顧客セグメント
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 39/51。
この章では、クラスターを活用して、ムード別に分類されたプレイリストを作成します。
まずはセグメントです。人々が働きかけることのできる顧客グループです。あるホステルでは、2つの特徴を尺度化し、宿泊客を分類しました。
実際の単位は、セグメントがどのようなものかを示します。標準化された中心は、そのセグメントの特徴を際立たせるもの、つまり平均的なゲストと比べた各特徴を示します。
X = StandardScaler().fit_transform(guests[["nights", "days_ahead"]])
km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X)
print(km.cluster_centers_.round(1))これは次のように出力されます:
[[ 1.3 -0.7]
[-0.7 -0.7]
[-0.7 1.4]]各行で0から最も離れた数値が、そのセグメントを示します。行0は1.3標準偏差分長く残ります:バックパッカー。行2は1.4標準偏差分早く予約します:学校の旅行。
チャレンジ
中級ある劇場では、166人の会員について知りたいと考えています。プログラムは、age,ticket_priceなど、セグメント分けに使う特徴量を読み込みます。
- それらの列をスケーリングし、スターターのヘルパー関数を使って
best_k(X)個のセグメントにクラスタリングし、その数を出力します。 - 大きい順に、各セグメントのサイズと名前を出力します。名前は、中心の特徴量のうち0から最も離れているものと、
highまたはlow、およびその距離です。
別の劇場でage,shows_per_yearを使う場合:
4 segments
57 members: high shows_per_year (1.2 std from average)
52 members: low shows_per_year (1.0 std from average)
40 members: low age (1.4 std from average)
32 members: high age (1.5 std from average)自分で試してみよう
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 劇場の会員1人につき1行
members = pd.read_csv("theatre.csv")
# age,ticket_price など、セグメント分けに使用する特徴量
features = input().split(",")
# Silhouette Scores から、X に対するシルエットスコアが最も高い 2~6 の k を選ぶ
def best_k(X):
best, best_score = 2, -1
for k in range(2, 7):
labels = KMeans(n_clusters=k, n_init=10, random_state=0).fit_predict(X)
score = silhouette_score(X, labels)
if score > best_score:
best, best_score = k, score
return best
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ