数据集来自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('积分')
五种颜色的点集代表五个簇,黑色的星星则代表各自簇的质心。它将顾客分为了五种类型。我这里将这五种客户归类为:高收入高消费、低收入高消费的重要客户,高输入低消费、中等收入中等消费的潜力客户和低收入低消费的一般客户。