财政收入影响因素分析及预测模型
背景
在我国现行的分税制财政管理体制下,地方财政收入不仅是国家财政收入的重要组成部分,还具有其相对独立的构成内容。如何有效地利用地方财政收入,合理地分配来促进地方的发展,提高市民的收入和生活质量是每个地方政府需要考虑的首要问题。因此,对地方财政收入进行预测,不但是必要的,而且是可能的。科学、合理地预测地方财政收入,对于克服年度地方预算收支规模的随意性和盲目性,正确处理地方财政与经济的相互关系具有十分重要的意义。某市作为改革开放的前沿城市,其经济发展在全国经济中的地位举足轻重。目前,该市在财政收入规模、结构等方面与北京、深圳和上海等城市仍有一定差距,存在不断完善的空间。
目标
本案例旨在通过研究,发现影响该市目前以及未来地方财源建设的因素,并对其进行深入分析,提出对该市地方财源优化的具体建议,供政府决策参考,同时为其他经济发展较快的城市提供借鉴。
考虑到数据的可得性,本案例所用的财政收入分为地方一般预算收入和政府性基金收入。
地方一般预算收入包括:1.税收收入,主要包括企业所得税和地方所得税中中央和地方共享的40%,地方享有的25%的增值税、营业税和印花税等;2.非税收入,包括专项收入、行政事业费收入、罚没收入、国有资本经营收入和其他收入等。政府性基金收入是国家通过向社会征收以及出让土地、发行彩票等方式取得的收入,并专项用于支持特定基础设施建设和社会事业发展的收入。由于1994年财政体制重大改革,所以1994年前后不具有可比性,仅对1994年后的进行分析,本案例数据来自《某市统计年鉴》(1995-2014)
挖掘目标
梳理影响地方财政收入的关键特征,分析、识别影响地方财政收入的关键特征的选择模型。结合目标1的因素分析,对某市2015年的财政总收入及各个类别收入进行预测。
分析
在以往的文献中,对影响财政收入的因素的分析大多采用普通最小二乘法来对回归模型的系数进行估计,预测变量的选取采用的则是逐步回归。然而,不论是最小二乘法还是逐步回归,都有其不足之处。它们一般都局限于局部最优解而不是全局最优解。如果预测变量过多,子集选择的计算过程具有不可实行性,且子集选择具有内在的不连续性,从而导致子集选择极度多变。
Lasso是近年来被广泛使用于参数估计和变量选择的方法之一,并且在确定的条件下,使用Lasso方法进行变量选择已经被证明是一致的。案例选用Adaptive-Lasso方法来探究地方财政收入与各因素之间的关系。(该方法不在数学上具体叙述)
在Adaptive-Lasso变量选择的基础上,鉴于灰色预测对小数据量数据预测的优良性能,对单个选定的影响因素建立灰色预测模型,得到它们在2014年及2015年的预测值。由于神经网络较强的适用性和容错能力,对历史数据建立训练模型,把灰色预测的数据结果代入训练好的模型中,就得到了充分考虑历史信息的预测结果,即2015年某市财政收入及各个类别的收入。
下面是基于数据挖掘技术的财政收入分析预测模型流程
- 从某市统计局网站以及各统计年鉴搜集到该市财政收入以及各类别收入相关数据。
- 利用步骤1)形成的已完成数据预处理的建模数据,建立Adaptive-Lasso变量选择模型。
- 在步骤2)的基础上建立单变量的灰色预测模型以及人工神经网络预测模型。
- 利用步骤3)的预测值代入构建好的人工神经网络模型中,从而得到2014/2015年某市财政收入及各个类别的收入。
处理过程
- 数据获取
- 已提供。
- 数据探索
- 描述分析
- 相关分析
- 数据预处理
- 处理好的数据给出了。
- 数据挖掘建模
- Adaptive-Lasso变量选择模型
- sklearn中Adaptive-Lasso模型已经删除了。
- 财政收入及各类别收入预测模型
- 某市财政收入预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 增值税预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 营业税预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 企业所得税预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 个人所得税预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 政府性基金收入预测模型
- 真实值与预测值对比
- 真实值与预测值对比
- 某市财政收入预测模型
- Adaptive-Lasso变量选择模型
代码
import pandas as pd
import numpy as np
from GM11 import GM11def adaptiveLasso():'''Adaptive-Lasso变量选择模型:return:'''inputfile = 'data/data1.csv'data = pd.read_csv(inputfile)# 导入AdaptiveLasso算法,要在较新的Scikit-Learn才有。from sklearn.linear_model import LassoLarsmodel = LassoLars()model.fit(data.iloc[:, 0:13], data['y'])print(model.coef_)def huise():'''地方财政收入灰色预测:return:'''inputfile = 'data/data1.csv'outputfile = 'data/data1_GM11.xls'data = pd.read_csv(inputfile)data.index = range(1994, 2014)data.loc[2014] = Nonedata.loc[2015] = Nonel = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']for i in l:f = GM11(data[i][np.arange(1994, 2014)].values)[0]# 2014年预测结果data[i][2014] = f(len(data) - 1)# 2015年预测结果data[i][2015] = f(len(data))data[i] = data[i].round(2)data[l + ['y']].to_excel(outputfile)print(data)def yuce():'''地方财政收入神经网络预测模型:return:'''inputfile = 'data/data1_GM11.xls' # 灰色预测后保存的路径outputfile = 'data/revenue.xls' # 神经网络预测后保存的结果modelfile = 'data/1-net.model' # 模型保存路径data = pd.read_excel(inputfile)feature = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7'] # 特征所在列data_train = data.loc[range(1994, 2014)].copy() # 取2014年前的数据建模data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean) / data_std # 数据标准化x_train = data_train[feature].values # 特征数据y_train = data_train['y'].values # 标签数据from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() # 建立模型model.add(Dense(input_dim=6, units=12))model.add(Activation('relu')) # 用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim=12, units=1))model.compile(loss='mean_squared_error', optimizer='adam') # 编译模型model.fit(x_train, y_train, nb_epoch=10000, batch_size=16) # 训练模型,学习一万次model.save_weights(modelfile) # 保存模型参数# 预测,并还原结果。x = ((data[feature] - data_mean[feature]) / data_std[feature]).valuesdata[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']data.to_excel(outputfile)import matplotlib.pyplot as plt # 画出预测结果图p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])plt.show()def adaptiveLasso2():'''Adaptive-Lasso变量选择:return:'''inputfile = 'data/data2.csv' # 输入的数据文件data = pd.read_csv(inputfile) # 读取数据# 导入AdaptiveLasso算法,新版本已经删除from sklearn.linear_model import AdaptiveLassomodel = AdaptiveLasso(gamma=1)model.fit(data.iloc[:, 0:6], data['y'])model.coef_ # 各个特征的系数def huise2():'''增值税灰色预测:return:'''inputfile = 'data/data2.csv' # 输入的数据文件outputfile = 'data/data2_GM11.xls' # 灰色预测后保存的路径data = pd.read_csv(inputfile) # 读取数据data.index = range(1999, 2014)data.loc[2014] = Nonedata.loc[2015] = Nonel = ['x1', 'x3', 'x5']for i in l:f = GM11(data[i][np.arange(1999, 2014)].values)[0]data[i][2014] = f(len(data) - 1) # 2014年预测结果data[i][2015] = f(len(data)) # 2015年预测结果data[i] = data[i].round(6) # 保留六位小数data[l + ['y']].to_excel(outputfile) # 结果输出print(data)def yuce2():'''增值税神经网络预测模型:return:'''inputfile = 'data/data2_GM11.xls' # 灰色预测后保存的路径outputfile = 'data/VAT.xls' # 神经网络预测后保存的结果modelfile = 'data/2-net.model' # 模型保存路径data = pd.read_excel(inputfile) # 读取数据feature = ['x1', 'x3', 'x5'] # 特征所在列data_train = data.loc[np.arange(1999, 2014)].copy() # 取2014年前的数据建模data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean) / data_std # 数据标准化x_train = data_train[feature].values # 特征数据y_train = data_train['y'].values # 标签数据from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() # 建立模型model.add(Dense(input_dim=3, units=6))model.add(Activation('relu')) # 用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim=6, units=1))model.compile(loss='mean_squared_error', optimizer='adam') # 编译模型model.fit(x_train, y_train, nb_epoch=10000, batch_size=16) # 训练模型,学习一万次model.save_weights(modelfile) # 保存模型参数# 预测,并还原结果。x = ((data[feature] - data_mean[feature]) / data_std[feature]).valuesdata[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']data[u'y_pred'] = data[u'y_pred'].round(2)data.to_excel(outputfile)import matplotlib.pyplot as plt # 画出预测结果图p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])plt.show()def adaptiveLasso3():'''Adaptive-Lasso变量选择:return:'''inputfile = 'data/data3.csv' # 输入的数据文件data = pd.read_csv(inputfile) # 读取数据# 导入AdaptiveLasso算法,要在较新的Scikit-Learn才有。from sklearn.linear_model import AdaptiveLassomodel = AdaptiveLasso(gamma=1)model.fit(data.iloc[:, 0:10], data['y'])model.coef_ # 各个特征的系数def huise3():'''营业税灰色预测:return:'''inputfile = 'data/data3.csv' # 输入的数据文件outputfile = 'data/data3_GM11.xls' # 灰色预测后保存的路径data = pd.read_csv(inputfile) # 读取数据data.index = range(1999, 2014)data.loc[2014] = Nonedata.loc[2015] = Nonel = ['x3', 'x4', 'x6', 'x8']for i in l:f = GM11(data[i][np.arange(1999, 2014)].values)[0]data[i][2014] = f(len(data) - 1) # 2014年预测结果data[i][2015] = f(len(data)) # 2015年预测结果data[i] = data[i].round() # 取整data[l + ['y']].to_excel(outputfile) # 结果输出print(data)def yuce3():'''营业税神经网络预测模型:return:'''inputfile = 'data/data3_GM11.xls' # 灰色预测后保存的路径outputfile = 'data/sales_tax.xls' # 神经网络预测后保存的结果modelfile = 'data/3-net.model' # 模型保存路径data = pd.read_excel(inputfile) # 读取数据feature = ['x3', 'x4', 'x6', 'x8'] # 特征所在列data_train = data.loc[range(1999, 2014)].copy() # 取2014年前的数据建模data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean) / data_std # 数据标准化x_train = data_train[feature].values # 特征数据y_train = data_train['y'].values # 标签数据from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() # 建立模型model.add(Dense(input_dim=4, units=8))model.add(Activation('relu')) # 用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim=8, units=1))model.compile(loss='mean_squared_error', optimizer='adam') # 编译模型model.fit(x_train, y_train, nb_epoch=10000, batch_size=16) # 训练模型,学习一万次model.save_weights(modelfile) # 保存模型参数# 预测,并还原结果。x = ((data[feature] - data_mean[feature]) / data_std[feature]).valuesdata[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']data[u'y_pred'] = data[u'y_pred'].round(2)data.to_excel(outputfile)import matplotlib.pyplot as plt # 画出预测结果图p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])plt.show()def adaptiveLasso4():'''Adaptive-Lasso变量选择:return:'''inputfile = 'data/data4.csv' # 输入的数据文件data = pd.read_csv(inputfile) # 读取数据# 导入AdaptiveLasso算法,要在较新的Scikit-Learn才有。from sklearn.linear_model import AdaptiveLassomodel = AdaptiveLasso(gamma=1)model.fit(data.iloc[:, 0:10], data['y'])model.coef_ # 各个特征的系数def huise4():'''企业所得税灰色预测:return:'''inputfile = 'data/data4.csv' # 输入的数据文件outputfile = 'data/data4_GM11.xls' # 灰色预测后保存的路径data = pd.read_csv(inputfile) # 读取数据data.index = range(2002, 2014)data.loc[2014] = Nonedata.loc[2015] = Nonel = ['x1', 'x2', 'x3', 'x4', 'x6', 'x7', 'x9', 'x10']for i in l:f = GM11(data[i][np.arange(2002, 2014)].values)[0]data[i][2014] = f(len(data) - 1) # 2014年预测结果data[i][2015] = f(len(data)) # 2015年预测结果data[i] = data[i].round(2) # 保留两位小数data[l + ['y']].to_excel(outputfile) # 结果输出print(data)def yuce4():'''企业所得税神经网络预测模型:return:'''inputfile = 'data/data4_GM11.xls' # 灰色预测后保存的路径outputfile = 'data/enterprise_income.xls' # 神经网络预测后保存的结果modelfile = 'data/4-net.model' # 模型保存路径data = pd.read_excel(inputfile) # 读取数据feature = ['x1', 'x2', 'x3', 'x4', 'x6', 'x7', 'x9', 'x10'] # 特征所在列data_train = data.loc[range(2002, 2014)].copy() # 取2014年前的数据建模data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean) / data_std # 数据标准化x_train = data_train[feature].values # 特征数据y_train = data_train['y'].values # 标签数据from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() # 建立模型model.add(Dense(input_dim=8, units=6))model.add(Activation('relu')) # 用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim=6, units=1))model.compile(loss='mean_squared_error', optimizer='adam') # 编译模型model.fit(x_train, y_train, nb_epoch=5000, batch_size=16) # 训练模型,学习五千次model.save_weights(modelfile) # 保存模型参数# 预测,并还原结果。x = ((data[feature] - data_mean[feature]) / data_std[feature]).valuesdata[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']data[u'y_pred'] = data[u'y_pred'].round()data.to_excel(outputfile)import matplotlib.pyplot as plt # 画出预测结果图p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])plt.show()def adaptiveLasso5():'''Adaptive-Lasso变量选择:return:'''inputfile = 'data/data5.csv' # 输入的数据文件data = pd.read_csv(inputfile) # 读取数据# 导入AdaptiveLasso算法,要在较新的Scikit-Learn才有。from sklearn.linear_model import AdaptiveLassomodel = AdaptiveLasso(gamma=1)model.fit(data.iloc[:, 0:7], data['y'])model.coef_ # 各个特征的系数def huise5():'''个人所得税灰色预测:return:'''inputfile = 'data/data5.csv' # 输入的数据文件outputfile = 'data/data5_GM11.xls' # 灰色预测后保存的路径data = pd.read_csv(inputfile) # 读取数据data.index = range(2000, 2014)data.loc[2014] = Nonedata.loc[2015] = Nonel = ['x1', 'x4', 'x5', 'x7']for i in l:f = GM11(data[i][np.arange(2000, 2014)].values)[0]data[i][2014] = f(len(data) - 1) # 2014年预测结果data[i][2015] = f(len(data)) # 2015年预测结果data[i] = data[i].round() # 取整data[l + ['y']].to_excel(outputfile) # 结果输出print(data)def yuce5():'''个人所得税神经网络预测模型:return:'''inputfile = 'data/data5_GM11.xls' # 灰色预测后保存的路径outputfile = 'data/personal_Income.xls' # 神经网络预测后保存的结果modelfile = 'data/5-net.model' # 模型保存路径data = pd.read_excel(inputfile) # 读取数据feature = ['x1', 'x4', 'x5', 'x7'] # 特征所在列data_train = data.loc[range(2000, 2014)].copy() # 取2014年前的数据建模data_mean = data_train.mean()data_std = data_train.std()data_train = (data_train - data_mean) / data_std # 数据标准化x_train = data_train[feature].values # 特征数据y_train = data_train['y'].values # 标签数据from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() # 建立模型model.add(Dense(input_dim=4, units=8))model.add(Activation('relu')) # 用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim=8, units=1))model.compile(loss='mean_squared_error', optimizer='adam') # 编译模型model.fit(x_train, y_train, nb_epoch=15000, batch_size=16) # 训练模型,学习一万五千次model.save_weights(modelfile) # 保存模型参数# 预测,并还原结果。x = ((data[feature] - data_mean[feature]) / data_std[feature]).valuesdata[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']data[u'y_pred'] = data[u'y_pred'].round()data.to_excel(outputfile)import matplotlib.pyplot as plt # 画出预测结果图p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])plt.show()def huise6():'''政府性基金收入灰色预测:return:'''x0 = np.array([3152063, 2213050, 4050122, 5265142, 5556619, 4772843, 9463330])f, a, b, x00, C, P = GM11(x0)print(u'2014年、2015年的预测结果分别为:\n%0.2f万元和%0.2f万元' % (f(8), f(9)))print(u'后验差比值为:%0.4f' % C)p = pd.DataFrame(x0, columns=['y'], index=range(2007, 2014))p.loc[2014] = Nonep.loc[2015] = Nonep['y_pred'] = [f(i) for i in range(1, 10)]p['y_pred'] = p['y_pred'].round(2)p.index = pd.to_datetime(p.index, format='%Y')import matplotlib.pylab as pltp.plot(style=['b-o', 'r-*'], xticks=p.index)plt.show()if __name__ == '__main__':# adaptiveLasso()# huise()# yuce()# adaptiveLasso2()# huise2()# yuce2()# adaptiveLasso3()# huise3()# yuce3()# adaptiveLasso4()# huise4()# yuce4()# adaptiveLasso5()# huise5()# yuce5()huise6()
后续处理
应用模型进行推理。
补充说明
案例参考书《Python数据分析与挖掘实战》,与原书有借鉴,但是较大改动代码,修复了原书一些旧版本代码错误,具体数据集和代码可以查看我的Github,欢迎star或者fork。再次补充,相关数据集的获取直接clone整个仓库即可。