02-数据分析进阶:用SQL和统计学把数据看透
数据分析进阶实战:用 SQL 和统计学,把老板丢来的数据"看透"
写作日期:2026-08-05 | 来源:数据分析学习笔记
关键词:SQL、GROUP BY、窗口函数、数据透视表、统计学
背景(S)
昨天学会了用 Pandas 把数据读进来、洗干净、算出每个产品的总销售额。但老板又丢来一个 10 万行的销售记录,问了我三个问题:
- “哪个季度销售额最高?”
- “每个季度里,哪三个产品卖得最好?”
- “这组数据整体表现怎么样?是稳的还是忽高忽低的?”
第一个问题——Pandas 能解决(groupby + sort_values)。
第二个问题——Pandas 也能解决,但更简单的方式是用 SQL 的窗口函数一行搞定。
第三个问题——得用统计学(均值、标准差)来回答"稳不稳定"。
这三个问题,正好对应我今天学完的三个知识点:SQL 分组聚合、SQL 窗口函数、统计学基础。
踩过的坑(T)
- SQL 和 GROUP BY 一起用时,SELECT 里写了不该写的列——忘了 SELECT 只能选分组列和聚合函数,导致报错。
- 忘了 HAVING 和 WHERE 的区别——分组后想过滤结果,还在用 WHERE,导致报错。后来才搞懂:WHERE 在分组前执行(不能写聚合函数),HAVING 在分组后执行(可以写聚合函数)。
- 窗口函数忘了包一层子查询——
ROW_NUMBER()算出排名后,直接在同一个 SELECT 里写WHERE 排名 <= 3,SQL 不认。必须先子查询包一层,在外层 WHERE 过滤排名。 - 相关系数算出来 0.95,就以为是因果关系——后来才理解"相关 ≠ 因果"。比如冰淇淋销量和溺水人数正相关,其实是夏天这个第三变量同时让两者上升,并不是冰淇淋导致溺水。
- 算公司平均薪资被高管拉高——10 万月薪的高管让平均值从 5000 直接飙到 20000,老板一眼看出不对劲。后来改用中位数和按岗位分组,才得出真实结论。
怎么解决的(A)
知识点 1:SQL 聚合函数与 GROUP BY
每个季度总销售额——和 Pandas groupby 逻辑一模一样,只是语法不同:
| Pandas | SQL |
|---|---|
df.groupby('季度')['金额'].sum() | SELECT 季度, SUM(金额) FROM 表 GROUP BY 季度 |
df.groupby('季度')['金额'].mean() | SELECT 季度, AVG(金额) FROM 表 GROUP BY 季度 |
SQL 执行顺序记牢:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。
一个完整示例:每个季度总销售额,降序排列:
SELECT 季度, SUM(金额) AS 季度销售额
FROM 销售记录
GROUP BY 季度
ORDER BY 季度销售额 DESC;
知识点 2:SQL 窗口函数——“取每组前 N 名”
这是 SQL 最强大的能力之一——保留每一行数据,同时给每行加上排名标签。和 GROUP BY 最大的区别:GROUP BY 会压缩行数,窗口函数不会。
三种排名函数:
| 函数 | 同分时 | 例子 | 场景 |
|---|---|---|---|
ROW_NUMBER() | 不重复,1,2,3,4,5 | 取每组前 N 名(唯一编号) | |
RANK() | 同分同名,跳号 1,1,3,4,5 | 比赛排名 | |
DENSE_RANK() | 同分同名,不跳号 1,1,2,3,4 | 成绩/评分排名 |
取每组前 N 名是面试必考题,模板背下来:
SELECT 季度, 产品, 金额, 排名
FROM (
SELECT 季度, 产品, 金额,
ROW_NUMBER() OVER (PARTITION BY 季度 ORDER BY 金额 DESC) AS 排名
FROM 销售记录
) AS t
WHERE 排名 <= 3;
子查询先执行,算出每个季度内每个产品的排名;外层 WHERE 过滤前 3 名。
知识点 3:统计学基础——均值、中位数、标准差、相关系数
- 均值(Mean):数据平均水平。⚠️ 容易被极值拉偏。
- 中位数(Median):把数据排好,取中间值。抗极值,更真实。
- 标准差(Std):数据波动大小。标准差越大,数据越不稳定(忽高忽低)。
- 相关系数(Correlation):两个变量一起涨还是反向走。+1 是强正相关,-1 是强负相关,0 是没关系。相关 ≠ 因果。
实际例子:两组产品月销售额都是 5000,但:
- A 产品:[5000, 5000, 5000, 5000] → 标准差 ≈ 0(很稳定)
- B 产品:[1000, 2000, 9000, 13000] → 标准差很大(忽高忽低)
结论:均值一样,但 B 产品风险更高。
复盘(R)
- Pandas ↔ SQL ↔ Excel 三种工具打通:数据透视表 = Pandas
pivot_table= Excel 拖字段,本质都是"按两个维度交叉汇总"。 - 窗口函数是 SQL 的杀手锏:GROUP BY 能做的分组汇总,窗口函数都能做;而且窗口函数还能做 GROUP BY 做不了的事——保留每一行、算排名。
- 统计学是数据的"温度计":均值告诉你水平、标准差告诉你稳不稳、相关系数告诉你变量之间的关系——三个指标一起看,数据才有温度。
- Pandas 干细活、SQL 干重活:复杂计算在 Pandas 做(相关系数、排名),数据入库和聚合在 SQL 做,边界要分清。
一句话总结:数据分析用 SQL 分组聚合(GROUP BY + SUM/AVG/HAVING),窗口函数(ROW_NUMBER)取每组前 N 名,统计学四指标(均值看中位数、标准差看稳定、相关系数看关系)描述数据特征——Pandas ↔ SQL ↔ Excel 三种工具本质相通,边界要分清。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)