統計分析は、今まで紙ベースで勉強してきたが、Pythonでどのように表現していくか、『Python統計分析&機械学習マスタリングハンドブック』をやりながら、統計の基礎知識を時々復習していきたいと思う。このシリーズは基本、私自分用のメモとして記録していく。
今日は線形単回帰分析。
1.線形単回帰モデルとは?
単一の説明変数を持つ線形回帰モデルである。
つまりy=ax+b。
ここでは、
yは目的変数、xは説明変数。
aは回帰係数(直線の傾き)、bは切片(xが0の時のyの値)。
aとbは、最小二乗法で推測される。
2.Pythonで単一回帰線形モデルの構築
まずは必要なライブラリーを導入する。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
今回は架空のある町の花屋さんの一年間毎週の売上とその週の平均気温の関係を調べたい。
まずは、そのデータを読み込む。
df=pd.read_csv(".../test.csv")
df.head()
次に、線形単回帰モデルの回帰係数と切片を計算する関数を定義する。
def lineareg (x, y):
n = len(x)
a=(np.dot(x,y)-(y.sum()*x.sum())/n)/(np.dot(x,x)-x.sum()**2/n)
b=(y.sum()-a*x.sum())/n
return a, b
売上と気温のデータを配列で抽出し、回帰係数と切片を計算してみる。
sales = df['Sales']
temperature = df['Temp']
a,b = lineareg(temperature, sales)
print(a, b)
⇒-1107.703842273166 154623.23270556156
散布図を描画し、回帰直線を描いてみる。
plt.scatter(temperature, sales)
plt.plot(temperature, a*temperature+b, color='red')
線形関係が弱そうだね。
決定係数を計算してみよ。
y_pred = a*temperature+b
1-((sales-y_pred)**2).sum()/((sales-sales.mean())**2).sum() #R^2
⇒0.040412234968837946
相関関係も計算してみる。
corr= df.corr()
corr
つまり、この店では、毎週の売上と毎週の平均気温との関係が弱いと分かった。気温に左右されない商売になっているね。
もし、本当にこの店の売上を予測できるモデルに作りたければ、どのような案が考えられるか?
①そもそも1週間の範囲は広すぎるため、毎日の売上とその日の温度の相関関係も調べたほうがいいかもしれない。
②温度以外に、他の外部影響要素はないか?eg. 天気、休日・祝祭日、お店の立地
その場合、他の回帰モデルの利用も検討すべきでは?
③内部影響要素はないか?eg.各品種の花の売上
...
色々な案が考えられると思う。
今日は線形単回帰モデルを簡単に復習してみた。