My Notes

統計学とかR(R言語)とかPython3の覚え書きとか走り書きとか。 座右の銘にしたい: All work and no play makes Jack a dull boy.

Python3(pandas, StatsModels)で、単回帰分析。regression.linear_model.OLS()

Python3コード

#!/usr/bin/env python3


"""(docstring)
"""


# 使用したデータは『マンガでわかる統計学 [回帰分析編]』第2章


import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import statsmodels.api as sm
# statsmodels.regression.linear_model.OLS


def main():
    """(docstring)
    """

    # macOSやOS Xで文字化けするなら。
    font = {'family' : 'Osaka'}

    dat = {'最高気温': [29, 28, 34, 31, 25,
                      29, 32, 31, 24, 33,
                      25, 31, 26, 30],
           'アイスティー': [77, 62, 93, 84, 59,
                          64, 80, 75, 58, 91,
                          51, 73, 65, 84]}

    df = pd.DataFrame(dat, columns = ['最高気温', 'アイスティー'])
    print('df')
    print('')
    print(df)
    print('')

    # x, yとしたほうが普通だと思うが。
    # x = df.ix[:, '最高気温']
    # y = df.ix[:, 'アイスティー']

    # 定数項を追加。列名 const
    # (sm.add_constant()がちょっとハマりどころかも。
    # 以下、公式から引用。
    # "exog:
    #        ...An intercept is not included by default and should be added by the user. See statsmodels.tools.add_constant."
    #
    # "Notes
    #
    # No constant is added by the model unless you are using formulas."
    # )。
    X = sm.add_constant(df.ix[:, '最高気温'])
    print(X)
    print('')

    # statsmodels.regression.linear_model.OLS()
    # (UserWarning: kurtosistest: ... (警告出ても気にしないでとりあえずいいと思う))。
    res = sm.OLS(df.ix[:, 'アイスティー'], X).fit()
    print(res)
    print('')

    print(res.summary())
    print('')

    print(res.params)
    print('')

    # 散布図と回帰直線
    plt.scatter(df.ix[:, '最高気温'], df.ix[:, 'アイスティー'], color='blue')
    plt.plot(df.ix[:, '最高気温'], res.predict(X), color='red')
    # 回帰直線は自分で計算式を書いても描ける。
    # b, a = res.params # 切片と回帰係数
    # print(b, a)
    # 第1引数にx, 第2引数に y = a*x+b の計算式部分。
    # plt.plot(x, a*x+b, color='red')
    # y = a*x+b
    # で代入して、yを第2引数にしてもいい。
    # plt.plot(x, y, color='red')
    plt.xlabel('最高気温')
    plt.ylabel('アイスティーの注文数')
    plt.show()


if __name__ == '__main__':
    main()


# Fitting models using R-style formulas
# statsmodels.formula.api as smf
# を使ったほうが楽かなどうかな。

出力

df

    最高気温  アイスティー
0     29      77
1     28      62
2     34      93
3     31      84
4     25      59
5     29      64
6     32      80
7     31      75
8     24      58
9     33      91
10    25      51
11    31      73
12    26      65
13    30      84

    const  最高気温
0     1.0    29
1     1.0    28
2     1.0    34
3     1.0    31
4     1.0    25
5     1.0    29
6     1.0    32
7     1.0    31
8     1.0    24
9     1.0    33
10    1.0    25
11    1.0    31
12    1.0    26
13    1.0    30

<statsmodels.regression.linear_model.RegressionResultsWrapper object at 0x10c6ae5f8>

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 アイスティー   R-squared:                       0.823
Model:                            OLS   Adj. R-squared:                  0.808
Method:                 Least Squares   F-statistic:                     55.61
Date:                Sun, 13 Aug 2017   Prob (F-statistic):           7.66e-06
Time:                        09:43:04   Log-Likelihood:                -43.174
No. Observations:                  14   AIC:                             90.35
Df Residuals:                      12   BIC:                             91.63
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        -36.3612     14.687     -2.476      0.029     -68.362      -4.360
最高気温           3.7379      0.501      7.457      0.000       2.646       4.830
==============================================================================
Omnibus:                        5.158   Durbin-Watson:                   1.669
Prob(Omnibus):                  0.076   Jarque-Bera (JB):                1.433
Skew:                          -0.180   Prob(JB):                        0.488
Kurtosis:                       1.474   Cond. No.                         282.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

const   -36.361233
最高気温      3.737885
dtype: float64

散布図と回帰直線のスクリーンショット

f:id:my_notes:20170813094713p:plain

参考文献

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 回帰分析編