実践データ分析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

2020年12月21日