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

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

vol.10 ロジスティック回帰の練習

今回はロジスティック回帰の練習をしてみたので、
そこで分かったことや気づいたことを書いていきたいと思います。


使ったデータ
・入会日からの日数(4年未満のユーザーに限定)
・役職(position)
・職種(job)
・性別(gender)
・bizoceanの書式ダウンロード数(2017年1~3月)


分析の流れ
①役職、職種、性別は連続しないので真偽値に変換
②ダウンロード数データから、ダウンロードした(True)かしてないか(False)に変換
③1月2月のダウンロード状況と3月のダウンロード状況の関係を分析



①役職、職種、性別を真偽値に変換

まずユーザー情報、
f:id:yuka_nakayama:20170911153509p:plain

これら3つは連続値ではないので、「get_dummies」で1か0に変換します。

変換の仕方は

pd.get_dummies(df, columns = 真偽値に変換したいカラム)

で、実際には

bool_columns = ["position", "job", "gender"]

member_df_dum = pd.get_dummies(member_df_drop, columns=bool_columns)

member_df_dum.head()

3つとも同じ処理をするので
あらかじめ「bool_columns」という名前で括っておくと便利。


f:id:yuka_nakayama:20170906161441p:plain
変換できた~

②ダウンロードしたかしてないかを1,0で表す

ここではbool関数を使うことによって、
ダウンロード数0をFalse、それ以外をTrueと表すことができます。

f:id:yuka_nakayama:20170906161515p:plain

ichigatuDL_drop["DL_count1_bool"] = ichigatuDL_drop["DL_count1"].map(lambda x:bool(x))


f:id:yuka_nakayama:20170906161600p:plain


2月と3月も同様にやって、ユーザー情報のデータフレームとコンカット。

member_dl = pd.concat([member_df_dum,ichigatuDL_drop,nigatuDL_drop,sangatuDL_drop],axis=1)

このとき、「inplace=True」にすると元のデータフレームに上書きされてしまって
DL_count列がなくなるので、
DL_count_boolもなくなってエラーになります。


あと、たくさんNaNが出てきたので「dropna」で消すのですが、
ユーザー情報のNaNを0で埋めて、
ダウンロード数のNaNをFalseで埋めてから
それでも残ってるNaNを消します。

NaNが残っていると回帰分析をするときに「数字じゃないと分析できないよ」というエラーがでてくるからです。

#ユーザー情報のNaNを0で埋める
member_dl.DL_count1.fillna(0, inplace=True)
member_dl.DL_count2.fillna(0, inplace=True)
member_dl.DL_count3.fillna(0, inplace=True)

#ダウンロードのNaN(つまりダウンロードしてない)をFalseで埋める
member_dl.DL_count1_bool.fillna(False, inplace=True)
member_dl.DL_count2_bool.fillna(False, inplace=True)
member_dl.DL_count3_bool.fillna(False, inplace=True)

#それでも残っているNaNをdropする
member_dl = member_dl.dropna()
③1月2月のダウンロード状況と3月のダウンロード状況の関係を分析

3月のダウンロード状況をdropする

X_df = member_dl.drop(["DL_count3_bool"],axis=1)

Xを標準化する、標準化することで平均値の違うデータを比較できるようになる
(Xはユーザー情報と1,2月のダウンロード状況)

sc= StandardScaler()
X_std = sc.fit_transform(X_df)

yは3月のダウンロード状況

y_df = member_dl["DL_count3_bool"]

scikit learnライブラリの「train_test_split」関数でトレーニングデータとテストデータに分割する

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_std, y_df, test_size=0.2, random_state=0)

X_std(Xを標準化したもの)とyを、それぞれ8:2に分割して、
X_stdの8をX_train、X_stdの2をX_test、
yの8をy_train、yの2をy_testと定義する。

random_state=Noneにすると毎回違う値で回帰分析ができて、
random_state=0だと毎回同じ値で分析することになります。


ロジスティック回帰

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
clf = LogisticRegression(n_jobs=-1, verbose=1)

clf.fit_transform(X_train, y_train)

f:id:yuka_nakayama:20170906161647p:plain

f:id:yuka_nakayama:20170911153801p:plain

前回までの降水量と書式ダウンロード数の線形回帰よりは
比較的それっぽい分析の練習になったかなと思います。
本当は、上の緑色のグラフがきれいな曲線になればよかったのですが、なんか変な感じになってしまったので、データ量を増やしたり計算を少し変えたりすれば変わるかなーと思いました。




.