前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >商业分析python实战(一):企业所得税预测

商业分析python实战(一):企业所得税预测

作者头像
三猫
发布2023-08-31 12:01:40
3130
发布2023-08-31 12:01:40
举报
文章被收录于专栏:机器学习养成记
企业所得税是企业经营过程中的一项重点关注内容,分析企业所得税的影响因素,预测未来两年有效的企业所得税,为未来企业发展提供指导依据,在企业经营过程中有重大意义。现有某企业2004年至2015年相关的数据,希望以此为基础,预测2016年及2017年的企业所得税。

步骤

1、获取数据;

2、相关性分析;

3、Lasso特征选择;

4、单个特征灰色预测;

5、SVR预测2016年及2017年企业所得税,并对模型进行评价。

NO.1 获取数据

考虑数据的可得性和与实际情况的关联性,选取2004年-2015年某企业相关维度的数据,具体字段名及说明如下表:

NO.2 分析企业所得税数据的相关性

从已有数据,可知道共有10个因素会影响企业所得税,需要计算各影响因素与目标特征之间的相关系数,进而判断企业所得税与选取特征之间的相关性。这里,我们计算10个特征间的Pearson相关系数,结果如下:

由上可知,x6与企业所得税(y)呈负相关关系,其余特征均与y呈正相关关系,且各个特征间存在严重的多重共线性,如x1,x2,x3,x4,x7,x8,x10。因此,需要对这些特征进行进一步筛选,避免信息重复。

NO.3 用Lasso回归选取关键特征

Lasso回归方法属于正则化方法的一种,是一种收缩估计方法,它可以将特征的系数进行压缩并使某些回归系数变为0,从而达到特征选择的目的。Lasso对数据类型没有太多限制,一般不需要对数据进行标准化处理,可以有效的解决多重共线性问题,但它倾向于选择多个特征中的一个特征,会导致结果的不稳定性。本例中,多重共线性的问题较为严重,因此使用Lasso进行特征选择是一个恰当的方法。

根据上图的结果,Lasso识别的影响企业所得税因素为x1,x9,x2。

NO.4 用灰色预测得到单特征预测值

因为各因素没有2016年、2017年的数据,因此我们需要先通过灰色预测得到单个特征在2016年、2017年的值。灰色预测是一种对含有不确定因素的系统进行预测的方法,具有预测精度高、模型可检验、参数估计方法简单的特点,但对序列的光滑度要求较高。灰色预测通过后验差检验判别模型精度,结果参照表如下:

通过GM方法进行灰色预测,x1、x2、x3的后验差检验结果及在2016年、2017年的预测值如下:

NO.5 用SVR构建预测模型

SVR(支持向量回归)不仅适用于线性模型,也能很好的抓住数据和特征之间的非线性关系,可避免局部最小问题,但计算复杂度较高,数据量大时,耗时较长。模型预测后,可通过R2值来判断模型效果,R2越接近1,表示模型拟合效果越好。

实现代码

代码语言:javascript
复制
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)

参考内容:

1、《R语言商务数据分析实战》

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


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档