[Spark Big Job] 財務収益に影響を与える要因の分析と予測モデル


序文

1. 収集した地方財政収入や特定都市の各種歳入データから、地方財政収入に影響を与える主要な属性を分析・特定する 2. 選択した主要な影響要因の2014年および2015年の予測値を予測
する
3. モデルの精度を評価します。

参考:【データマイニング事例】財政収入影響要因の分析・予測モデル


スタンドアロン、小規模データ、パンダ

1. データの基本的な記述分析

1.1 ガイドパケットとリードデータ

  • データ(data.xlsx)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
import openpyxl

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x)

# 读入数据
data = pd.read_excel('./input/data.xlsx')

ここに画像の説明を挿入します

  • フィールドの意味
    • 社会従業員数(×1)
    • 現業従業員の賃金総額(×2)
    • 消費財の小売総売上高 (x3)
    • 都市住民の一人当たり可処分所得(x4)
    • 都市住民の一人当たり消費支出(x5)
    • 年末の総人口(x6)
    • 社会全体の固定資産投資額(×7)
    • 地域総生産 (x8)
    • 第一次産業産出額(9倍)
    • 税金 (x10)
    • 消費者物価指数 (x11)
    • 第三次産業と第二次産業の産出額比率(×12)
    • 地域総生産(x8)と家計消費水準(x13)

1.2 データの基本的な状況

data.shape # (20, 14)
data.info()

ここに画像の説明を挿入します

# 描述性分析
data.describe().T

ここに画像の説明を挿入します

# 描述性分析
r = [data.min(), data.max(), data.mean(), data.std()]
r = pd.DataFrame(r, index=['Min', 'Max', 'Mean', 'STD']).T
r = np.round(r, 2)
r

ここに画像の説明を挿入します

1.3 変数の分布

from sklearn.preprocessing import MinMaxScaler

#实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
data_scale = pd.DataFrame(scaler.transform(data)) #通过接口导出结果
data_scale.columns = data.columns

import joypy
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
import seaborn as sns

fig, axes = joypy.joyplot(data_scale, alpha=.5, color='#FFCC99')#连续值的列为一个"脊"

ここに画像の説明を挿入します

data_scale.plot()

ここに画像の説明を挿入します

1.4 相関分析

pear = np.round(data.corr(method = 'pearson'), 2)
pear

ここに画像の説明を挿入します

plt.figure(figsize=(12,12))
sns.heatmap(data.corr(), center=0,
            square=True, linewidths=.5, cbar_kws={
    
    "shrink": .5},annot=True, fmt='.1f')
#设置x轴
plt.xticks(fontsize=15)
#设置y轴
plt.yticks(fontsize=15)
plt.tight_layout()
plt.savefig('a.png')

ここに画像の説明を挿入します

  • この図から、消費者物価指数(×11)と財政収入との直線関係は有意ではなく、負の相関を示していることがわかります。残りの変数は財政収入と高い正の相関関係があります。

2. データの前処理

  • 変数のスクリーニング (分析手法の選択):
    • 従来、財政収入の分析では、重回帰モデルや最小二乗推定法を用いて回帰モデルの係数を推定していましたが、係数間の関係を検定できるかどうかはデータに大きく依存していましたが、得られるものは多くの場合、局所的な最適解のみであり、後続のテストでは本来の意味が失われる可能性があります。
    • したがって、このケースでは、Adaptive-Lasso 変数選択法を使用して検討します。Lasso については、書籍に記載されている理論的知識がここにあります。

2.1 ラッソ変数選択モデル

  • ここには AdaptiveLasso 関数がありません。代わりに Lasso を使用してください。
from sklearn.linear_model import Lasso
model = Lasso(alpha=0.1, max_iter=100000)
model.fit(data.iloc[:, 0:13], data['y'])
q=model.coef_#各特征的系数
q=pd.DataFrame(q,index=data.columns[:-1])
q

ここに画像の説明を挿入します

  • 変数の固有値がゼロ以外であると計算された場合は、その変数が予測変数に対してより大きな影響を与えていることを意味し、変数の固有値がゼロの場合は、その変数が予測変数に対してほとんど影響を与えていないことを意味します。 。
  • パラメータ値を調整する(参照:https://blog.csdn.net/weixin_43746433/article/details/100047231)
from sklearn.linear_model import Lasso
lasso = Lasso(1000)  #调用Lasso()函数,设置λ的值为1000
lasso.fit(data.iloc[:,0:13],data['y'])
print('相关系数为:',np.round(lasso.coef_,5))  #输出结果,保留五位小数
## 计算相关系数非零的个数
print('相关系数非零个数为:',np.sum(lasso.coef_ != 0))
mask = lasso.coef_ != 0  #返回一个相关系数是否为零的布尔数组
print('相关系数是否为零:',mask)

new_reg_data = data.iloc[:,:13].iloc[:,mask]  #返回相关系数非零的数据
new_reg_data = pd.concat([new_reg_data,data.y],axis=1)
new_reg_data.to_excel('new_reg_data.xlsx')

ここに画像の説明を挿入します

  • ゼロ以外の係数によれば、Lasso によって最終的に除外された変数は次のとおりです。
    ここに画像の説明を挿入します
  • 変数を選別したら、次のステップはモデリングを開始することです。

3. 財政収入予測モデルの確立

ここに画像の説明を挿入します

3.1 グレーモデル

  • グレー モデルの学習: https://blog.csdn.net/qq_42374697/article/details/106611556
def GM11(x0): #自定义灰色预测函数
    import numpy as np
    x1 = x0.cumsum() # 生成累加序列
    z1 = (x1[:len(x1)-1] + x1[1:])/2.0 # 生成紧邻均值(MEAN)序列,比直接使用累加序列好,共 n-1 个值
    z1 = z1.reshape((len(z1),1))
    B = np.append(-z1, np.ones_like(z1), axis = 1)    # 生成 B 矩阵
    Y = x0[1:].reshape((len(x0)-1, 1))    # Y 矩阵
    [[a],[u]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)    #计算参数
    f = lambda k: (x0[0]-u/a)*np.exp(-a*(k-1))-(x0[0]-u/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)
    return f, a, u, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率
data.index = range(1994, 2014)
data.loc[2014] = None
data.loc[2015] = None
# 模型精度评价
# 被lasso筛选出来的6个变量
l = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
for i in l:
    GM = GM11(data[i][list(range(1994, 2014))].values)
    f = GM[0]
    c = GM[-2]
    p = GM[-1]
    data[i][2014] = f(len(data)-1)
    data[i][2015] = f(len(data))
    data[i] = data[i].round(2)
    if (c < 0.35) & (p > 0.95):
        print('对于模型{},该模型精度为---好'.format(i))
    elif (c < 0.5) & (p > 0.8):
        print('对于模型{},该模型精度为---合格'.format(i))
    elif (c < 0.65) & (p > 0.7):
        print('对于模型{},该模型精度为---勉强合格'.format(i))
    else:
        print('对于模型{},该模型精度为---不合格'.format(i))

data[l+['y']].to_excel('data2.xlsx')

ここに画像の説明を挿入します
ここに画像の説明を挿入します

  • 予測値は以下の通りです。

ここに画像の説明を挿入します

3.2 ニューラルネットワーク予測モデル

  • 次に、履歴データを使用してニューラル ネットワーク モデルを構築します。
  • パラメータは誤差精度 107、学習回数 10,000、ニューロン数は Lasso 変数選択法で選択された変数数 8 に設定されています。
'''神经网络'''
data2 = pd.read_excel('data2.xlsx', index_col=0)
# 提取数据
feature = list(data2.columns[:len(data2.columns)-1]) # ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']
train = data2.loc[list(range(1994, 2014))].copy()
mean = train.mean()
std = train.std()
train = (train - mean) / std    # 数据标准化,这里使用标准差标准化
x_train = train[feature].values
y_train = train['y'].values

# 建立神经网络模型
from keras.models import Sequential
from keras.layers import Dense, Activation
import tensorflow

model = Sequential()
model.add(Dense(input_dim=8, units=12))
model.add(Activation('relu'))
model.add(Dense(input_dim=12, units=1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x_train, y_train, epochs=10000, batch_size=16)
model.save_weights('net.model')

ここに画像の説明を挿入します

  • モデルをトレーニングした後、1994 年から 2005 年をモデルに取り込んで予測を行います
# 将整个变量矩阵标准化
x = ((data2[feature] - mean[feature]) / std[feature]).values
# 预测,并还原结果
data2['y_pred'] = model.predict(x) * std['y'] + mean['y']
data2.to_excel('data3.xlsx')
  • 予測結果

ここに画像の説明を挿入します

  • 真の値と予測値の間の折れ線グラフをプロットする
import matplotlib.pyplot as plt
p = data2[['y', 'y_pred']].plot(style=['b-o', 'r-*'])
p.set_ylim(0, 2500)
p.set_xlim(1993, 2016)
plt.show()
plt.savefig('plot.png')  # 保存图像为 plot.png

ここに画像の説明を挿入します

  • 結果から、予測値は実際の値と基本的に一致しています。
  • ニューラル ネットワークの予測結果と比較するために、他の予測モデルを使用して結果を見てみましょう。
from sklearn.linear_model import LinearRegression # 线性回归
from sklearn.neighbors import KNeighborsRegressor # K近邻回归
from sklearn.neural_network import MLPRegressor # 神经网络回归
from sklearn.tree import DecisionTreeRegressor # 决策树回归
from sklearn.tree import ExtraTreeRegressor # 极端随机森林回归
from xgboost import XGBRegressor # XGBoot
from sklearn.ensemble import RandomForestRegressor # 随机森林回归
from sklearn.ensemble import AdaBoostRegressor  # Adaboost 集成学习
from sklearn.ensemble import GradientBoostingRegressor # 集成学习梯度提升决策树
from sklearn.ensemble import BaggingRegressor # bagging回归
from sklearn.linear_model import ElasticNet

from sklearn.metrics import explained_variance_score,\
mean_absolute_error,mean_squared_error,\
median_absolute_error,r2_score

models=[LinearRegression(),KNeighborsRegressor(),MLPRegressor(alpha=20),DecisionTreeRegressor(),ExtraTreeRegressor(),XGBRegressor(),RandomForestRegressor(),AdaBoostRegressor(),GradientBoostingRegressor(),BaggingRegressor(),ElasticNet()]
models_str=['LinearRegression','KNNRegressor','MLPRegressor','DecisionTree','ExtraTree','XGBoost','RandomForest','AdaBoost','GradientBoost','Bagging','ElasticNet']


data2 = pd.read_excel('data2.xlsx', index_col=0)
# 提取数据
feature = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
train = data2.loc[list(range(1994, 2014))].copy()
mean = train.mean()
std = train.std()
train = (train - mean) / std    # 数据标准化,这里使用标准差标准化
x_train = train[feature].values
y_train = train['y'].values
# 将整个变量矩阵标准化
x = ((data2[feature] - mean[feature]) / std[feature]).values


for name,model in zip(models_str,models):
    print('开始训练模型:'+name)
    model=model   #建立模型
    a = 'y_pred_'+ name
    data2[a] = model.fit(x_train,y_train).predict(x) * std['y'] + mean['y']
    df=data2[:-2]
    print('平均绝对误差为:',mean_absolute_error(df['y'].values,df[a].values))
    print('均方误差为:',mean_squared_error(df['y'],df[a]))
    print('中值绝对误差为:',median_absolute_error(df['y'],df[a]))
    print('可解释方差值为:',explained_variance_score(df['y'],df[a]))
    print('R方值为:',r2_score(df['y'],df[a]))
    print('*-*'*15)

ここに画像の説明を挿入します


環境設定

ここに画像の説明を挿入します

  • インストールが成功すると画像がポップアップします(そうでないと正常にインストールできません)

ここに画像の説明を挿入します

# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'

Spark Pans API インターフェース (理解)

  • データ処理には Spark が提供する pandsAPI インターフェイスを使用します
  • 処理操作は pands と同じですが、少し異なります
  • 大規模データの処理に適しています (≥1M)

Spark 上の Pandas API について学ぶ 10 分 (1)
文字列を含む Excel ファイルを読み取るときは、各列の型が正しいことを確認するために Spark DataFrame のスキーマを指定する必要があることに注意してください。
科学表記法をオフにすることはできません。

from pyspark.sql import SparkSession
import pyspark.pandas as ps

# 创建SparkSession
spark = SparkSession.builder.getOrCreate()

# 使用pandas读取Excel文件
pandas_df = ps.read_excel('./input/data.xlsx')
pandas_df = pandas_df.astype(str)

print(pandas_df)

ここに画像の説明を挿入します

公式ソース: Spark 上の Pandas APD

データ処理のための分散 + Spark

HDFS (分散ストレージ) へのファイルのアップロード

スパークデータ処理

from pyspark.sql import SparkSession

# 创建 SparkSession
spark = SparkSession.builder.appName("ReadData").getOrCreate()
# 读取数据文件
data = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("input/data.csv")
# 指定列名
columns = ["x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "y"]
data = data.toDF(*columns)
# 显示数据
data.show()

ここに画像の説明を挿入します

import seaborn as sns
import matplotlib.pyplot as plt

# 计算相关性矩阵
correlation_matrix = data.drop("label").toPandas().corr()

# 创建热力图
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm")
plt.title("Correlation Matrix")
plt.show()

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/Lenhart001/article/details/131452379