vol.10 ロジスティック回帰の練習
今回はロジスティック回帰の練習をしてみたので、
そこで分かったことや気づいたことを書いていきたいと思います。
使ったデータ
・入会日からの日数(4年未満のユーザーに限定)
・役職(position)
・職種(job)
・性別(gender)
・bizoceanの書式ダウンロード数(2017年1~3月)
分析の流れ
①役職、職種、性別は連続しないので真偽値に変換
②ダウンロード数データから、ダウンロードした(True)かしてないか(False)に変換
③1月2月のダウンロード状況と3月のダウンロード状況の関係を分析
①役職、職種、性別を真偽値に変換
まずユーザー情報、
これら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」という名前で括っておくと便利。
変換できた~
②ダウンロードしたかしてないかを1,0で表す
ここではbool関数を使うことによって、
ダウンロード数0をFalse、それ以外をTrueと表すことができます。
ichigatuDL_drop["DL_count1_bool"] = ichigatuDL_drop["DL_count1"].map(lambda x:bool(x))
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)
前回までの降水量と書式ダウンロード数の線形回帰よりは
比較的それっぽい分析の練習になったかなと思います。
本当は、上の緑色のグラフがきれいな曲線になればよかったのですが、なんか変な感じになってしまったので、データ量を増やしたり計算を少し変えたりすれば変わるかなーと思いました。
.