酒店品牌榜上,平均 5 星的品牌为什么不一定第一?
这次用公开评测原题走一遍完整链路:数据 → 问题 → 解法 → 验收。重点不在算出答案,而在看清资格门槛和分母选择如何改变结论。
数据与题目
数据集是 InfiAgent-DABench,评测从 CSV、自然语言问题和约束出发,检验能否真正执行分析并给出结果。本次固定题单有 257 题、引用 52 份 CSV;这里只取其中的 hotel_data.csv,1,057 行、9 列,覆盖 7 个城市和 103 个非空品牌,每行是一条酒店记录。
选择的是 510、513 两道 medium 题。
510:评价数至少 100 的酒店中,哪个品牌平均星级最高?还要求品牌、星级非空,品牌在全表至少 10 家,按算术平均计算,出现并列时再看全表规模。
513:评价数与 bubble_score 的相关,在不同星级组里分别是多少?注意 bubble_score 和酒店星级不是一个字段。
两道题都设置了约束,这使它们比“算个平均值”更接近真实工作:约束决定谁有资格参与,也决定分母是什么。
解法:把 510 拆成两路
第一路在全表计算品牌规模,确定参评资格;第二路筛出有效酒店,计算星级总和与均值。最后在品牌粒度汇合。
筛选路径:
| 步骤 | 行数 | 说明 |
|---|---|---|
| 全表 | 1,057 | 所有酒店记录 |
| 品牌规模 ≥10 家 | — | 确定参评品牌 |
| 星级、品牌非空 | 332 | 具备评分所需字段 |
| 评价数 ≥100 且星级、品牌非空 | 296 | 符合酒店级条件 |
| 应用品牌规模门槛后最终参与排名 | 125 家 / 6 个品牌 | 同时满足品牌与酒店两级条件 |
第一名 Preferred Hotels & Resorts 在全表有 21 家,参与评分的有 19 家,星级总和 83.5,均值 83.5 ÷ 19 = 4.3947。
关键在分母
这里最容易出错的地方,是拿 21 作分母。
83.5 ÷ 21 = 3.976,名次会明显下降。但 21 是“全表酒店数”,19 是“有有效评分的酒店数”。题目要求的是评价数至少 100 的酒店的平均星级,所以分母必须是 19。
这不是算术细节,而是资格与分母的定义问题。把合格酒店的星级总和除以更大的全表酒店数,会系统性地压低参评样本占比较低的品牌得分。被排除的记录也不一定缺少星级,可能只是评价数未达门槛。
不加门槛会发生什么
如果不加品牌规模门槛,只有 1 家评分样本的品牌也能拿到 5.0 分,直接登顶。
这个现象在小样本榜单里很常见:样本越少,极值越容易出现。门槛的作用不是让结果更好看,而是让比较在同等资格下进行。
原文约束里“品牌在全表至少 10 家”这一条,正是为了排除这种偶然性。它同时也说明了另一件事:资格规则应该写在问题里,而不是在结果出来后调整。
513:重新建样本,不能沿用
513 问的是评价数与 bubble_score 的相关性,在不同星级组里分别是多少。
一个常见错误是直接沿用 510 的 125 家样本。但 513 的分组对象是星级组,每个组的样本需要重新构建,不能沿用上一题的筛选结果。
三个星级组的相关系数分别是 0.15、0.04、−0.28。整体相关系数不能直接套给每个群体:组间差异明显,其中一组甚至是负相关。
这也解释了为什么“整体结论”和“分组结论”经常冲突。它们回答的不是同一个问题。
Skill 分工写清楚
这次复算用到五个 Skill,各自的责任是:
| Skill | 负责什么 | 产物 |
|---|---|---|
gather-business-context | 确认题意与字段含义 | 口径说明 |
analyze-data-quality | 查 ID、缺失与粒度 | 输入检查记录 |
jupyter-notebooks | 执行两路聚合 | 可复现计算记录 |
visualize-data | 呈现筛选、榜单与有效 n | 图表 |
validate-data | 独立 SQL 核对结果 | 验收记录 |
需要说明的是:这是按 Skill 规范组织的责任映射,不是自动调用日志;实际计算由 SQL 和 Python 执行。
结论边界
这次是公开数据的教学复算,答案已可见,不是盲测。几处判断需要明确标注:
- 品牌规模门槛按题目约束执行,不是分析者自选。
- 星级均值按算术平均,未按评价数加权。
- 513 的分组样本独立重建,未复用 510 的筛选结果。
- 相关系数只描述线性关系强度,不说明因果。
可迁移的三点
第一,资格先于计算。在任何排行榜、评分或排名类分析里,先写清谁有资格参与,再谈谁第一。
第二,分母要跟着问题走。同一个数字,用不同的分母会得到不同的结论;分母的选择必须能追溯到问题定义。
第三,分组要重建样本。当问题从“整体”变成“分群体”时,样本、筛选和口径都可能需要重来,直接沿用是最常见的错误来源。
参考:InfiAgent-DABench 数据集 · OpenAI Data Analytics Skills 公开参考仓库