【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第2回目))
ほぼ、備忘録
サンプルデータで止まっている人向け、statsmodels(OLS)入門
statsmodelsで回帰のサンプルをやってみて、自分で作ったデータで止まっている人向けの入門記事です。
このスクリプトで想定しているケースは、架空の飲食店(バーやスカイラウンジーの想定)で、商品の大分類や客単価、来店人数等が記録された架空の売上データがあったとして、売上が多い日には何か傾向があるのだろうか?という設定です。
【環境】
Linux: debian10.3
python: 3.7.3
pandas: 1.0.3
statsmodels: 0.11.1
jupyter-lab: 2.1.0
以下の様な、csvファイルがあったとして
Date,earnings,customer,earnings_customer,fortified_sweet,rum,brown_spirits,mojito_rebjito,cocktail,bar_food,cigar
2020-03-01,30000,5,6000,2,2,2,3,2,5,1
【1】モデルの適用とサマリーの表示(前回の続き)
# 回帰モデルの呼び出し
model = sm.OLS(y, sm.add_constant(X))
# モデルの作成
results = model.fit()
#結果の詳細を表示
print(results.summary())
OLS Regression Results
==============================================================================
Dep. Variable: earnings R-squared: 0.930
Model: OLS Adj. R-squared: 0.921
Method: Least Squares F-statistic: 100.8
Date: Sat, 09 May 2020 Prob (F-statistic): 2.50e-28
Time: 01:09:38 Log-Likelihood: -618.49
No. Observations: 61 AIC: 1253.
Df Residuals: 53 BIC: 1270.
Df Model: 7
Covariance Type: nonrobust
===================================================================================
coef std err t P>|t| [0.025 0.975]
-----------------------------------------------------------------------------------
const -435.1552 2434.515 -0.179 0.859 -5318.173 4447.863
customer 5103.4245 617.184 8.269 0.000 3865.511 6341.338
fortified_sweet 844.1247 543.874 1.552 0.127 -246.747 1934.997
rum -389.6465 440.184 -0.885 0.380 -1272.545 493.252
brown_spirits 1267.2019 581.664 2.179 0.034 100.532 2433.872
cocktail -1766.9369 568.908 -3.106 0.003 -2908.022 -625.852
bar_food 74.3759 514.091 0.145 0.886 -956.760 1105.512
cigar 4420.0626 599.323 7.375 0.000 3217.972 5622.153
==============================================================================
Omnibus: 16.459 Durbin-Watson: 1.864
Prob(Omnibus): 0.000 Jarque-Bera (JB): 24.107
Skew: 0.971 Prob(JB): 5.83e-06
Kurtosis: 5.390 Cond. No. 37.4
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
サマリーの一部を見ると
#結果の詳細を表示
print(results.summary())
サマリーの一部
R-squared: 0.930
Adj. R-squared: 0.921
AIC: 1253.
coef std err t P>|t| [0.025 0.975]
-----------------------------------------------------------------------------------
customer 5103.4245 617.184 8.269 0.000 3865.511 6341.338
fortified_sweet 844.1247 543.874 1.552 0.127 -246.747 1934.997
rum -389.6465 440.184 -0.885 0.380 -1272.545 493.252
brown_spirits 1267.2019 581.664 2.179 0.034 100.532 2433.872
cocktail -1766.9369 568.908 -3.106 0.003 -2908.022 -625.852
bar_food 74.3759 514.091 0.145 0.886 -956.760 1105.512
cigar 4420.0626 599.323 7.375 0.000 3217.972 5622.153
サマリーが表示されたら、まず見るところが、あるという。
「R-squared 」決定係数(1に近い程、精度が高い)
「Adj. R-squared」 自由度調整済み決定係数(説明変数が多い時の決定係数)
・このケースでは、説明変数が多いので、この値で判断しようと思います。
「AIC」 どの程度モデルの当てはまっているか?(小さい程、精度が高い。)
・数値が大きすぎる(精度が低い)様です
「coef」回帰係数(大きい程、全体に与える影響が大きい)
・これで見ると、「customer」や「cigar」が大きな影響を与える様です。
「>|t|」(小さい程(基準として、0.05未満)、変数の影響が偶然でない可能性が高い)
・これで見ると、「customer」や「cigar」に加えて、「cocktail」の値が小さいのは、偶然では無いという事の様です。
ここまでのサマリーを見ると、説明変数が多い様です。
「customer」や「cigar」が売上に大きな影響を与えるという事がいえそうです。
回帰係数の出力を見ると、ほぼ想定通りの結果といえると思います。
「AIC」の値を見ると、説明変数が多く精度が低い様です。
説明変数を減らし、再度、分析をやってみようと思います。
再分析の結果は、別の機会に更新しようと思います。
グラフだけ先に投稿しておくと、凡例がありませんが、グラフを見ると、青っぽい線が「customer(ゲストの来店人数)」、赤っぽい線が「cigar(cigarの提供)」の動きです。
以上、【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第2回目))でした。