QBUS6600 Exploratory Data Analysis Project|压表的每一步选择都在被评分
🔍 七个文件打开,分析表自己造
拿到手的七个 CSV 加起来将近 500MB。体量大的三张分别是 269 万行刷卡记录、88 万行消费明细和 71 万行预订,全是一个会员占好多行的事件流。你打开 attendance.csv,一个人一上午刷了三次卡就是三行,一周来四次就是十几行。而你最终要画的每一张 EDA 图,横轴都是会员级别的汇总数字。每个会员到底来了多少次、多久没来、最近有没有在衰减、消费集中在什么项目,这些全要自己算。原始文件里没有一列叫「到店次数」或「最近到店天数」,每个数字都需要你从事件流里算出来,而算法的选择本身就是被评分的分析决策。
那就有一个绕不开的前置步骤:在画第一张图之前,先把 400 多万行事件压成 13,622 行、一行一个会员的分析表。这步操作其实就是 Data Processing 的全部内容,Rubric 给了 30 分。多数人准备用半页带过就直接跳去画图,但 EDA 的 45 分同样建立在这张表上。压错了,后面每一张频率图的数据基础都跟着错。Data Processing 和 EDA 看名字像两件事,其实都在围绕同一张分析表:一个管怎样造,一个管造好了以后怎样读。所以聚合口径的每一步选择同时决定两部分的得分,合计 75 分。
🧹 去重窗口选多长,全部频率数值都跟着变
先看 attendance。一个人从停车场走到前台刷一次,进健身房再刷一次,中间去了趟更衣室回来又刷一次。原始数据里,28.77% 的相邻刷卡间隔不到 30 分钟。如果每次刷卡都算一次到店,那一个人某天来一趟,数据上记了三到四次,而实际上这一天就来了一次。
📌 按 180 分钟的会话间隔做去重,总刷卡数从 269 万降到 177 万,减少 34.3%。一个去重窗口的选择,改变了全部频率特征的数值。
去重窗口没有标准答案。写报告时有三件事必须覆盖到:
- 选了多长的间隔阈值
- 为什么选这个长度(比如你发现绝大多数短间隔集中在 30 分钟内,30 到 180 分钟之间几乎为零,那 180 分钟就有了数据依据)
- 去重前后的数量变化和对下游特征的影响
这三项直接对应 Rubric 里反复出现的 justifying your choices。
⏱️ T0 边界按列判断,不能一刀删空值
bookings 里有将近一万行的活动开始时间在 T0(2024 年 7 月 20 日)之后。这批行的出席状态全部为空,因为那天还没发生。看到空值想删很正常,但删掉的代价特别大。整个 bookings 表有超过 70 万行,其中这近万行恰好是区分力特别强的一批。
这些记录的下单时间全在 T0 之前。「手上还握着未来预订」本身就是一个合法特征。满足这个条件的 1,520 名训练集会员,流失率只有 1.71%,也就是 100 个持有未来预订的会员里只有不到两个会取消,是基线 7.16% 的四分之一不到;不满足的 10,752 人升到 7.93%。就算只看最近 30 天内到过店的活跃会员,持有未来预订的那组和没有的那组之间仍然差 2.6 倍。一刀删空值,丢的是整份数据里保护力度排在前列的信号之一。
做法就是在同一张表里按列判断:
- ❌ 出席结果列:T0 之后才产生的信息,不能用
- ✅ 预订动作列:T0 之前已经发生的行为,可以用
这个判断方式在报告里同样需要给出理由,属于 Rubric 要求的 justifying your decisions。






