Menu
CoddyTech

買い物セグメント

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 48/51。

オンラインの植物ショップは、240 人の顧客について、年間の注文回数、カゴの大きさ、セールで購入した割合、前回の注文からの日数だけを把握しています。

植物ショップの240人の顧客を灰色の点で表示。横軸は年間の注文回数、縦軸はユーロでの平均購入額。ラベルはなく、購入額の低い位置に密集した帯と、左上付近に少数の高額購入グループがある

誰もそれらにラベルを付けていません。所有者は、平易な言葉で説明できるいくつかのセグメントと、離れていった人向けの再獲得メールを望んでいます。

2つの方法で k を判定します。樹形図で値を推測し、シルエットで近隣の値と照らし合わせて確認します。その後、すべてのセグメントを実際の単位で読み取ります。

challenge icon

チャレンジ

難しい

プログラムは樹形図をどこで切るかを読み込み、スターターコードではタイトル付きのグラフを設定しています。

  1. 特徴量をスケーリングし、その位置でWard法の樹形図を切ります。できたセグメント数を出力します。
  2. その k と隣接する各 k について、k-means のシルエットスコア(小数点以下3桁)を出力し、続けて最適な k を出力します。
  3. その k で再学習し、結果を plants["segment"] に格納します。サイズの大きい順に各セグメントへ文字を割り当て、元の単位での平均値を出力します。その後、最後の注文から最も日数が経っているセグメントを出力します。
  4. 各セグメントを文字のラベル付きで散布図にします。凡例を表示し、グラフを表示します。

別のショップで、8の位置で切ると:

Tree cut at 8.0: 3 segments
Silhouette at k = 2: 0.573
Silhouette at k = 3: 0.675
Silhouette at k = 4: 0.630
Best k: 3
A (70): 8.6 orders a year, 29 EUR baskets, 15% on sale, last order 23 days ago
B (50): 3.1 orders a year, 22 EUR baskets, 60% on sale, last order 53 days ago
C (30): 1.8 orders a year, 89 EUR baskets, 10% on sale, last order 148 days ago
Win-back email: segment C

そのグラフ:

Plant Shop Segmentsというタイトルの別のショップのセグメント:Aは年間5~14件の注文がある顧客70人、Bは注文数が少なくかごの金額も小さい顧客50人、Cは注文数が少なくかごの金額が大きい顧客30人で、グラフ上部付近に表示され、凡例付き

続いてCoddyがあなたの結果を説明します。

自分で試してみよう

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from scipy.cluster.hierarchy import linkage, fcluster

# 植物店の顧客1人につき1行
plants = pd.read_csv("plants.csv")
features = ["orders_per_year", "avg_basket_eur", "sale_share_pct", "days_since_order"]

# デンドログラムから読み取った、店主が植物店の樹形図を切る高さ(3つ以上のセグメント)
cut = float(input())

fig, ax = plt.subplots()
ax.set_title("Plant Shop Segments")
ax.set_xlabel("Orders per year")
ax.set_ylabel("Average basket (EUR)")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ