SQL ベースのロジスティックリグレッションを使用して顧客チャーンを予測
顧客離れを予測すると、実用的なインサイトを通じて満足度とロイヤルティを向上させることで、企業が顧客を維持し、リソースを最適化し、収益性を高めるのに役立ちます。
SQL ベースのロジスティック回帰を使用して顧客チャーンを予測する方法を説明します。 この包括的な SQL ガイドを使用すると、生の e コマースデータを、主要な行動指標(購入頻度、平均注文額、最終購入の最新性など)に基づいて意味のある顧客インサイトに変換できます。 このドキュメントでは、データの準備と機能エンジニアリングから、モデルの作成、評価、予測までのプロセス全体を説明します。
このガイドを使用すると、リスクの高い顧客を特定し、リテンション戦略を絞り込み、より良いビジネス上の意思決定を推進する、強力なチャーン予測モデルを作成できます。 ステップバイステップの手順、SQL クエリ、詳細な説明が含まれており、データ環境で自信を持って機械学習技術を適用するのに役立ちます。
はじめに
チャーンモデルを作成する前に、主な顧客機能とデータ要件を調べることが重要です。 以下の節では、正確なモデルトレーニングを行うために必要な、基本的な顧客属性と必須のデータフィールドの概要を説明します。
お客様の機能の定義 define-customer-features
チャーンを正確に分類するために、モデルは購入習慣とトレンドを分析します。 次の表に、モデルで使用される主な顧客行動機能の概要を示します。
total_purchasestotal_revenueavg_order_valuecustomer_lifetimedays_since_last_purchasepurchase_frequency前提および必須フィールド assumptions-required-fields
顧客チャーン予測を生成するために、モデルは、顧客トランザクションの詳細を取得する webevents テーブル内のキーフィールドに基づいています。 データセットには、次のフィールドを含める必要があります。
identityMap['ECID'][0].idproductListItems.priceTotal[0]productListItems.quantity[0]timestampcommerce.order.purchaseIDデータセットには、構造化された顧客トランザクションレコードの履歴が含まれている必要があり、各行は購入イベントを表しています。 各イベントには、SQL DATEDIFF 関数と互換性のある適切な日時形式(YYYY-MM-DD HHSS など)のタイムスタンプが含まれている必要があります。 さらに、顧客を一意に識別するために、各レコードの ECID フィールドに有効なExperience Cloud ID (identityMap)が含まれている必要があります。
モデルを作成 create-a-model
顧客のチャーンを予測するには、顧客の購入履歴と行動指標を分析する SQL ベースのロジスティック回帰モデルを作成する必要があります。 モデルでは、過去 90 日以内に購入したかどうかを判断して、顧客を churned または not churned に分類します。
SQL を使用したチャーン予測モデルの作成 sql-create-model
SQL ベースのモデルでは、主要指標を集計し、90 日間の非アクティブ状態ルールに基づいてチャーンラベルを割り当てることで、webevents データを処理します。 このアプローチは、アクティブな顧客とリスクのある顧客を区別します。 また、SQL クエリは、モデルの精度を向上させ、チャーン分類を改善するための機能エンジニアリングも実行します。 これらのインサイトは、ターゲットを絞ったリテンション戦略を実装し、チャーンを削減し、顧客の生涯価値を最大化するようにビジネスを強化します。
DATEDIFF(CURRENT_DATE, MAX(timestamp)) > 90 条件を変更します。次の SQL ステートメントを使用して、指定された機能とラベルで retention_model_logistic_reg モデルを作成します。
CREATE MODEL retention_model_logistic_reg
TRANSFORM (
vector_assembler(array(total_purchases, total_revenue, avg_order_value, customer_lifetime, days_since_last_purchase, purchase_frequency)) features
-- Combines selected customer metrics into a feature vector for model training
)
OPTIONS (
MODEL_TYPE = 'logistic_reg', -- Specifies logistic regression as the model type
LABEL = 'churned' -- Defines the target label for churn classification
)
AS
WITH customer_features AS (
SELECT
identityMap['ECID'][0].id AS customer_id, -- Extract the unique customer ID from identityMap
AVG(COALESCE(productListItems.priceTotal[0], 0)) AS avg_order_value, -- Calculates the average order value, and handles null values with COALESCE
SUM(COALESCE(productListItems.priceTotal[0], 0)) AS total_revenue, -- The sum of all purchase values per customer
COUNT(COALESCE(productListItems.quantity[0], 0)) AS total_purchases, -- The total number of items purchased by the customer
DATEDIFF(MAX(timestamp), MIN(timestamp)) AS customer_lifetime, -- The days between first and last recorded purchase
DATEDIFF(CURRENT_DATE, MAX(timestamp)) AS days_since_last_purchase, -- The days since the last purchase event
COUNT(DISTINCT CONCAT(YEAR(timestamp), MONTH(timestamp))) AS purchase_frequency -- The count of unique months with purchases
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0) -- Filters transactions with valid total price
AND commerce.`order`.purchaseID <> '' -- Ensures the order has a valid purchase ID
GROUP BY customer_id
),
customer_labels AS (
SELECT
identityMap['ECID'][0].id AS customer_id, -- Extract the unique customer ID for labeling
CASE
WHEN DATEDIFF(CURRENT_DATE, MAX(timestamp)) > 90 THEN 1 -- Marks the customer as churned if no purchase occurred in the last 90 days
ELSE 0
END AS churned
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0)
AND commerce.`order`.purchaseID <> ''
GROUP BY customer_id
)
SELECT
f.customer_id,
f.total_purchases,
f.total_revenue,
f.avg_order_value,
f.customer_lifetime,
f.days_since_last_purchase,
f.purchase_frequency,
l.churned
FROM
customer_features f
JOIN
customer_labels l
ON f.customer_id = l.customer_id -- Join features with churn labels
ORDER BY RANDOM() -- Shuffles rows randomly for training
LIMIT 500000; -- Limit the dataset to 500,000 rows for model training
モデル出力 model-output
出力データセットには、顧客関連の指標とそのチャーンステータスが含まれています。 各行は、顧客、その機能値およびチャーンステータスを表します。 この出力を使用して、顧客の行動を分析し、予測モデルをトレーニングし、リスクのある顧客を保持するためのターゲット設定された保持戦略を開発できます。 出力テーブルの例を次に示します。
customer_id | total_purchases | total_revenue | avg_order_value | customer_lifetime | days_since_last_purchase | purchase_frequency | churned |
|--------------+-----------------+---------------+------------------+-------------------+--------------------------+--------------------+----------
100001 | 25 | 1250.00 | 50.00 | 540 | 20 | 10 | 0
100002 | 3 | 90.00 | 30.00 | 120 | 95 | 1 | 1
100003 | 60 | 7200.00 | 120.00 | 800 | 5 | 24 | 0
100004 | 15 | 750.00 | 50.00 | 365 | 60 | 8 | 0
100005 | 1 | 25.00 | 25.00 | 60 | 180 | 1 | 1
churnedSQL を使用してモデルを評価 model-evaluation
次に、チャーン予測モデルを評価して、リスクのある顧客の特定におけるモデルの有効性を判断します。 精度と信頼性を測定する主要指標を使用して、モデルのパフォーマンスを評価します。
顧客チャーンの予測における retention_model_logistic_reg モデルの精度を測定するには、model_evaluate 関数を使用します。 次の SQL の例では、トレーニングデータのような構造を持つデータセットを使用して、モデルを評価します。
SELECT *
FROM model_evaluate(retention_model_logistic_reg, 1,
WITH customer_features AS (
SELECT
identityMap['ECID'][0].id AS customer_id,
AVG(COALESCE(productListItems.priceTotal[0], 0)) AS avg_order_value,
SUM(COALESCE(productListItems.priceTotal[0], 0)) AS total_revenue,
COUNT(COALESCE(productListItems.quantity[0], 0)) AS total_purchases,
DATEDIFF(MAX(timestamp), MIN(timestamp)) AS customer_lifetime,
DATEDIFF(CURRENT_DATE, MAX(timestamp)) AS days_since_last_purchase,
COUNT(DISTINCT CONCAT(YEAR(timestamp), MONTH(timestamp))) AS purchase_frequency
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0)
AND commerce.`order`.purchaseID <> ''
GROUP BY customer_id
),
customer_labels AS (
SELECT
identityMap['ECID'][0].id AS customer_id,
CASE
WHEN DATEDIFF(CURRENT_DATE, MAX(timestamp)) > 90 THEN 1
ELSE 0
END AS churned
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0)
AND commerce.`order`.purchaseID <> ''
GROUP BY customer_id
)
SELECT
f.customer_id,
f.total_purchases,
f.total_revenue,
f.avg_order_value,
f.customer_lifetime,
f.days_since_last_purchase,
f.purchase_frequency,
l.churned
FROM
customer_features f
JOIN
customer_labels l
ON f.customer_id = l.customer_id); -- Joins customer features with churn labels
モデル評価出力
評価出力には、AUC-ROC、精度、精度、リコールなどの主要パフォーマンス指標が含まれます。 これらの指標は、モデルの有効性に関するインサイトを提供します。このインサイトを使用して、リテンション戦略を絞り込み、データに基づいた意思決定を行うことができます。
auc_roc | accuracy | precision | recall
|---------+----------+-----------+--------
1 | 0.99998 | 1 | 1
auc_rocaccuracyprecisionrecallモデル予測 model-prediction
モデルを評価したら、model_predict を使用して新しいデータセットに適用し、顧客チャーンを予測します。 これらの予測を使用して、リスクのある顧客を特定し、ターゲットを絞った保持戦略を実装できます。
SQL を使用してチャーン予測を生成する sql-model-predict
以下の SQL クエリでは、retention_model_logistic_reg モデルを使用して、トレーニングデータのような構造を持つデータセットで顧客のチャーンを予測します。
SELECT *
FROM model_predict(retention_model_logistic_reg, 1, -- Applies the trained model for churn prediction
WITH customer_features AS (
SELECT
identityMap['ECID'][0].id AS customer_id,
AVG(COALESCE(productListItems.priceTotal[0], 0)) AS avg_order_value,
SUM(COALESCE(productListItems.priceTotal[0], 0)) AS total_revenue,
COUNT(COALESCE(productListItems.quantity[0], 0)) AS total_purchases,
DATEDIFF(MAX(timestamp), MIN(timestamp)) AS customer_lifetime,
DATEDIFF(CURRENT_DATE, MAX(timestamp)) AS days_since_last_purchase,
COUNT(DISTINCT CONCAT(YEAR(timestamp), MONTH(timestamp))) AS purchase_frequency
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0) -- Ensures only valid purchase data is considered
AND commerce.`order`.purchaseID <> ''
GROUP BY customer_id
),
customer_labels AS (
SELECT
identityMap['ECID'][0].id AS customer_id,
CASE
WHEN DATEDIFF(CURRENT_DATE, MAX(timestamp)) > 90 THEN 1 -- Identify customers who have not purchased in the last 90 days
ELSE 0
END AS churned
FROM
webevents
WHERE EXISTS(productListItems, value -> value.priceTotal > 0)
AND commerce.`order`.purchaseID <> ''
GROUP BY customer_id
)
SELECT
f.customer_id,
f.total_purchases,
f.total_revenue,
f.avg_order_value,
f.customer_lifetime,
f.days_since_last_purchase,
f.purchase_frequency,
l.churned
FROM
customer_features f
JOIN
customer_labels l
ON f.customer_id = l.customer_id); -- Matches features with their churn labels for prediction
モデル予測出力 prediction-output
出力データセットには、主な顧客機能とその予測されるチャーンステータスが含まれています。これは、顧客がチャーンを起こす可能性が高いかどうかを示します。 これらのインサイトを使用して、プロアクティブなリテンション戦略を実装し、顧客チャーンを削減します。
total_purchases | total_revenue | avg_order_value | customer_lifetime | days_since_last_purchase | purchase_frequency | churned | prediction
|-----------------+---------------+-----------------+-------------------+--------------------------+--------------------+---------+------------
2 | 299 | 149.5 | 0 | 13 | 1 | 0 | 0
1 | 710 | 710.00 | 0 | 149 | 1 | 1 | 1
1 | 19.99 | 19.99 | 0 | 30 | 1 | 0 | 0
1 | 4528 | 4528.00 | 0 | 26 | 1 | 0 | 0
1 | 21.84 | 21.84 | 0 | 90 | 1 | 0 | 0
1 | 16.64 | 16.64 | 0 | 268 | 1 | 1 | 1
prediction次の手順
これで、SQL ベースのモデルを作成、評価および使用して顧客チャーンを予測する方法を学びました。 この基盤を使用すると、顧客の行動を分析し、リスクのある顧客を特定し、プロアクティブなリテンション戦略を導入して顧客維持を向上させることができます。 チャーン予測モデルをさらに強化して適用するには、次の手順を検討します。
- プロセスの自動化:継続的な監視とリアルタイムのインサイトのために、モデルをデータパイプラインに統合します。 SQL を使用してデータセットを検証および処理する方法を確認します 。
- モデルのパフォーマンスの監視:新しいデータでモデルを継続的に評価し、精度と関連性を維持します。 Adobe Experience Platform UI で AI アシスタント を使用して、主要なパフォーマンスの変化と オーディエンスのトレンドの予測 を監視します。