数据分析与挖掘实战-财政收入影响因素分析及预测模型

财政收入影响因素分析及预测模型

背景

在我国现行的分税制财政管理体制下,地方财政收入不仅是国家财政收入的重要组成部分,还具有其相对独立的构成内容。如何有效地利用地方财政收入,合理地分配来促进地方的发展,提高市民的收入和生活质量是每个地方政府需要考虑的首要问题。因此,对地方财政收入进行预测,不但是必要的,而且是可能的。科学、合理地预测地方财政收入,对于克服年度地方预算收支规模的随意性和盲目性,正确处理地方财政与经济的相互关系具有十分重要的意义。某市作为改革开放的前沿城市,其经济发展在全国经济中的地位举足轻重。目前,该市在财政收入规模、结构等方面与北京、深圳和上海等城市仍有一定差距,存在不断完善的空间。

目标

本案例旨在通过研究,发现影响该市目前以及未来地方财源建设的因素,并对其进行深入分析,提出对该市地方财源优化的具体建议,供政府决策参考,同时为其他经济发展较快的城市提供借鉴。

考虑到数据的可得性,本案例所用的财政收入分为地方一般预算收入和政府性基金收入。

地方一般预算收入包括:1.税收收入,主要包括企业所得税和地方所得税中中央和地方共享的40%,地方享有的25%的增值税、营业税和印花税等;2.非税收入,包括专项收入、行政事业费收入、罚没收入、国有资本经营收入和其他收入等。政府性基金收入是国家通过向社会征收以及出让土地、发行彩票等方式取得的收入,并专项用于支持特定基础设施建设和社会事业发展的收入。由于1994年财政体制重大改革,所以1994年前后不具有可比性,仅对1994年后的进行分析,本案例数据来自《某市统计年鉴》(1995-2014)

挖掘目标

梳理影响地方财政收入的关键特征,分析、识别影响地方财政收入的关键特征的选择模型。结合目标1的因素分析,对某市2015年的财政总收入及各个类别收入进行预测。

分析

在以往的文献中,对影响财政收入的因素的分析大多采用普通最小二乘法来对回归模型的系数进行估计,预测变量的选取采用的则是逐步回归。然而,不论是最小二乘法还是逐步回归,都有其不足之处。它们一般都局限于局部最优解而不是全局最优解。如果预测变量过多,子集选择的计算过程具有不可实行性,且子集选择具有内在的不连续性,从而导致子集选择极度多变。

Lasso是近年来被广泛使用于参数估计和变量选择的方法之一,并且在确定的条件下,使用Lasso方法进行变量选择已经被证明是一致的。案例选用Adaptive-Lasso方法来探究地方财政收入与各因素之间的关系。(该方法不在数学上具体叙述)

在Adaptive-Lasso变量选择的基础上,鉴于灰色预测对小数据量数据预测的优良性能,对单个选定的影响因素建立灰色预测模型,得到它们在2014年及2015年的预测值。由于神经网络较强的适用性和容错能力,对历史数据建立训练模型,把灰色预测的数据结果代入训练好的模型中,就得到了充分考虑历史信息的预测结果,即2015年某市财政收入及各个类别的收入。

下面是基于数据挖掘技术的财政收入分析预测模型流程

  1. 从某市统计局网站以及各统计年鉴搜集到该市财政收入以及各类别收入相关数据。
  2. 利用步骤1)形成的已完成数据预处理的建模数据,建立Adaptive-Lasso变量选择模型。
  3. 在步骤2)的基础上建立单变量的灰色预测模型以及人工神经网络预测模型。
  4. 利用步骤3)的预测值代入构建好的人工神经网络模型中,从而得到2014/2015年某市财政收入及各个类别的收入。

处理过程

  • 数据获取
    • 已提供。
  • 数据探索
    • 描述分析
    • 相关分析
  • 数据预处理
    • 处理好的数据给出了。
  • 数据挖掘建模
    • Adaptive-Lasso变量选择模型
      • sklearn中Adaptive-Lasso模型已经删除了。
    • 财政收入及各类别收入预测模型
      • 某市财政收入预测模型
        • 真实值与预测值对比
      • 增值税预测模型
        • 真实值与预测值对比
      • 营业税预测模型
        • 真实值与预测值对比
      • 企业所得税预测模型
        • 真实值与预测值对比
      • 个人所得税预测模型
        • 真实值与预测值对比
      • 政府性基金收入预测模型
        • 真实值与预测值对比

代码

import pandas as pd
import numpy as np
from GM11 import GM11


def adaptiveLasso():
    '''
    Adaptive-Lasso变量选择模型
    :return:
    '''
    inputfile = 'data/data1.csv'
    data = pd.read_csv(inputfile)
    # 导入AdaptiveLasso算法,要在较新的Scikit-Learn才有。
    from sklearn.linear_model import LassoLars
    model = 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] = None
    data.loc[2015] = None
    l = ['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 Sequential
    from keras.layers.core import Dense, Activation

    model = 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]).values
    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(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 AdaptiveLasso
    model = 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] = None
    data.loc[2015] = None
    l = ['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 Sequential
    from keras.layers.core import Dense, Activation

    model = 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]).values
    data[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 AdaptiveLasso
    model = 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] = None
    data.loc[2015] = None
    l = ['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 Sequential
    from keras.layers.core import Dense, Activation

    model = 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]).values
    data[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 AdaptiveLasso
    model = 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] = None
    data.loc[2015] = None
    l = ['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 Sequential
    from keras.layers.core import Dense, Activation

    model = 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]).values
    data[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 AdaptiveLasso
    model = 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] = None
    data.loc[2015] = None
    l = ['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 Sequential
    from keras.layers.core import Dense, Activation

    model = 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]).values
    data[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] = None
    p.loc[2015] = None
    p['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 plt
    p.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整个仓库即可。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周先森爱吃素

你的鼓励是我坚持创作的不懈动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值