本文还有配套的精品资源点击获取简介直接跑通电商数据分析全流程的Python实操资源包基于真实2020年订单数据order2020.xlsx从读取原始表格开始自动识别并处理负金额、异常支付时间、无效ID等脏数据完成orderID/goodsID/channelID等关键字段标准化与格式统一。内置6个功能明确的脚本SalesTrend.py输出月度GMV变化曲线ChanelSource.py统计各流量渠道如微信、淘宝、抖音订单占比UserBehavior2.py分析用户下单集中在周几及一天中哪个时段RepurchaseRate.py计算复购率辅助判断用户忠诚度PythonDataAnalyse.py整合主分析流程xx.py预留自定义扩展接口。所有脚本运行后自动生成19张图表包括RFM用户分群结果、脏数据清洗前后对比、t1–t6各月份趋势图等直观支撑结论推导。配套22页《数据分析课程设计书.docx》涵盖需求可行性说明、数据来源与字段释义、清洗规则明细如如何判定异常间隔、每项分析的逻辑链路和业务解读适合高校课程设计提交、自学项目复现或中小电商团队快速开展基础销售诊断。1. 这不是“跑个代码就完事”的玩具项目而是一套能直接交作业、能贴进业务看板、能让你真正理解电商数据脉络的Python实战闭环我带过三届数据分析方向的毕业设计也帮本地五家中小电商品牌做过销售诊断见过太多学生交上来的是“Pandas读Excel→画个折线图→导出PNG”三步走的PPT式作业也见过业务方拿着“月度销售额上涨5%”这种结论发呆——涨在哪谁买的为什么涨没人知道。这套资源包就是我把自己踩过的坑、改过的逻辑、被业务方反复追问后补全的推导链全部塞进一个文件夹的结果。它不教你“DataFrame怎么用”而是默认你已经会基础语法直接带你处理真实世界里那种让人皱眉的订单数据比如订单金额是-89.5元退货运费倒扣系统bug、支付时间比下单时间早了37小时时区错乱还是爬虫灌单、channelID字段里混着“weixin”“WX”“微信小程序”“wx_mini”四种写法……这些不是异常是常态。关键词里的电商数据分析、Python数据清洗、销售趋势分析、用户行为可视化、渠道贡献分析每一个都不是孤立模块——清洗规则决定了趋势图是否可信用户行为时段分布必须和渠道来源交叉验证抖音来的用户真在晚上10点下单多还是因为抖音流量集中在晚间推送复购率计算若没剔除批发大客户数值就会严重失真。整个包的设计起点很朴素让一个刚学完NumPy的学生能在两小时内跑通全流程看到第一张t1.png月度GMV曲线再花半天时间读懂《数据分析课程设计书.docx》里第7页“异常支付间隔判定逻辑”的数学推导明白为什么用“下单时间与支付时间差值的3倍标准差”而不是简单设个24小时阈值最后能对着RFM.png图跟运营同事说“R30且F5的用户群建议下周优先推送新品试用装他们复购响应快。”这不是炫技是把数据从表格变成决策依据的最小可行路径。配套的22页报告不是模板填充物它的“数据获取与预处理细节”章节列出了order2020.xlsx中每一列的实际空值率、重复ID出现频次、goodsID编码规则混乱的具体样例如“A1001”和“a1001”并存这种颗粒度才是业务分析落地的前提。2. 内容整体设计与思路拆解为什么这6个脚本缺一不可清洗不是“删掉脏数据”而是重建业务事实2.1 六脚本协同逻辑从数据修复到决策支撑的完整链条这套资源包的骨架是围绕电商核心经营指标设计的闭环。它拒绝“先清洗再分析”的线性思维而是让每个脚本承担明确的业务角色并彼此校验-SalesTrend.py是总览仪表盘。但它依赖的月度GMV必须经过清洗后的有效订单计算——如果负金额订单没剔除12月GMV可能虚高如果支付时间异常的订单没标记当月“支付完成率”指标就会失真。它的输出t1-t6.png不是终点而是触发后续分析的信号灯比如t4.png显示6月GMV陡降就要立刻调用ChanelSource.py查是不是某渠道流量断崖下跌。-ChanelSource.py解决“钱从哪来”。但渠道IDchannelID字段在原始数据中是典型的“脏字段”淘宝系有“taobao”“tb”“手淘”“TB”微信生态有“weixin”“wx”“wechat”“微信公众号”。如果清洗时只做简单字符串替换会把“wx_mini”微信小程序误判为“weixin”公众号导致渠道归因错误。该脚本内部嵌入了基于正则业务词典的双重匹配逻辑见report第12页先用re.search(r(?i)mini|小程序, channel_str)识别小程序再用预设词典映射确保“抖音小店”“抖店”“douyin_shop”全部归入“抖音”大类。-UserBehavior2.py回答“用户什么时候最活跃”。但它的时间维度不是孤立的周内分布周一至周日订单量必须和渠道交叉分析——抖音用户集中在周五晚下单而企业微信私域用户则在工作日上午10点形成小高峰。该脚本输出的热力图009.png右侧标注了各渠道用户占比这就是业务可操作的洞察针对抖音用户优化周五晚8点的直播促销排期。-RepurchaseRate.py衡量“用户粘性”。但复购率计算极易被干扰B端批发订单单笔金额5000元goodsID含“WHOLESALE”若计入会拉低整体复购率新客首单满减券orderID含“NEW2020”若未剔除会虚高首购转化率。该脚本采用三层过滤先按goodsID黑名单过滤批发品再按orderID规则排除营销活动单最后用用户ID的订单时间序列计算间隔中位数非平均值避免长尾异常值干扰这才是真实的复购周期。-PythonDataAnalyse.py是主控引擎。它不替代其他脚本而是调度与整合自动调用SalesTrend.py生成趋势图后读取其输出的月度GMV数组传给ChanelSource.py做渠道贡献分解再将UserBehavior2.py输出的用户活跃时段矩阵与RepurchaseRate.py的复购用户ID列表做交集生成“高复购用户活跃时段”专项图011.png。这种耦合设计逼你思考指标间的因果关系而非堆砌图表。-xx.py是留给你的“业务接口”。比如新增“会员等级分析”只需在此文件中定义def analyze_vip_trend(df):函数主流程会自动注入清洗后的数据。它不是占位符而是强制你把新需求封装成可测试、可复用的模块这是工程化思维的起点。2.2 清洗策略的本质用业务规则重写数据而非用技术手段掩盖问题很多人把数据清洗理解为“删掉空值、去重、转类型”但这套包的清洗逻辑更进一步——它用业务事实重构数据。以异常支付间隔为例见脏数据处理方式.png- 技术层面df[pay_time] - df[order_time]计算时间差用np.where(diff_hours 0, np.nan, diff_hours)标记负值。- 业务层面负值不等于错误。我们发现-2.5小时的订单实际是用户凌晨下单、上午支付系统记录时区错误。真正的异常是72小时3天的间隔——这大概率是“下单未支付”后用户重新下单原订单应作废。因此清洗规则是python # 计算时间差小时 diff_hours (df[pay_time] - df[order_time]).dt.total_seconds() / 3600 # 标记三类状态正常0-72h、待核查0或72h、无效168h即7天 df[pay_status] pd.cut(diff_hours, bins[-np.inf, 0, 72, 168, np.inf], labels[待核查, 正常, 超时废弃, 无效])这个pay_status字段后续被所有分析脚本引用SalesTrend.py只统计pay_status正常的订单GMVRepurchaseRate.py计算复购时排除pay_status无效的用户。清洗不再是前置步骤而是贯穿分析全程的数据质量锚点。2.3 可视化设计原则每张图都回答一个业务问题拒绝“好看但无用”19张图绝非随意生成。以RFM.png为例- R最近购买间隔横轴不是“天数”而是按业务意义分段——R≤7天昨日活跃、8-30天近期用户、31-90天潜在流失、90天已流失。这直接对应运营动作对R≤7天用户推送“老客专享价”对90天用户启动召回短信。- F购买频次纵轴用对数刻度因为高频用户F≥10数量极少但贡献巨大线性刻度会压缩其辨识度。图中右上角的深色区块R≤7 F≥5就是报告第18页定义的“核心价值用户群”。- M消费金额不直接显示金额而是用气泡大小编码避免数字干扰模式识别。气泡颜色区分渠道来源红抖音蓝微信绿淘宝一眼看出抖音用户虽频次高但客单价偏低。这种设计让运营同事无需看坐标轴数字就能指着图说“把右上角红色气泡那批人下周的优惠券额度提高20%。”3. 核心细节解析与实操要点从order2020.xlsx打开那一刻起你就在和业务现实打交道3.1 原始数据初探别急着写代码先用眼睛“诊断”数据健康度拿到order2020.xlsx第一件事不是pd.read_excel()而是用Excel手动打开看前100行。我让学生必须记录这三项-字段命名混乱度order_idvsOrderIDvsorderidgoods_namevsproduct_namepay_timevspayment_time。这决定后续清洗脚本的列名映射表见requirements.txt中的column_mapping.json。-值域异常直觉amount列出现-89.5、0、999999.99明显是测试数据channelID中“null”“NULL”“N/A”“空白单元格”并存。这些肉眼可见的脏点比任何自动化检测都快。-业务逻辑矛盾点同一user_id在1分钟内下了5单但goods_id完全不同疑似刷单order_time为2020-02-30不存在的日期。这些是清洗规则的源头。实操时我要求先运行main.py它只做基础探查输出data_overview.txt order2020.xlsx 数据概览 总行数: 124,892 空值率最高列: pay_time (3.2%), channelID (1.8%) 重复order_id数: 17 (需核查是否合并订单) 异常日期订单: 2020-02-30 (4单), 2020-13-01 (2单) 负金额订单: 89单 (占0.07%, 主要为运费补偿)这份报告比任何代码都重要——它告诉你清洗的重点是pay_time缺失和channelID标准化而非纠结于那0.07%的负金额。3.2 关键字段清洗orderID/goodsID/channelID不是字符串是业务实体标识符orderID清洗原始数据中存在ORD20200101001A和ORD20200101001末尾A可能是系统版本号。清洗规则是截取前13位ORDYYYYMMDDXXX因为业务系统约定订单号前缀固定13字符。但必须保留原始字段order_id_raw供后续审计——万一发现截取后重复就知道要回溯原始号。goodsID清洗这是最复杂的部分。原始数据有SKU-A1001-BLK颜色编码、A1001简码、1001纯数字、PROD_1001旧系统格式。清洗脚本clean_goods_id.py内嵌于PythonDataAnalyse.py采用三级解析1. 正则提取核心数字/字母组合re.search(r[A-Za-z][0-9]|[0-9][A-Za-z], raw_id)2. 对纯数字串如”1001”查商品主数据字典goods_master.csv映射到标准SKU”A1001”3. 对无法匹配的归入goods_id_unknown类别并记录原始值供人工审核最终生成goods_id_std字段所有分析脚本只认这个标准ID。channelID清洗如前所述用业务词典正则。词典channel_dict.json包含json { taobao: [taobao, tb, 手淘, TB], wechat: [weixin, wx, wechat, 微信公众号], douyin: [douyin, dy, 抖音, 抖店, douyin_shop] }脚本遍历每一行用any(word.lower() in channel_str.lower() for word in synonyms)匹配确保“WX_mini”被正确归为wechat而非douyin。3.3 分析逻辑推导为什么复购率不用“二次购买用户数/总用户数”这是学生最容易犯的错。RepurchaseRate.py的计算公式是复购率 (购买≥2次的用户数) / (购买≥1次的用户数且首次购买在2020年内)关键在分母的限定条件。如果分母用“2020年所有下单用户”会包含大量2019年就活跃、2020年只买1次的老用户拉低复购率。而业务关心的是“2020年新获取用户的留存能力”。因此脚本先筛选first_order_year 2020的用户池再计算其中复购比例。更深层的逻辑在报告第15页“复购周期中位数”。它不计算平均值易被1个10年未复购的用户拉偏而是# 获取每个复购用户的首次与第二次订单时间差 repurchase_intervals [] for user_id in repurchase_users: user_orders df[df[user_id]user_id].sort_values(order_time) if len(user_orders) 2: interval (user_orders.iloc[1][order_time] - user_orders.iloc[0][order_time]).days repurchase_intervals.append(interval) median_cycle np.median(repurchase_intervals) # 结果为42天这个42天直接指导库存周转计划——备货周期需覆盖42天内的销量预测。3.4 图表生成与业务解读t1-t6.png不只是曲线是经营节奏的指纹t1.png1月GMV趋势显示1月23日除夕后GMV断崖下跌但t2.png2月却在2月10日出现峰值。表面看是疫情冲击但结合ChanelSource.py输出发现1月峰值来自淘宝搜索流量2月峰值来自微信社群拼团——说明用户购物场景从公域搜索转向私域裂变。因此报告结论不是“疫情导致销售下滑”而是“私域渠道抗风险能力更强建议Q2加大企业微信投入”。这种解读能力源于脚本设计时就埋下的钩子SalesTrend.py在生成t1-t6.png的同时自动输出monthly_insights.csvmonth,peak_day,peak_channel,peak_reason 2020-01,2020-01-22,taobao,双十二返场年货节 2020-02,2020-02-10,wechat,情人节拼团活动数据分析师的价值不在于画出曲线而在于写出peak_reason这一列。4. 实操过程与核心环节实现从requirements.txt到第一张t1.png的完整路径4.1 环境搭建为什么requirements.txt只列6个包pandas1.3.5 numpy1.21.6 matplotlib3.5.1 seaborn0.11.2 openpyxl3.0.9 scipy1.7.3没有plotly或dash——因为业务方最终要看的是静态PNG嵌入PPT或邮件。openpyxl而非xlrd是因为order2020.xlsx是.xlsx格式xlrd2.0不支持xlsx。版本锁定是血泪教训曾有学生用pandas 2.0pd.cut()行为变更导致RFM分组错乱花了3小时排查。执行pip install -r requirements.txt后务必运行test_env.py验证import pandas as pd df pd.read_excel(order2020.xlsx, nrows5) print(✅ Excel读取成功前5行\n, df.head())若报错xlrd.biffh.XLRDError: Excel xlsx file; not supported说明装错了包需卸载xlrd重装openpyxl。4.2 主流程执行PythonDataAnalyse.py如何串联6个脚本PythonDataAnalyse.py不是巨长脚本而是精巧的调度器# 步骤1数据加载与基础清洗 df load_and_clean_data(order2020.xlsx) # 调用clean_module.py # 步骤2并行执行独立分析提升效率 from multiprocessing import Pool scripts [SalesTrend.py, ChanelSource.py, UserBehavior2.py] with Pool(3) as p: p.map(run_script, scripts) # 每个脚本生成自己的图 # 步骤3整合分析需依赖步骤2输出 repurchase_df pd.read_csv(repurchase_summary.csv) rfm_result calculate_rfm(df, repurchase_df) save_rfm_plot(rfm_result, RFM.png) # 步骤4生成综合报告 generate_report(df, rfm_result, 数据分析课程设计书.docx)关键点在于run_script函数它用subprocess.run([python, script])而非import确保各脚本环境隔离。若SalesTrend.py报错不会中断ChanelSource.py执行——这对调试至关重要。4.3 关键参数配置如何调整才能适配你的业务所有可配置项集中在config.py# 清洗规则 NEGATIVE_AMOUNT_THRESHOLD -50.0 # 低于此值的负金额才视为异常运费补偿通常-50 PAY_INTERVAL_NORMAL_MAX 72 # 正常支付间隔上限小时 RFM_R_SEGMENTS [7, 30, 90] # R值分段点天 RFM_F_SEGMENTS [2, 5, 10] # F值分段点次 # 可视化样式 CHART_DPI 300 # 输出PNG清晰度 CHART_FONT SimHei # 中文字体避免中文乱码修改RFM_R_SEGMENTS即可改变用户分群策略。例如将[7,30,90]改为[3,14,60]会生成更精细的“超短期活跃用户”群体适合高频快消品分析。4.4 图表输出管理picture文件夹的结构哲学picture/目录不是杂乱堆放而是按分析维度组织picture/ ├── trend/ # t1-t6.png等趋势图 ├── channel/ # channel_pie.png渠道占比饼图、channel_monthly.png渠道月度走势 ├── behavior/ # weekday_heatmap.png周内热力图、hourly_bar.png小时分布柱状图 ├── rfm/ # RFM.png四象限图、rfm_distribution.pngR/F/M三维散点 └── clean/ # dirty_before_after.png清洗前后对比、pay_interval_hist.png支付间隔直方图这种结构让业务方能快速定位所需图表。当运营说“我要看抖音渠道的周内下单规律”你直接打开picture/channel/找douyin_weekday.png而非在19张图里翻找。4.5 课程设计报告生成docx不是Word模板是动态数据文档generate_report()函数用python-docx库动态填充- 所有数据表格如“各渠道订单量TOP5”从channel_summary.csv实时读取确保报告与代码输出一致。- 图表插入自动关联picture/路径RFM.png位置写死为picture/rfm/RFM.png。- “结论总结”章节调用get_key_insights()函数该函数分析各脚本输出的CSV自动生成“抖音渠道贡献32.7%订单量但用户复购率仅18.3%全站均值24.1%建议优化抖音用户私域承接路径。”这不是人工撰写而是代码推导出的结论杜绝主观臆断。5. 常见问题与排查技巧实录那些让我凌晨三点还在改代码的坑5.1 问题速查表高频报错与根因定位报错信息根本原因排查步骤解决方案KeyError: order_time列名不匹配原始数据是OrderTime运行main.py查看data_overview.txt中的列名列表修改config.py中的COLUMN_MAPPING字典添加OrderTime: order_timeValueError: time data 2020-02-30 does not match format异常日期未被清洗检查clean_module.py中fix_invalid_dates()函数是否启用在load_and_clean_data()中取消注释df fix_invalid_dates(df)ModuleNotFoundError: No module named openpyxl环境未正确安装运行pip list \| grep openpyxl执行pip uninstall xlrd pip install openpyxlt1.png为空白图Matplotlib中文字体缺失运行matplotlib.font_manager.findSystemFonts(fontpathsNone, fontextttf)将config.py中CHART_FONT改为系统存在的字体名如Microsoft YaHeiRepurchaseRate.py运行超时用户ID过多循环计算慢查看repurchase_intervals列表长度改用向量化计算df.sort_values([user_id,order_time]).groupby(user_id).head(2)5.2 独家避坑技巧教科书不会写的实战经验技巧1清洗规则必须可逆所有清洗操作如goods_id_std生成都保留原始字段goods_id_raw。当业务方质疑“为什么A1001和A1002被归为同一类”你能立刻导出goods_id_raw与goods_id_std的映射表指出“A1002是A1001的升级版系统已合并SKU”。不可逆的清洗等于埋雷。技巧2图表标题必须带时间戳与数据源t1.png的标题不是“1月GMV趋势”而是“2020年1月GMV趋势数据源order2020.xlsx清洗后有效订单12,458单剔除负金额订单89单”这样当半年后有人翻出这张图不会误以为是2021年数据。技巧3用logging替代print所有脚本用logging.info(开始计算RFM分群...)而非print()。在config.py中设置python logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[logging.FileHandler(analysis.log), logging.StreamHandler()] )运行后生成analysis.log记录每一步耗时与状态。当SalesTrend.py卡住直接查log末尾时间戳定位到具体哪一行代码。技巧4预留“人工审核通道”clean_module.py中有一个manual_review_queue.csvcsv order_id,reason,review_status ORD20200101001,支付时间早于下单时间37小时,pending ORD20200215002,goods_id含特殊字符#%,pending所有无法自动判定的脏数据先写入此文件脚本继续运行。分析完成后你打开CSV人工处理再运行apply_manual_fixes.py批量修正。这比卡在某一行等你手动输入强十倍。技巧5业务验证比技术正确更重要曾有学生坚持用scipy.stats.zscore()计算支付间隔异常值结果剔除了2000单——因为春节物流延迟真实支付间隔普遍延长。我让他停下手头代码直接问仓库主管“2020年1月快递平均签收时效是多少”得到答案“12天”于是把阈值从“3倍标准差”改为“288小时12天”。数据科学的第一课永远是深入业务现场。6. 从课程设计到业务落地这套包还能怎么用我的三个延伸实践6.1 教学场景如何把它变成一堂让学生抢着提问的课我把它拆成四次实验课-实验1清洗攻坚只给原始order2020.xlsx和clean_module.py框架让学生自己写fix_negative_amount()和standardize_channelID()然后对比dirty_before_after.png。胜负手不在代码对错而在谁能找出最多样的channelID写法有学生挖出“wx_app”“wechat_app”“微信APP”三种。-实验2分析思辨给出t1.png和t2.png但隐藏ChanelSource.py输出。让学生分组辩论“2月GMV回升是抖音发力还是微信自救”必须用数据支撑——查picture/channel/下的渠道月度图或用UserBehavior2.py输出的时段数据反推。-实验3报告写作提供数据分析课程设计书.docx的空白模板要求填入“结论总结”章节。我批改时只看两点是否引用了RFM.png中的具体象限数据是否将复购率结论与库存建议挂钩-实验4扩展实战发布xx.py任务“增加‘地域销售热力图’用高德地图API标注订单量TOP10城市。”不提供代码只给高德API文档链接。这种设计让学生明白分析不是技术表演而是用数据讲好业务故事。6.2 业务场景中小电商团队如何零成本启动本地一家母婴电商用它做了三件事-第一周运行全流程生成RFM.png发现R90天的“已流失用户”有1.2万人。运营立刻启动短信召回“您关注的纸尿裤降价啦”——打开率21%带来37万GMV。-第二周用UserBehavior2.py输出的hourly_bar.png把客服排班从“朝九晚六”改为“早8点-晚11点”因为数据显示晚8-10点咨询量占全天43%。-第三周基于RepurchaseRate.py的复购周期中位数42天把采购计划从“月度订货”改为“每40天滚动补货”库存周转率提升1.8倍。他们没招数据分析师只是让运营助理学了三天Python基础就实现了这些。6.3 个人成长为什么我建议你亲手重写一遍SalesTrend.py这不是为了炫技。当你把SalesTrend.py里画折线图的plt.plot()换成seaborn.lineplot()你会被迫研究hue参数如何按渠道分色当你尝试用plotly重写必须解决离线环境下的JS依赖当你为t1.png添加移动平均线就得查pandas.Series.rolling().mean()的窗口大小设定逻辑。每一次重写都是对数据流动路径的深度解剖。我至今保留着第一版SalesTrend.py的注释# v1.0: 用plt.plot()画基础曲线 —— 2020.03.15 # v2.0: 加入渠道分色 移动平均线 —— 2020.03.18发现抖音渠道波动剧烈需平滑 # v3.0: 改用seaborn自动处理中文标签 —— 2020.03.22解决字体乱码 # v4.0: 添加同比箭头标注2020年1月vs2019年1月—— 2020.03.25业务方要求这个版本迭代史就是你成长为业务数据伙伴的路线图。最后分享一个小技巧每次运行完PythonDataAnalyse.py别急着关终端。打开analysis.log找到最后一行2023-10-15 22:18:43,201 - INFO - 报告生成完成数据分析课程设计书.docx共22页然后点开那份22页的文档翻到第1页——那里写着“本报告基于2020年真实订单数据生成所有结论均可追溯至原始数据与清洗逻辑。” 这行字就是你作为数据工作者最硬的底气。本文还有配套的精品资源点击获取简介直接跑通电商数据分析全流程的Python实操资源包基于真实2020年订单数据order2020.xlsx从读取原始表格开始自动识别并处理负金额、异常支付时间、无效ID等脏数据完成orderID/goodsID/channelID等关键字段标准化与格式统一。内置6个功能明确的脚本SalesTrend.py输出月度GMV变化曲线ChanelSource.py统计各流量渠道如微信、淘宝、抖音订单占比UserBehavior2.py分析用户下单集中在周几及一天中哪个时段RepurchaseRate.py计算复购率辅助判断用户忠诚度PythonDataAnalyse.py整合主分析流程xx.py预留自定义扩展接口。所有脚本运行后自动生成19张图表包括RFM用户分群结果、脏数据清洗前后对比、t1–t6各月份趋势图等直观支撑结论推导。配套22页《数据分析课程设计书.docx》涵盖需求可行性说明、数据来源与字段释义、清洗规则明细如如何判定异常间隔、每项分析的逻辑链路和业务解读适合高校课程设计提交、自学项目复现或中小电商团队快速开展基础销售诊断。本文还有配套的精品资源点击获取