本章学习目标:
- 建立"拿到数据先体检"的职业习惯
- 记住6个核心问题及其背后的检查目的
- 学会向AI描述体检需求
- 能够读懂体检结果并判断"有没有问题"
一、为什么叫"体检"?
想象你去医院做体检:
| 体检项目 | 目的 | 数据分析的对应 |
|---|---|---|
| 身高体重 | 知道你的基本数据 | 数据有多少行、多少列 |
| 血常规 | 检查各项指标是否正常 | 每列是什么类型、有没有异常值 |
| X光片 | 看有没有隐藏问题 | 缺失值、重复值、脏数据 |
| 医生问诊 | 结合你的情况综合判断 | 结合业务场景判断数据是否合理 |
体检的核心逻辑:
- 先做标准化检查(每个人都有同样的项目)
- 发现问题再深入检查(某项指标异常,加做专项)
- 拿到报告后判断"正常"还是"有问题"
体检的意义:不要在生病后才去看病,而是在数据进入分析流程之前,就发现潜在问题。
二、体检清单:6个核心问题
无论拿到什么数据,你都需要回答这6个问题:
| 序号 | 问题 | 一句话回答 | 如果不检查会怎样 |
|---|---|---|---|
| 1 | 数据长什么样? | 看一眼前几行,确认加载正确 | 读错了文件都不知道 |
| 2 | 有多少行、多少列? | 了解数据规模 | 小数据集用大方法、大数据集跑崩内存 |
| 3 | 每列是什么类型? | 数字、文本、还是日期? | 不该求平均的求了平均,不该做差值的做了差值 |
| 4 | 哪些列有缺失?缺了多少? | 知道数据不完整的地方 | 计算出的平均值是错的、模型报错 |
| 5 | 数值分布如何? | 最大值、最小值、均值、中位数 | 被异常值欺骗、数据范围理解错误 |
| 6 | 有哪些唯一值? | 分类变量有哪些取值 | 脏数据("北京"和"BJ"共存)没发现 |
三、逐一拆解6个问题
问题1:数据长什么样?
这个问题问的是:我加载的数据,看起来对吗?
具体做:看表格的前几行(通常是5-10行)
你从这步能发现什么:
| 你能发现的问题 | 实际例子 | 怎么处理 |
|---|---|---|
| 列名不是我预期的那一行 | 第一行是"报表日期:2024年1月",第二行才是真正的列名 | 告诉AI用正确的行作为列名 |
| 文件读错了 | 本应该读订单表,结果读了用户表 | 换正确的文件 |
| 数据是乱码 | 名字显示为"å¼ ä¸‰" | 告诉AI换个编码重新读 |
| 分隔符不对 | 整行粘在一起,没有分列 | 告诉AI用正确的分隔符 |
| 空行或广告行 | 前几行是公司Logo和报表标题 | 告诉AI跳过这些行 |
如何向AI描述:
"帮我读取这个文件,显示前10行,让我看看数据长什么样"
"这个Excel前3行是无关内容,跳过前3行再读"
核心心法:这一步就像你收到一堆快递,先拆开看一眼里面是什么,别急着往冰箱里塞。
问题2:有多少行、多少列?
这个问题问的是:数据规模有多大?
具体做:获取表格的"形状"------行数 × 列数
知道这个数字后,你能判断什么:
| 行数 | 意味着什么 | 你应该怎么做 |
|---|---|---|
| < 1000 | 小数据集 | 随便怎么分析都行,不用考虑性能 |
| 1,000 - 100,000 | 中等数据集 | 常规分析没问题 |
| 100,000 - 1,000,000 | 大数据集 | 注意性能,避免低效操作 |
| > 1,000,000 | 超大数据集 | 可能需要分块处理或用数据库 |
| 列数 | 意味着什么 | 你应该怎么做 |
|---|---|---|
| < 20 | 小特征集 | 好处理 |
| 20 - 100 | 中等特征集 | 可能需要做特征筛选 |
| > 100 | 高维数据 | 可能需要降维,注意内存 |
如何向AI描述:
"告诉我这个表格有多少行、多少列"
"这个数据集的规模是多大?"
核心心法:知道数据规模,你就知道自己手里是"自行车"还是"卡车"------决定你用什么方式去开它。
问题3:每列是什么类型?
这个问题问的是:每列存储的是什么类型的数据?
常见的类型及含义:
| 类型名称 | 它代表什么 | 数据举例 | 能做什么操作 |
|---|---|---|---|
| 整数 | 整数数字,没有小数 | 年龄25、数量3、用户ID | 加减乘除、求平均、排序 |
| 浮点数 | 带小数的数字 | 价格199.5、比例0.85 | 加减乘除、求平均、排序 |
| 文本/字符串 | 文字或混合字符 | 姓名"张三"、地址"北京朝阳区" | 比较是否相等、查找子串、拼接 |
| 日期时间 | 时间和日期 | 2024-01-15、2024-01-15 10:30:00 | 计算时间差、提取年月日、排序 |
| 分类 | 有限个固定取值 | 性别"男/女"、状态"完成/取消" | 分组统计、频次分析 |
为什么类型这么重要?
因为类型决定了你能做什么操作,也决定了不能做什么操作:
| 你想做的事 | 数字类型 | 文本类型 |
|---|---|---|
| 计算平均值 | ✅ 可以做 | ❌ 没有意义("张三"的平均值是什么?) |
| 比较大小 | ✅ 可以做 | ❌ 没有意义("张三"比"李四"大?) |
| 查找包含某个字 | ✅ 有些困难 | ✅ 很适合 |
| 做加减法 | ✅ 适合 | ❌ 不能做 |
经典错误案例:
- 把用户ID当成数字,求平均ID(毫无意义)
- 把手机号当成数字,前面的0丢了
- 把日期当成文本,无法计算"今天距离注册过了多少天"
常见的问题类型及如何处理:
| 你发现的问题 | 它是什么意思 | 怎么告诉AI |
|---|---|---|
数字列显示为文本 |
数字被误读成了文本 | "把金额列转成数字类型" |
日期列显示为文本 |
日期被误读成了文本 | "把订单日期列解析成日期格式" |
城市列显示为文本但取值很少 |
这其实是个分类变量 | "把城市列转成分类类型,节省内存" |
ID列显示为数字 |
ID不应该当数字用 | "把用户ID读成字符串类型" |
如何向AI描述:
"检查每一列的数据类型,看看有没有类型不对的"
"user_id应该是字符串,不是数字,帮我转一下"
"把order_date列从文本转成日期格式"
核心心法:类型决定一切。类型对了,分析才可能对;类型错了,结果一定是错的。
问题4:哪些列有缺失?缺了多少?
这个问题问的是:数据里有多少"空位"?
什么是缺失值:数据表格里某些单元格是空的,原因可能是:
- 用户没填(年龄、性别)
- 系统没记录(某些日志没采集到)
- 数据合并时没匹配上
为什么要关注缺失值:
| 缺失程度 | 影响 | 你的应对 |
|---|---|---|
| < 5% | 影响很小 | 可以直接删除缺失的行 |
| 5% - 20% | 有一定影响 | 需要决定"删除"还是"填充" |
| 20% - 50% | 影响很大 | 填充前需要仔细思考用哪个值填 |
| > 50% | 该列可能没什么用 | 考虑是否删除整列 |
缺失值处理的三条原则(提前预告,后续会细讲):
| 情况 | 建议做法 | 场景举例 |
|---|---|---|
| 缺失很少(<5%) | 删除缺失的行 | 1万行里缺了100行,删掉不影响 |
| 缺失较多但该列重要 | 用某个值填充 | 用平均值填充年龄缺失 |
| 缺失很多(>50%) | 考虑删除整列 | "备注"列80%都是空,留着意义不大 |
如何向AI描述:
"检查每一列的缺失值数量,告诉我哪些列缺了、缺了多少、占比多少"
"这个表里有哪些列存在空值?"
核心心法:缺失值就像体检报告里的"未检测"------你得知道哪些指标没测到,才能决定是重测、忽略、还是用其他方式推断。
问题5:数值分布如何?
这个问题问的是:数值列的大致情况------最大值、最小值、集中在什么范围?
具体看什么:对于每一列数值数据,看以下指标:
| 指标 | 它是什么 | 能发现什么问题 |
|---|---|---|
| 计数 | 有多少个非空值 | 确认和总行数的差异 |
| 均值 | 平均值 | 是否有极端值拉高或拉低 |
| 标准差 | 数据波动程度 | 波动很大说明数据不稳定 |
| 最小值 | 最小的那个值 | 是否合理(年龄0?价格负数?) |
| 25%分位数 | 前25%的数据的上限 | 数据分布位置 |
| 50%分位数(中位数) | 中间那个值 | 比均值更抗极端值 |
| 75%分位数 | 前75%的数据的上限 | 数据分布位置 |
| 最大值 | 最大的那个值 | 是否合理(年龄200?) |
你能从这些数字中发现的"异常信号":
| 你看到的 | 可能的问题 | 应该怎么做 |
|---|---|---|
| 最小值 = 0,但业务上不应该有0 | 数据错误或默认值 | 检查这些0是否合理 |
| 最大值 = 999999,远超正常范围 | 有异常值 | 检查是否是录入错误 |
| 均值远大于中位数 | 数据右偏,存在很大的极端值 | 用中位数代表"典型值" |
| 均值为负,但金额不应该为负 | 有错误数据 | 检查负数是否合理 |
| 标准差非常大 | 数据波动很大 | 看是否存在异常值或分组差异 |
| 年龄列 min=0, max=200 | 明显的数据错误 | 需要清洗异常值 |
一个具体例子:收入数据
| 场景 | 均值 | 中位数 | 说明 |
|---|---|---|---|
| 正常分布 | 8000 | 7500 | 均值和中间值接近,数据正常 |
| 老板加入了数据 | 15000 | 7500 | 均值被拉高,中位数更能代表"典型员工" |
| 录入错误(一个999999) | 严重偏离 | 7500 | 均值完全失真,中位数还能用 |
如何向AI描述:
"对数值列做描述性统计分析,告诉我均值、标准差、最大最小值、以及各分位数"
"检查年龄列有没有异常值,比如小于0或大于120的"
"看看金额列的最大值是否合理,有没有异常的极高值"
核心心法:不要相信任何一个数字,直到你检查过它的分布。一个异常值就能让均值完全失真。
问题6:有哪些唯一值?
这个问题问的是:文本/分类列里,都有哪些不同的取值?
具体看什么:
| 操作 | 它做什么 | 能发现什么问题 |
|---|---|---|
| 列出唯一值 | 显示该列所有不同的取值 | 发现脏数据、理解分类 |
| 统计唯一值个数 | 看有多少种不同的取值 | 判断是分类变量还是连续文本 |
| 统计每个值的频次 | 每个值出现多少次 | 看分布是否均匀、哪个值最多 |
你能发现的问题:
| 你看到的 | 可能的问题 | 应该怎么做 |
|---|---|---|
| "北京"、"北京市"、"BJ"同时存在 | 同一含义的不同写法 | 统一成一种写法 |
| "男"、"Male"、"M" | 性别字段脏数据 | 标准化 |
| 状态列有"已完成"、"完成"、"完毕" | 枚举值不统一 | 统一 |
| 年龄列有100多个唯一值 | 年龄应该是连续变量不是分类 | 不需要当分类看 |
| 某值出现比例极高(如95%是"正常") | 类别不平衡 | 分析时注意少数类 |
| 应该只有"是/否"的列出现"√"、"1"、"Y" | 取值不规范 | 统一 |
一个具体例子:城市列的数据质量检查
假设你在分析用户数据,查看"城市"列的唯一值:
唯一值:["北京", "北京市", "BJ", "beijing", "上海", "上海市", "广州", "深圳"]
问题:北京出现了4种不同的写法!这会导致:
- 统计北京用户数量时只能数到"北京"那部分,漏掉了其他写法
- 分组分析时会产生虚假的多个组
解决方案:告诉AI"把城市列中所有指向北京的值统一成'北京'"。
如何向AI描述:
"列出城市列的所有唯一值"
"统计每个城市的用户数量,按从高到低排序"
"检查状态列有哪些不同的取值,看看有没有不规范的写法"
核心心法:分类变量只有在取值规范时才有意义。脏数据会让你的分组和统计完全失准。
四、体检清单速查卡
| 序号 | 问题 | 核心检查点 | 异常信号 | 一句话告诉AI |
|---|---|---|---|---|
| 1 | 数据长什么样? | 前几行内容 | 乱码、列名错位、读错文件 | "显示前10行" |
| 2 | 有多少行、多少列? | 数据规模 | 太大或太小 | "告诉我行数和列数" |
| 3 | 每列是什么类型? | 数据类型 | 类型与业务含义不符 | "检查每列的数据类型" |
| 4 | 哪些有缺失? | 缺失数量和占比 | 缺失过多 | "检查缺失值情况" |
| 5 | 数值分布如何? | 最大/最小/均值/中位数 | 范围异常、均值偏离中位数 | "对数值列做描述性统计" |
| 6 | 有哪些唯一值? | 唯一值列表和频次 | 同义异写、取值不规范 | "列出城市列的唯一值" |
五、完整体检报告示例
假设你拿到一份"用户订单数据",体检后你应该能回答:
markdown
【数据体检报告】
1. 数据概况:891行 × 12列
2. 类型检查:
- 正常:乘客ID、票价等是数字
- 异常:年龄列是文本类型,需要转数字
- 异常:登船时间列是文本,应该是日期
3. 缺失检查:
- 年龄列:177个缺失(占20%),需要填充
- 船舱号列:687个缺失(占77%),考虑删除
- 登船港口列:2个缺失(占0.2%),影响很小
4. 数值分布检查(票价列):
- 最小值:0 → 不合理,票价不能为0
- 最大值:512 → 合理范围内
- 均值:32,中位数:14 → 均值>中位数,存在高价票拉高均值
5. 唯一值检查(登船港口列):
- 唯一值:['S', 'C', 'Q'] → 规范
- 唯一值(性别列):['male', 'female'] → 规范
【体检结论】
- 需要处理:年龄类型转换、年龄缺失填充、票价0值检查
- 建议删除:船舱号列(缺失太多)
- 可忽略:登船港口的2个缺失
六、如何向AI描述体检需求(提示词模板汇总)
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 完整体检 | "帮我做数据体检:显示前几行、基本信息和缺失值、数值列统计、分类列唯一值" |
| 快速扫描 | "快速看一下这张表的基本情况" |
| 检查类型 | "检查每列的数据类型是否正确" |
| 检查缺失 | "哪些列有缺失值?缺了多少?占比多少?" |
| 检查数值 | "对数值列做描述性统计,有没有异常值?" |
| 检查分类 | "检查分类列的唯一值,有没有不规范的写法?" |
七、本章总结
6个核心问题(必须记住)
- 数据长什么样? → 看一眼前几行
- 有多少行、多少列? → 知道数据规模
- 每列是什么类型? → 数字/文本/日期决定能做什么操作
- 哪些有缺失? → 知道数据不完整的地方
- 数值分布如何? → 最大/最小/均值/中位数
- 有哪些唯一值? → 分类变量有哪些取值
核心心法
"拿到数据,先体检,后分析"------这是区分"新手"和"老手"的第一道分水岭。
- 新手:急着跑模型、做图表
- 老手:先花5分钟体检,确认数据没问题再动手
体检花的5分钟,能帮你省下后续5小时的返工时间。
思考题
-
你刚读取了一个CSV文件,用
head()查看前5行,发现第一行显示"## 2024年销售报表",第二行显示"导出时间:2024-01-15",第三行才是列名。这意味着什么?你应该怎么办? -
info()显示"年龄"列有200个非空值,但总行数是1000行。这说明什么?缺失比例是多少?应该怎么办? -
describe()显示"金额"列的最小值是-100,最大值是999999,均值是5000,中位数是300。你能从中发现哪些异常信号? -
value_counts()查看"城市"列,发现有"北京"、"北京市"、"BJ"、"北平"四种写法。这会导致什么问题?你应该怎么处理? -
你拿到一张1000万行、50列的数据集。在用
info()和describe()之前,你应该先问哪个问题?为什么?
下一节预告 :3.2 工具速查 ------ 用什么工具完成这6个体检项目?
head()、info()、describe()、value_counts()......每个工具是干嘛的、输出长什么样?