以下の記事例では、実際のデモデータ「sate_demo_train.tsv」(下記サンプルデータ参照)を用いて、ユーザーや商品の行動分析を行う方法を解説します。
なお、今回のデータは以下のような構造になっています。
user_id | product_id | event_type | ad | time_stamp |
---|---|---|---|---|
U1127 | P1884 | 1 | -1 | 2021-01-07 14:48:14 |
U1460 | P202 | 1 | -1 | 2021-01-21 15:58:21 |
U861 | P1871 | 0 | -1 | 2021-01-05 19:32:46 |
U1295 | P2342 | 1 | -1 | 2021-01-08 04:53:36 |
U1131 | P33 | 1 | -1 | 2021-01-16 16:03:43 |
… | … | … | … | … |
以下のサンプルコードでは、pandasを利用してデータの前処理からユーザー単位、商品単位、そしてユーザー×商品の複合分析まで、各分析ステップを順に解説していきます。
データの前処理
まずは、データの読み込みと time_stamp
カラムの型変換を行います。
このデータはタブ区切り(TSV形式)のため、sep="\t"
を指定して読み込みます。
import pandas as pd
# sate_demo_train.tsv の読み込み(ファイルは同一ディレクトリに配置済みとする)
data = pd.read_csv("sate_demo_train.tsv", sep="\t")
# time_stampカラムをdatetime型に変換
ts = pd.to_datetime(data["time_stamp"])
data["time_stamp"] = ts
# 変換確認
print(data['time_stamp'].dtypes) # 出力例: datetime64[ns]
ユーザー毎の行動を時系列順に並べる
ユーザーごとにどのような行動が行われたのか、まずは時系列順に並べ替えます。
例えば、ユーザー U1127
の行動履歴を確認するコードは以下の通りです。
# ユーザーごとに行動を時系列順に並べる
data_u = data.groupby("user_id").apply(lambda x: x.sort_values("time_stamp"))
# ユーザー 'U1127' の行動履歴を表示
print(data_u.loc["U1127"])
ユーザーの行動分析
ユーザーが関わったユニークな商品の確認
例えば、ユーザー U1127
がどれだけの異なる商品に関わったかを調べます。
# ユーザー 'U1127' がかかわったユニークな商品IDの取得
products = data_u.loc['U1127']['product_id'].unique()
# ユニークな商品数を表示
print("ユーザー U1127 がかかわった商品数:", len(products))
ユーザーの行動(event_type)の頻度
行動の種類は以下の通りです:
- 0: カートに入れる
- 1: 詳細ページ閲覧
- 2: 広告クリック
- 3: 購入
以下のコードで、ユーザー U1127
の各行動の頻度を確認できます。
print("ユーザー U1127 の行動頻度:")
print(data_u.loc["U1127"]["event_type"].value_counts())
ユーザーが行動を起こした日数の確認
日時データから年月日部分だけを抽出し、ユニークな日数を確認します。
# ユーザー 'U1127' の行動したユニークな年月日を取得
ymd = data_u.loc["U1127"]["time_stamp"].apply(lambda x: x.date()).unique()
# 行動した日数を表示
print("ユーザー U1127 が行動した日数:", len(ymd))
商品毎の行動分析
次に、商品の観点から行動を確認します。
商品毎の行動を時系列順に並べる
各商品ごとにグループ化して、時系列順に並べ替えます。
# 商品ごとに行動を時系列順に並べる
data_p = data.groupby("product_id").apply(lambda x: x.sort_values("time_stamp"))
# 商品 'P1884'(例)の行動履歴を表示(ユーザー U1127 の記録が含まれる場合)
print(data_p.loc["P1884"])
商品に関わったユニークなユーザー数
例えば、商品 P1884
に対して関わったユーザー数を調べます。
users = data_p.loc["P1884"]["user_id"].unique()
print("商品 P1884 にかかわったユニークなユーザー数:", len(users))
商品に対する行動頻度の確認
print("商品 P1884 の各行動頻度:")
print(data_p.loc["P1884"]["event_type"].value_counts())
曜日別の行動数の確認
商品の行動日時から曜日情報を抽出し、曜日ごとの行動数を確認します。
print("商品 P1884 の曜日別行動数:")
print(data_p.loc["P1884"]["time_stamp"].apply(lambda x: x.day_name()).value_counts())
ユーザー×商品の行動分析
ユーザーと商品の組み合わせに注目し、詳細な行動パターンを確認します。
ユーザー×商品の行動を時系列順に並べる
# ユーザー×商品の行動を時系列順に並べる
data_up = data.groupby(["user_id", "product_id"]).apply(lambda x: x.sort_values("time_stamp"))
# 例:ユーザー 'U1127' と商品 'P1884' の行動履歴を表示
print(data_up.loc[("U1127", "P1884")])
ユーザー×商品の行動パターンの頻度
特定のユーザーと商品の組み合わせで、各行動の回数を確認します。
print("ユーザー 'U1127' と商品 'P1884' の行動パターン:")
print(data_up.loc[("U1127", "P1884")]["event_type"].value_counts())
購入パターンの詳細(広告経由の確認)
購入イベント(event_type == 3
)に注目し、ad
カラムの値で広告経由か否かを判定します。
例として、ユーザー U277
と商品 P2178
のデータ(実際に購入イベントがあるデータ)の場合です。
# ユーザー 'U277' と商品 'P2178' の行動データを取得
data_up_0 = data_up.loc[("U277", "P2178")]
# 購入イベント(event_typeが3)の条件
condition = data_up_0["event_type"] == 3
# 広告経由(ad=1 や 0 など)とそうでない場合の件数を確認
print("ユーザー 'U277' と商品 'P2178' の購入イベント(広告経由/非広告)の件数:")
print(data_up_0[condition]["ad"].value_counts())
ユーザー×商品の関わった日数の計算
最後に、特定のユーザーと商品の組み合わせで、関わった日数を確認します。
例として、ユーザー U277
と商品 P2178
の場合。
ymd = data_up.loc[("U277", "P2178")]["time_stamp"].apply(lambda x: x.date()).unique()
print("ユーザー 'U277' と商品 'P2178' が関わった日数:", len(ymd))
まとめ
今回の記事では、実際のデモデータ「sate_demo_train.tsv」を利用して、以下の手法を学びました:
- datetime型への変換
時系列解析に必要なtime_stamp
の整形 - groupby と apply を用いたデータの時系列ソート
ユーザー単位、商品単位、ユーザー×商品の複合分析の実践 - ユニーク値の抽出と頻度計算
行動パターンや関与期間、曜日別の行動分析 - 購入パターンの詳細分析
広告経由の購入など、より細かい要因の解析
これらの分析結果は、次回以降の【特徴量作成】や【推薦モデル構築】に向けた基盤となります。
各コード例を実際に動かしながら、データの持つ意味や分析手法に慣れてみてください。
以上が、sate_demo_train.tsvを活用したユーザーと商品の行動分析の一例です。
コメント