【第8回】pythonデータ分析100本ノックをやってみた (ノック36-40)

今回は第8回、ノック36〜ノック40までをやっていきたいと思います。
Python実戦データ分析100本ノックは、pandas の使い方やデータサイエンスを実戦的に学べる書籍なのでぜひ手に取ってみてください。

Python実践データ分析100本ノック レビューでも実用的と高評価ですね。

 

ノック36:翌月の利用回数予測を行うためのデータ準備をしよう

翌日の利用回数を予測する為、直近の6ヶ月の利用回数をデータとして

読み込ませます。まずは、顧客毎、年月毎にデータを整理します。

uselog["usedate"] = pd.to_datetime(uselog["usedate"])

uselog[“年月”] = uselog[“usedate”].dt.strftime(“%Y%m”)

uselog_months = uselog.groupby([“年月”,”customer_id”],as_index=False).count()

uselog_months.rename(columns={“log_id”:”count”}, inplace=True)

del uselog_months[“usedate”]

uselog_months.head()

for文を使って、過去6ヶ月分の利用データを取得して列に追加していきましょう。難しいですけど写経してもOKと思います。

year_months = list(uselog_months[“年月”].unique())

predict_data = pd.DataFrame()

for i in range(6, len(year_months)):

tmp = uselog_months.loc[uselog_months[“年月”]==year_months[i]]

tmp.rename(columns={“count”:”count_pred”}, inplace=True)

for j inrange(1, 7):

 

tmp_before = uselog_months.loc[uselog_months[“年月”]==year_months[i-j]]

del tmp_before[“年月”]

 

tmp_before.rename(columns={“count”:”count_{}”.format(j-1)}, inplace=True)

tmp = pd.merge(tmp, tmp_before, on=”customer_id”, how=”left”)

predict_data = pd.concat([predict_data, tmp], ignore_index=True)

predict_data.head()

欠損値を消すのが1行目

新たにindexを振り直すのが2行目の処理です。

predict_data = predict_data.dropna()

predict_data = predict_data.reset_index(drop=True)

predict_data.head()

ノック37:特徴となる変数を付与しよう

まず、start_dateれ列を追加します。

predict_data = pd.merge(predict_data, customer[[“customer_id”,”start_date”]], on=”customer_id”, how=”left”)

predict_data.head()

次にnow_date 列を作り、start_date との差から、会員期間を作成しましょう。

predict_data[“now_date”] = pd.to_datetime(predict_data[“年月”], format=”%Y%m”)

 

predict_data[“start_date”] = pd.to_datetime(predict_data[“start_date”])

 

from dateutil.relativedelta import relativedelta

 

predict_data[“period”] = None

 

for i in range(len(predict_data)):

 

delta = relativedelta(predict_data[“now_date”][i], predict_data[“start_date”][i])

 

predict_data[“period”][i] = delta.years*12 + delta.months

 

predict_data.head()

いい感じですね。

次は、いよいよ予測モデルを作ります!

ノック38:来月の利用回数予測モデルを作成しよう

sklearn の線形モデル( linear_model)で解析します。

predict_data = predict_data.loc[predict_data[“start_date”]>=pd.to_datetime(“20180401”)]

from sklearn import linear_model

 

import sklearn.model_selection

 

model = linear_model.LinearRegression()

 

X = predict_data[[“count_0″,”count_1″,”count_2″,”count_3″,”count_4″,”count_5″,”period”]]

 

y = predict_data[“count_pred”]

 

X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X,y)

 

model.fit(X_train, y_train)

最後に予測精度を計測します。

print(model.score(X_train, y_train))

 

print(model.score(X_test, y_test))

ノック39:モデルに寄与している変数を確認しよう

ここまで、count0-count5 と会員期間を変数としましたが、どのパラメータが

いちばん大きいか確認しましょう。

coef = pd.DataFrame({“feature_names”:X.columns, “coefficient”:model.coef_})

 

coef

結果、count0 つまり直近月の回数が最も関連する事がわかります。

ノック40:来月の利用回数を予測しよう

このモデルは、新たにデータを入れるとすぐに予測結果が表示されます。

顧客の利用データを入れると結果がでます。

x1 = [3, 4, 4, 6, 8, 7, 8]

 

x2 = [2, 2, 3, 3, 4, 6, 8]

 

x_pred = [x1, x2]

model.predict(x_pred)

最後に出力します。

uselog_months.to_csv(“use_log_months.csv”,index=False)

 

お疲れ様でした。これで4章は終了です。次回はいよいよ【第9回】5章:ノック41ー45に進んでいきたいと思います。

あと少しです!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

元薬局薬剤師。今は一般会社で働き、副業ライター(月5-6桁)しつつ自由に暮らす30代男性。英語学習(TOEIC920点)やライティング、マーケティング、メンタル術など、社会で必要とされつつ、個人で稼げるために必要なスキルを磨いて、その様子を発信しています。
詳しい自己紹介は(https://iroirotantan.com/ryoutaro/)で

コメント

コメントする

目次