実践データ分析100本ノック(第3章-顧客の全体像を把握する-25~26)
2020年12月21日
#--ノック25------------------------------
# %%
print(uselog.head())
# log_id customer_id usedate
# 0 L00000049012330 AS009373 2018-04-01
# 1 L00000049012331 AS015315 2018-04-01
# 2 L00000049012332 AS040841 2018-04-01
# 3 L00000049012333 AS046594 2018-04-01
# 4 L00000049012334 AS073285 2018-04-01
# datetime型に変換
uselog["usedate"] = pd.to_datetime(uselog["usedate"])
# フォーマットを変換してカラム「年月」を生成
uselog["年月"] = uselog["usedate"].dt.strftime("%Y%m")
# カラム「年月」と「ユーザー」毎にグループ化してカウント
uselog_months = uselog.groupby(["年月", "customer_id"], as_index=False).count()
print(uselog_months.head())
# 年月 customer_id log_id usedate
# 0 201804 AS002855 4 4
# 1 201804 AS009013 2 2
# 2 201804 AS009373 3 3
# 3 201804 AS015315 6 6
# 4 201804 AS015739 7 7
# カラム名「log_id」を「count」に変換
uselog_months.rename(columns={"log_id": "count"}, inplace=True)
# カラム[usedate]を削除
del uselog_months["usedate"]
uselog_months.head()
# 年月 customer_id count
# 0 201804 AS002855 4
# 1 201804 AS009013 2
# 2 201804 AS009373 3
# 3 201804 AS015315 6
# 4 201804 AS015739 7
# %%
# 顧客毎に平均値、中央値、最大値、最小値を集計
uselog_customer = uselog_months.groupby("customer_id").agg(["mean", "median", "max", "min"])["count"]
print(uselog_customer.head())
# mean median max min
# customer_id
# AS002855 4.500000 5.0 7 2
# AS008805 4.000000 4.0 8 1
# AS009013 2.000000 2.0 2 2
# AS009373 5.083333 5.0 7 3
# AS015233 7.545455 7.0 11 4
# indexを再割り当て
uselog_customer = uselog_customer.reset_index(drop=False)
print(uselog_customer.head())
# customer_id mean median max min
# 0 AS002855 4.500000 5.0 7 2
# 1 AS008805 4.000000 4.0 8 1
# 2 AS009013 2.000000 2.0 2 2
# 3 AS009373 5.083333 5.0 7 3
# 4 AS015233 7.545455 7.0 11 4
#--ノック26------------------------------
# %%
# 曜日を生成
uselog["weekday"] = uselog["usedate"].dt.weekday
# 顧客、年月、曜日毎にグループ化し訪問回数をカウント
uselog_weekday = uselog.groupby(["customer_id", "年月", "weekday"], as_index = False).count()[["customer_id", "年月", "weekday", "log_id"]]
# カラム「log_id」を「count」に変更しデータフレームを更新
# ※引数inplaceをTrueにすると、元のDataFrameが変更される。新しいDataFrameは返されず、返り値はNone。
uselog_weekday.rename(columns={"log_id":"count"}, inplace=True)
print(uselog_weekday.head())
# customer_id 年月 weekday count
# 0 AS002855 201804 5 4
# 1 AS002855 201805 2 1
# 2 AS002855 201805 5 4
# 3 AS002855 201806 5 5
# 4 AS002855 201807 1 1
# %%
# 特定の曜日で最も訪問している回数をユーザーごとに算出
uselog_weekday = uselog_weekday.groupby("customer_id", as_index=False).max()[["customer_id", "count"]]
print(uselog_weekday.head())
# customer_id count
# 0 AS002855 5
# 1 AS008805 4
# 2 AS009013 2
# 3 AS009373 5
# 4 AS015233 5
# %%
# フラグを用意
uselog_weekday["routine_flg"] = 0
# 訪問回数が4を超えているユーザーのフラグを1にする
# ※「whereの第二引数」は「False」の要素の値としてNaNの代わりにその値が使われる
uselog_weekday["routine_flg"] = uselog_weekday["routine_flg"].where(uselog_weekday["count"]<4, 1)
print(uselog_weekday.head())
# customer_id count routine_flg
# 0 AS002855 5 1
# 1 AS008805 4 1
# 2 AS009013 2 0
# 3 AS009373 5 1
# 4 AS015233 5 1
ディスカッション
コメント一覧
まだ、コメントがありません