SQL ベースのロジスティック回帰による顧客離れを予測する

顧客離れを予測することは、実用的なインサイトを通じて満足度とロイヤルティを向上させることで、顧客の維持、リソースの最適化、収益性の向上に役立ちます。

SQL ベースのロジスティック回帰を使用して顧客離れを予測する方法を説明します。 この包括的なSQL ガイドでは、生のe コマースデータを、主要な行動指標(購入頻度、平均注文額、最終購入日など)にもとづいて、有意義な顧客インサイトに変換できます。 このドキュメントは、データの準備から特徴量工学、モデルの作成、評価、予測に至るまでのプロセス全体をカバーしています。

このガイドでは、リスクのある顧客を特定し、リテンション戦略を洗練させ、より優れたビジネス上の意思決定を促進する、強力な解約予測モデルを構築できます。 データ環境内でマシンラーニングの手法を自信を持って適用できるよう、ステップバイステップの指示、SQL クエリ、詳細な説明が含まれています。

はじめに

顧客離れモデルを構築する前に、顧客の主な特徴とデータ要件を確認することが重要です。 以下の節では、正確なモデルのトレーニングに必要な顧客属性と必須データフィールドの概要を説明します。

顧客の特徴を定義 define-customer-features

顧客離れを正確に分類するために、モデルは購買習慣と傾向を分析します。 モデルで使用される主な顧客行動機能の概要を次の表に示します。

機能
説明
total_purchases
顧客が行った購入の合計数。
total_revenue
顧客の購入から生成された総収益。
avg_order_value
顧客の平均購入額。
customer_lifetime
顧客の最初の購入から最後の購入までの日数。
days_since_last_purchase
顧客が最後に購入してから経過した日数。
purchase_frequency
顧客が購入した異なる月の数。

前提条件と必須フィールド assumptions-required-fields

顧客解約予測を生成するために、モデルは、顧客トランザクションの詳細をキャプチャするwebevents テーブル内の主要フィールドに依存します。 データセットには次のフィールドを含める必要があります。

フィールド
説明
identityMap['ECID'][0].id
セッションをまたいで顧客を追跡するために使用される一意のID。
productListItems.priceTotal[0]
トランザクションあたりの購入済み品目の合計コストです。
productListItems.quantity[0]
購入に含まれるアイテムの合計数。
timestamp
各購入イベントの正確な日時。
commerce.order.purchaseID
購入完了を確認する必要な値。

データセットには、構造化された過去の顧客トランザクションレコードを含め、各行が購入イベントを表す必要があります。 各イベントには、SQL DATEDIFF関数と互換性のある適切な日時形式(YYYY-MM-DD HHSSなど)のタイムスタンプを含める必要があります。 さらに、顧客を一意に識別するには、各レコードにidentityMap フィールドに有効なExperience Cloud ID (ECID)が含まれている必要があります。

TIP
数百万のレコードを持つ大規模なデータセットを処理すると、パフォーマンスに大きな影響を与える可能性があります。 クエリ実行を最適化するには、エクスペリエンスデータセットをタイムスタンプで分割し、スナップショットを使用して増分処理を実行し、必要に応じて効率的な集計関数を適用します。 さらに、集計前にデータをフィルタリングして、処理のオーバーヘッドを削減できます。

モデルを作成 create-a-model

顧客離れを予測するには、顧客の購入履歴と行動指標を分析するSQL ベースのロジスティック回帰モデルを作成する必要があります。 このモデルは、過去90日以内に購入したかどうかを判断することで、顧客をchurnedまたはnot churnedに分類します。

SQLを使用した解約予測モデルの構築 sql-create-model

SQL ベースのモデルは、主要な指標を集計し、90日間の非アクティブ ルールに基づいて解約ラベルを割り当てることで、webevents データを処理します。 このアプローチにより、アクティブ顧客とリスクのある顧客を区別できます。 また、SQL クエリは、モデルの精度を高め、解約分類を改善するために、特徴量工学も実行します。 これらのインサイトは、ターゲットを絞ったリテンション戦略の実施、顧客離れの低減、顧客生涯価値の最大化を実現するのに役立ちます。

NOTE
解約予測モデルでは、デフォルトのしきい値である90日を使用して、顧客を解約として分類します。 ビジネス目標と維持戦略に合わせてこの閾値を調整するには、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      
説明
churned
この値は、顧客が過去90日以内に購入したかどうかを示します(0 =解約なし、1 =解約)。

SQLを使用したモデル評価 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、精度、精度、リコールなどの主要なパフォーマンス指標が含まれます。 これらの指標は、モデルの有効性に関するインサイトを提供し、顧客維持戦略を改善したり、データにもとづいた意思決定に活用できます。

NOTE
パフォーマンス値は0 ~ 1の範囲で、1.0は完全なパフォーマンスを表します。
 auc_roc | accuracy | precision | recall
|---------+----------+-----------+--------
1        | 0.99998  |  1        |  1
指標
説明
auc_roc
この指標は、解約した顧客と解約していない顧客を区別するモデルの能力を示しています。 値が1に近いほど、パフォーマンスが向上したことを示します。
accuracy
精度メトリックは、正しい予測の割合を表し、モデルのパフォーマンスの全体的な尺度を提供します。
precision
精度は、正しく識別された解約顧客の割合を示し、解約予測の信頼性を示します。 値が大きいほど、偽陽性が少なくなります。
recall
Recallは、実際の顧客離れを把握するためのモデルの能力を測定します。 リコール値が高い場合は、顧客離れが少ないことを示しています。
NOTE
この例の完璧に近いスコアは、デモ用です。 実際には、実際のデータは、ノイズと変動により、より低い値になる場合があります。

モデル予測 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
モデルに基づく顧客の予測解約ステータス(0 =解約なし、1 =解約)。

次の手順

SQL ベースのモデルを作成、評価、使用して、顧客離れを予測する方法を学びました。 この基盤を活用することで、顧客行動の分析、リスクの高い顧客の特定、先見的な顧客維持戦略の実施などが可能になり、顧客維持率を向上させることができます。 解約予測モデルをさらに強化して適用するには、次のステップを検討します。

  • プロセスの自動化:モデルをデータパイプラインに統合し、継続的なモニタリングとリアルタイムのインサイトを実現します。 SQLでデータセットを検証および処理する方法を確認します。
  • モデルのパフォーマンスを監視する:精度と関連性を維持するために、新しいデータを使用してモデルを継続的に評価します。 Adobe Experience Platform UIでAI アシスタント ​を使用して、主要なパフォーマンスの変化をモニタリングし、​ オーディエンスの傾向を予測します。
recommendation-more-help
experience-platform-help-query-service