【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第1回目))
ほぼ、備忘録
サンプルデータで止まっている人向け、statsmodels(OLS)入門
statsmodelsで回帰のサンプルをやってみて、自分で作ったデータで止まっている人向けの入門記事です。
最近、データの予測をはじめまして、時系列の分析としてfacebookのprophetは、やってみたところ、用意したデータも少なく、精度はまだ未知数ですが、ともかくひとまず動きました。基本だと思われるstatsmodelsやsklearnで回帰を始めたところ、自分でデータを作ったところで、エラー等が出て止まっておりました。
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.架空の売上データの分析
スクリプトはjupyterで実行しました。
## !/usr/bin/env python
# coding: utf-8
# 架空の売上データ
# infile = './sales_item_tf.csv'
import pandas as pd
# import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
# csvファイル
infile = './sales_item_tf.csv'
df = pd.read_csv(infile ,usecols={'earnings' ,'customer'
,'fortified_sweet' ,'brown_spirits' ,'rum' ,'cocktail' ,'bar_food','cigar'})
df.columns
# 相関係数
df_corr = df.corr()
sns.heatmap(df_corr, vmax=1, vmin=-1, center=0)
# 説明変数Xに代入
X = df.loc[: ,'customer':'cigar']
X = X.astype(float)
# X.info()
df.columns
# 目的変数yにearnings'を代入
df
y = df['earnings']
y = y.astype(float)
# y = y.values
y
# 回帰モデルの呼び出し
model = sm.OLS(y, sm.add_constant(X))
# モデルの作成
results = model.fit()
# 結果の詳細を表示
print(results.summary())
# plot
# plt.plot(X)
2.構成を分割してみると
【1】ライブラリのインポートと、csvファイルの読み込み
# 架空の売上データ
# infile = './sales_item_tf.csv'
import pandas as pd
# import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
# csvファイル
infile = './sales_item_tf.csv'
df = pd.read_csv(infile ,usecols={'earnings' ,'customer'
,'fortified_sweet' ,'brown_spirits' ,'rum' ,'cocktail' ,'bar_food','cigar'})
df.columns
Index(['earnings', 'customer', 'fortified_sweet', 'rum', 'brown_spirits',
'cocktail', 'bar_food', 'cigar'],
dtype='object')
【2】説明変数(X)と目的変数(y)にデータを代入
# 説明変数Xに代入
X = df.loc[: ,'customer':'cigar']
X = df[['customer' ,'cigar']]
X = X.astype(float)
X.head()
customer fortified_sweet rum brown_spirits cocktail bar_food cigar
0 5.0 2.0 2.0 2.0 2.0 5.0 1.0
1 10.0 8.0 5.0 1.0 2.0 2.0 1.0
2 10.0 5.0 2.0 2.0 2.0 2.0 0.0
3 6.0 5.0 5.0 3.0 2.0 0.0 0.0
4 10.0 5.0 6.0 2.0 5.0 5.0
y
0 30000.0
1 60000.0
2 50000.0
3 30000.0
4 40000.0
...
56 50000.0
57 48000.0
58 40000.0
59 20000.0
60 20000.0
Name: earnings, Length: 61, dtype: float64
説明変数(X)と目的変数(y)をfloat型に変更しています。
私は、ここで止まりました。
モデルを適用する時にfloat型にしておかないとエラーになる様です。
【3】モデルの適用とサマリーの表示
# 回帰モデルの呼び出し
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.
ひとまず、モデルの適用が出来た様です。
少し長くなったので、2回に分けようと思います。
サマリーの結果を見るところから、始めようと思います。
一旦、終了、【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第1回目))でした。