質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

GLM(一般化線形モデル)による予測値をグラフ化したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 587

masabassii94

score 10

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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()


GLMによるフィッティング

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/05 23:23

    ありがとうございます
    Rについても勉強してみます

    キャンセル

0

拝見したところおかしなところは見つかりませんでした。よろしいかなと思います。

【解説あり】Pythonで一般化線形モデル(GLM)を実装する方法
こちらの記事、おそらく私は初見ですが分かりやすい記事ですね。

これだけですとなんなので、(私はRから入ったので)Rを用いた解説がメインですが考え方などが非常に参考になるブログ(R界では有名)がありますのでご参考まで

統計勉強会の資料~二日目 一般化線形モデル編~

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る