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

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

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

步骤

步骤如下:

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

读取数据集

使用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}')

运行结果

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。