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など)のタイムスタンプを含める必要があります。 さらに、顧客を一意に識別するには、各レコードにidentityMap フィールドに有効なExperience Cloud ID (ECID)が含まれている必要があります。
モデルを作成 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 アシスタント を使用して、主要なパフォーマンスの変化をモニタリングし、 オーディエンスの傾向を予測します。