買い物セグメント
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 48/51。
オンラインの植物ショップは、240 人の顧客について、年間の注文回数、カゴの大きさ、セールで購入した割合、前回の注文からの日数だけを把握しています。
誰もそれらにラベルを付けていません。所有者は、平易な言葉で説明できるいくつかのセグメントと、離れていった人向けの再獲得メールを望んでいます。
2つの方法で k を判定します。樹形図で値を推測し、シルエットで近隣の値と照らし合わせて確認します。その後、すべてのセグメントを実際の単位で読み取ります。
チャレンジ
難しいプログラムは樹形図をどこで切るかを読み込み、スターターコードではタイトル付きのグラフを設定しています。
- 特徴量をスケーリングし、その位置でWard法の樹形図を切ります。できたセグメント数を出力します。
- その k と隣接する各 k について、k-means のシルエットスコア(小数点以下3桁)を出力し、続けて最適な k を出力します。
- その k で再学習し、結果を
plants["segment"]に格納します。サイズの大きい順に各セグメントへ文字を割り当て、元の単位での平均値を出力します。その後、最後の注文から最も日数が経っているセグメントを出力します。 - 各セグメントを文字のラベル付きで散布図にします。凡例を表示し、グラフを表示します。
別のショップで、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そのグラフ:
続いて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)")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ