使用KMeans对批发客户数据进行聚类

本文使用Python中的pandas、numpy等库,运用KMeans算法对开源的Wholesale customers data.csv数据集进行聚类,以识别批发客户群体。步骤包括读取数据集、去除不必要列、数据预处理、寻找最优K值、聚类、分析结果、可视化特征及样本聚类,最后计算准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用KMeans对批发客户数据进行聚类

使用Python中的pandas、numpy、matplotlib、sklearn和PCA库来完成这个项目。使用KMeans算法来识别可能存在的客户群体,并使用PCA和可视化来展示聚类结果。

在这个项目中,数据集是开源的Wholesale customers data.csv数据集。数据集包含了Portuguese的一些批发客户的购买数据。这些数据涵盖了超市,零售商和咖啡馆等不同类型的客户。在这个项目中,使用这个数据集来识别可能存在的客户群体。

步骤

步骤如下:

  1. 读取数据集
  2. 去除不必要的列
  3. 数据预处理
  4. 寻找最优的K值
  5. 使用KMeans进行聚类
  6. 分析聚类结果
  7. 可视化每个聚类的特征
  8. 使用PCA可视化每个样本的聚类
  9. 计算准确率

读取数据集

使用pandas库读取数据集。代码如下:

df = pd.read_csv('Wholesale customers data.csv')

去除不必要的列

在这个数据集中,由于不需要使用Channel和Region这两列。所以可以使用pandas库的drop函数来删除这两列。代码如下:

df.drop(['Channel', 'Region'], axis=1, inplace=True)

数据预处理

在进行聚类之前,需要对数据进行预处理。需要检查数据是否有缺失值,并对数据进行标准化处理。

检查是否有缺失值

使用pandas库的isnull函数检查是否有缺失值。代码如下:

print(df.isnull().sum())

如果输出结果为0,则说明数据集中没有缺失值。

对数据进行标准化处理

使用sklearn库的StandardScaler函数对数据进行标准化处理。代码如下:

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

寻找最优的K值

使用sklearn库的KMeans函数进行聚类,并使用silhouette_score函数寻找最优的K值。代码如下:

k_range = range(2, 11)
scores = []
for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(df_scaled)
    scores.append(silhouette_score(df_scaled, kmeans.labels_))
plt.plot(k_range, scores)
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Score')
plt.show()

通过观察图形来确定最优的K值。

使用KMeans进行聚类

根据上一步的结果,我们选择K=5进行聚类。使用sklearn库的KMeans函数进行聚类。代码如下:

kmeans = KMeans(n_clusters=5, random_state=42)
kmeans.fit(df_scaled)

分析聚类结果

分析每个聚类中心的特征。用sklearn库的PCA函数对数据进行降维,然后使用pandas库的DataFrame函数将聚类中心转换为一个数据框。代码如下:

cluster_centers_scaled = scaler.inverse_transform(kmeans.cluster_centers_)
cluster_centers = pd.DataFrame(cluster_centers_scaled, columns=df.columns[:-1])
print(cluster_centers)

可视化每个聚类的特征

使用matplotlib库绘制雷达图来可视化每个聚类的特征。可以使用以下修改过的雷达图函数来实现。

def radar_chart(df, cluster, n_clusters, n_ticks=6, color='b'):
    labels = list(df.columns)
    stats = df.loc[cluster].values
    angles = np.linspace(0, 2 * np.pi, n_ticks, endpoint=False)
    angles = np.concatenate((angles, [angles[0]]))
    stats = np.concatenate((stats, [stats[0]]))
    fig = plt.figure()
    ax = fig.add_subplot(111, polar=True)
    ax.plot(angles, stats, 'o-', linewidth=2, color=color)
    ax.fill(angles, stats, alpha=0.25, color=color)
    ax.set_thetagrids(np.linspace(0, 360, n_ticks, endpoint=False), labels)
    ax.set_title(f'Cluster {n_clusters}')
    ax.grid(True)
    plt.show()

可以为不同的聚类分配不同的颜色来区分它们。代码如下:

colors = ['r', 'g', 'b', 'c', 'm']
for i in range(5):
    radar_chart(cluster_centers, i, i, n_ticks=6, color=colors[i])

为了更好地对比不同聚类之间的差异,可以将不同的聚类绘制在同一个雷达图上。

for i in range(5):
    radar_chart(cluster_centers, i, i, n_ticks=6)

使用PCA可视化每个样本的聚类

使用sklearn库的PCA函数对数据进行降维,然后使用matplotlib库的scatter函数将聚类结果可视化。代码如下:

pca = PCA(n_components=2)
df_pca = pca.fit_transform(df_scaled)
plt.scatter(df_pca[:, 0], df_pca[:, 1], c=df['Cluster'])
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.show()

计算准确率

使用真实分类标签来计算聚类标签的准确率。代码如下:

true_labels = pd.read_csv('Wholesale customers data true labels.csv')['Label']
true_labels_binary = []
for label in true_labels:
    if label == 'Retail':
        true_labels_binary.append(0)
    else:
        true_labels_binary.append(1)
predicted_labels_binary = []
for label in df['Cluster']:
    if label == 0 or label == 3:
        predicted_labels_binary.append(0)
    else:
        predicted_labels_binary.append(1)
accuracy = sum(np.array(true_labels_binary) == np.array(predicted_labels_binary)) / len(true_labels_binary)
print(f'Accuracy: {accuracy}')

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值