ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

拼多多文具销售数据分析与可视化实战:从数据清洗到看板设计

拼多多文具销售数据分析与可视化实战:从数据清洗到看板设计

拼多多文具类目这几年一直是电商数据分析里比较“友好”的切入点。SKU大量聚集在低价标品上,订单量够大,用户评论意愿也够强,天然适合做销售规律挖掘和可视化展示。很多毕业设计团队把题目挂在“Python电商数据分析”下,实际上真正动起手来,最大的坑经常不在模型或算法,而是前期数据字段怎么对齐、商品标题怎么清洗、竞品区间怎么划分这些“脏活累活”。这篇就把整个实操链路完整走一遍,从数据源选择到可视化落地,全程以拼多多文具类目为例,给还在起步阶段的朋友一个可以直接参考的模板。

1. 项目定位与分析框架搭建

1.1 解析“数据分析与可视化”这个组合题的真正考点

先说一个比较常见的心态问题:很多同学拿到这个题目,第一反应是“我要先学会爬虫”,第二反应是“我要选个好看的图表模板”。其实这两件事都不是核心。毕业设计的评分逻辑通常是三个维度并行:业务分析的逻辑闭环、数据处理的技术链路、可视化表达的信息密度。

放到拼多多文具销售这个场景里,业务分析闭环可以拆成四个问题:这个类目里面哪些商品在持续贡献销售额?高价和低价商品的量价关系长什么样?用户的评价分布呈现什么特征?销量随时间波动的驱动因素是什么?这四个问题如果都能用数据和图表回答出来,设计就算站稳了。

技术链路则不需要过度炫技。核心技能点倒是非常清晰:Python数据采集(requests + json解析)、Pandas做字段规整和聚合计算、时间序列重采样、KMeans划分价格带、以及Pyecharts或Plotly做交互式图表。整套下来覆盖了数据分析岗位日常用的主干工具,面试或答辩时被追问细节也都能接得上。

1.2 分析目标的拆解与关键词映射

把标题里的关键词拆开,每个词都对应一个具体的设计决策:

  • “基于Python”:语言选型是确定的。这里不需要犹豫是选Java还是R,Python在数据处理生态上的优势太明显。
  • “拼多多文具”:平台锁定拼多多,意味着数据维度要围绕拼多多商品卡片展开,详情页字段包括标题、价格、已拼件数、评论数、店铺名称等。注意,淘宝或京东的字段逻辑不能直接套用,比如“已拼件数”和“月销量”的统计口径就有差异。
  • “销售数据”:核心指标以销售额、销量、客单价为主,衍生指标可以包括销售额环比增长率、头部商品集中度、品类渗透率等。
  • “分析”:必须有对比逻辑或归因逻辑。单纯把销量做一个Bar图展示,那不叫分析,叫流水账。好的分析至少要包含“销量Top10商品有什么共同点”、“低价商品的销售额占比是否真的更高”、“好评率高的商品是否点击量也更高”这类交叉问题。
  • “可视化”:静态图是底线,交互式看板是加分项。如果时间充裕,做一个单页面Dashboard,把价格带分布、销量趋势、地区分布、评价情感串起来展示,答辩效果会明显提升。

1.3 为什么以“文具”作为切入类目

不是所有类目都适合毕业设计阶段独立分析。选文具是因为它的数据特征带来了天然的容错空间。

第一,SKU数量适中。文具不像服饰有海量的颜色尺码组合,也不像3C数码有复杂的参数规格。一支笔就是一支笔,“得力中性笔0.5mm黑色”基本就是一个完整描述,数据规整难度低。

第二,价格梯度完整。从几毛钱的橡皮到上百元的礼盒装钢笔,价格覆盖范围大,做价格带划分时样本分布不会挤成一个尖峰。

第三,评价内容偏向简短实用。文具类评论大多是“好用”“流畅”“孩子喜欢”这类短文本,做情感分析不用处理太复杂的语义结构。

第四,销售周期有明显波动。开学季、考试季、节假日促销带来的销量起伏能被清晰捕获,时间序列分析有实际意义。

综合下来,文具类目是验证整套分析框架性价比极高的试验场。这也是为什么很多课程设计和毕业设计都愿意选它。

2. 数据采集与预处理全流程记录

2.1 数据来源选择:接口采集与公开数据集对比

在没有现成数据包的情况下,数据来源通常有三条路:走平台开放接口、爬取商品搜索结果页、使用第三方提供的历史数据集。

开放接口是最规范的路径,但拼多多开放平台对个人开发者申请权限限制比较多,尤其是非企业主体,可能要等审批周期,不一定赶得上项目进度。公开数据集则存在时效性差、字段覆盖不全的问题,很多已经是一两年前脱敏后的快照,用起来倒是省事,但做完后容易被答辩老师一个问题击穿:“如果数据不是最新的,你的结论对当前运营还有参考价值吗?”

我的建议是优先爬取搜索结果页,但不要硬刚反爬。具体做法是:在拼多多网页端手动搜索关键词“文具 小学生”,从地址栏里提取搜索接口的URL参数结构。然后用requests库模拟浏览器请求,加上常见的User-Agent和Referer头信息。解析响应时不用正则硬抠HTML,直接看JSON字段。拼多多的搜索结果页很多数据是嵌套在页面首屏的原始JSON里的,字段名常是storeInitInfo或类似结构,里面能直接拿到goods_id、goods_name、min_group_price、sales_tip等关键信息。

这里有一个重要的步骤决策:优先采集“已拼件数”超过一定阈值的商品。这样能得到一个在市场上真正有动销的样本集,避免大量零销量长尾商品把分析区间搅浑。

2.2 字段定义与数据字典设计

动手采集之前,先把数据字典定义清楚。这是很多团队容易忽略但后期返工率最高的环节。字段定义越早,后续清洗和聚合越省力。我这里给出一份兼容性较好的字段集合作为参考:

  • goods_id:商品唯一标识,用于去重和关联
  • goods_name:商品标题,原始文本,等待清洗
  • min_group_price:单件最低价(拼团价),用于价格带分析
  • origin_price:单件原价,用于计算折扣率
  • sales_tip:销售标记,文本形式,如“已拼10万+件”
  • comment_count:评论总数,作为用户关注度代理指标
  • shop_name:店铺名称,后续脱敏替换
  • category_path:类目路径,如“办公用品>笔类>中性笔”
  • 抓取时间戳:记录采集的具体时间,便于后续增量更新

字段设计中最容易踩的坑是两个:一个是sales_tip的解析,拼多多通常给出“已拼xx件”或者是区间描述“已拼>1万件”,需要正则提取数字并统一单位;另一个是min_group_price和origin_price的类型,进数据库前就要转成浮点数,不要在分析阶段反复处理字符串。

2.3 数据清洗三步走:去重、标题规整、异常值处理

清洗阶段三个高频问题,每个都值得展开。

去重针对goods_id精确去重是最基础的。但有一个容易被忽略的场景:同一款商品由于促销活动不同,可能以“套装版”和“单独装”两个SKU存在,直接按goods_id去重会把它们当成两条记录,实际上它们的价格带分布有高相关性。处理办法是按清洗后的标题关键词做归一化聚合,比如把“【开学季】XX牌中性笔0.5mm黑色12支装”和“XX牌中性笔0.5mm黑色12支装”合并处理。

标题规整是中文NLP里老生常谈但永远绕不开的环节。主要手段包括:统一大小写(虽然中文场景少,但英文字符常见于“B5”“A4”这类规格描述);去掉促销性词缀(“开学季”“限时秒杀”“网红同款”这类词不影响品类判断但影响聚类效果);处理全角半角标点(很多商品标题里混着全角空格和括号)。

异常值处理要特别警惕两类数据:价格异常和销量异常。一支中性笔的正常价格区间在0.5元到10元之间,如果出现0.01元或999元的价格,大概率是用于引流或组合销售的非常规SKU,直接保留会拉偏价格分位数。销量端,“已拼100万+件”这类超头部商品和小店几十件的长尾商品在同一个数据集里,计算均值时会被头部严重拉高,更适合用中位数和分位数描述分布。

2.4 样本量与时间窗口的平衡策略

毕设项目不是企业级BI报表,不需要全量数据支撑。样本量目标一般控制在5000到10000条有效商品记录,时间窗口覆盖一个大促周期和两个常态周就足够。我的操作习惯是分三个批次采集:第一批在月初覆盖全品类搜索词,第二批在月中做分类目标采集(按中性笔、笔记本、文具盒等子类目抽样),第三批在月末做一次增量补充。这样得到的数据既保证横截面覆盖度,又有时间纵向对比的可能。

3. 核心分析维度与关键实现

3.1 价格带聚类:从人工分段到KMeans的完整过渡

价格分析最让人头疼的地方在于分段标准的确定。如果直接按“0到5元”“5到10元”这样等宽划分,做出来的图很难看,因为拼多多文具类目的价格分布不是均匀的,超低价区间密度极大,等宽划分会产生头部聚集效应。更合理的做法是用分位数切分或者聚类。

KMeans在这个场景下是一个好选择,但直接跑原始价格数据会遇到一个问题:个别高价商品会形成极端质心。所以先做对数变换,np.log1p进行压缩,再丢进KMeans里跑。设定聚类数从3到6依次尝试,用轮廓系数和业务解释性两个条件共同选择。以中性笔为例,最后通常能分出三个有解释性的价格带:引流低价带(0.5-1.5元)、主流走量带(1.5-5元)、品质溢价带(5元以上)。每个聚类中心对应的平均折扣率、平均评论数都存在明显分离,这个结果本身就是可以在论文里直接作为“价格分层策略”证据的。

3.2 量价关系:销量与价格的“L型曲线”拟合

文具行业给人直觉印象是越便宜卖得越多,但真实数据往往是在低价区间存在一个销量的爆发点,之后快速衰减并进入长尾平台期。把价格分箱,计算每个箱子内的总销量和平均单价,就能画出经典的量价关系图。

实操中用pd.cut对价格做分箱,再groupby分箱标签统计销量之和。随后用scipy的curve_fit尝试拟合幂律函数y = a * x^b。做过几次后你会发现b值通常在-0.6到-1.2之间浮动,这意味着价格提升10%,销量可能下降6%到12%。不同小类目之间这个弹性的差异很有分析价值:本子类的弹性比笔类更敏感,因为纸质品的品牌替代性极弱,而笔类由于书写体验差异,有一定忠诚度。

3.3 时间维度:季节性波动的识别与归因

如果采集周期覆盖了开学季或618这类促销节点,时间序列分析的价值会大幅提升。将每天的销量汇总后按周重采样,能明显观察到暑假尾巴和寒假前的双峰形态。

不建议直接上ARIMA或Prophet这类比较重的预测模型,毕业设计阶段解释成本太高,而且文具类目的销售波动受开学日历、天气、疫情等外生变量影响较大,纯时序模型容易在答辩时被质疑。替代方案是用移动平均 + 同比环比拆解:计算周度移动平均线识别趋势,计算对应的周环比增长率标记峰值点,再对照学校校历和电商大促日历去解释峰值成因。这样做既保留了分析深度,又避开了复杂模型验证环节可能带来的时间消耗。

3.4 文本情感:评价数据的轻量级情感打分

评价数据是销售数据的富矿,但毕业设计不建议直接上BERT或深度学习模型,效果不稳定不说,小样本上还容易过拟合,答辩时问“为什么不用预训练模型”比问“情感词典是什么”更难答。

一个够用且能讲清楚的路线是:对评论文本做jieba分词,基于通用情感词典匹配正向词和负向词,计算每条评论的情感得分。文具类评论有较强的领域特殊性,需要人工标注一批文具相关的领域情感词,比如“断墨”“漏油”强烈负向,“顺滑”“速干”强烈正向。这个方法虽然朴素,但能回答最关键的业务问题:低价引流款的好评率是否真的低于主流价格带?从数据里经常能得到“低价带好评率并不显著更低,但差评内容更多集中在包装破损”这类有价值的矛盾结论。

4. 可视化看板设计与图表选型

4.1 图表选型背后的信息表达逻辑

可视化的第一原则是“每张图只回答一个问题”。很多初学者喜欢一张图塞三四个维度,最后答辩时解释半天别人也看不出所以然。

我的选型习惯是:

  • 品类销量分布:用横向条形图(Bar),按分类汇总,一眼看结构。
  • 价格带上商品数与销量对比:用双轴图,柱状图展示商品数量,折线图叠加销量占比。
  • 量价关系:用散点图 + 拟合曲线,点的大小映射评论数。
  • 时序销量波动:用折线图 + 移动平均线,同时在峰值点添加标注。
  • 店铺头部集中度:用帕累托图(累计占比曲线)。
  • 价格与情感得分关系:用箱线图,横轴是价格带,纵轴是评价情感得分。

4.2 Pyecharts配置的三个细节

选Pyecharts不是因为功能最强,而是因为中文支持和社区模板丰富。但默认配置有几个细节必须手工调。

一是全局颜色风格。默认主题直接用在学术答辩场景会显得不够沉稳。我习惯用ThemeType.CHALK或者直接自定义色板,颜色数量保持在5个以内,统一冷暖搭配。

二是数据缩放组件。当记录数超过几百条,散点图和折线图都必须加上DataZoom组件,否则呈现端密密麻麻一坨,答辩时老师想细看某个局部都无从下手。在pyecharts里加DataZoom是标准操作,初始化时指定datazoom_opts即可。

三是Tooltip的触发方式。字段比较多时,默认的axis触发会显示全部序列信息,信息噪音极大。建议改成item触发,按需查看单个数据点的明细。

4.3 Dashboard整合:从单图到故事线

单图再好看也只是零件,最终交付要呈现一条完整的故事线。我的页面结构通常是四段式:

第一段是全局看板区。放KPI卡片,核心指标是总销售额、有效商品数、平均客单价、头部店铺市占率。第二段是价格结构区。左边放价格带分布柱状图,右边放量价关系拟合图,环环相扣。第三段是时间趋势区。折线图展示整体销量走势,配合大促节点标注。第四段是用户声音区。箱线图展示不同价格档位的情感得分分布,配合几条代表性的正负向评语案例。

页面不需要做得多炫,但每个区块的标题必须是业务问题,不能是“销量趋势图”这种标题,而是“开学季前后销量如何波动”这类人话标题。这是可视化和普通图表展示之间的关键差异。

5. 踩坑实录与常见问题排查

5.1 数据采集阶段的三个高频异常

第一个高频异常是请求返回空白JSON。常见原因不是IP受限,而是缺少某些必要的Header参数,尤其是AccessToken或Anti-Content参数。我在多次实操中发现,直接复制浏览器请求里带上的Cookie能解决大多数问题,但要注意Cookie时效性,采集脚本跑了几个小时后如果突然连续失败,优先检查Cookie是否过期。

第二个高频异常是销量字段缺失。部分商品的销售标记可能是空字符串或“即将开抢”这类活动状态文本。如果采集时没做非空判断,后面分析时会出现大量NaN,影响分组统计。处理办法是在清洗环节直接把销量为空的记录过滤掉,同时在论文里注明“有效样本为具备完整销量字段的商品”。

第三个异常是价格字段的单位差异。有些促销场景会展示“券后价X元起”,和前端的拼团价逻辑有偏差。这种情况我的做法是统一以详情页JSON里的min_group_price为准,不额外解析文案。

5.2 价格异常值处理的边界情况

文具类目经常出现“0.01元秒杀”这种数据点,在价格分箱时如果纳入,会生成一个只有几个样本的独立分箱,曲线拟合时还会成为强影响点。我的处理原则是:设定领域价格下界,低于下界的记录单独标记为异常样本,不参与主流区间建模,但在论文中可以单列一小节讨论引流策略。这比直接删除更严谨。

5.3 中文编码与字体文件的那些事

Pyecharts生成的HTML里中文显示正常,但一旦导出图片或嵌入Jupyter Notebook截图时,经常出现豆腐块字体。这个问题的根因是系统缺少中文字体,需要把生成的网页设置为指定字体或者用无头浏览器将HTML截图导出PNG,导出前安装simhei字体并执行fontconfig更新。这个细节看起来小,但最终提交的论文插图如果出现乱码,评审观感影响很大。

5.4 答辩前后需要重点验证的数字口径

有一类问题在答辩场上几乎必问:“你的总销售额怎么算的?”如果回答“销量乘以价格”,就暴露出统计口径不严谨,因为拼多多的销量可能包含刷单和活动冲量。我建议把指标定义为“成交金额估算 = 已拼件数 × 单人拼单价”,并在文档中明确标注是估算口径,同时用评论数和商品收藏数作为交叉验证。遇到答辩老师追问时,可以坦率讨论估算的局限和修正思路。

6. 从毕设到实战的扩展路径

整套代码跑通后,可以做的扩展方向其实不少。

第一个方向是搭建定时采集任务。把主脚本用APScheduler包一层,每天凌晨自动拉取数据入库,配合数据库里的历史数据做滚动分析,这就是一个标准的电商数据监控雏形。后续甚至可以把周报自动生成的功能加进去,到这一步,就不仅仅是毕业设计,而是具备企业级应用形态的工具了。

第二个方向是增加店铺维度分析。文具类目头部门店和中长尾门店的运营策略差异是一个非常值得深挖的方向。比如头部门店通常用全品类覆盖策略,中长尾门店则可能专注于单品类深度,这从店铺商品分布和销量集中度两个指标就能量化。

第三个方向是引入用户评论的可视化词云和时间演化。把拆好的词频数据按月度做对比,能观察到“网红文具”概念在平台上的扩散路径。这类内容的展示性很强,适合在答辩或作品集中作为亮点展示。

还有一点建议:代码仓库从一开始就要建好,README里写清楚环境依赖和运行顺序。这不仅是好习惯,也是答辩时展示工程素养的有力证据——很多同学代码能跑但文档混乱,反而扣分。README至少包含:数据字典说明、环境安装命令、脚本执行顺序、输出图表清单。

个人经验总结

整套做下来,我最大的体会是“先保质,再保量”。很多新手把精力全花在采集更多商品数据上,但数据质量不行,后面所有分析和可视化都是空中楼阁。我实际跑项目时,清洗环节占到整个项目时间的四成左右,远高于最初预期。想要数据规整干净,核心就是一开始把字段定义想清楚,把清洗规则写成可重复执行的函数——不要用Jupyter Notebook里的单元格一个个手动处理,那会让你第二周完全看不懂自己写了什么。

另外一个容易被忽视的小技巧是分析过程中保留中间产出。每个清洗步骤、每次聚类结果、每个图表的初始版本都留一个快照。答辩展示时可以顺理成章地讲出“我是怎么一步步调整思路的”,这比直接丢一个最终版图表要可信得多。

拼多多文具数据分析这个题目范围适中、延展性好,做完后你会发现自己对Python数据分析的把握程度会有质的提升。别贪多,把一条链路从头走到尾,该有的收获一分都不会少。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进