本分析は、仮想の音楽ストリーミングプラットフォーム「HarmonyStream」(Spotifyや网易云音乐に相当)のユーザー行動ログを対象として、解約(チャーン)リスクを予測する機械学習パイプラインをApache Spark上に構築するものです。データ期間は2016年10月1日から12月1日までの3か月間で、JSON形式のイベントログから226名のアクティブユーザーの操作記録が含まれます。
データセット(mini_harmony_event_data.json)は、元の12GBから抽出された123MBのサブセットであり、各レコードは以下の18属性で構成されます:
- artist:再生された楽曲のアーティスト名
- auth:認証状態(例:
Logged In,Guest) - firstName/lastName:ユーザー氏名
- gender:性別(
F/M) - level:契約プラン(
freeまたはpremium) - page:実行された操作(
NextSong,Thumbs Up,Cancellation Confirmationなど) - sessionId/
userId:セッションおよびユーザー識別子 - ts:UNIXタイムスタンプ(ミリ秒単位)
- registration:登録時刻(UNIXタイムスタンプ)
- location:地理的位置情報
- userAgent:デバイス・ブラウザ情報
サンプルデータは以下の通りです:
+----------------+----------+---------+------+-------------+--------+---------+---------+--------------------+------+---------------------+-------------+---------+--------------------+------+-------------+--------------------+------+
| artist| auth|firstName|gender|itemInSession|lastName| length| level| location|method| page| registration|sessionId| song|status| ts| userAgent|userId|
+----------------+----------+---------+------+-------------+--------+---------+---------+--------------------+------+---------------------+-------------+---------+--------------------+------+-------------+--------------------+------+
| Billie Eilish| Logged In| Alexi| F| 7| Warren| 214.5921| premium|Spokane-Spokane V...| PUT| Thumbs Down|1532482662000| 53|bad guy | 200|1538355255000|Mozilla/5.0 (Wind...| 54|
| Tame Impala| Logged In| Jamie| M| 12| Reed| 258.3012| free| Austin-Round Rock| GET| Home |1541020800000| 102|Borderline | 200|1541021502000|Mozilla/5.0 (Mac... | 101|
+----------------+----------+---------+------+-------------+--------+---------+---------+--------------------+------+---------------------+-------------+---------+--------------------+------+-------------+--------------------+------+
前処理フェーズでは、まず認証状態がLogged Outのレコードを除外し、その後欠損値の分布を定量的に評価します。特にfirstNameとartist列には有意な欠損が見られますが、これらはユーザーがログインしたまま広告視聴や設定変更などの非再生系操作を行った結果であり、予測特徴量として有効である可能性があるため、削除せず保持します。
解約ラベルの定義は、page == "Cancellation Confirmation"を正例(churn = 1)とし、それ以外のユーザーを負例(churn = 0)とします。この定義により、解約直前の行動パターンを学習可能にし、将来的な離脱リスクを事前に検知できるようになります。
以下は、Spark SQLを用いたラベル生成と不均衡データの統計的確認の例です:
// 解約ユーザーの抽出(正例)
val churnUsers = spark.sql(
"SELECT DISTINCT userId, 1 AS label FROM userlogs WHERE page = 'Cancellation Confirmation'"
)
// 非解約ユーザーの抽出(負例:解約経験のない全ユーザー)
val activeUsers = spark.sql(
"SELECT DISTINCT userId, 0 AS label FROM userlogs WHERE userId NOT IN (SELECT userId FROM churnUsers)"
)
// ラベル付きデータの結合とシャッフル
val labeledData = churnUsers.union(activeUsers).orderBy(rand())
// ラベル分布の確認
labeledData.groupBy("label").count().show()
// 出力例:
// +-----+-----+
// |label|count|
// +-----+-----+
// | 1| 42 |
// | 0| 184 |
// +-----+-----+
この段階で得られるラベル付きデータセットは、後続の特徴エンジニアリング(例:ユーザーごとのページ遷移頻度、平均セッション長、課金期間、最終行動からの経過時間など)および分類モデル(ランダムフォレスト、勾配ブースティングなど)への入力として利用されます。