从Excel到3D聚类图:一份给业务分析师的Python K-means实战避坑指南
从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定时执行脚本。
更多推荐


所有评论(0)