vol.12 重回帰分析の練習、続き
今回も、少し前にやった内容です。
ビズオーシャンのユーザーの入会日、クリック状況、ダウンロード状況のでデータを使って、
入会日からの日数とクリック数(説明変数)が
ダウンロード数(目的変数)にどれくらい影響しているか、分析してみました。
uid:ユーザーID
duration:入会日からの日数
click_sum:クリック数
dl_sum:ダウンロード数
データはいずれも2017年の1月1日~8月31日までのもので、
その期間にクリックがあったユーザーに限定,
さらにランダムに200人に絞りました。
以前、別の分析の練習のときですが、
30万人分ぐらいのデータを使ったら、ひとつの処理に10分くらいかかってしまったので、
今回は200人にまで減らしました。
①データの読み込み
#入会日からの日数のデータ member_duration = pd.read_csv("20170919work.gz") member_duration.head()
#クリック数のデータ member_click = pd.read_csv("20171003click.gz") member_click.head()
#ダウンロード数のデータ member_dl = pd.read_csv("20171003dl.gz") member_dl.head()
②3つともuidをindexに指定する、200人抽出、join
#duration member_duration.index = member_duration["uid"] member_duration_drop = member_duration.drop("uid", axis=1) #click member_click.index = member_click["uid"] member_click_drop = member_click.drop("uid", axis=1) #download member_dl.index = member_dl["uid"] member_dl_drop = member_dl.drop("uid",axis=1) #join duration_click = member_duration_drop.join(member_click_drop) #click_sumにNaNが含まれるユーザーを排除 duration_click_drop = duration_click.dropna() duration_click_drop
#ランダム抽出 sample = np.random.permutation(len(duration_click_drop)) member_random = duration_click_drop.take(sample[:200])
#ランダム抽出したものにダウンロード数データをjoin member_join = member_random.join(member_dl_drop) member_join
#dl_sumにNaNがあったので、それは0で埋める member_fill = member_join.fillna(0)
③分析する
#Xを日数、クリック数とする X_df = member_fill.drop("dl_sum",axis=1)
#yをダウンロード数とする y_df = member_fill.drop(["duration","click_sum"],axis=1)
#Xとyを標準化する std = StandardScaler() >|| #Xの標準化 X_std = std.fit_transform(X_df)
#yの標準化 y_std = std.fit_transform(y_df)
import statsmodels.api as sm import matplotlib.pyplot as plt x = X_std x = sm.add_constant(x) y = y_std #add_constantにより定数項を求められる model = sm.OLS(y, x) results = model.fit() results.summary()
④結果の解釈
入会日からの日数とクリック数がダウンロード数にどれくらい影響するか、分析の結果の式は
[dl_sum] = (7.497e-05)[duration] + (0.8271)[click_sum] + (-8.327e-17) で、
説明変数の係数は目的変数への影響の大きさを表していて、
0に近いほど影響は小さく、1に近いほど影響は大きいと言えます。
[duration]の係数は7.497e-05なので、
入会からの日数はDL数にほとんど影響しない、
[click_sum]の係数は0.8271なので、
クリック数はDL数に影響する、と解釈できます。
ただ、決定係数が0.681なので、この式の当てはまりは68%ぐらい。
なので、入会日からの日数とクリック数だけでDL数を説明しようとするならば、
全体の68%しか説明できない。ということです。
説明変数を増やせば、当てはまり具合は100%に近づきます。
〈メモ〉
[95%Conf.Int.]95% confidence interval
95%信頼区間のこと
今回、2017年1月~8月にクリックしたユーザーから、200人だけを無作為に抽出し分析に使いました。
何回か無作為抽出をするとき、標本平均はそのたびに変わっていきますが、
何度も行うことで、(大数の法則により)母平均に近づいていきます。
95%信頼区間とは、
何度も(例えば100回)無作為抽出したとき、そのうちの95%(つまり95回)は
この区間に標本平均が含まれる、ということで、
正確にはズレているらしいのですが、ごく簡単に解釈するとすれば、
「95%の確率でその区間に母平均が含まれる」というような感じです。
つまり、
上と同じような分析を何度も繰り返せば、そのうちの95%では、
定数項は-0.079と0.079の間に含まれる、
[duration]の係数は-0.081と0.081の間に含まれる、
[click_sum]の係数は0.746と0.908の間に含まれる、
ということを意味します。