いっかくのデータサイエンティストをいく

1からプログラミングとデータサイエンスを独習したい

【統計学】ダミー変数(RとPython)

有斐閣統計学」第11章SECTION5になります。この本もそろそろ終わりに近づいてきました。

ダミー変数とは

男と女、花が咲いた・咲かなかった、上位100位とそれ以外など、2つのグループに分けることのできるものがあります。それを回帰分析の説明変数に入れたい場合、0と1を使います。上位100位=1、それ以外=0のように。このように2つに分けられるものを0と1で数値化し説明変数に入れたものをダミー変数といいます。

図でイメージ

こんな回帰分析の例を考えてみましょう。 「歌手の知名度オリコンランキングによってカラオケ演奏回数は増えるのかどうか?」 式にすると下のようになります。 (カラオケ演奏回数)= a + b×( 歌手の知名度)+c×(オリコン1位を獲得した否か) (オリコン1位を獲得した否か)がダミー変数です。 仮にa=1000、b=2000、c=3000だったとします。

すると

オリコン1位獲得しなかった曲(ダミー変数=0)=1000+2000×( 歌手の知名度

オリコン1位獲得した曲(ダミー変数=1)=1000+2000×( 歌手の知名度)+3000=4000+2000×( 歌手の知名度

とダミー変数=1の場合係数が増えることになりまず。下の図のようにオリコン1位獲得しなかった曲を青線とすると オリコン1位獲得した曲はオレンジ線のように上へ平行移動します。

f:id:imakoto0323:20180620164812p:plain

実装するデータ

データはおなじみの上記書籍のP60にあるJリーグの試合結果のデータを使用します。 ただし、勝数上位9位にダミー変数をつけています。上位9位=1、下位9位=0となっております。

Rで実装

#勝数
wins  <- c(22, 20, 20, 18, 17, 18, 13, 13, 13, 13, 13, 13, 13, 12, 12, 5, 6, 4)
#得点
score <- c(67, 84, 80, 60, 68, 62, 51, 47, 49, 50, 57, 43, 56, 46, 42, 32, 44, 38)
#dummy
dummy <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0)

#回帰分析
result <- lm(wins~score+dummy)
summary(result)

f:id:imakoto0323:20180620165153p:plain

Pythonで実装

import pandas as pd
import statsmodels.api as sm
#データ
df = pd.DataFrame({ 
                   'score':[67, 84, 80, 60, 68, 62, 51, 47, 49, 50, 57, 43, 56, 46, 42, 32, 44, 38],
                   'wins':[22, 20, 20, 18, 17, 18, 13, 13, 13, 13, 13, 13, 13, 12, 12, 5, 6, 4],
                   'dummy':[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                   })

#回帰分析
import statsmodels.api as sm
y = df["wins"]
X1 = df["score"]
X2 = df["dummy"]
X = pd.concat([X1, X2] ,axis=1)
mod = sm.OLS(y, sm.add_constant(X))
res = mod.fit()
res.summary() #結果を表示

f:id:imakoto0323:20180620170216p:plain