【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第1回目))

### 【初心者向け】回帰モデルの自前データで止まっている人向け(statsmodels(第1回目))
ほぼ、備忘録

**<font color=blue>サンプルデータで止まっている人向け、statsmodels(OLS)入門</font>**

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で実行しました。

### 
 
```python: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ファイルの読み込み

```python:jupyer

# 架空の売上データ
# 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)にデータを代入

```python:jupyter

# 説明変数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

```

<font color=blue>説明変数(X)と目的変数(y)をfloat型に変更しています。</font>
私は、ここで止まりました。
**モデルを適用する時にfloat型にしておかないとエラーになる様です。**


【3】モデルの適用とサマリーの表示

```python:statsmodels

# 回帰モデルの呼び出し
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回目))でした。**