财政收入影响因素分析及预测模型
分析地方财政收入来源状况,并依据此对其将来收入进行预测,对预防腐败、克服无度开支、合理利用财政收入、资金合理分配与最优化支出等都有重大意义。
项目目标:
1、梳理影响地方财政收入的关键特征,分析、识别影响地方财政收入的关键特征的选择模型
2、对某市财政总收入进行预测
接下来我们从经济角度考虑这个问题。我们会发现以下指标:
1、城镇居民人均可支配收入(X1)
可支配收入直接影响购买力和劳动积极性。购买力的提升直接推动税收的增加;劳动的积极性带来更高的工作效率和创造力,从而创造出更多财富。
2、城镇居民人均消费性支出(X2)
当今社会,消费支出的提高等同于税收的增加,税收的增加直接影响政府的财政收入。
3、社会消费品零售总额(X3)
社会消费品零售总额由社会商品供给和有支付能力的商品需求的规模所决定。社会消费品零售总额主要反映了一定时期内,居民消费欲望程度,社会商品购买力的实现程度,以及零售市场的规模状况。(百度)社会消费品零售总额增长时,表示居民消费意愿强烈,在一定程度上会促使增值税、营业税的增加。另外,消费的增长也会影响到其他方面,比如投资、新的实体创建等,这些都会变相影响政府财政收入。
4、全社会固定资产投资额(X4)
全社会固定资产投资是以货币形式表现的建造和购置固定资产活动的工作量。反映固定资产投资规模、速度、比例关系和使用方向的综合性指标。社会固定资产再生产的主要手段。促进经济增长、扩大税源、进而拉动财政税收收入整体增长。
5、地区生产总值(X5)
是指本地区所有常住单位在一定时期内生产活动的最终成果。地区生产总值等于各产业增加值之和。一般来讲,地区生产总值与政府财政收入直接挂钩。
6、第一产业产值(X6)
自从取消农业税,国家反哺农村以来,第一产业产值对政府财政收入的影响力越来越小。
7、税收(X7)
其强制性、无偿性以及固定性的特点使其成为各国各地区主要的财政收入来源。
8、居民消费价格指数(X8)
反映居民家庭一般所购买的消费品和服务项目价格水平变动情况,会对城乡居民生活支出与国家财政收入造成一定影响。
9、第三产业与第二产业产值比(X9)
表示产业结构。当产业结构逐步优化时,财政收入也会随之增加。
10、居民消费水平(X10)
间接影响地方财政收入。
11、在岗职工工资总额(X11)
反映的是社会分配情况,主要影响财政收入中的个人所得税、房产税等。
接下来我们从社会角度考虑这个问题
12、社会从业人数(X12)
从业人数的变化间接影响财政收入
13、年末总人口(X13)
人均地方财政收入与地方人口数量呈反比例变化
一、首先对数据初步了解
inputfile = 'data1.csv'
data = pd.read_csv(inputfile)
r = [data.min(),data.max(),data.mean(),data.std()]
r = pd.DataFrame(r,index=['Min','Max','Mean','STD']).T
np.round(r,2)
对数据初步分析可以得出以下结论:
1、该市经济每年都成上升趋势,其中2008年上升较快
2、平均值和方差相差不大,说明数据在统计期间发生较大的变化
二、对变量间进行相关性分析,并画出散点图
# 相关性分析
r2 = data.corr(method='pearson')
np.round(r2,2)
pic_2,axs_3=plt.subplots(figsize=(16,16))
pd.plotting.scatter_matrix(data,ax=axs_3,diagonal='kde',color='#00008B')
plt.show()
由上图可以看出,x11,x12与y之间没有强的关联性,x11与y成负相关,x12与y虽然成正相关,但相关性较差,故在做灰度预测时 将x11和x12删除
对角线部分: 核密度估计图(Kernel Density Estimation),就是用来看某 一个 变量分布情况,横轴对应着该变量的值,纵轴对应着该变量的密度(可以理解为出现频次)。 非对角线部分:两个 变量之间分布的关联散点图。将任意两个变量进行配对,以其中一个为横坐标,另一个为纵坐标,将所有的数据点绘制在图上,用来衡量两个变量的关联度(Correlation)
对于病态矩阵(超定或者低定),多重线性矩阵,利用lasso算法进行变量选取和系数估计是一种很好的选择,然而普通型lasso算法应用本身要求过于苛刻,因此这里采用LassoLarsCV,LassoLarsIC
# LassoLarsCV
Data_ori=pd.read_csv('data1.csv')
Data_ori_1=pd.DataFrame(Data_ori.values,index=range(1994,2014),columns=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10','x11','x12','x13','y'])
model_CV_2=LassoLarsCV(fit_intercept=True, verbose=False, max_iter=500, normalize=False, precompute=True, cv=20, max_n_alphas=1000, n_jobs=1, eps=2.2204460492503131e-16, copy_X=True, positive=False)
model_CV_2.fit(Data_ori_1.loc[:,'x1':'x13'],Data_ori_1['y'])
model_CV_2.coef_
# LassoLarsIC,从系数可以看出,只有一个特征与y值有关,这是不可能的,因此排除该算法
model_ic_aic=LassoLarsIC(criterion='aic', fit_intercept=True, verbose=False, normalize=False, precompute='auto', max_iter=500, copy_X=True, positive=False)
model_ic_aic.fit(Data_ori_1.loc[:,'x1':'x13'],Data_ori_1['y'])
model_ic_aic.coef_
综上,可以将X2
、x9-x12
变量删除,用剩余变量作灰度预测
灰色序列通过某种生成弱化其自身随机性,显现其规律性。
inputfile = '/data1.csv' #输入的数据文件
outputfile = '/data1_GM1111.xls' #灰色预测后保存的路径
data = pd.read_csv(inputfile) #读取数据
data.index = range(1994, 2014)
data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x3', 'x4', 'x5', 'x6','x7','x8','x13']
# GM11(data['x1'][range(1994, 2014)])[0]
for i in l:
f = GM11(data[i][:-2].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) #结果输出
建立7层神经网络进行预测
# 神经网络预测
inputfile = '/data1_GM11.xls' #灰色预测后保存的路径
outputfile = '/revenue.xls' #神经网络预测后保存的结果
modelfile = '../tmp/1-net.model' #模型保存路径
data = pd.read_excel(inputfile) #读取数据
feature =['x1', 'x3', 'x4', 'x5', 'x6','x7','x8','x13'] #特征所在列
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].as_matrix() #特征数据
y_train = data_train['y'].as_matrix() #标签数据
from keras.models import Sequential
from keras.layers.core import Dense, Activation
model = Sequential() #建立模型
# model.add(Dense(12, input_shape=(6,)))
# model.add(Activation('relu')) #用relu函数作为激活函数,能够大幅提供准确度
# model.add(Dense(1, input_shape=(12,)))
model.add(Dense(8, input_dim=6))
model.add(Activation('relu'))
model.add(Dense(12, init='uniform', activation='relu'))
model.add(Dense(12, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(8, input_dim=6))
model.add(Dense(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]).as_matrix()
data[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(style=['b-o','r-*'])
plt.show()
从图可以看出,使用7层神经网络训练,预测结果与实际结果完美拟合,但是为了防止过拟合,采用3层神经网络训练即可.