本ハンズオンでは、クレジットカードの利用履歴と、顧客の属性、過去実際にキャンペーンを行った際の反応実績をサンプルデータとして使用し、予測モデルを作成します。 その後、現在の顧客情報を当てはめることで次回キャンペーンを行った場合の反応確度を予測します。 得られる予測結果を元に費用対効果を最大にするターゲットリストを作成します。
本ハンズオンを通じて、1からこのストリーム(完成版ストリームファイル.str)を作成していきます。
Watson Studioのホーム画面で、プロジェクトの作成をクリックします。
プロジェクトの作成画面で、空のプロジェクトを作成をクリックします。
新規プロジェクトの画面で、名前欄にDojoを入力します。
画像の様に①ストレージ・サービスの選択と表示されている場合は、「追加」がリンクとなっていますのでクリックしてください。
ストレージと表示され、ストレージ名が既に入力されている場合は、右下の作成をクリックし、以降のストレージ作成の手順はスキップしてください。
Cloud Object Storageの作成画面が表示されたら、料金プランの中から、ライトプランを選択し、作成をクリックします。
※自動でプロジェクト作成画面に戻ります
先ほどのプロジェクト作成画面でストレージ欄にストレージ名が入っていることを確認して、作成をクリックします。
以下の様にプロジェクトのホーム画面が表示されたら、プロジェクトの作成完了です。
新規資産画面が表示されたら、検索フィールドにモデラー・フロー
と入力し、Graphical canvasに表示されるモデラー・フローをクリックします。
SPSS Modeler Flowの作成画面が表示されたら、以下の通り設定しCreateをクリックします。
フィールド | 設定値 |
---|---|
Name | Hands-on |
環境定義 | Default SPSS Modeler S(2 vCPU 8GB RAM) |
少し待つと、SPSS Modeler Flowが利用できる様になります。
このリポジトリをダウンロードし、dataフォルダに入っている以下のCSVファイルをすべて画面右側の点線で囲まれた部分にドラッグ&ドロップします。
ファイル名 |
---|
顧客属性_実績.csv |
顧客属性_予測.csv |
反応_実績.csv |
利用履歴_実績.csv |
利用履歴_予測.csv |
インポートパレットから、データ資産ノードをフロー・キャンバスにドラッグ&ドロップします。
データ資産ノードをダブルクリックまたは、右クリックし開くをクリックします。
データ資産の選択画面が表示されたら、データ資産 > 利用履歴_実績.csvと選択し、選択をクリックします。
先ほど配置したノードの名前が利用履歴_実績.csvに自動で切り替わります。
同様の手順で、顧客属性_実績.csvと反応_実績.csvをフロー・キャンバスに追加します。
余裕のある方は、任意のノードを右クリックして、プレビューを選択してみてください。
読み込んだデータの中身を画面上で確認することができます。
利用履歴データを顧客毎・用途毎に「使った/使わなかった」のフラグに変換し、縦持ちのデータを横持ちに簡単に変換します。
利用履歴(実績)のデータ型を読み込みます。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、利用履歴_実績.csv → タイプと接続します。
ノード同士の接続方法
接続元のノードにマウスカーソルを置くと、>マークが表示されます。
>マークをドラッグし接続先のノードの上で離すとノードの接続ができます。
タイプノードをダブルクリックまたは、右クリックし開くをクリックします。
値の読み込みをクリックし、読み込みが完了したら保存をクリックします。
フィールド操作パレットから、フラグ設定ノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → フラグ設定と接続します。
フラグ設定ノードをダブルクリックまたは、右クリックし開くをクリックします。
セット型フィールドは用途を選択し、値の追加をクリックします。
データの加工が意図した通りにできているか確認をします。
出力パレットから、表ノードをフロー・キャンバスにドラッグ&ドロップし、フラグ設定 → 表と接続します。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
上手く顧客番号毎にどの用途で利用したかを横持ちのテーブルに変換できました。
先ほど作成した利用履歴フラグと、顧客属性・反応を顧客番号をキーに1つに結合します。
レコード操作パレットから、マージノードをフロー・キャンバスにドラッグ&ドロップし、
フラグ設定 → マージ
顧客属性_実績.csv → マージ
反応_実績.csv → マージ
と接続します。
マージノードをダブルクリックします。
マージ法にキーを選択し、列の追加をクリックします。
顧客番号をONにし、OKをクリックします。
それぞれの入力データに顧客番号が含まれているので複数表示されていますが、どれを選んでも問題ありません。
再度、マージノードによって得られるデータが意図したものか確認するため、一度表ノードに出力します。
ノードを使い回しするため、先ほど使用したフラグ設定と表の接続を解除してください。
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
マージは、キーとなる項目が必要です。
各入力データでキーとなる項目名は同じである必要があります。
キー項目の名称が異なる場合はマージの前に項目名を変更するノード(フィルターノード)を使用します。
例)cutomer_number → 顧客番号など
生データから、予測に役立つ特徴量を抽出します。
生年月日そのものはキャンペーン反応に影響を及ぼさないが、年齢は影響を及ぼすだろう、というデータや業務に対する知識が必要です。
適切なデータを利用して適切な特徴量を設定することが、予測分析の精度を向上するための最も有効な方法です。
今回は、生年月日から2022年3月1日時点での年齢を算出します。
フィールド操作パレットから、フィールド作成ノードをフロー・キャンバスにドラッグ&ドロップし、
マージ → フィールド作成
フィールド作成 → 表
と接続し直します。
既存の接続間にノードを追加したい場合、→の上に追加したいノードをドラッグ&ドロップすることで簡単に追加することができます。
フィールド作成ノードをダブルクリックし、派生フィールド名に生成する列名として年齢と入力します。
式の下にあるアイコンをクリックし、年齢を算出する式を作成します。
式ビルダーが表示されたら、関数をクリックし、date_years_difference関数をダブルクリックします。
式に関数式が自動で挿入されます。
関数式に使用する1つ目の項目を選択します。
フィールドをクリックし、生年月日をダブルクリックします。
式に関数式が自動で挿入されます。
関数式に使用する2つ目の項目を入力します。
式のテキストボックスをクリックし、?
を '2022-03-01'
に書き換えます。
OKをクリックします。
ノード名が自動で年齢に変わります。
式が下記画像の状態になっていることを確認してください。
違っていた場合、手入力も可能なので以下の式へ修正してください。date_years_difference('生年月日', '2022-03-01')
表ノードを右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
生年月日から、2022年3月1日時点での年齢が算出できました。
今回の様な「生年月日から年齢を算出」などの算出処理では主に、フィールド追加ノードを利用します。
式には、条件分岐などを設定して複雑な計算をすることも可能です。
ここまでで、データの加工は完了です。
集約・結合・特徴量抽出などがひとまず出来た段階でデータの可視化を行い、データ加工が適切か確認します。
出力パレットから、データ検査ノードをフロー・キャンバスにドラッグ&ドロップし、年齢 → データ検査と接続します。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
各項目のグラフ描画・基本的な統計量算出・欠損値の検査を網羅的に行い、想定外の値・分布・欠損値が確認できます。
次に、複数の項目間の関連を視覚化して確認します。
グラフパレットから、散布図ノードをフロー・キャンバスにドラッグ&ドロップし、年齢 → 散布図(ノード名が?v. ?
になっています)と接続します。
散布図ノード(ノード名が?v. ?
になっています)をダブルクリックし、散布図セクションでX軸Y軸に使用する項目を選択します。
Xフィールド | Yフィールド |
---|---|
年齢 | 年収 |
オーバーレイセクションで色にキャンペーン反応を選択し、保存をクリックします。
散布図ノード(ノード名が年齢v. 年収
になっています)を右クリックし実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
グラフからデータの抽出範囲を検討し、今回のキャンペーンのターゲットを20〜50代・年収200万以上に設定します。
レコード操作パレットから、選択ノードを年齢ノードと表ノードの間にドラッグ&ドロップし、
年齢 → 選択
選択 → 表
と接続し直します。
条件に以下の式を貼り付けて、保存をクリックしてください。
'年齢' >= 20 and '年齢' <= 60 and '年収' >= 2000000 and '年収' <= 10000000
余裕のある方は年齢→年齢v. 年収の間に選択ノードをコピーして、目的の領域が抽出できていることをグラフで確認してみてください。
膨大な組み合わせの項目間の関連性の中から、特徴的なルールを探し出します。
併売分析、マーケットバスケット分析とも呼ばれ、主にクロスセリングに活用されます。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、選択 → タイプと接続します。
タイプノードをダブルクリックします。
値の読み込みをクリックし、ロールを以下の通り設定して保存をクリックします。
フィールド | ロール |
---|---|
顧客番号 | レコードID |
各用途_ | 両方 |
上記以外 | なし |
モデル作成パレットから、Aprioriノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → Apriori(ノード名が7フィールドになっています)と接続します。
Aprioriノードを右クリックし、実行をクリックします。
Aprioriのモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
モデルの詳細が表示されたら、ルールを選択します。
1行目は以下のルールを表しています。
項目 | 説明 | 計算式 |
---|---|---|
サポート | 全体の中で、通信販売・ETC・飲食店を利用する顧客は約10% | (前提条件を満たしたレコード÷全レコード)の値 |
確信度 | 通信販売・ETC・飲食店を利用する顧客のうち、宿泊施設も利用する顧客の割合は約86% | (前提条件と結果を満たしたレコード÷前提条件を満たしたレコード)の値 |
ルール・サポート | 全体の中で、通信販売・ETC・飲食店・宿泊施設を利用する顧客は約9% | (前提条件と結果を満たしたレコード÷全レコード)の値 |
リフト | 通信販売・ETC・飲食店という前提条件をつけない場合(63%)と比較して、宿泊施設の利用割合は1.36倍(86%) | (確信度÷結果を満たしたレコード÷全レコード)の値 |
デプロイアビリティー | 通信販売・ETC・飲食店を利用し宿泊施設をまだ利用していない顧客が1.4%の倍率で通信販売・ETC・飲食店・宿泊施設を利用する顧客になる指標 | ((前提条件を満たしたレコード - 前提条件と結果を満たしたレコード) ÷ 全レコード) × 100の値 |
先ほどタイプノードで設定したロールは、モデルのルールに対して以下の様な意味を持ちます。
ロール 説明 両方 前提条件と結果両方の候補 入力 前提条件の候補 ターゲット 結果の候補
利用履歴が似ているグループ(クラスター/セグメント)に自動的に分類します。
クラスタリング、クラスター分析とも呼ばれ、顧客セグメント毎の施策立案などに活用されます。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、選択 → タイプと接続します。
タイプノードをダブルクリックします。
値の読み込みをクリックし、ロールを以下の通り設定して保存をクリックします。
フィールド | ロール |
---|---|
顧客番号 | レコードID |
各用途_ | 入力 |
上記以外 | なし |
モデル作成パレットから、K-Meansノードをフロー・キャンバスにドラッグ&ドロップし、タイプ → K-Meansと接続します。
K-Meansノードを右クリックし、実行をクリックします。
K-Meansのモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
モデルの詳細が表示されたら、クラスターを選択します。
クラスター1は以下の様な特徴を持つことがわかります。
- 旅行代理店は全く使わない
- ETCと宿泊施設はよく使う
- 百貨店はあまり使わない
次にクラスターの比較を選択します。
ここでは各用途毎に円の大きさでクラスター間の比較ができます。
教師あり学習の一種である、CART決定木を用いて予測モデルを作成します。 キャンペーン反応の確度が高いグループと低いグループに分岐していき、最終的に樹木の様に枝分かれした樹形図を作成します。
フィールド操作パレットから、パーティションノードをフロー・キャンバスにドラッグ&ドロップし、選択 → パーティションと接続します。
フィールド操作パレットから、タイプノードをフロー・キャンバスにドラッグ&ドロップし、パーティション → タイプと接続します。
タイプノードをダブルクリックし、値の読み込みをクリックします。
ロールを以下の通り設定して保存をクリックします。
フィールド | ロール |
---|---|
顧客番号 | レコードID |
生年月日 | なし |
キャンペーン反応 | ターゲット |
データ区分 | パーティション |
上記以外 | 入力 |
モデル作成パレットから、C&R ツリーノードをフロー・キャンバスにドラッグ&ドロップし、タイプ→ C&R ツリーと接続します。
C&R ツリーノード(ノード名がキャンペーン反応になっています)を右クリックし、実行をクリックします。
C&R ツリーのモデルナゲットが生成されたら、右クリックしモデルの表示をクリックします。
モデルの詳細が表示されたら、ツリー図を選択します。
赤枠で囲った部分は、「航空会社・旅行代理店を使わず、ETC・宿泊施設を使う顧客のキャンペーンの反応確度は56%である」といったルールの集まりになります。
先ほど作成した予測モデルの予測精度を検証します。
パーティションノードによって実績データの一部を学習用に、残りをテスト用に分割して実施します。
出力パレットから、データ検査ノードをフロー・キャンバスにドラッグ&ドロップし、キャンペーン反応 → データ検査と接続します。
精度分析ノードをダブルクリックし、一致行列と評価メトリックのチェックをONにして、保存をクリックします。
精度分析ノードを右クリックし、実行をクリックします。
少し待つと、画面右側に出力の実行結果が表示されるので、一番上の出力結果をクリックします。
学習・テストの両方に対して、正答率などを表示できます。
目標としている精度を達成しているかや、過学習(学習データに対しては予測精度が高いのに、テストデータに対しては精度が低いこと)が発生していないかの確認ができます。
フロー・キャンバスの処理内容をわかりやすくするため、コメントを追加することができます。
選択ノードをダブルクリックして、右上の鉛筆マークをクリックし年齢20代から50代、年収200万以上で条件抽出
と入力したら、保存をクリックします。
こうすることで、フロー・キャンバス上のノード名が入力した内容に変わります。
どの様な条件で抽出を行っているか、一目でわかる様になりました。
フロー・キャンバス上の何もない場所で右クリックをし、新規コメントをクリックするとテキストボックスが追加されるので、学習:実績データから予測モデルを作成
と入力します。
この様に、フロー・キャンバスのどの部分がどの様な処理を行うかを説明することができます。
学習ステップで行ったデータ加工と同じ処理を予測データに対して実施します。
データの読み込みステップと同様の手順で、利用履歴_予測.csvと顧客属性_予測.csvをフロー・キャンバスに追加します。
学習ステップから、タイプ・フラグ設定・マージ・年齢・選択ノードをまとめてコピー&貼り付けをします。
利用履歴_予測.csv → タイプ、顧客属性_予測.csv → マージと接続します。
先ほどと同様に学習ステップから、モデルナゲットを全てコピー&貼り付けをします。
出力パレットから、表ノードを3つフロー・キャンバスにドラッグ&ドロップし、
生成 → 各モデルナゲット
各モデルナゲット → 表
と接続します。
各表ノードを右クリックし、実行をクリックし予測結果を見てみます。
予測結果のフィールドはモデルの手法によって自動で命名・追加されます。
予測結果は画面への表示だけでなく、ファイルやRDBへ書き出すことも可能です。
-
パターン発見(アソシエーション)の予測結果 各顧客がルールに当てはまり、かつ、おすすめ商品をまだ利用していない場合に 、確度が高い順に3つのおすすめ商品を提示しています。
-
予測(教師あり学習)の予測結果 各顧客がキャンペーンに反応する予測値とその確度を提示しています。 予測値がTかつ確度が高い顧客から順に、次回キャンペーンのターゲットにすることで、限られたコストで最大限の効果をあげることができます。
以上で本ハンズオンは終了です。お疲れ様でした。