Menu
CoddyTech

购物分段

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 48 课,共 51 课。

一家在线植物商店只能通过顾客的行为来了解这 240 位顾客:每年的订单数、购物篮大小、促销商品的购买占比,以及距离上次下单的天数。

这家植物商店的 240 位顾客以灰色圆点表示,横轴为每年的订单数,纵轴为以欧元计的平均购物篮金额,没有标签:低金额处有一条密集带状区域,左上方附近有一小群消费较高的顾客

没人给它们贴上标签。店主想要几个能用简单文字描述的细分群体,还想为那个已经流失的群体写一封挽回邮件。

让两种方法在 k 上达成一致:病房树给出建议,轮廓则将其与相邻值进行比较。然后用实际单位读取每个片段。

challenge icon

挑战

困难

程序会读取树的切分位置;起始代码会设置好带标题的图表。

  1. 对特征进行缩放,并在该位置切分 ward 树。打印生成的分段数量。
  2. 打印该 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,70 位顾客,每年下单 5 到 14 次;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

# 植物店每位顾客占一行
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 在线编译器