今回は第9回、ノック41〜ノック50までをやっていきたいと思います。
Python実戦データ分析100本ノックは、pandas の使い方やデータサイエンスを実戦的に学べる書籍なのでぜひ手に取ってみてください。
↓Python実践データ分析100本ノック
レビューでも実用的と高評価ですね。
リンク
引き続き、スポーツジムの会員データを使って顧客の行動を分析していきます。
4章では数ヶ月利用している顧客の来月の利用回数の予測を行いましたので、5章では退会を防ぐための原因究明を行うための顧客の退会予測を取り扱います。
import pandas as pd
customer = pd.read_csv(‘customer_join.csv’)
uselog_months = pd.read_csv(‘use_log_months.csv’)
for 文で当月と1ヶ月前の利用回数を集計します。
year_months = list(uselog_months[“年月”].unique())
uselog = pd.DataFrame()
for i in range(1, len(year_months)):
tmp = uselog_months.loc[uselog_months[“年月”]==year_months[i]]
tmp.rename(columns={“count”:”count_0″}, inplace=True)
tmp_before = uselog_months.loc[uselog_months[“年月”]==year_months[i-1]]
del tmp_before[“年月”]
tmp_before.rename(columns={“count”:”count_1″}, inplace=True)
tmp = pd.merge(tmp, tmp_before, on=”customer_id”, how=”left”)
uselog = pd.concat([uselog, tmp], ignore_index=True)
uselog.head()
退会者は退会月の前月に退会届を出しますので、その前月のデータを解析する事で退会申請を防ぐ目的があります。
from dateutil.relativedelta import relativedelta
exit_customer = customer.loc[customer[“is_deleted”]==1]
exit_customer[“exit_date”] = None
exit_customer[“end_date”] = pd.to_datetime(exit_customer[“end_date”])
for i in range(len(exit_customer)):
exit_customer[“exit_date”].iloc[i] = exit_customer[“end_date”].iloc[i] – relativedelta(months=1)
exit_customer[“年月”] = exit_customer[“exit_date”].dt.strftime(“%Y%m”)
uselog[“年月”] = uselog[“年月”].astype(str)
exit_uselog = pd.merge(uselog, exit_customer, on=[“customer_id”, “年月”], how=”left”)
print(len(uselog))
exit_uselog.head()
exit_uselog = exit_uselog.dropna(subset=[“name”])
print(len(exit_uselog))
print(len(exit_uselog[“customer_id”].unique()))
exit_uselog.head()
次に継続顧客のデータを作成します。
Name列が欠損しているデータを除去します。
次にcustomer_id が重複しているデータを除去します。
conti_customer = customer.loc[customer[“is_deleted”]==0]
conti_uselog = pd.merge(uselog, conti_customer, on=[“customer_id”], how=”left”)
print(len(conti_uselog))
conti_uselog = conti_uselog.dropna(subset=[“name”])
print(len(conti_uselog))
conti_uselog = conti_uselog.sample(frac=1).reset_index(drop=True)
conti_uselog = conti_uselog.drop_duplicates(subset=”customer_id”)
print(len(conti_uselog))
conti_uselog.head()
最後に退会顧客と継続顧客を結合しましょう。
継続と大会の両方が混ざったデータベースを作成しましょう。
predict_data = pd.concat([conti_uselog, exit_uselog],ignore_index=True)
print(len(predict_data))
predict_data.head()
在籍期間の作成をして、機械学習に備えましょう。
period列が作成されているのをを確認しましょう。
predict_data[“period”] = 0
predict_data[“now_date”] = pd.to_datetime(predict_data[“年月”], format=”%Y%m”)
predict_data[“start_date”] = pd.to_datetime(predict_data[“start_date”])
for i in range(len(predict_data)):
delta = relativedelta(predict_data[“now_date”][i], predict_data[“start_date”][i])
predict_data[“period”][i] = int(delta.years*12 + delta.months)
predict_data.head()
predict_data.isna().sum()
end_date, exit_data, count_1に欠損値がありますが、
count_1 に欠損値があるデータのみ除外します。
predict_data = predict_data.dropna(subset=[“count_1”])
predict_data.isna().sum()
お疲れ様でした。次回はいよいよ最終回です。ノック46−50をやっていきましょう。
目次に戻る方はこちらまで。
リンク
コメント