夜雨聆风学习资料网

ARTICLE · 1110759

拿到一个Excel别急着分析:先让R做这8项数据体检

拿到一个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    )  )

假设得到:

变量
缺失率
Age
0%
MonthlyIncome
2.1%
JobSatisfaction
8.3%
OverTime
0%

这时候不要马上:

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 第八项:有没有“看起来正常,但根本没用”的变量?

最后一个检查,我特别建议做机器学习的人注意。

例如某个字段:

EmployeeCount

1470个人全部都是:

1

这个变量有没有缺失?

没有。

有没有异常?

没有。

类型对不对?

也对。

但是:

它没有任何信息量。

因为所有人的值完全一样。

可以检查:

data %>%  summarise(    across(      everything(),      ~ n_distinct(.)    )  )

如果某列:

n_distinct = 1

就是零方差变量。

另外还有一种情况:

几乎所有值都一样。

例如:

Yes = 99.5%No  = 0.5%

这类变量也值得重点检查。

在tidymodels中,后续还可以考虑:

step_zv(all_predictors())

或者根据具体任务进一步处理近零方差等问题。

为什么要检查?

因为不是所有Excel里的字段:

都应该进入模型。

数据分析不是:

列越多越好。

而是:

哪些变量真正携带了有用信息?

一张表总结:拿到Excel先做这8项体检

体检项目
R里重点检查什么?
你要回答的问题
① 数据规模
dim()
数据有多少行、多少列?
② 字段名称
names()
字段与预期一致吗?
③ 数据类型
glimpse()
numeric/factor/character合理吗?
④ 缺失值
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工作流

相关学习资料