ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

泰迪杯B题冲刺:从Excel到业务结论的完整数据分析流程

泰迪杯B题冲刺:从Excel到业务结论的完整数据分析流程 简介面向2022年第5届泰迪杯数据分析技能赛B题的完整解题资源主题为银行客户忠诚度分析适合参赛学生、数据分析初学者及希望复盘赛题的学习者。资源围绕赛事五个任务展开数据探索与清洗、产品营销数据可视化、客户流失因素分析、特征构建及长期忠诚度预测建模提供可运行的Jupyter Notebook代码与对应输出结果。包内共28个文件以10个ipynb代码文件为核心另含8个xlsx结果文件、5个html格式的代码预览、3个csv辅助数据及2个pdf赛题原文档压缩包大小12.05MB结构清晰便于对照学习。内容覆盖完整数据分析流程从原始数据处理到建模预测均有实现并附有中间结果与最终预测文件可直接查看每一步输出。目前已有695人学习/下载适合需要系统掌握泰迪杯B题思路和Python数据分析实战方法的同学。1. 泰迪杯B题难在把Excel表格讲成业务结论泰迪杯数据分析技能赛的B题历年风格偏“经营分析”和“业务诊断”给一张或几张看起来不算太大的宽表让你做清洗、处理、分析最后输出结论和可视化结果。很多同学卡住不是因为算法不会而是拿到数据先想跑个高大上的模型结果绕远了。B题真正考察的是把一张Excel表变成结构化结论的能力这恰恰是比赛里大多数人丢分的地方。这套流程适合两类人第一次参加技能赛、想快速建立完整解题框架的同学以及已经跑过Python数据分析、想用最短时间从数据到报告的在职人士。下面直接按一条可复现的路径展开从打开表到交卷前验算都覆盖到。2. 拿到B题先别跑模型把Excel和数据字典读透2.1 先判断数据形态再决定用pandas还是ExcelB题给的数据默认是Excel或CSV量级通常在几万到几十万行之间。这个量级用Excel手工处理非常折磨人纯pandas又容易忽略字段含义所以常见做法是“Excel看结构、Python做重活”。拿到数据后我一般先做三件事打开每个工作表记录每个sheet的行列数看字段名是否规范找有没有单独的数据字典说明文档。很多队伍直接跳过了这个环节等清洗完才发现“订单金额”是文本类型后面全部做不了聚合。2.2 用pandas读取Excel的最小可靠脚本读取阶段不要一上来就用pd.read_excel一把梭先把结构摸清楚。下面这个脚本是每次比赛我都会用的开头import pandas as pd # 第一步只读前5行先看字段名和示例数据 df_preview pd.read_excel(B题数据.xlsx, sheet_name0, nrows5) print(df_preview.head()) print(df_preview.columns.tolist()) # 第二步确认每个字段的真实类型特别警惕“数字存成文本” df_full pd.read_excel(B题数据.xlsx, sheet_name0) print(df_full.dtypes) # 第三步做一次全表缺失率检查决定后续清洗工作量 missing_rate df_full.isnull().mean().sort_values(ascendingFalse) print(missing_rate[missing_rate 0])这段代码的核心思路是先看后做nrows5避免一次加载全表导致内存浪费dtypes直接暴露出“金额”“日期”这类字段是否被读成了object而缺失率检查能让你在写清洗逻辑前就心里有数。注意sheet_name0表示第一个工作表如果B题数据分了多个sheet建议逐个sheet各跑一遍这个脚本把字段清单汇总到一个表格里再开始写业务逻辑。2.3 把任务清单拆成输出物清单读透数据的真正目的是把“题目要求”翻译成“输出物”。B题一般会要求你做统计汇总、指标计算或数据可视化常见输出物包括清洗后的数据表、指标结果表、可视化图表、分析结论文档。这一步我建议直接在Excel里建一个“输出物清单”sheet列四列序号、目标、输出文件名、对应的数据源。这样做的好处是后面每完成一步就勾掉一项避免交卷时漏文件。建议的读表检查顺序可以对照下面这个表格检查项目具体动作出错信号字段数量比对数据字典和工作表的列数列数不一致说明可能有派生字段唯一标识确认有没有订单号、用户ID这类主键主键重复会导致后续关联翻倍时间字段确认时间列是datetime类型、时区统一时间字符串格式混杂需要先解析金额数值检查是否存在负数、0值和文本型数字金额出现文本会导致sum失效类别字段用value_counts看类别数量和占比出现“未知”“-”等脏类别需要合并有些参赛选手会在这一步花很长时间去做完美清洗实际没必要。B题是按完成度和结论质量评分不是看清洗过程多漂亮所以清洗到“可分析、不误导结论”的程度就可以进入下一阶段。3. 数据清洗和特征派生B题拿高分的关键得分点3.1 缺失值处理先分清是“真空缺”还是“业务含义”缺失值处理是B题最常见的坑。比如“会员等级”为空可能确实没填写也可能是用户根本没注册会员这两种情况处理方式完全不同。所以清洗前要先判断每个缺失字段的业务含义。常见做法分成三类直接删除行、用默认值填充、保留缺失并单独标记。对于参与聚合计算的金额类字段缺失时不能简单填0否则会把“没有记录”和“金额为0”混为一谈。下面给出一套可复用的清洗模板注释里标注了每一步的适用场景import pandas as pd import numpy as np df pd.read_excel(B题数据.xlsx) # 1. 删除完全重复的行保留第一条 df df.drop_duplicates() # 2. 关键业务字段订单号、用户ID缺失的直接剔除 df df.dropna(subset[订单号, 用户ID]) # 3. 类别字段用“未知”填充避免后续groupby丢失 df[会员等级] df[会员等级].fillna(未知) # 4. 数值型字段先看分布再决定策略 # 如果中位数和均值差距大说明有偏态分布用中位数填充更稳 amount_median df[消费金额].median() df[消费金额] df[消费金额].fillna(amount_median) # 5. 日期字段缺失的单独打标不参与时间维度分析 df[下单日期] pd.to_datetime(df[下单日期], errorscoerce) df[日期缺失] df[下单日期].isnull().astype(int) # 6. 过滤明显的异常值消费金额为负且无退款标记 df df[~((df[消费金额] 0) (df[退款标记] ! 1))]这段代码覆盖了B题90%的清洗场景。关键点是第4步填充缺失值前先看数据分布df[消费金额].median()先算出来看一眼如果中位数远小于均值说明数据右偏这时候用均值填充会把大量缺失值推到高消费区间影响后续分组统计。第6步过滤负金额时注意条件逻辑只有“没有退款标记”的负金额才真正异常有退款标记的负金额其实是业务中的正常记录。3.2 时间维度和用户维度的特征派生清洗完之后B题通常需要做分组统计这时原始表往往不够用。最常见的需求是按时间分析趋势按用户分析复购按商品分析销量。三者对应的特征派生方式完全不同对照关系如下分析场景派生方式典型代码产出字段按天/月统计销售额从下单日期提取年月df[月份] df[下单日期].dt.to_period(M)月份、销售额按用户统计消费频次按用户ID分组计数df.groupby(用户ID)[订单号].nunique()用户ID、订单数按用户统计消费金额按用户ID分组求和df.groupby(用户ID)[消费金额].sum()用户ID、消费总额按商品统计销量按商品ID分组累加df.groupby(商品ID)[数量].sum()商品ID、销量派生完的特征建议单独存成新表不要全部拼回原表。原因有两个一是避免原表变得臃肿二是不同分析目标需要不同的聚合粒度全部拼回原表会导致行数膨胀。做法上我习惯在代码目录下建一个feat/文件夹每个派生表一个文件后面做可视化和报告时直接读取。3.3 分组统计后一定要用Excel透视表交叉验证这一点容易被忽略但特别重要。Python的groupby结果算完之后我建议把结果导出成一个临时Excel用数据透视表手动拖一遍同样的维度核对关键数字是否一致。注意这里核对的是数量级和关键总计不是每个单元格。比如你算出来“华东区销售额约12.3万”手动透视结果如果显示12.8万那就要回头查原因但如果显示123万那就是分组维度写错了。下面这段代码把分组结果导出成Excel方便交叉验证# 按月统计销售额和订单量 monthly df.groupby(月份).agg( 销售额(消费金额, sum), 订单量(订单号, nunique) ).reset_index() # 导出到Excel方便用透视表核对 with pd.ExcelWriter(feat/monthly_summary.xlsx) as writer: monthly.to_excel(writer, sheet_name按月统计, indexFalse)这里agg函数用(消费金额, sum)这种写法表示对消费金额列做求和对订单号列统计唯一值数量。nunique比count更适合统计订单量因为同一个订单号可能在明细表里有多行count会把重复订单算多次。导出Excel时用了ExcelWriter可以同时写多个sheet后面如果还有区域维度的统计结果直接加一行写入同一个文件即可。4. 用Python做批量分析用Excel做结论呈现4.1 分析结果回写Excel的做法B题最终提交通常要求包含结果表常见做法是把Python算好的结果整理成规范的Excel输出。注意这里说的“规范”指三件事每个sheet只放一张表、首行是字段名、数值字段保留统一小数位。用原生to_excel直接导出经常会出现多个表堆在同一个sheet里、行格式混乱的情况。下面给出一套可以直接套用的导出模板重点在格式控制import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, PatternFill, Alignment # 先写出原始结果 output_path 结果表.xlsx with pd.ExcelWriter(output_path, engineopenpyxl) as writer: monthly.to_excel(writer, sheet_name月度分析, indexFalse) category.to_excel(writer, sheet_name类目分析, indexFalse) # 再用openpyxl调整格式这一步是为了交卷时表格能直接看 wb load_workbook(output_path) for ws in wb.worksheets: # 表头加粗并填充底色 for cell in ws[1]: cell.font Font(boldTrue) cell.fill PatternFill(start_colorDCE6F1, end_colorDCE6F1, fill_typesolid) cell.alignment Alignment(horizontalcenter) # 列宽按内容长度自适应 for col in ws.columns: max_length max(len(str(cell.value)) for cell in col if cell.value) ws.column_dimensions[col[0].column_letter].width max_length 4 wb.save(output_path)这段代码分两步走先用pandas把多个分析结果写入不同sheet再用openpyxl调整格式。注意engineopenpyxl是写.xlsx格式的常规选择如果不指定pandas默认用xlsxwriter两者功能差异不大但load_workbook只能读openpyxl写的文件所以要保持一致。表头加粗加底色是为了让阅卷方快速看清楚字段结构实际比赛中很多同学忽略这一步结果表看起来和原始数据没区别印象分会受影响。4.2 一张图和一个量化结论搭配使用可视化不是画得越复杂越好。B题常见评分维度是“分析结论是否清晰”所以每张图最好对应一个结论句。比如“销售额在6月出现峰值环比增长约35%”对应的图就是月度销售额折线图。“会员等级越高平均消费金额越大”对应的是分组柱状图。不建议用堆叠面积图、雷达图这类难解读的图表评卷时间有限一眼能看懂比花哨更重要。4.3 用Excel公式验证Python计算结果的准确性最后一道保险是用Excel公式手动复算关键指标。把Python算出的结果表复制到新的sheet在旁边用SUMIF或AVERAGEIF按同一口径算一遍再和Python结果做差。下面是一个典型验证过程# Python侧计算各区域的销售总额 region_summary df.groupby(区域)[消费金额].sum().reset_index() print(region_summary)然后把region_summary粘贴到Excel在旁边用SUMIF重算。如果两边结果一致说明分组维度和聚合函数都正确如果不一致优先检查源数据的消费金额列是否有隐藏的文本型数字。Excel里这类单元格左上角会有绿色小三角但使用read_excel读入后可能已经被pandas自动转了类型所以一定要以原始Excel的透视结果为准。5. 交卷前的验算技巧和提交文件整理5.1 三个最容易翻车的数字接近交卷时花10分钟检查三个关键数字总销售额、订单总数、参与分析的用户数。这三个数字是所有后续分析的地基任何一个出错会导致全盘结论无效。具体做法是写一个一次性核对脚本# 交卷前快速核对核心指标 total_amount df[消费金额].sum() total_orders df[订单号].nunique() total_users df[用户ID].nunique() print(f总销售额: {total_amount:.2f}) print(f总订单数: {total_orders}) print(f总用户数: {total_users}) # 对比原始Excel的透视结果逻辑一致再继续这里的nunique是去重计数在B题场景里比count更准确。如果订单号存在多条明细行count会把同一笔订单重复统计导致订单数虚高。写脚本只是第一步重点是把这三个数和用手工透视的结果做差差值在千分之一以内可以接受超过这个范围就要排查是否存在脏数据。5.2 提交文件按“数据-代码-报告”三层归档B题提交通常需要打包整个项目建议按下面结构整理提交/ ├── data/ │ ├── 原始数据/ │ └── 清洗后数据/ ├── code/ │ ├── step1_read.py │ ├── step2_clean.py │ ├── step3_analyze.py │ └── step4_export.py └── 报告/ ├── 分析报告.docx └── 图表/代码文件按步骤编号的好处是复现时可以按顺序执行不需要来回跳转。如果最终只能提交一个zip包压缩前务必先删除中间产物文件只保留最终结果表避免评委混淆和文件过大影响上传。5.3 给“需要分享的同学”一个可复用的经验对第一次参加泰迪杯技能赛的同学我的建议是不要先学一堆机器学习算法把groupby、pivot_table、pd.to_datetime、pd.merge这四组操作练熟足够应付B题90%的任务。如果遇到需要关联两张表的场景先想清楚关联键和关联方式pd.merge的how参数是B题另一个高频坑——默认内连接会丢掉无匹配的行而业务上通常需要左连接保留主表全部记录。交卷前把所有图表重新看一遍确认每张图都能对应到一个明确结论这就是B题完整且稳定的拿分路径。本文还有配套的精品资源点击获取
返回列表