vol.11 重回帰分析の練習
少し前にやった内容です。
降水量、気圧、気温のデータを使って、
降水量と気圧(説明変数)が気温(目的変数)にどれくらい影響しているか、線形回帰で分析しました。
まずデータの読み込み
weather = pd.read_csv("20170914.csv", encoding="SHIFT-JIS")
カラム名が長いので、適当に分かりやすく短くする
temp = weather.tempareture rain = weather.rain atm = weather.atmosphere weather_rename = weather.rename(columns = {"tempareture":"temp","atmosphere":"atm"})
説明変数のデータフレームを「X_df」、目的変数のデータフレームを「y_df」
X_df = weather_rename.drop("temp",axis=1) drop_columns = ["rain","atm"] y_df = weather_rename.drop(drop_columns,axis=1)
降水量と気圧は平均値が違うので標準化する、
気温も標準化しておく
std = StandardScaler() X_std = std.fit_transform(X_df) y_std = std.fit_transform(y_df)
〈①まずPandasでやってみる〉
import pandas as pd
model_ols = pd.ols(y=weather_rename["temp"],x=weather_rename.drop(["temp"],axis=1),intercept=True)
「ols」は「Ordinary Least Squares (Regression)」の略で、
最小二乗法のことです。つまり線形回帰のことを言います。
どうやらxとyで同じデータフレームにする必要があるっぽいので、
上記のように「X_df」「y_df」と分けなくて良かったです。
もともと別のデータフレームなのであれば、あらかじめconcatしておくと便利そう。
で、結果がこれです。
このモデルの数式は
[temp] = (-0.0778)[rain] + (-0.0125)[atm] + 18.51565
Numbere of Obserbations標本数は31
Number of Degress of Freedom自由度は3
R-square決定係数(寄与率)は0.0308なので
説明変数は目的変数の約3.1%しか説明できていない
Adj R-squared自由度調整済みの決定係数
Rmse平均標本二乗誤差
参考)https://mathwords.net/rmsemae
〇F検定 モデル全体の妥当性の検討
P-valueF値の有意確率は0.7859
→説明変数の係数が0である確率が78.6%なので、この分析で出したモデルは78.6%の確率で妥当とは言えない、と考えることができる。
〈②statsmodelを使ってやってみる〉
import statsmodels.api as sm
とりあえず
x = X_std x = sm.add_constant(x) y = y_std
と定義する。
「add_constant」でy切片も計算することができます。
statsmodelのolsに当てはめてみる。
model = sm.OLS(y, x) results = model.fit() results.summary()
標準化した数値をols関数に入れることができました。
で、結果がこれです。
このモデルの数式は
[temp] = (-0.1290)×[rain] + (-0.0410)×[atm] - 1.305e-15
Df Residuals(residual degrees of freedom)残差の自由度は28
Df Model(degree of freedom)自由度は2
R-squared決定係数は0.017
→説明変数は目的変数の1.7%しか説明できていないことになる
Adj.R-squared自由度調整済み決定係数は-0.053
〇F検定 モデル全体の妥当性の検討
Prob(F-statistic)有意確率は0.786
→結果は78.6%の確率で妥当だとは言えない
恐らく計算は間違っていないと思うのですが、
あまりいい結果が得られなかったので、
データを増やしたり説明変数を増やしたりすればもっといい結果になったかなと思います…。