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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3680閲覧

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

masabassii94

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/04 22:02

前提・実現したいこと

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

上記により以下のようなグラフが作成されました。
作成したグラフ

解析表は以下の通りになります。
解析表

この手法で誤りがないかご教授いただければ幸甚です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

正しいか確認する方法はいくつかありますが

  • 素性の分かるダミーデータを作って実験する
  • 複数の手法を比較する(全部間違っている可能性はありますが)

Rなら1行の処理なのでpythonと結果を比較してみるのはどうでしょうか?

R

1signate24 <- read.csv("train.csv", fill=F) 2out <- glm(y ~ temperature, data=signate24, family=poisson) 3summary(out)

結果

terminal

1$ Rscript hoge.R 2 3Call: 4glm(formula = y ~ temperature, family = poisson, data = signate24) 5 6Deviance Residuals: 7 Min 1Q Median 3Q Max 8-5.6407 -1.8310 -0.3937 1.1682 7.9584 9 10Coefficients: 11 Estimate Std. Error z value Pr(>|z|) 12(Intercept) 4.9849247 0.0166788 298.88 <2e-16 *** 13temperature -0.0287788 0.0008711 -33.04 <2e-16 *** 14--- 15Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 16 17(Dispersion parameter for poisson family taken to be 1) 18 19 Null deviance: 2511.7 on 206 degrees of freedom 20Residual deviance: 1412.3 on 205 degrees of freedom 21AIC: 2706 22 23Number of Fisher Scoring iterations: 4

[追記]
書き忘れましたが時系列のプロットの前に temperature vs y のグラフの上にフィッティングした線を是非描いて下さい。フィッティングの正しさの判断はグラフが強力です。

R

1library('ggplot2') 2png("glm.png") 3p <- ggplot(data=signate24,aes(x=temperature, y=y)) + geom_point() + 4 geom_line(aes(y = out$fitted.values), color='red') 5print(p) 6dev.off()

GLMによるフィッティング

投稿2020/07/05 09:20

編集2020/07/05 13:40
yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masabassii94

2020/07/05 14:23

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

0

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

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

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

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

投稿2020/07/05 09:05

aokikenichi

総合スコア2210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問