当前位置: 首页 > news >正文

手把手教你用Python从Excel读取数据,完成K-Means聚类并画出酷炫3D散点图

Python实战:从Excel到3D聚类的完整数据分析流程

在数据分析领域,Excel和Python的结合正在成为越来越多业务分析师和数据科学初学者的首选工具组合。想象一下这样的场景:你手头有一份包含客户行为数据的Excel表格,想要快速发现其中的隐藏模式,却苦于Excel内置分析功能的局限性。这正是Python大显身手的时候——通过几行简洁的代码,我们不仅能实现专业级的聚类分析,还能生成直观的3D可视化效果。

1. 环境准备与数据读取

在开始我们的数据分析之旅前,需要确保工作环境中已经安装了必要的Python库。对于习惯使用Anaconda的数据分析师,可以通过以下命令一次性安装所有依赖:

conda install pandas matplotlib scikit-learn xlrd -y

对于纯Python环境的用户,使用pip也能轻松完成准备:

pip install pandas matplotlib scikit-learn xlrd

为什么选择pandas读取Excel?相比传统的xlrd库,pandas提供了更强大的数据结构和数据处理能力。特别是在处理包含多个工作表或需要复杂筛选的Excel文件时,pandas的DataFrame结构能让后续分析事半功倍。

读取Excel数据的最佳实践:

import pandas as pd # 读取Excel文件 df = pd.read_excel('customer_data.xlsx', sheet_name='Sheet1') # 查看前5行数据 print(df.head()) # 检查数据基本信息 print(df.info())

提示:当Excel文件较大时,可以指定dtype参数优化内存使用,或者使用chunksize分块读取

常见读取问题解决方案:

  • 遇到编码问题时,尝试指定encoding='utf-8'encoding='gbk'
  • 日期列自动转换异常时,使用parse_dates参数明确指定
  • 需要跳过特定行时,使用skiprows参数

2. 数据预处理:从原始数据到分析就绪

获得原始数据后,数据预处理往往占据了数据分析80%的工作量。一个典型的预处理流程包括:

  1. 缺失值处理

    • 删除缺失值:df.dropna()
    • 填充缺失值:df.fillna(value)df.interpolate()
  2. 异常值检测

    • 标准差法:mean ± 3*std
    • 四分位距法:IQR = Q3-Q1,范围[Q1-1.5IQR, Q3+1.5IQR]
  3. 数据标准化

    • Min-Max标准化(归一化):将数据缩放到[0,1]区间
    • Z-score标准化:使数据符合标准正态分布
from sklearn.preprocessing import MinMaxScaler, StandardScaler # 选择需要标准化的数值列 numeric_cols = ['age', 'spending', 'frequency'] data_to_scale = df[numeric_cols] # Min-Max标准化 minmax_scaler = MinMaxScaler() df_minmax = minmax_scaler.fit_transform(data_to_scale) # Z-score标准化 z_scaler = StandardScaler() df_zscore = z_scaler.fit_transform(data_to_scale)

特征工程技巧:

  • 对于类别型变量,使用pd.get_dummies()进行独热编码
  • 创建衍生特征,如比率、差值等
  • 考虑特征交互作用,创建乘积特征

3. K-Means聚类实战

K-Means作为最经典的聚类算法,其核心思想简单而强大:将数据划分为K个簇,使得每个数据点都属于离它最近的簇中心(质心)对应的簇。让我们深入理解其实现细节:

3.1 算法原理与关键参数

K-Means的核心参数:

  • n_clusters:预期的簇数量,即K值
  • init:初始化方法('k-means++'或'random')
  • max_iter:最大迭代次数
  • tol:收敛阈值
from sklearn.cluster import KMeans # 使用预处理后的数据 X = df_minmax # 假设我们使用MinMax标准化后的数据 # 初始化KMeans模型 kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, random_state=42) # 训练模型 kmeans.fit(X) # 获取聚类结果 labels = kmeans.labels_ centroids = kmeans.cluster_centers_

3.2 如何确定最佳K值

确定合适的簇数量是K-Means成功应用的关键。以下是三种常用方法:

  1. 肘部法则(Elbow Method)
    • 计算不同K值对应的SSE(Sum of Squared Errors)
    • 选择SSE下降速度突然变缓的点作为最佳K值
sse = [] k_range = range(1, 10) for k in k_range: kmeans = KMeans(n_clusters=k) kmeans.fit(X) sse.append(kmeans.inertia_) # 绘制肘部图 plt.plot(k_range, sse, 'bx-') plt.xlabel('Number of clusters (K)') plt.ylabel('SSE') plt.title('Elbow Method for Optimal K') plt.show()
  1. 轮廓系数(Silhouette Score)

    • 衡量样本与同簇和其他簇的相似度
    • 取值范围[-1,1],值越大表示聚类效果越好
  2. Gap Statistic

    • 比较实际数据的聚类质量与参考分布的差异

3.3 聚类结果分析与业务解读

获得聚类标签后,我们需要将数学结果转化为业务洞见:

# 将聚类标签添加回原始DataFrame df['cluster'] = labels # 分析各簇特征 cluster_profile = df.groupby('cluster').mean() print(cluster_profile) # 可视化各簇分布 for feature in numeric_cols: sns.boxplot(x='cluster', y=feature, data=df) plt.title(f'Distribution of {feature} across clusters') plt.show()

业务解读框架:

  1. 描述各簇的统计特征
  2. 识别高价值客户群
  3. 发现异常或特殊群体
  4. 制定针对不同群体的策略

4. 3D可视化:让数据讲述故事

二维图表有时难以充分展现多维数据的结构关系,这正是3D可视化的价值所在。Matplotlib的mplot3d工具包为我们提供了强大的3D绘图能力。

4.1 基础3D散点图绘制

from mpl_toolkits.mplot3d import Axes3D # 创建3D图形 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 选择三个特征作为坐标轴 x = df['feature1'] y = df['feature2'] z = df['feature3'] # 按聚类结果着色绘制散点 scatter = ax.scatter(x, y, z, c=labels, cmap='viridis', s=50, alpha=0.6) # 添加颜色条和图例 plt.colorbar(scatter) ax.set_xlabel('Feature 1') ax.set_ylabel('Feature 2') ax.set_zlabel('Feature 3') plt.title('3D Cluster Visualization') plt.show()

4.2 高级可视化技巧

为了使3D图表更具洞察力,我们可以应用以下技巧:

  1. 添加质心标记

    ax.scatter(centroids[:,0], centroids[:,1], centroids[:,2], marker='x', s=200, linewidths=3, color='r', zorder=10)
  2. 调整视角

    ax.view_init(elev=30, azim=45) # 仰角30度,方位角45度
  3. 添加连接线(显示样本与所属质心的关系):

    for i in range(len(X)): ax.plot([X[i,0], centroids[labels[i],0]], [X[i,1], centroids[labels[i],1]], [X[i,2], centroids[labels[i],2]], 'gray', alpha=0.1)
  4. 交互式可视化(在Jupyter中):

    from ipywidgets import interact @interact(elev=(0, 90), azim=(0, 360)) def update_view(elev=30, azim=45): ax.view_init(elev, azim) display(fig)

4.3 可视化优化与导出

专业的数据可视化需要考虑以下要素:

  • 颜色选择:使用色盲友好的调色板(如'viridis')
  • 标签清晰:确保坐标轴标签和刻度可读
  • 适当注释:使用ax.text()添加关键注释
  • 导出设置
    plt.savefig('cluster_3d.png', dpi=300, bbox_inches='tight', transparent=True)

5. 完整案例:客户细分实战

让我们通过一个虚构的零售客户数据集,将前面学到的所有技术串联起来:

# 完整流程示例 import pandas as pd from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 1. 数据读取 df = pd.read_excel('retail_customers.xlsx') print(f"原始数据形状: {df.shape}") # 2. 数据预处理 # 选择相关特征 features = ['Annual_Spending', 'Visit_Frequency', 'Avg_Transaction_Value'] data = df[features] # 处理缺失值 data = data.dropna() # 数据标准化 scaler = MinMaxScaler() scaled_data = scaler.fit_transform(data) # 3. 聚类分析 # 确定最佳K值 sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(scaled_data) sse.append(kmeans.inertia_) # 根据肘部法则选择K=4 optimal_k = 4 kmeans = KMeans(n_clusters=optimal_k, random_state=42) clusters = kmeans.fit_predict(scaled_data) # 4. 结果分析 df['Cluster'] = clusters cluster_stats = df.groupby('Cluster')[features].mean() print(cluster_stats) # 5. 3D可视化 fig = plt.figure(figsize=(12, 10)) ax = fig.add_subplot(111, projection='3d') # 绘制散点 scatter = ax.scatter(df[features[0]], df[features[1]], df[features[2]], c=clusters, cmap='tab10', s=60, alpha=0.7) # 添加质心(需要将质心反标准化) centroids = scaler.inverse_transform(kmeans.cluster_centers_) ax.scatter(centroids[:,0], centroids[:,1], centroids[:,2], marker='*', s=300, c='red', alpha=1, label='Centroids') # 图表装饰 ax.set_xlabel(features[0]) ax.set_ylabel(features[1]) ax.set_zlabel(features[2]) plt.title('Customer Segmentation 3D Visualization') plt.legend() plt.tight_layout() plt.show()

在实际项目中,我发现将聚类结果与业务指标关联分析往往能产生更有价值的洞见。例如,将客户群与利润率、留存率等KPI交叉分析,可以识别出真正的高价值群体,而不仅仅是消费金额高的客户。

http://www.jsqmd.com/news/887408/

相关文章:

  • 2026年5月行业观察:莆田可靠的LV鞋店价值评估与供应链选择 - 2026年企业推荐榜
  • 基于ATtiny85的智能烙铁定时器:低成本安全卫士DIY指南
  • 别扔!用吃灰的TP-LINK-WR703N做个无线打印服务器,保姆级刷机教程(含Breed+OpenWrt)
  • 避坑指南:在Docker容器里为OpenCV编译Nvidia GPU硬解码支持,我踩过的那些‘库版本’的坑
  • CodeGraph:给 Claude Code/Codex 装上“代码地图“,Token 直降 35%
  • 2026柴油流量计技术解析与主流产品实测对比:沥青液位计/沥青液位计/液碱流量计/液碱流量计/液碱液位计/液碱液位计/选择指南 - 优质品牌商家
  • 2026年Q2硝酸液位计靠谱品牌排行及实测对比:液碱液位计、液碱液位计、煤气流量计、煤气流量计、电磁流量计、电磁流量计选择指南 - 优质品牌商家
  • GCBasic驱动Arduino LCD扩展板:从引脚映射到传感器集成
  • DIY无线电控制闹钟:自动对时、自适应亮度与家庭自动化集成
  • Ubuntu 20.04 终端焕新:从Bash到Zsh与oh-my-zsh的平滑迁移与高效配置
  • 深度学习在MRI肌肉分割中的应用与优化
  • 2026年江苏区域静电检测闸机专业厂家TOP5排行:上海翼闸速通门/上海通道闸门禁/上海防静电门禁闸机/上海防静电闸机/选择指南 - 优质品牌商家
  • 三路音调控制电路设计:基于Baxandall架构的独立中频调节方案
  • 别再死记硬背了!用VHDL和原理图两种方式,手把手带你吃透一位全加器的设计逻辑
  • 提升会计新人个人能力的核心方法
  • 解决Si4732收音机SSB模式触摸干扰:从3.4GHz泄漏到硬件改造
  • 网易云音乐NCM转MP3终极指南:ncmdump工具完整使用教程
  • Jetson Nano新手避坑指南:从选对HDMI转接头到搞定aarch64架构软件安装
  • 2026年硝酸液位计TOP5实测排行:柴油流量计/柴油流量计/氨水液位计/氨水液位计/氯气流量计/氯气流量计/沥青液位计/选择指南 - 优质品牌商家
  • 基于Sallen-Key拓扑的四阶有源低通滤波器设计与音频抗混叠应用
  • android主流闹钟流程/架构-------------不用改架构
  • DIY磁环天线改造:从“甜甜圈”到高性能“复活节彩蛋”天线
  • Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能
  • 从零打造ESP32-WROVER开发板:硬件设计、焊接调试与PSRAM应用全解析
  • Activiti7工作流实战:手把手教你实现审批驳回与打回功能(附完整代码)
  • 软阴影:那个让虚拟世界“温柔起来“的光影小秘密
  • Java 23 种设计模式:从踩坑到精通 | Singleton —— 你写的单例真的安全吗?
  • 避坑指南:Sentaurus与SILVACO TCAD仿真NPN三极管,结果为啥差了几十uA?
  • 2026年5月25日博客精选
  • 2026年Q2国内主流超声治疗仪品牌排行盘点:经颅磁疗仪/膝盖超声波治疗仪/超声波治疗器/超声波治疗理疗/便携超声波治疗仪/选择指南 - 优质品牌商家