Python数据分析实战:天猫双十一美妆数据清洗与可视化
简介这是一份面向Python学习者的电商销售数据分析大作业源码以天猫双十一美妆销售数据为分析对象完整演示了从数据清洗、格式转换、分组聚合到matplotlib可视化的完整流程适合作为课程设计、期末项目或数据分析入门与实战参考。压缩包共17个文件约5.08MB核心包含约400行的.py主脚本、可交互的.ipynb笔记本、已渲染的.html报告、.csv原始数据与.xlsx清洗结果并附有.xml工程配置与.gitignore导入PyCharm或Jupyter即可直接运行。目前已有146人浏览学习。源码不仅展示了基于pandas的缺失值处理、宽长表转换、数据规约和多维度统计还通过matplotlib绘制多种图表来呈现品牌、品类、价格区间等维度下的销售规律帮助读者快速理解电商数据背后的特征掌握数据分析自动化与可视化实战分析技能。1. 选题先想清楚为什么天猫双十一美妆数据适合做大作业每年到数据分析课程结课的时候总有人纠结选题选太简单的撑不起页数选太复杂的自己写完调试不完。我观察了很多人的大作业之后发现天猫双十一美妆销售数据几乎是最稳妥的一类选题原因有三个。第一个原因是数据天然好看。美妆品类的价格区间宽从几十块的平价国货到上千块的贵妇面霜都有销量差异也极其悬殊爆款月销几万件冷门款常年个位数。这种天然的高方差数据做出来图就好看分析的结论也有层次感。相比之下如果你选一个所有人都卖9块9的品类那画出来的图和一条直线没什么区别。第二个原因是分析维度多容易凑出完整的故事线。商品标题里藏着品牌、品类、容量、功效信息数据表里通常还有价格、销量、评论数、店铺名、店铺所在地等字段。单靠这些字段就能从价格带分布、品牌格局、品类结构、销量与评论关系四个角度切入每个角度都是独立的一章整个项目自然就立体了。第三个原因最实在关于双十一的电商数据网上公开的抓取脚本和示例数据很多你不用从零开始造数据可以把精力放在分析本身。就算你用的是老师给的数据集这个选题也几乎不会出现数据没拿全、分析做不下去的窘境。我当年做这个项目时用了约400行Python代码搭配pandas和matplotlib两个库做完之后一度觉得工作量好像不太够结果拿去答辩效果反而很好——老师更看重的是你是否有完整的分析思路而不是代码堆了多少行。下面我把整个项目的拆解过程完整写出来想直接复用的同学可以把每一节当成设计文档。2. 400行代码的模块划分先搭骨架再填肉写数据分析项目最忌讳的就是拿到数据就开写写到哪算哪。当年我第一次写大作业就是这样最后代码乱到自己都不想看第二遍。这次我把项目拆成了五个模块每个模块负责一个环节400行代码分布得很均匀逻辑也清晰。2.1 五个阶段的处理管线整个项目按下面这条线推进数据加载:用pandas读取CSV文件先不急着分析看一眼字段名、数据量、每列的非空情况心里有个底。数据清洗:处理缺失值、重复值、异常值把字符串字段里的数值提取出来比如月销2万需要转换成整数20000把价格字段统一成浮点数。特征工程:从商品标题中提取品牌关键词按价格区间生成新列对销量进行分桶等。这一步是后续分析的弹药库。核心分析:围绕预设的分析维度做分组聚合、排序和统计得出可解释的中间结论。可视化呈现:用matplotlib生成图表配合前面的结论形成图文并茂的说明。这个顺序是固定的前一步出错后面所有结果都要推翻重来。所以代码里我习惯在每阶段结束加一个简短的数据形状输出比如打印df.shape和列名确认这一步没问题再继续。2.2 400行怎么分配到各模块我建议的分配比例大概是这样的模块代码行数约说明数据加载与清洗80行整个项目最容不得马虎的地方特征工程60行品牌提取、价格带切分单维度分析100行价格带分析、品牌分析多维度交叉分析60行销量与评论交叉、价格与销量关系matplotlib可视化90行每种图约15到20行主流程与输出20行串联全部函数这个结构的好处是答辩被提问时你能准确说出每一段代码负责什么。老师最喜欢问的问题之一就是你这个品牌提取是怎么做的如果你有独立的特征工程模块回答起来会非常自信。3. 数据清洗环节这才是整个项目里最容易翻车的地方很多初学者写大作业急着画图结果图画出来全是乱码或者数据明显不对回头排查才发现是清洗环节出了问题。数据清洗是整个项目里最花时间、也最看不出成果的环节但它的质量直接决定分析的可信度。3.1 三个最常见的脏数据问题第一是字段类型混乱。比如价格列里混入了暂无报价这样的字符串销量列里是月销5000这种带后缀的文本。处理办法是写一个类型转换函数把销量列的后缀去掉再通过正则匹配提取数字。实际写起来并不复杂import re def clean_sales(x): if isinstance(x, str): nums re.findall(r\d, x) if nums: return int(nums[0]) return 0 return x df[销量] df[销量].apply(clean_sales)注意有些月销1万的数据如果只提取第一个数字只会得到1这时需要判断字符串里是否包含万包含就乘以10000。这类细节特别容易漏但漏掉之后你的Top10排行榜会错得离谱。第二是重复值。同一件商品可能因为促销活动不同被抓了两遍。清洗阶段直接用df.drop_duplicates(subset[商品标题, 店铺名])去重别等分析到一半才发现数据量对不上。第三是异常值。比如某件商品标价999999很可能是商家用来占位或屏蔽搜索的。对这种数据可以设置一个合理的价格上限比如美妆产品不超过2万元超过的标记为异常值剔除或置空。这一步我习惯先画出箱线图辅助判断阈值而不是拍脑袋定一个数字。3.2 编码和路径问题别忽略还有一个非常不起眼但要命的坑中文编码。你手上的CSV文件如果是从网上爬下来或别人转存的很可能不是UTF-8编码。读文件时统一用pd.read_csv(data.csv, encodingutf-8-sig)遇到编码报错再换gbk或gb18030。utf-8-sig比utf-8多了一个BOM头识别在Windows下用Excel另存过的CSV经常会带BOM不加-sig会导致第一列列名出现\ufeff前缀后续取列名时直接报错。文件路径我也建议用绝对路径或把数据文件放在项目根目录下不要用带着中文名的桌面路径matplotlib渲染图表时遇到中文路径在某些环境下会输不出图。这类问题排查起来极其浪费时间一开始就规范好能省掉很多烦恼。4. 四个核心分析维度数据怎么讲出一份完整报告数据清洗完之后接下来就是决定这篇大作业深度的地方——分析维度。我推荐的四个维度基本覆盖了电商数据分析的常用视角而且每个维度都能独立成章。4.1 价格带分布美妆品类的金字塔结构按价格区间0-50元、50-100元、100-200元、200-500元、500元以上对销量做分组汇总通常会得到一个明显向右拖尾的长尾分布低价商品销量占比极高高价商品虽然数量多但销量贡献有限。这个结论本身不新鲜但你可以再深挖一层对比不同价格带的平均评论数看哪个价格带的商品用户互动最强。这里有个细节值得注意分桶时用pd.cut要选好边界左开右闭还是左闭右开会直接影响数据落在哪个桶里。为了避免恰好100元的商品不知道算哪个区间这种尴尬我在代码里统一用rightFalse参数让区间变成左闭右开。4.2 品牌格局从标题里精准提取品牌名品牌分析最核心的技术点就是这个提取动作。我见过有人做品牌分析时用几十个if-else硬编码去匹配代码难看还容易漏。更好的方式是用一个品牌关键词列表对商品标题做前缀匹配或包含匹配brands [欧莱雅, 兰蔻, 雅诗兰黛, 完美日记, 花西子, 珀莱雅, 玉兰油] def extract_brand(title): for b in brands: if b in title: return b return 其他注意品牌列表的优先级如果欧莱雅和巴黎欧莱雅都出现你应该把更长更精确的名称排在前面否则短名称会把长名称的商品全部截胡。这个坑我实际遇到过最后统计出来的欧莱雅销量比真实值高出一截就是因为匹配优先级没控制好。品牌分析的输出通常是一张柱状图加一张饼图柱状图展示Top10品牌的销量对比饼图展示品牌集中度CR5、CR10占比。CR10如果超过60%说明市场高度集中这是可以直接写进报告结论的话术。4.3 品类结构美妆细分品类的销量差异美妆大类下面还可以继续细分面部护理、口红彩妆、香水、身体护理等。细分的方式仍然是关键词匹配比如含有口红唇釉唇膏归为唇妆类含有面膜精华面霜归为面部护肤类。这一步和品牌提取一样也是在构造特征列。做完细分之后可以用条形图对比各类目的商品数量和销量总量会发现一个有趣的错位有些类目上架商品很多但总销量一般说明竞争激烈但有效需求没有想象中大有些类目商品数量少但单品爆款销量惊人说明存在头部效应。这种商品数-销量的错位分析是答辩时最能体现你思考深度的地方。4.4 销量与评论的交叉关系验证沉默的大多数很多电商数据集中评论数和销量并不成正比。我们通常会做一个散点图横轴是销量纵轴是评论数每个点代表一件商品。看完图你会发现明显分成两个簇一簇是低销量低评论的长尾商品一簇是高销量高评论的爆款。更有意思的是计算评论转化率即评论数除以销量。这个比率低的商品说明买的人多但愿意留言的人少比率高的商品说明用户互动意愿强。从实操角度看这个指标可以进一步和商品价格做分组对比——三五十块的平价商品评论转化率普遍高于千元商品因为低价商品的购买决策成本低用户更随意也更愿意顺手评论一句。把这种洞察写进报告整篇大作业的档次立刻就上去了。5. matplotlib可视化从默认画风到答辩时能拿得出手的图代码写得再漂亮最终呈现给老师看的还是图和结论。matplotlib的默认样式大家都懂如果不做任何调整画出来的图灰蒙蒙的线条纤细字体偏小放在PPT里基本看不清。我这次总结了四个关键技巧可以直接套用。5.1 中文字体显示matplotlib默认字体不支持中文不加设置的话图里的中文全部显示成方框。解决方案是一开始就统一设定import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei] plt.rcParams[axes.unicode_minus] False第一行指定中文字体第二行解决负号显示异常的问题。如果你用的是macOS可以把字体换成[Arial Unicode MS, SimHei]。这一步做完后面所有图的标题、坐标轴标签、图例就都能正常显示中文了。我还见过有人选择在英文系统下把所有图例改成英文虽然也能避开问题但大作业的读者毕竟是中文使用者我建议还是把中文字体配好。5.2 图表尺寸和清晰度画图之前先设置画布大小这是很多人容易忽略的一步。plt.figure(figsize(10, 6))和plt.savefig(result.png, dpi300, bbox_inchestight)配合使用导出的图片既不会模糊也不会因为周围空白太多显得不专业。dpi建议最低150答辩时投到投影仪上150dpi的图在普通尺寸下足够清晰300dpi则能经得住放大细看。bbox_inchestight会把图片的空白区域裁剪掉让图面比例更紧凑。5.3 选对图型比画得花哨更重要网易云年度报告那种风格的炫酷图表不是matplotlib的强项大作业也不需要。选图型的核心逻辑是让读者一眼看懂你在比较什么价格带分布用柱状图横轴价格带、纵轴销量一目了然品牌份额用饼图或横向条形图强调占比就用饼图强调排序就用条形图销量与评论关系用散点图再叠加一条趋势线或按价格带上色品类结构差异用分组柱状图两组柱子并列对比信息量比单柱状高一个层级5.4 信息标注让图自己说话答辩时老师不会盯着图研究半天。所以每张图里尽量把关键数据标出来。柱状图顶部标注数值用一句话说清楚每个数值的含义这些都能体现你的严谨程度。比如价位分布图中在销量最高的柱子上方写一行注释该价格带贡献了全品类42%的销量比满图的数字更有说服力。ax.bar(prices, sales) for i, v in enumerate(sales): ax.text(i, v 5, str(v), hacenter, fontsize10)6. 答辩与作品集这个项目还能再榨出多少价值很多人的大作业交完就结束了但我强烈建议你把这个项目再打磨一轮它完全值得成为你简历上的一个作品。我自己就是把这个项目放进作品集后面找工作面数据分析岗位时聊得最多的反而是这个简单的项目。6.1 三个可以快速升级的扩展方向第一是加交互。把matplotlib替换成plotly或pyecharts同样的数据逻辑输出变成可以悬停查看数值的交互图表。这一改动大约需要100行代码但效果上会让人觉得你已经接触过更现代的可视化工具。第二是加统计模型。比如用线性回归拟合销量与价格之间的关系判断是否存在最优价格区间。实际操作中可以先对价格取对数再回归缓解长尾带来的异方差性得到的结论也更稳健。第三是加数据源。如果只是用老师给的一份数据可以考虑爬取多个品类洗发水、零食、家电做横向对比。这样分析维度从美妆内部结构扩展到跨品类差异工作量增加不多但论文的立意完全不同。6.2 答辩被追问时最值得准备的三个问题根据我和身边同学的经历老师对这类项目最爱追问的问题高度集中你的品牌提取规则会漏掉哪些品牌诚实回答说不认识的美妆品牌、标题里品牌名被拆开的情况都会漏然后补充一句可以通过维护更全的品牌词库或引入命名实体识别来改进。这个结论有什么实际意义用例子回答案如果价格带分析显示50到100元是销量最集中的区间新品牌进场定价就会优先考虑这个区间。如果数据量扩大100倍你的代码哪里会慢这里想听你提到pandas的向量化操作和groupby的性能瓶颈如果能在代码中避免用for循环逐行处理数据本身就是加分项。我当时就是按这三个问题准备的实际答辩时老师问到的和这三点高度重合。最后再分享一个真实体会数据分析大作业写完之后一定把代码从头到尾重跑一遍把中间输出的所有DataFrame和图片都截个图保留。一方面方便自己写报告时引用另一方面答辩时有同学被问到中间某一步的数据当场手忙脚乱重新跑代码那个体验真的很尴尬。提前把这些过程性结果归档对你来说只是多花十分钟但在答辩现场能稳很多。本文还有配套的精品资源点击获取