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

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

Vol.8 回帰分析の練習、線形回帰

今回は今やっている回帰分析の練習について書いていこうと思います。


今回使ったデータは
東京の降水量(2017年1月1日~3月31日) と、
東京のユーザーの書式ダウンロード数 です。

本当はロジスティック回帰の練習をしようと思っていたのですが、
そもそもロジスティック回帰は確率を予想する分析方法なので、
上のデータを使うのであれば降水量からダウンロード数を予想する線形回帰のほうがいいのではないかと思って、線形回帰の練習にしました。


降水量とダウンロード数はたぶん全く関係がないので
線形回帰でなく相関をとったほうがいい気もしますが、
とりあえず練習ということでやってみました。


①データの読み込み

東京の降水量のデータは
気象庁HPからCSV形式でダウンロードし、
「20170530work.rain」という名前で保存していました。

rain_df = 
pd.read_csv(‘20170530work.rain.csv', names=('date','rain'), encoding="SHIFT-JIS" )

f:id:yuka_nakayama:20170906121246p:plain
はじめにCSVファイルを読み込んだとき、日本語が文字化けしてしまったので
「encoding=”SHIFT-JIS”」で直しました。



ダウンロード数のデータはBigQueryにあるので
SQLでテーブルを作ってそのままデータフレームに変換しました。

下の表は勤務地が東京にあるユーザーによるダウンロード数合計を表します。
f:id:yuka_nakayama:20170906121334p:plain


②データの整理

⑴まず日付の表記を統一する

降水量のデータは2017/01/01なのに対し
ダウンロード数のデータは2017-01-01になっています。

のちに日付列で表をコンカットしたいので、表記を揃えます。

tokyo_dl_df.date = tokyo_dl_df.date.apply(lambda date: date.replace ("-", "/"))

lambdaを使うと無名関数を作ることができて、
(lambda X : y)で、Xが引数、yが戻り値になります。

「もとの日付データ」をX、「-を/に表記を変えた日付データ」をy と定義した無名関数にdate関数を適用して、表記を変えた日付データyを返します。

⑵日付以外の表記を統一する

ダウンロード数も降水量も
見たかんじだと数字で統一されているようですが、
ダウンロード数は数値(int64)、
降水量は文字列(str)で表されていました。

文字列だと分析ができないので数値に直します。

整数だけに変換するときはint、
小数も含めて変換したいときはfloatを使うようですが、
うまくできなかったのでpandasのto_numericを使いました。

⑶表をくっつける

恐らく、くっつけなくても分析はできるとは思うのですが、
こうしたほうが確しやすいかなと思ったのでconcatで表をくっつけます。

f:id:yuka_nakayama:20170906121437p:plain

ダウンロード数の表「tokyo_dl_df2」にも降水量の表「rain_df3」にも日付データがあって、
さっき表記を統一していたので、このようにコンカットすることができました。

③線形回帰(liner_Regression)

【自分メモ】

2種類のデータで線形回帰を行うとき、
データをXとyであらわす。y=aX+bの形にするので。
Xは独立変数、yは説明変数。
yをXで説明する。Xがyに(一方的に)影響している。

【自分メモおわり】


今回の分析では
ダウンロード数を降水量で説明したいので、次のように定義します。

f:id:yuka_nakayama:20170906121525p:plain
※reshapeはデータの標準化
標準化は、平均値の違う2変数を比較するときに使います。

あとから調べてみて気づいたのですが、
おそらく今回のような単回帰分析では標準化の必要はなく、
重回帰分析をするときにどの変数が結果にどれくらい影響しているか知るために使うようです。



やっとのことで線形回帰してみるとこんな感じになります。


・linear_modelというライブラリのLinearRegression関数を使って「clf」と定義

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

fit_intercept=Trueで切片が求められ、
normalize=Falseで説明変数を正規化しない、
copy_X=Trueでデータを複製してからつかう、
n_jobs=1で使うジョブの数を1にする。

説明変数の正規化も、おそらく単回帰ではなく重回帰に使うもので、
たとえば、単位がkmの変数とmmの変数があるとき、mmのほうは見た目の数字が大きく、結果への影響も大きく見えてしまうため、正規化する必要があるそうです。


・clfと定義したものにX(降水量)とy(書式ダウンロード数)を代入

clf.fit(X, y)


・回帰係数Rを求める

clf.coef_
  • 0.547 でした


・切片を求める

clf.intercept_

734.595 でした


以上より、東京のユーザーによる書式ダウンロード数を東京の降水量で説明する直線の式はy=-0.547X+734.595 となります。



f:id:yuka_nakayama:20170906121615p:plain

注)グラフ横軸は東京の降水量、
横軸は東京のユーザーによるダウンロード数



今回は降水量と書式ダウンロード数という全く相関関係がないデータを使っての回帰分析でした。
ただ、回帰分析の流れはだいたい分かったので、
データ量を増やしたり説明変数を増やしたり、応用していければなと思いました。



※ 降水量データ
出所)国土交通省気象庁ホームページ
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php#!table

※ 無名関数の説明
参考)LIFE WITH PYTHON「Pythonno無名関数」(2017年9月11日閲覧)
http://www.lifewithpython.com/2013/01/python-anonymous-function-lambda.html

※ 線形回帰の説明
参考)Pythonでデータサイエンス「scikit-earnで線形回帰(単回帰分析・重回帰分析)」(2017年9月11日閲覧)http://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0





.