KMeans聚类:商城客户细分数据

数据集来自DataFountain,一共包含200名顾客,记录包含顾客的ID,性别,年龄,收入和支出分数。首先先查看一下数据的前五行

1、描述分析

df = pd.read_csv('Mall_Customers.csv', index_col=0)
df.columns = [ 'Gender', 'Age', 'Income', 'Score']
df.head()

在进行聚类之前,首先进行描述性分析,了解一下顾客的大体情况。

  • 年龄分布
df.Age.plot(kind='kde')
plt.xlabel('年龄')
plt.ylabel('和密度值')

年龄大致呈正态分布,大多数分人年龄在20-60之间,这个年龄段为此商家的消费主力。

  • 收入分布
df.Income.plot(kind='kde')
plt.xlabel('收入')
plt.ylabel('和密度值')

收入也整体呈正态分布,消费的主力人群收入为3-10万美元之间。

  • 男女比例


  • 男女消费能力比较


  • 男女收入对比



    可见女性消费人数和消费能力略有优势,但是收入比男性稍少一些。

2、KMeans聚类分析

这里选择收入和积分两个维度用于顾客聚类的依据。首先收入和积分之间的散点图。

plt.scatter(df['Income'], df['Score'])

可以看到数据分布还是比较有规律的,仅凭肉眼观察,似乎能凭感觉将数据分为5类,那么我们的直觉是否准确呢。下面通过KMeans进行测试。

  • 数据标准化
    由于收入和积分的量纲不一致,需要进行标准化处理
from sklearn.preprocessing import minmax_scale
x = df[['Income','Score']]
X = minmax_scale(x)
X = pd.DataFrame(X, columns=['Income', 'Score'])
  • 确定最佳K值
    这里离差平方和拐点法以及轮廓系数法确定最佳K值
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np

K = range(2,11)
TSSE = []
score = []
for k in K:
    SSE = []
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    labels = kmeans.labels_
    centers = kmeans.cluster_centers_
    score.append(silhouette_score(X, labels))
    for label in set(labels):
        SSE.append(np.sum((X.loc[label == labels] - centers[label,:])**2))
    TSSE.append(np.sum(SSE))
plt.figure(figsize=(10,5))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(1,2,1)
plt.plot(K, TSSE, 'b*-')
plt.xlabel('簇的个数')
plt.ylabel('各簇内离差平方和之和')

plt.subplot(1,2,2)
plt.plot(K, score, 'ro-')
plt.xlabel('簇的个数')
plt.ylabel('轮廓系数')

从左图可以看到,簇的个数为5时有个明显的拐点,并且右图可以看到,簇个数为5时,轮廓系数最大。所以可以将K值确定为5,这也印证了我们开始肉眼观察的结果。

  • 查看聚类效果
    接下来我们通过可视化,观察一下KMeans是怎么将数据进行聚类的。
kmeans = KMeans(n_clusters=5)
kmeans.fit(X)
df['cluster'] = kmeans.labels_
for i in range(5):
    plt.scatter(df[df.cluster == i]['Income'], df[df.cluster == i]['Score'])
    plt.scatter(df[df.cluster == i]['Income'].mean(), df[df.cluster == i]['Score'].mean(), marker='*', c='black',s=100)
plt.xlabel('收入')
plt.ylabel('积分')

五种颜色的点集代表五个簇,黑色的星星则代表各自簇的质心。它将顾客分为了五种类型。我这里将这五种客户归类为:高收入高消费、低收入高消费的重要客户,高输入低消费、中等收入中等消费的潜力客户和低收入低消费的一般客户。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354