data.csv數據如下:
一、對data.csv數據進行分析與繪圖
讀取數據
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False inputfile = 'data/data/data.csv' # 輸入的數據文件 data = pd.read_csv(inputfile) # 讀取數據
1、描述性統計分析
description = [data.min(), data.max(), data.mean(), data.std()] # 依次計算最小值、最大值、均值、標准差 description = pd.DataFrame(description, index = ['Min', 'Max', 'Mean', 'STD']).T # 將結果存入數據框 print('描述性統計結果:\n',np.round(description, 2)) # 保留兩位小數
2、相關性分析
corr = data.corr(method = 'pearson') # 計算相關系數矩陣 print('相關系數矩陣為:\n',np.round(corr, 2)) # 保留兩位小數
3、繪制熱力圖
import matplotlib.pyplot as plt import seaborn as sns plt.subplots(figsize=(10, 10)) # 設置畫面大小 sns.heatmap(corr, annot=True, vmax=1, square=True, cmap="Blues") plt.title('相關性熱力圖') plt.show() plt.close
二、灰色預測+SVR預測
import sys sys.path.append('../code') # 設置路徑 import pandas as pd import matplotlib.pyplot as plt from sklearn.svm import LinearSVR inputfile = 'data/new_reg_data_GM11.xls' # 灰色預測后保存的路徑 data = pd.read_excel(inputfile) # 讀取數據 feature = ['x1', 'x4', 'x5', 'x6', 'x7', 'x8'] # 屬性所在列 data_train = data.iloc[0:20].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 # 標簽數據 linearsvr = LinearSVR() # 調用LinearSVR()函數 linearsvr.fit(x_train,y_train) x = ((data[feature] - data_mean[feature])/data_std[feature]).values # 預測,並還原結果。 data['y_pred'] = linearsvr.predict(x) * data_std['y'] + data_mean['y'] outputfile = 'data/new_reg_data_GM11_revenue.xls' # SVR預測后保存的結果 data.to_excel(outputfile) print('真實值與預測值分別為:\n',data[['y','y_pred']]) fig = data[['y','y_pred']].plot(subplots = True, style=['b-o','r-*']) # 畫出預測結果圖 plt.show()
2014年與2015年的預測結果如下:
三、ARIMA模型
import pandas as pd discfile = 'data/data/data.csv' data = pd.read_csv(discfile) # 時序圖 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 data.plot() plt.show() # 自相關圖 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data['y']).show() # 平穩性檢測 from statsmodels.tsa.stattools import adfuller as ADF print('原始序列的ADF檢驗結果為:', ADF(data['y'])) # 差分后的結果 D_data = data.diff().dropna() D_data.columns = ['x1','x2','x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'x11', 'x12', 'x13', 'y'] D_data.plot() # 時序圖 plt.show() plot_acf(D_data['y']).show() # 自相關圖 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data['y']).show() # 偏自相關圖 print('差分序列的ADF檢驗結果為:', ADF(D_data['y'])) # 平穩性檢測 # 白噪聲檢驗 from statsmodels.stats.diagnostic import acorr_ljungbox print('差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data['y'], lags=1)) # 返回統計量和p值 from statsmodels.tsa.arima_model import ARIMA # 定階 data['y'] = data['y'].astype(float) pmax = int(len(D_data)/10) # 一般階數不超過length/10 qmax = int(len(D_data)/10) # 一般階數不超過length/10 bic_matrix = [] # BIC矩陣 for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: # 存在部分報錯,所以用try來跳過報錯。 tmp.append(ARIMA(data['y'], (p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 從中可以找出最小值 p,q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print('BIC最小的p值和q值為:%s、%s' %(p,q)) model = ARIMA(data['y'], (p,1,q)).fit() # 建立ARIMA(0, 1, 1)模型 print('模型報告為:\n', model.summary2()) print('預測未來2年,其預測結果、標准誤差、置信區間如下:\n', model.forecast(5))
時序圖:
自相關圖:
差分后的時序圖、自相關圖、偏自相關圖:
模型報告如下:
灰色預測與SVR預測效果比ARIMA預測效果好