1. 内容整体设计与思路拆解
1.1 这个项目到底在做什么
先把这个项目说透。标题叫"用Python分析某电商销售数据",我接下来说的内容,就是把我自己做过的一整套电商销售数据取数、清洗、分析与可视化的流程完整复现一遍。
很多人一听到"数据分析"就以为要上什么高大上的工具,其实真正干活的人都知道,Excel能搞定的事没必要上Python,但一旦数据量到了几十万行、上百万行,或者分析维度很多、要做自动化报表的时候,Excel就开始卡了,VLOOKUP也开始变得吃力,这时候Python的优势就体现出来了。
我这次分析的场景是这样的:某电商店铺后台导出了一份销售订单明细表,包含大约30万行订单记录,跨度是最近一年的数据。字段包括订单编号、下单时间、商品名称、商品类目、销售数量、销售金额、成本、买家ID、支付方式、收货省份城市等。目标是回答几个问题:店铺整体销售趋势是什么样的;哪些类目是主力;哪些商品贡献了大部分利润;不同省份的销售分布如何;有没有明显的季节性波动。
这套分析做完之后要输出什么?一张核心指标总览、趋势折线图、类目占比图、Top商品排行、省份分布图、复购率指标,以及一份可以拿去和老板汇报的结论摘要。整体走一遍下来,Python的pandas做数据清洗和聚合、matplotlib和pyecharts做可视化,完全够用。
1.2 为什么选这几个库而不是别的
先说pandas,这基本是Python数据分析的第一选择,没有之一。它的DataFrame结构对表格数据的处理能力极其强大,groupby、merge、pivot_table这些方法用熟练之后,你会发现Excel里要折腾半天的操作,在pandas里两行代码就解决了。
数据量大时候,pandas底层用numpy的数组实现,性能比纯粹的Python循环快了好几个数量级。我这里有一个很直观的对比:同样是对30万行订单按月份汇总,用Python原生循环写的话可能要跑几十秒,用pandas的groupby基本上是毫秒级出结果。一开始接触pandas的人可能不太理解为什么groupby效率这么高,实际上它内部做了很多向量化运算和索引优化,你不需要自己写for循环。
可视化部分我用了pyecharts而不是纯matplotlib。因为pyecharts生成的图表是交互式的HTML文件,鼠标悬停能看到具体数值,还有缩放、图例筛选这些功能,拿给业务同事看的时候体验好很多。matplotlib当然也有它的优势,适合快速画静态图、做论文级别的精细控制,但如果是给业务方汇报,交互式图表更讨喜。后文我会把两种方式都演示一遍,让读者自己感受差异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 数据文件的准备和处理
我这个项目的原始数据是模拟真实电商后台导出的CSV格式。真实场景里,各个平台的导出格式五花八门,有UTF-8编码的,有GBK编码的,有的字段名带空格,有的日期格式不统一。这里我先做一步"模拟真实丑数据"的处理:故意在CSV里混入了一些空行、重复表头、金额字段带人民币符号、日期格式不统一的问题,方便演示清洗过程。
在动手之前先建一个干净的项目目录,我习惯这么组织:
code复制sales_analysis/
├── data/
│ └── sales_data.csv
├── output/
├── main.py
└── requirements.txt
requirements.txt里写入依赖:
code复制pandas>=1.5.0
numpy>=1.23.0
matplotlib>=3.6.0
pyecharts>=2.0.0
安装方式很简单,在命令行里执行 pip install -r requirements.txt 就行。如果你用的是Anaconda环境,pandas和matplotlib一般已经预装了,只需要再补装pyecharts。
2.2 从CSV读取数据时的编码坑
读取数据这一步就有很多细节要注意。使用 pd.read_csv() 读文件的时候,如果文件是GBK编码而你没有指定encoding参数,会直接报UnicodeDecodeError。实际业务中很多老旧系统导出的CSV文件就是GBK编码,处理办法是读文件的时候牺牲一点性能,用 encoding='gbk' 或者更通用的 encoding='gb18030'。
还有一类情况是文件里前面几行有无关信息,比如"销售数据导出时间:2024-01-15"这种,真正的表头在第5行。这时候需要加 skiprows=4 或者 header=4 来跳过干扰行。
我在这次分析中故意不处理这些干扰,先把文件用默认参数读进来,让报错自然发生,然后一个一个解决,这样大家能更直观地理解为什么后面要这么写代码。
python复制import pandas as pd
df = pd.read_csv("data/sales_data.csv")
print(df.head())
print(df.shape)
第一次读取大概率会碰到两个
