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

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

vol.9 線形回帰の練習・続き

前回の練習は


データ…2017年1月1日~3月31日の
    東京の降雨量と、東京にいるユーザーのダウンロード数


分析の流れ…東京にいるユーザーのIDのデータテーブルと
      そのユーザーによる3か月分のダウンロード数のデータテーブルをJOIN
       ↓
      降雨量データの読み込み
       ↓
      降雨量データとダウンロード数データをコンカット         
       ↓
      線形回帰

という感じでした。

降水量によって書式ダウンロード数は変わるのか、回帰分析してみたのですが、
直線の傾きが横軸とほぼ平行だったのと、
データがかなりバラついていたので、改めてですが降水量による影響は無しと分かりました。



今回はその延長で、


データ…2016年9月1日~2017年3月31日の
    関東圏(1都6県)の降雨量と、そこにいるユーザーのダウンロード数


分析の流れ…東京にいるユーザーのIDのデータテーブルと
      そのユーザーによる7か月分のダウンロード数データテーブルをJOIN
       ↓
      東京の降雨量データの読み込み
       ↓
      降雨量データとダウンロード数データをコンカット
       ↓
      (その他6県も同様に)
       ↓
      7つのデータフレームを縦にコンカット
       ↓
      線形回帰

という感じです。


これをやって新しく覚えたことを
メモみたいに書いていきます。

〇データフレームを縦にコンカット

f:id:yuka_nakayama:20170906122339p:plain

はじめ、


赤丸のところ(ダウンロード数のcolumns名)を
「東京」や「千葉」などと個別に設定していたのですが、
それだと横にコンカットされてNaNだらけになります。

縦にコンカットするにはcolumns名が同じである必要があるらしく、
「count」に統一しました。
(あとで詳しく書きますが、「count」じゃない名前にすればよかったです)


どのみち分析するときには県名とか関係なくなるので、
最初から同じcolumns名にしたほうがすっきりするような気もします。

f:id:yuka_nakayama:20170906122404p:plain


1都6県×7か月分で全部で1483行あって、
真ん中の列がcount(ダウンロード数)、右の列がrain(降雨量)です。


*オレンジ色下線部

DL_rain.reset_index(drop=True, inplace=True)

分析のときは日付データも要らないので消しました。

indexは、消すというよりも、
「indexを降り直して、日付を普通の列に戻して、
その日付の列をdropする」感じです。

()内、drop=Falseだと普通の列に戻ったやつは消えません。


*青色下線部

pd.set_option("display.max_rows", x)


行数が多いと省略で表示されてしまうのですが、
これで最大x行まで表示できるようになります。


途中、データにNaNが混ざっている疑惑があって、
これくらいなら目視で確認できるだろうということで
最大1500行表示できるようにしました。


〇(目視でなく、)NaNがないか確認する

DL_rain.isnull().values.any()

実行したらFalseと表示されたので
NaNは無かったということです…

〇ダウンロード数のcolumns名を「count」以外にしたほうがよかった


説明変数Xを降雨量、従属変数yをダウンロード数にして、
線形回帰にあてはめようとしたら、
データの型がだめみたいなそんな感じのエラーが出ました。


降雨量データもダウンロード数データも数字なはずなのに???となったんですが、

y = DL_rain.count

で実行しようとしていて、
それだと「count」がデータフレームのcolumns名としてではなく
pandasのcount関数として認識されているとのことでした。

[“”]でとじるとcolumns名の「count」を指定できて、
データ型を確認するとちゃんとintegerになってます。




これで線形回帰ができるようになりました。

from sklearn import linear_model
clf = linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)

DL_rain_fit = clf.fit(X, y)

import matplotlib.pyplot as plt

plt.scatter(X, y)
plt.plot(X, clf.predict(X))


f:id:yuka_nakayama:20170906122645p:plain

回帰係数…clf.coef_ で 0.96、
切片…clf.intercept_  で 790.89  
直線の式は y=0.96x+790.89 です。


前回も書きましたが、
降雨量とダウンロード数には因果関係が無いので、
分析方法としては、ほんとうは線形回帰でなく相関のほうが適しています。


もし、降水量と書式ダウンロード数に因果関係がある場合、
相関係数と回帰係数は1に近づきます。
が、「雨が降ったら書式をダウンロードしたくなる」ということを論理的に説明しなければいけなくなります。
実際、雨が降っても降らなくても、書式が必要ならダウンロードするし、不要であればダウンロードしないので、これらには因果関係が無いということができます。

参考)リクルートマネジメントソリューションズ 連載・コラム「『回帰分析』で因果関係を分析する」(2017年9月11日閲覧)
https://www.recruit-ms.co.jp/issue/column/0000000564/



.