GLM(一般化線形モデル)による予測値をグラフ化したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 587
前提・実現したいこと
Python, 統計学ともに初心者の者です。
この度、仕事でGLMを用いた解析が必要となり、勉強している最中です。
SIGNATEのお弁当箱需要データ(https://signate.jp/competitions/24)を用いて
GLMで解析し、実測データと予測値をグラフ化してみることにしました。
以下のウェブサイトを参考にしました。
(https://tech-diary.net/generalized-linear-model-with-python/)
発生している問題・エラーメッセージ
見よう見まねでやってみるとグラフ化できましたが、
これで合っているのか自信がありません。
この手法で誤りがないかご教授頂ければ幸いです。
該当のソースコード
# 1. 必要なライブラリの読み込み
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
# 2. 使用するデータの読み込み
df = pd.read_csv("Desktop/Pyhton memo/trainmoji.csv", encoding="shift-jis")
df.head()
# 3. smf.glmで使うformula(線形予測子)とfamily(確率分布)を設定する
y = df['y']
x = pd.get_dummies(df[['temperature']]) # 説明変数
family = sm.families.Poisson()
x = sm.add_constant(x)
# 4. 先ほどの設定値を使って一般化線形モデルを作成
model = sm.GLM(y, x, family=family)
# 5. 作成したモデルを学習させる
result = model.fit()
# 6. 結果の表示
result.summary()
# 7.グラフの作成
import matplotlib.pyplot as plt
pred = result.predict(x)
df['pred'] = pred
df.plot(y=['y','pred'], x='datetime', figsize=(30,5), title='GLM')
plt.savefig("Desktop/jupyter/GLMotehon.png")
この手法で誤りがないかご教授いただければ幸甚です
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
正しいか確認する方法はいくつかありますが
- 素性の分かるダミーデータを作って実験する
- 複数の手法を比較する(全部間違っている可能性はありますが)
Rなら1行の処理なのでpythonと結果を比較してみるのはどうでしょうか?
signate24 <- read.csv("train.csv", fill=F)
out <- glm(y ~ temperature, data=signate24, family=poisson)
summary(out)
結果
$ Rscript hoge.R
Call:
glm(formula = y ~ temperature, family = poisson, data = signate24)
Deviance Residuals:
Min 1Q Median 3Q Max
-5.6407 -1.8310 -0.3937 1.1682 7.9584
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.9849247 0.0166788 298.88 <2e-16 ***
temperature -0.0287788 0.0008711 -33.04 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 2511.7 on 206 degrees of freedom
Residual deviance: 1412.3 on 205 degrees of freedom
AIC: 2706
Number of Fisher Scoring iterations: 4
[追記]
書き忘れましたが時系列のプロットの前に temperature vs y のグラフの上にフィッティングした線を是非描いて下さい。フィッティングの正しさの判断はグラフが強力です。
library('ggplot2')
png("glm.png")
p <- ggplot(data=signate24,aes(x=temperature, y=y)) + geom_point() +
geom_line(aes(y = out$fitted.values), color='red')
print(p)
dev.off()
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
拝見したところおかしなところは見つかりませんでした。よろしいかなと思います。
【解説あり】Pythonで一般化線形モデル(GLM)を実装する方法
こちらの記事、おそらく私は初見ですが分かりやすい記事ですね。
これだけですとなんなので、(私はRから入ったので)Rを用いた解説がメインですが考え方などが非常に参考になるブログ(R界では有名)がありますのでご参考まで
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/07/05 23:23
Rについても勉強してみます