ビズオーシャンでのインターン日記

プログラミング未経験の文系大学生がインターンシップで頑張る日記です

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

f:id:yuka_nakayama:20171226105609p:plain

#クリック数のデータ

member_click = pd.read_csv("20171003click.gz")
member_click.head()

f:id:yuka_nakayama:20171226105623p:plain

#ダウンロード数のデータ

member_dl = pd.read_csv("20171003dl.gz")
member_dl.head()

f:id:yuka_nakayama:20171226105633p:plain


②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

f:id:yuka_nakayama:20171226105750p:plain

#ランダム抽出

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

f:id:yuka_nakayama:20171226105816p:plain

#dl_sumにNaNがあったので、それは0で埋める

member_fill = member_join.fillna(0)


③分析する

#Xを日数、クリック数とする

X_df = member_fill.drop("dl_sum",axis=1)

f:id:yuka_nakayama:20171226105924p:plain

#yをダウンロード数とする

y_df = member_fill.drop(["duration","click_sum"],axis=1)

f:id:yuka_nakayama:20171226105955p:plain

#Xとyを標準化する
std = StandardScaler()
>||
#Xの標準化

X_std = std.fit_transform(X_df)

f:id:yuka_nakayama:20171226110013p:plain

#yの標準化

y_std = std.fit_transform(y_df)

f:id:yuka_nakayama:20171226110027p:plain

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

f:id:yuka_nakayama:20171226110047p:plain




④結果の解釈

入会日からの日数とクリック数がダウンロード数にどれくらい影響するか、分析の結果の式は
[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の間に含まれる、
ということを意味します。

参考)http://d.hatena.ne.jp/kiwamu_i/20121203/1354520561