0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-08

【初心者向け】回帰モデルの自前データで止まっている人向け(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で実行しました。

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

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)にデータを代入

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

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

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

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回目))でした。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1