ARTICLE · 1110759
拿到一个Excel别急着分析:先让R做这8项数据体检
拿到一份Excel数据,你第一件事会做什么?
很多人的操作是:
data <- read_excel("data.xlsx")然后马上开始:
ggplot()lm()t.test()或者更直接:
把Excel丢给AI:“帮我分析一下这个数据。”
我以前也经常这么干。
但做的数据项目越多,我越觉得:
拿到数据以后,最不应该急着做的事情,就是马上分析。
因为真正让后面的统计分析、机器学习不断报错的,很多时候不是模型。
而是你的原始数据。
比如:
1470行数据里有没有重复记录? 本来应该是数字的年龄,为什么变成了字符? 缺失值到底有多少? 有没有一个人的月收入是负数? 分类变量是不是出现了 "Male"、"male"、"男"三种写法?有没有一列从头到尾只有一个值? 有没有极端异常值? 目标变量是不是严重不平衡?
如果这些问题没有发现,后面的代码即使全部运行成功:
结果也可能不可靠。
所以我现在拿到一份陌生Excel,基本不会马上建模。
而是先做一次:
数据体检
今天把我最常检查的 8个项目 整理出来。
最后还会给大家一套:
一键数据体检R代码 + AI数据诊断Prompt
可以直接保存使用。
01 第一项:数据到底有多大?
第一步看起来最简单。
先别分析。
先问:
这份数据到底有多少行、多少列?
读取Excel:
library(tidyverse)library(readxl)data <- read_excel("data.xlsx")然后:
dim(data)例如得到:
[1] 1470 31表示:
1470行31列
也可以分别查看:
nrow(data)ncol(data)为什么这个动作很重要?
因为你首先需要建立一个最基本的数据认知。
比如原本别人告诉你:
“大概有1500份问卷。”
结果导入以后只有:
1327那就应该先问:
剩下的数据去哪了?
而不是马上建模。
02 第二项:字段是不是你以为的那些字段?
接下来我一定会运行:
names(data)看看所有变量。
例如:
AgeAttritionBusinessTravelDepartmentJobRoleMonthlyIncomeOverTimePercentSalaryHike...这一步看起来也很普通。
但它可以避免一个非常常见的问题:
字段名和你以为的不一样。
例如你以为字段叫:
PercentSalaryIncrease真实数据却是:
PercentSalaryHike你以为收入叫:
Salary实际却是:
MonthlyIncome如果直接让AI写代码,它可能根据常识“猜”字段。
于是:
select(Age, Salary, PercentSalaryIncrease)一运行:
Error: Column `Salary` doesn't exist.所以我现在有一个习惯:
在让AI写数据分析代码之前,先把
names(data)给它。
还是上一篇反复强调的那句话:
不要让AI猜你的数据。
03 第三项:每一列到底是什么类型?
这是我认为非常重要的一步。
运行:
glimpse(data)或者:
str(data)你可能看到:
Age <dbl>Department <chr>MonthlyIncome <dbl>OverTime <chr>Attrition <chr>为什么一定要看?
因为Excel看起来是:
35
R读进来以后,不一定就是数值。
例如一列年龄:
354228未知39因为混入了一个:
未知整列就可能被识别成字符。
于是后面:
mean(data$Age)可能直接出问题。
同样:
Attrition如果后面准备做分类模型,通常需要认真检查它的类型和水平,而不能默认AI已经处理正确。
我一般重点检查
numeric integer character factor logical Date
然后问:
这个变量现在的数据类型,符合它真正的业务含义吗?
这比单纯看代码有没有报错重要得多。
04 第四项:缺失值到底有多少?
接下来检查:
NA
最简单可以:
colSums(is.na(data))如果想看缺失比例:
data %>% summarise( across( everything(), ~ mean(is.na(.)) * 100 ) )假设得到:
这时候不要马上:
drop_na()这也是AI特别容易给出的方案。
看到缺失值:
全删掉。
但真正应该问的是:
为什么缺失?
例如:
随机漏填?
还是:
某类人系统性地没有回答?
又或者:
这个变量本身不适用于某些样本?
5%的缺失和50%的缺失,处理策略也完全不同。
所以:
发现缺失值只是第一步,理解缺失值才是真正的分析。
05 第五项:有没有重复数据?
Excel数据特别容易出现一个问题:
重复记录。
比如:
重复复制; 多次导入; 问卷重复提交; 数据合并产生重复; 同一个ID出现多次。
最简单可以先看:
sum(duplicated(data))如果结果:
23说明存在23条完全重复的记录。
进一步:
data %>% filter(duplicated(.))如果数据有唯一ID:
data %>% count(ID) %>% filter(n > 1)这时候不要看到重复就直接:
distinct()因为:
重复记录 ≠ 一定是错误记录。
例如医院数据中,同一个患者可能有多次随访。
交易数据中,同一个客户当然可能有多笔交易。
所以真正的问题应该是:
按照业务逻辑,这条记录应该唯一吗?
06 第六项:分类变量有没有“脏类别”?
这是Excel数据里面特别常见、又特别容易忽略的问题。
比如性别这一列,看起来只有:
MaleFemale但实际运行:
unique(data$Gender)可能发现:
MalemaleMALEFemalefemale Male肉眼看:
好像就两个类别。
R看来:
这是6个不同的值。
再比如:
本科本科生大学本科本科 很可能表达的是同一件事情。
所以对于分类变量,我通常会检查:
data %>% count(Gender)或者:
table(data$Gender, useNA = "ifany")如果类别很多,还可以:
data %>% count(JobRole, sort = TRUE)重点看:
大小写是否一致; 有没有前后空格; 同一类别是否有多种写法; 有没有极少数异常类别; 有没有错误编码。
这类问题如果不处理:
后面的统计分析和机器学习都会把它们当成不同类别。
07 第七项:数值变量有没有异常值?
假设:
Age正常应该是:
18~60结果出现:
250或者:
MonthlyIncome = -3000是不是一定错误?
不一定。
但至少:
值得检查。
我通常先做:
summary(data)对于重点变量:
summary(data$Age)还可以计算分位数:
quantile( data$MonthlyIncome, probs = c(0, 0.01, 0.25, 0.5, 0.75, 0.99, 1), na.rm = TRUE)再配一张箱线图:
ggplot(data, aes(y = MonthlyIncome)) + geom_boxplot()但是这里同样要提醒:
异常值 ≠ 错误值。
一个月收入非常高的人,可能真的存在。
年龄250岁,则大概率需要检查。
所以AI可以帮助我们:
发现异常。
但最终仍然需要人结合业务背景判断:
这个值到底合不合理?
08 第八项:有没有“看起来正常,但根本没用”的变量?
最后一个检查,我特别建议做机器学习的人注意。
例如某个字段:
EmployeeCount1470个人全部都是:
1这个变量有没有缺失?
没有。
有没有异常?
没有。
类型对不对?
也对。
但是:
它没有任何信息量。
因为所有人的值完全一样。
可以检查:
data %>% summarise( across( everything(), ~ n_distinct(.) ) )如果某列:
n_distinct = 1就是零方差变量。
另外还有一种情况:
几乎所有值都一样。
例如:
Yes = 99.5%No = 0.5%这类变量也值得重点检查。
在tidymodels中,后续还可以考虑:
step_zv(all_predictors())或者根据具体任务进一步处理近零方差等问题。
为什么要检查?
因为不是所有Excel里的字段:
都应该进入模型。
数据分析不是:
列越多越好。
而是:
哪些变量真正携带了有用信息?
一张表总结:拿到Excel先做这8项体检
dim() | ||
names() | ||
glimpse() | ||
is.na() | ||
duplicated() | ||
count()unique() | ||
summary() | ||
n_distinct() |
建议把这张表保存下来。
以后拿到任何Excel:
先体检,再分析。
再送大家一段一键数据体检R代码
如果想快速检查一份新数据,可以先跑下面这段:
library(tidyverse)library(readxl)# 1. 读取数据data <- read_excel("data.xlsx")# 2. 数据规模dim(data)# 3. 字段名称names(data)# 4. 数据结构glimpse(data)# 5. 基本统计summary(data)# 6. 每列缺失值数量missing_check <- tibble( variable = names(data), missing_n = map_int(data, ~ sum(is.na(.x))), missing_pct = map_dbl(data, ~ mean(is.na(.x)) * 100))missing_check %>% arrange(desc(missing_pct))# 7. 完全重复记录数量sum(duplicated(data))# 8. 每个变量的唯一值数量unique_check <- tibble( variable = names(data), unique_n = map_int(data, ~ n_distinct(.x, na.rm = TRUE)))unique_check %>% arrange(unique_n)# 9. 数值变量快速统计data %>% select(where(is.numeric)) %>% summary()# 10. 分类变量类别数量category_check <- data %>% select(where(~ is.character(.x) || is.factor(.x))) %>% summarise( across( everything(), ~ n_distinct(.x, na.rm = TRUE) ) )category_check这段代码不是为了自动替你决定:
哪些数据应该删除。
而是先帮你:
把问题暴露出来。
这是数据诊断最重要的目的。
最后再给AI一份RAI数据体检Prompt
如果你已经运行了上面的代码,可以把结果交给AI进一步辅助诊断。
不要只说:
帮我看看这个数据有没有问题。
建议这样问:
【任务背景】我正在使用R分析一份Excel数据。我的目标是:【填写研究/业务目标】后续准备进行:【描述性统计 / 回归 / 机器学习 / 可视化等】---【数据基本信息】数据规模:【粘贴dim()结果】字段名称:【粘贴names()结果】数据结构:【粘贴glimpse()结果】基本统计:【粘贴summary()结果】缺失值检查:【粘贴missing_check结果】重复值数量:【粘贴结果】变量唯一值数量:【粘贴unique_check结果】---【你的任务】请从下面8个方面检查数据:1. 数据规模是否合理;2. 字段名称是否存在潜在问题;3. 数据类型是否合理;4. 缺失值是否值得重点处理;5. 是否存在重复数据风险;6. 分类变量是否可能存在类别不一致;7. 数值变量是否存在异常值风险;8. 是否存在零方差或低信息变量。---【约束要求】1. 不要猜测我没有提供的数据;2. 不要直接删除任何数据;3. 区分“确定存在的问题”和“需要进一步检查的问题”;4. 每发现一个问题,请说明判断依据;5. 给出对应的R检查代码;6. 如果需要业务背景才能判断,请明确指出;7. 不要因为代码可以运行,就默认数据质量没有问题。---【输出结果】请输出一份“数据体检报告”,包括:1. 数据总体情况;2. 发现的问题;3. 问题严重程度;4. 建议进一步检查的内容;5. 推荐处理方式;6. 对应R代码;7. 进入正式分析前的Checklist。这段Prompt真正解决的是:
让AI从“直接分析数据”,变成“先帮助我们理解数据”。
一个非常重要的RAI习惯:AI不要太早介入“做决定”
你可能已经发现:
整个过程中,我一直在做一件事情。
不是:
把Excel直接扔给AI,让它替我分析。
而是:
R读取真实数据↓R完成基础检查↓AI辅助发现问题↓人结合业务背景判断↓R验证和处理↓再进入正式分析我把它概括成一句话:
R提供事实,AI提供协作,人负责判断。
这也是:
RAI = R + AI + Workflow
AI很强。
但如果输入给AI的数据本身就是乱的:
它只会更快地帮你把错误带到后面的分析里。
所以:
Garbage In,Garbage Out。
到了AI时代,这句话依然没有过时。
写在最后:数据分析真正的第一步,不是分析
很多初学者特别着急:
我什么时候可以做统计检验?
我什么时候可以画图?
我什么时候可以做机器学习?
但我越来越觉得:
数据分析真正的第一步,是认识你的数据。
知道:
它有多少数据; 有哪些变量; 每个变量代表什么; 哪些数据缺失; 哪些记录重复; 哪些类别混乱; 哪些数值异常; 哪些字段根本没有信息。
把这些问题搞清楚以后:
后面的统计分析和机器学习,才真正有意义。
所以以后再拿到一份Excel:
先别急着分析。
先花几分钟:
给数据做一次体检。
如果你想系统跑通AI+R数据分析
这篇文章解决的是:
拿到数据以后,第一步应该做什么。
但一个完整的数据项目,还包括:
问题定义↓数据导入↓数据诊断↓数据清洗↓探索分析↓数据可视化↓统计分析↓结果解释↓Quarto报告这也是我在 R语言AI编程营 里带大家实践的一条完整路径。
不是单独学几个函数。
而是:
借助AI,把一个真实的数据项目从头到尾做出来。
如果你希望系统学习,可以加我微信,备注:
RAI
如果你已经有R基础,希望进一步进入:
recipe → 多模型 → 交叉验证 → 模型评价 → 调参 → 完整机器学习项目
则可以了解:
RAI机器学习营
加微信备注:
机器学习
我的微信,扫码添加。

作者:RAI王博士
专注 R语言 × AI × 数据分析 × 机器学习工作流
RAI = R + AI + Workflow
让AI真正进入数据分析与科研工作流。
#R语言#AI编程#数据分析#数据清洗#Excel#tidyverse#tidymodels#R语言AI编程#RAI工作流