Menu
CoddyTech

Сегменты клиентов

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 39 из 51.

В этой главе мы применим кластеризацию на практике и составим плейлист по настроению:

80 песен в виде точек: валентность по горизонтали, энергия по вертикали; k-средних выявил и обозначил четыре группы: напряжённые вверху слева, весёлые вверху справа, грустные внизу слева, спокойные внизу справа

Сначала — сегменты: группы людей, на действия которых можно повлиять. Хостел масштабировал два признака и разделил своих гостей на группы:

150 гостей хостела: количество ночей за одну поездку — по горизонтали, количество дней между бронированием и заездом — по вертикали; три сегмента: школьные поездки с бронированием за несколько месяцев, гости выходного дня с коротким проживанием, бэкпекеры с длительным проживанием и поздним бронированием

Реальные единицы измерения показывают, как выглядит сегмент. Его центр в масштабированном пространстве показывает, чем он отличается: каждую характеристику в std от среднего гостя.

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

# Одна строка на каждого участника театра
members = pd.read_csv("theatre.csv")
# Признаки для сегментации, например age,ticket_price
features = input().split(",")


# По оценкам силуэта: k от 2 до 6 с наилучшей оценкой силуэта для X
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