

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# チュートリアル: カスタマーチャーンモデルの構築
<a name="tutorial_customer_churn"></a>

このチュートリアルでは、Amazon Redshift ML を使用して CREATE MODEL コマンドでカスタマーチャーンモデルを作成し、ユーザーシナリオの予測クエリを実行します。次に、CREATE MODEL コマンドが生成する SQL 関数を使用してクエリを実装します。

簡単な CREATE MODEL コマンドを使用して、トレーニングデータのエクスポート、モデルのトレーニング、モデルのインポート、Amazon Redshift 予測関数の準備を行うことができます。トレーニングデータをテーブルまたは SELECT ステートメントとして指定するには、CREATE MODEL ステートメントを使用します。

この例では、履歴情報を使用して、携帯電話事業者のカスタマーチャーンに対して機械学習モデルを構築します。まず、SageMaker AI で機械学習モデルをトレーニングし、任意のカスタマーのプロファイル情報を使用してモデルをテストします。モデルが検証されると、Amazon SageMaker AI はモデルと予測関数を Amazon Redshift にデプロイします。予測関数を使用して、カスタマーが解約するかしないかを予測できます。

## ユースケースの例
<a name="tutorial_customer_churn_tasks"></a>

Amazon Redshift ML を使用して、セールスリードが成立するかどうかを予測するなど、他の二項分類の問題を解決できます。また、金融取引が不正であるかどうかを予測することもできます。

**タスク**
+ 前提条件
+ ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
+ ステップ 2: 機械学習モデルを作成する
+ ステップ 3: モデルを使用して予測を実行する

## 前提条件
<a name="tutorial_customer_churn_prereqs"></a>

このチュートリアルを完了するためには、以下のものが必要です。
+ Amazon Redshift ML 用に Amazon Redshift クラスターをセットアップする必要があります。これを行うには、「[Amazon Redshift ML 管理者によるクラスターと設定のセットアップ](https://docs.aws.amazon.com/redshift/latest/dg/admin-setup.html)」のドキュメントを使用します。
+ モデルの作成に使用する Amazon Redshift クラスターと、トレーニングデータを使用し、モデルアーティファクトのステージングを保管する Amazon S3 バケットは、同じ AWS リージョンに置かれている必要があります。
+ このドキュメントで使用されている SQL コマンドおよびサンプルデータセットをダウンロードするには、次のいずれかの操作を行います。
  + [[SQL commands (SQL コマンド)](https://s3.amazonaws.com/redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql)]、[[Customer activity file (顧客のアクティビティファイル)](https://s3.amazonaws.com/redshift-downloads/redshift-ml/customer_activity/customer_activity.csv)]、および [[Abalone file (アワビファイル)](https://s3.amazonaws.com/redshift-downloads/redshift-ml/abalone_xg/abalone.csv)] をダウンロードします。
  + Amazon S3 用の AWS CLI を使用して、次のコマンドを実行します。独自のターゲットパスを使用できます。

    ```
    aws s3 cp s3://redshift-downloads/redshift-ml/tutorial-scripts/redshift-ml-tutorial.sql </target/path>
    aws s3 cp s3://redshift-downloads/redshift-ml/customer_activity/customer_activity.csv </target/path>
    aws s3 cp s3://redshift-downloads/redshift-ml/abalone_xgb/abalone_xgb.csv </target/path>
    ```

## ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする
<a name="tutorial_customer_churn_step_load"></a>

[Amazon Redshift クエリエディタ v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) を使用してクエリを編集および実行し、結果を視覚化します。

次のクエリを実行すると、`customer_activity` という名前のテーブルを作成し、サンプルデータセットを Amazon S3 から取り込みます。

```
DROP TABLE IF EXISTS customer_activity;

CREATE TABLE customer_activity (
state varchar(2),
account_length int,
area_code int,
phone varchar(8),
intl_plan varchar(3),
vMail_plan varchar(3),
vMail_message int,
day_mins float,
day_calls int,
day_charge float,
total_charge float,
eve_mins float,
eve_calls int,
eve_charge float,
night_mins float,
night_calls int,
night_charge float,
intl_mins float,
intl_calls int,
intl_charge float,
cust_serv_calls int,
churn varchar(6),
record_date date
);

COPY customer_activity
FROM 's3://redshift-downloads/redshift-ml/customer_activity/'
REGION 'us-east-1' IAM_ROLE default
FORMAT AS CSV IGNOREHEADER 1;
```

## ステップ 2: 機械学習モデルを作成する
<a name="tutorial_customer_churn_step_create_model"></a>

チャーンはこのモデルのターゲット入力です。モデルの他のすべての入力は、チャーンを予測する関数の作成に役立つ属性です。

次の例では、CREATE MODEL オペレーションを使用して、カスタマーがアクティブになるかどうかを予測するモデルを提供します。これには、カスタマーの年齢、郵便番号、使用量、およびケースなどの入力が使用されます。次の例で、amzn-s3-demo-bucket は、ユーザーの Amazon S3 バケットに置き換えます。

```
CREATE MODEL customer_churn_auto_model
FROM
    (
      SELECT state,
             account_length,
             area_code,
             total_charge/account_length AS average_daily_spend,
             cust_serv_calls/account_length AS average_daily_cases,
             churn
      FROM customer_activity
      WHERE  record_date < '2020-01-01'
     )
TARGET churn FUNCTION ml_fn_customer_churn_auto
IAM_ROLE default SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket'
);
```

先ほどの例の SELECT クエリは、トレーニングデータを作成します。TARGET 句は、CREATE MODEL オペレーションが予測する方法を学習するために使用する機械学習ラベルである列を指定します。ターゲット列の「churn」は、顧客がまだ有効なメンバーシップを持っているか、メンバーシップを一時停止しているかを示します。S3\$1BUCKET フィールドは、以前に作成した Amazon S3 バケットの名前です。Amazon S3 バケットは、Amazon Redshift と Amazon SageMaker AI の間でトレーニングデータとアーティファクトを共有するために使用されます。残りの列は、予測に使用される機能です。

CREATE MODEL コマンド基本的なユースケースの構文と機能の概要については、[「単純な CREATE MODEL」](https://docs.aws.amazon.com/redshift/latest/dg/r_create_model_use_cases.html#r_simple_create_model)を参照してください。

### サーバー側の暗号化のアクセス許可を追加する (オプション)
<a name="tutorial_customer_churn_encryption"></a>

Amazon Redshift はデフォルトでは、トレーニングに Amazon SageMaker AI Autopilot を使用します。特に、Amazon Redshift は、カスタマー指定の Amazon S3 バケットにトレーニングデータを安全にエクスポートします。`KMS_KEY_ID` を指定しない場合、データはデフォルトでサーバー側の暗号化 SSE-S3 を使用して暗号化されます。

入力に対し、AWS KMS マネージドキーを使用したサーバー側の暗号化 (SSE-KMS) が行われている場合は、次のアクセス許可を追加します。

```
{
    "Effect": "Allow",
    "Action": [
    "kms:Encrypt"
    "kms:Decrypt"
    ]
}
```

Amazon SageMaker AI のロールの詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[Amazon SageMaker AI roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)」を参照してください。

### モデルトレーニングのステータスを確認する (オプション)
<a name="tutorial_customer_churn_check_status"></a>

SHOW MODEL コマンドを使用して、モデルの準備が完了したことを知ることができます。

テーブルのステータスを確認するには、次のオペレーションを使用します。

```
SHOW MODEL customer_churn_auto_model;
```

次は先ほどのオペレーションの出力例です。

```
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
|           Key            |                                                                             Value                                                                             |
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
|        Model Name        |                                                                   customer_churn_auto_model                                                                   |
|       Schema Name        |                                                                            public                                                                             |
|          Owner           |                                                                            awsuser                                                                            |
|      Creation Time       |                                                                   Tue, 14.06.2022 17:15:52                                                                    |
|       Model State        |                                                                           TRAINING                                                                            |
|                          |                                                                                                                                                               |
|      TRAINING DATA:      |                                                                                                                                                               |
|          Query           | SELECT STATE, ACCOUNT_LENGTH, AREA_CODE, TOTAL_CHARGE / ACCOUNT_LENGTH AS AVERAGE_DAILY_SPEND, CUST_SERV_CALLS / ACCOUNT_LENGTH AS AVERAGE_DAILY_CASES, CHURN |
|                          |                                                                    FROM CUSTOMER_ACTIVITY                                                                     |
|                          |                                                               WHERE RECORD_DATE < '2020-01-01'                                                                |
|      Target Column       |                                                                             CHURN                                                                             |
|                          |                                                                                                                                                               |
|       PARAMETERS:        |                                                                                                                                                               |
|        Model Type        |                                                                             auto                                                                              |
|       Problem Type       |                                                                                                                                                               |
|        Objective         |                                                                                                                                                               |
|     AutoML Job Name      |                                                                redshiftml-20220614171552640901                                                                |
|      Function Name       |                                                                   ml_fn_customer_churn_auto                                                                   |
|   Function Parameters    |                                            state account_length area_code average_daily_spend average_daily_cases                                             |
| Function Parameter Types |                                                                 varchar int4 int4 float8 int4                                                                 |
|         IAM Role         |                                                                     default-aws-iam-role                                                                      |
|        S3 Bucket         |                                                                        amzn-s3-demo-bucket                                                                     |
|       Max Runtime        |                                                                             5400                                                                              |
+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

モデルトレーニングが完了すると、`model_state` 変数は `Model is Ready` になり、予測関数が使用可能になります。

## ステップ 3: モデルを使用して予測を実行する
<a name="tutorial_customer_churn_step_perform_predictions"></a>

SQL ステートメントを使用すると、予測モデルによって行われた予測を表示できます。この例では、CREATE MODEL オペレーションによって作成された予測関数の名前は `ml_fn_customer_churn_auto` です。予測関数の入力引数は、`state` には varchar、`account_length` には integer など、機能のタイプに対応しています。予測関数の出力は、CREATE MODEL ステートメントの TARGET 列と同じ型です。

1. 2020 年 1 月 1 日より前のデータでモデルをトレーニングしたので、テストセットで予測関数を使用します。例えば、次のクエリは、2020 年 1 月 1 日以降にサインアップしたカスタマーが、解約するかどうかを予測します。

   ```
   SELECT
       phone,
       ml_fn_customer_churn_auto(
           state,
           account_length,
           area_code,
           total_charge / account_length,
           cust_serv_calls / account_length
       ) AS active
   FROM
       customer_activity
   WHERE
       record_date > '2020-01-01';
   ```

1. 次の例では、異なるユースケースで同じ予測関数を使用しています。このケースでは、Amazon Redshift は、記録の日付が 2020 年 1 月 1 日以降のさまざまな州からのカスタマーにおいて、解約者と非解約者の割合を予測します。

   ```
   WITH predicted AS (
       SELECT
           state,
           ml_fn_customer_churn_auto(
               state,
               account_length,
               area_code,
               total_charge / account_length,
               cust_serv_calls / account_length
           ) :: varchar(6) AS active
       FROM
           customer_activity
       WHERE
           record_date > '2020-01-01'
   )
   SELECT
       state,
       SUM(
           CASE
               WHEN active = 'True.' THEN 1
               ELSE 0
           END
       ) AS churners,
       SUM(
           CASE
               WHEN active = 'False.' THEN 1
               ELSE 0
           END
       ) AS nonchurners,
       COUNT(*) AS total_per_state
   FROM
       predicted
   GROUP BY
       state
   ORDER BY
       state;
   ```

1. 次の例では、ある状態で解約するカスタマーの割合を予測するユースケースに予測関数を使用します。このケースでは、Amazon Redshift は、記録の日付が 2020 年 1 月 1 日より後の場合の解約率を予測します。

   ```
   WITH predicted AS (
       SELECT
           state,
           ml_fn_customer_churn_auto(
               state,
               account_length,
               area_code,
               total_charge / account_length,
               cust_serv_calls / account_length
           ) :: varchar(6) AS active
       FROM
           customer_activity
       WHERE
           record_date > '2020-01-01'
   )
   SELECT
       state,
       CAST((CAST((SUM(
           CASE
               WHEN active = 'True.' THEN 1
               ELSE 0
           END
       )) AS FLOAT) / CAST(COUNT(*) AS FLOAT)) AS DECIMAL (3, 2)) AS pct_churn,
       COUNT(*) AS total_customers_per_state
   FROM
       predicted
   GROUP BY
       state
   ORDER BY
       3 DESC;
   ```

## 関連トピック
<a name="tutorial_customer_churn_related_topics"></a>

Amazon Redshift ML の詳細については、次のドキュメントを参照してください。
+ [Amazon Redshift ML 機械学習を使用するためのコスト](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)
+ [CREATE MODEL コマンド](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_MODEL.html)
+ [EXPLAIN\$1MODEL 関数](https://docs.aws.amazon.com/redshift/latest/dg/r_explain_model_function.html)

機械学習の詳細については、以下のドキュメントを参照してください。
+ [機械学習の概要](https://docs.aws.amazon.com/redshift/latest/dg/machine_learning_overview.html)
+ [初心者やエキスパート向けの機械学習](https://docs.aws.amazon.com/redshift/latest/dg/novice_expert.html)
+ [機械学習予測の公平性とモデルの説明可能性とは](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-fairness-and-explainability.html)