天天看點

商業分析python實戰(一):企業所得稅預測

作者:機器學習養成記

原文連結:商業分析python實戰(一):企業所得稅預測

企業所得稅是企業經營過程中的一項重點關注内容,分析企業所得稅的影響因素,預測未來兩年有效的企業所得稅,為未來企業發展提供指導依據,在企業經營過程中有重大意義。現有某企業2004年至2015年相關的資料,希望以此為基礎,預測2016年及2017年的企業所得稅。

步驟

1、擷取資料;

2、相關性分析;

3、Lasso特征選擇;

4、單個特征灰色預測;

5、SVR預測2016年及2017年企業所得稅,并對模型進行評價。

商業分析python實戰(一):企業所得稅預測

NO.1 擷取資料

考慮資料的可得性和與實際情況的關聯性,選取2004年-2015年某企業相關次元的資料,具體字段名及說明如下表:

商業分析python實戰(一):企業所得稅預測

NO.2 分析企業所得稅資料的相關性

從已有資料,可知道共有10個因素會影響企業所得稅,需要計算各影響因素與目标特征之間的相關系數,進而判斷企業所得稅與選取特征之間的相關性。這裡,我們計算10個特征間的Pearson相關系數,結果如下:

商業分析python實戰(一):企業所得稅預測

由上可知,x6與企業所得稅(y)呈負相關關系,其餘特征均與y呈正相關關系,且各個特征間存在嚴重的多重共線性,如x1,x2,x3,x4,x7,x8,x10。是以,需要對這些特征進行進一步篩選,避免資訊重複。

NO.3 用Lasso回歸選取關鍵特征

Lasso回歸方法屬于正則化方法的一種,是一種收縮估計方法,它可以将特征的系數進行壓縮并使某些回歸系數變為0,進而達到特征選擇的目的。Lasso對資料類型沒有太多限制,一般不需要對資料進行标準化處理,可以有效的解決多重共線性問題,但它傾向于選擇多個特征中的一個特征,會導緻結果的不穩定性。本例中,多重共線性的問題較為嚴重,是以使用Lasso進行特征選擇是一個恰當的方法。

商業分析python實戰(一):企業所得稅預測

根據上圖的結果,Lasso識别的影響企業所得稅因素為x1,x9,x2。

NO.4 用灰色預測得到單特征預測值

因為各因素沒有2016年、2017年的資料,是以我們需要先通過灰色預測得到單個特征在2016年、2017年的值。灰色預測是一種對含有不确定因素的系統進行預測的方法,具有預測精度高、模型可檢驗、參數估計方法簡單的特點,但對序列的光滑度要求較高。灰色預測通過後驗差檢驗判别模型精度,結果參照表如下:

商業分析python實戰(一):企業所得稅預測

通過GM方法進行灰色預測,x1、x2、x3的後驗差檢驗結果及在2016年、2017年的預測值如下:

商業分析python實戰(一):企業所得稅預測

NO.5 用SVR建構預測模型

SVR(支援向量回歸)不僅适用于線性模型,也能很好的抓住資料和特征之間的非線性關系,可避免局部最小問題,但計算複雜度較高,資料量大時,耗時較長。模型預測後,可通過R2值來判斷模型效果,R2越接近1,表示模型拟合效果越好。

商業分析python實戰(一):企業所得稅預測

實作代碼

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt


#step1:擷取資料
datafile = pd.read_csv('income_tax.csv',index_col='year')
print(datafile.head())


#step2:相關性分析
print(datafile.corr())


#step3:Lasso特征選擇
from sklearn.linear_model import LassoCV
X = datafile.drop("y",1)   
y = datafile["y"] 
lasso = LassoCV()
lasso.fit(X, y)
coef = pd.Series(lasso.coef_, index = X.columns)
print("Lasso算法挑選了 " + str(sum(coef != 0)) + " 個變量,然後去除掉了" +  str(sum(coef == 0)) + "個變量")
imp_coef = coef.sort_values()
matplotlib.rcParams['figure.figsize'] = (8, 6)
imp_coef.plot(kind = "barh")
plt.title("Lasso Model Feature Importance")
plt.show()


#step4:GM算法進行變量灰色預測
def GM11(x0,i): 
    import numpy as np
    x1 = x0.cumsum() 
    x1 =pd.DataFrame(x1)
    z1 = (x1 + x1.shift())/2.0 
    z1 = z1[1:].values.reshape((len(z1)-1,1))  
    B = np.append(-z1, np.ones_like(z1), axis = 1)
    Yn = x0[1:].reshape((len(x0)-1, 1))  
    [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) 
    f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) 
    delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))  
    C = delta.std()/x0.std()
    P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
    print( str(i) + ": C = " + str(C) + " , P = " +  str(P))
    return f, a, b, x0[0], C, P 




l=['x1','x2','x9'] #根據Lasso分析結果,選擇變量
data_1=X[l].copy()
data_1.index=range(2004,2016)
data_1.loc[2016]=None  
data_1.loc[2017]=None


for i in l:  #預測每個變量2016、2017預測值
    f=GM11(data_1[i][:-2].values,i)[0]
    data_1[i][2016]=f(len(data_1)-1)
    data_1[i][2017]=f(len(data_1))
    data_1[i]=data_1[i].round(2)


print(data_1.tail(2))


#step5:SVR模型
result = data_1.copy()
result['real'] = y
result['predict'] = None #記錄結果


from sklearn import svm
from sklearn.metrics import r2_score
svm_model = svm.SVR(kernel='linear',max_iter=10)
svm_model.fit(data_1.iloc[0:12, :], y)
predict1 = svm_model.predict(data_1.iloc[0:12, :])
r2_score = r2_score(y,predict1)




result.iloc[0:12,4]=predict1


from sklearn.metrics import r2_score
print('R2 = ' + str(r2_score(y,predict1) ))
plt.scatter(y.index, y, color='darkorange', label='data')
plt.plot(y.index, predict1, color='navy', lw=2, label='Linear model')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()


predict2 = svm_model.predict(data_1.iloc[12:14, :])
result.iloc[12:14,4]=predict2
print('最終結果:')
print(result)           

點選原文(商業分析python實戰(一):企業所得稅預測)背景回複“企業”可得本例資料及代碼。

參考内容:

1、《R語言商務資料分析實戰》

2、https://www.cnblogs.com/zinyy/p/9535069.html