Menu
CoddyTech

顧客セグメント

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

この章では、クラスターを活用して、ムード別に分類されたプレイリストを作成します。

80曲を点で表示。横軸はvalence、縦軸はenergy。k-meansが見つけて名付けた4つのグループ:左上は緊張、右上は幸せ、左下は悲しみ、右下は穏やか

まずはセグメントです。人々が働きかけることのできる顧客グループです。あるホステルでは、2つの特徴を尺度化し、宿泊客を分類しました。

150人のホステル宿泊客を、宿泊日数を横軸、予約の早さを縦軸として、3つのセグメントに分類:数か月前に予約する修学旅行、短期滞在の週末旅行者、直前に予約する長期滞在のバックパッカー

実際の単位は、セグメントがどのようなものかを示します。標準化された中心は、そのセグメントの特徴を際立たせるもの、つまり平均的なゲストと比べた各特徴を示します。

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標準偏差分早く予約します:学校の旅行。

challenge icon

チャレンジ

中級

ある劇場では、166人の会員について知りたいと考えています。プログラムは、age,ticket_priceなど、セグメント分けに使う特徴量を読み込みます。

  1. それらの列をスケーリングし、スターターのヘルパー関数を使ってbest_k(X)個のセグメントにクラスタリングし、その数を出力します。
  2. 大きい順に、各セグメントのサイズと名前を出力します。名前は、中心の特徴量のうち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


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

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

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

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