从Excel到3D聚类图:业务分析师也能上手的Python K-means实战指南

当你面对Excel表格里密密麻麻的客户数据时,是否曾想过这些数字背后隐藏着怎样的群体特征?传统的Excel透视表虽然能提供基础统计,但要真正发现数据中的自然分组,K-means聚类算法才是更强大的武器。本文将带你用Python实现从Excel数据读取到3D可视化展示的全流程,即使没有编程背景也能轻松掌握。

1. 环境准备与数据读取

对于习惯Excel操作的业务分析师来说,Python环境的搭建往往是第一个门槛。我们推荐使用Anaconda发行版,它预装了数据分析所需的绝大多数工具包。安装完成后,只需在命令行执行以下命令即可获取所需库:

pip install pandas matplotlib scikit-learn xlrd

读取Excel数据时, pandas 库比原生 xlrd 更加友好。假设你的客户数据存储在"D:/客户分析数据.xlsx"中,包含"消费频率"、"平均订单金额"和"最近购买间隔"三列指标:

import pandas as pd

# 读取Excel数据
df = pd.read_excel(r'D:/客户分析数据.xlsx', sheet_name='Sheet1')
raw_data = df[['消费频率', '平均订单金额', '最近购买间隔']].values

注意:文件路径中的反斜杠在Python字符串中需要转义,或者在字符串前加r表示原始字符串

2. 数据预处理:聚类分析的关键步骤

直接从业务系统导出的数据往往存在量纲不一致的问题。比如"平均订单金额"可能达到数千元,而"消费频率"只是个位数字。如果不进行标准化处理,金额差异会完全主导聚类结果。

2.1 数据标准化

我们使用 MinMaxScaler 将各指标缩放到[0,1]范围:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(raw_data)

2.2 缺失值处理

业务数据中常见的缺失值问题也需要提前处理:

# 检查缺失值
print(df.isnull().sum())

# 简单填充策略
df.fillna(df.mean(), inplace=True)

3. K-means聚类实战

3.1 确定最佳聚类数量

肘部法则(Elbow Method)是确定K值的常用方法。我们计算不同K值对应的SSE(误差平方和),寻找拐点:

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

sse = []
for k in range(1, 10):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(normalized_data)
    sse.append(kmeans.inertia_)

plt.plot(range(1, 10), sse, 'bx-')
plt.xlabel('K值')
plt.ylabel('SSE')
plt.title('肘部法则确定最佳K值')
plt.show()

3.2 执行聚类分析

假设通过肘部法则确定K=4是最佳选择:

kmeans = KMeans(n_clusters=4, random_state=42)
clusters = kmeans.fit_predict(normalized_data)

# 将聚类结果添加回原始DataFrame
df['客户分组'] = clusters

4. 结果可视化与业务解读

4.1 3D散点图展示

使用matplotlib的3D绘图功能直观展示聚类结果:

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 为每个聚类指定不同颜色
colors = ['r', 'g', 'b', 'y']
for i in range(4):
    ax.scatter(
        normalized_data[clusters == i, 0], 
        normalized_data[clusters == i, 1],
        normalized_data[clusters == i, 2],
        c=colors[i],
        label=f'Group {i}'
    )

ax.set_xlabel('消费频率')
ax.set_ylabel('平均订单金额')
ax.set_zlabel('最近购买间隔')
plt.legend()
plt.title('客户分群3D可视化')
plt.show()

4.2 业务特征分析

对各聚类群体的统计特征进行分析:

cluster_stats = df.groupby('客户分组').agg({
    '消费频率': ['mean', 'std'],
    '平均订单金额': ['mean', 'std'],
    '最近购买间隔': ['mean', 'std'],
    '客户编号': 'count'
})
print(cluster_stats)

典型的分群解读可能包括:

  • 高价值活跃客户 :高消费频率、高订单金额
  • 潜在流失客户 :消费频率低且最近购买间隔长
  • 新客户群体 :最近购买间隔短但订单金额中等

5. 结果导出与自动化部署

5.1 保存聚类结果

将带有分组标签的数据保存回Excel,方便业务部门使用:

# 保存到新Excel文件
df.to_excel('D:/客户分群结果.xlsx', index=False)

# 也可以保存为CSV
df.to_csv('D:/客户分群结果.csv', index=False)

5.2 自动化脚本部署

为了让分析流程可重复使用,可以将完整代码封装为函数:

def customer_clustering(input_path, output_path):
    # 包含所有前述步骤的代码
    ...
    
# 使用时只需调用
customer_clustering('D:/客户分析数据.xlsx', 'D:/分群结果')

对于需要定期更新的分析,可以设置Windows任务计划或Mac的launchd定时执行脚本。

更多推荐