零基础入门R语言描述性统计:从summary()到分组分析

发布时间:2026/10/29 22:19:16
零基础入门R语言描述性统计:从summary()到分组分析 简介这份PDF文档面向R语言初学者与数据分析入门者系统梳理描述性统计分析的常用方法帮助读者快速掌握从基础统计量到分组分析与可视化的完整流程。内容覆盖summary()、sapply()等内置函数偏度与峰度的自定义函数写法Hmisc与psych包的describe()函数以及aggregate()、by()、doBy包的summaryBy()分组统计方案并配合ggplot2绘制直方图与箱线图直观呈现数据分布。资源包共1个PDF文件约98KB篇幅精炼、代码示例完整便于按章节检索与对照练习。目前已有553人学习适合希望夯实数据探索基础、为后续数据挖掘与机器学习打底的学习者参考使用。1. 零基础入门R语言描述性统计拿到一份数据先别急着画图你有没有过这种经历拿到一个 Excel 表格几百行数据老板问你「这批数据大概什么情况」你盯着屏幕看了半天除了知道有几行几列什么也说不出来。其实这时候你需要的不是复杂的模型而是一套最基础的动作——描述性统计分析。说白了它就是给数据做一次「体检」平均值多少、波动大不大、有没有离谱的异常值、分布是偏左还是偏右。R 语言在这件事上特别顺手几个函数就能把一份陌生数据摸得七七八八。这篇指南面向完全没碰过 R 的新手不堆公式先讲清概念再带你跑通第一个例子最后告诉你接下来该练什么。数据科学听着唬人但第一步往往就是这种「看一眼数据长什么样」的笨功夫而这恰恰是最值钱的功夫。2. 为什么新手第一站该学描述性统计先看懂数据再谈分析很多人刚接触数据科学恨不得直接上手机器学习、画酷炫的图结果数据里有个明显录错的年龄「999 岁」都没发现后面所有结论全歪。描述性统计分析就是那道最便宜的保险它用几个数字把数据的中心趋势、离散程度和分布形状摊开给你看让你在动手建模之前就知道这份数据靠不靠谱。R 语言之所以适合干这件事是因为它内置了summary()这类「一行出结果」的函数也有Hmisc、psych这些专门包把偏度、峰度都算好新手不用自己推导公式就能拿到完整画像。这一章先把「为什么学」讲透再落到「怎么迈第一步」。2.1 描述性统计到底在算什么三个词讲明白你可以把描述性统计理解成给数据拍三张照片。第一张叫中心趋势回答「这批数据大概在什么水平」代表指标是均值和中位数第二张叫离散程度回答「大家离这个水平有多远」代表指标是方差和标准差第三张叫分布形状回答「数据是往一边挤还是两边对称」代表指标是偏度和峰度。举个例子一个班里十个人考试平均分 80但有人 100 有人 60标准差就大如果大家都考 78 到 82标准差就小。同样是平均 80这两批数据的「性格」完全不同。R 语言里mean()、sd()、var()分别对应前两张照片偏度和峰度则需要自己写函数或用现成的包。新手先记住这三个词后面所有函数都是围绕它们转的。2.2 为什么用 R 而不是 Excel三个实际理由第一个理由是「可重复」。Excel 里你点几下算出均值换一份数据又得重新点而 R 里写好的代码换数据源直接重跑这对以后处理几十份表格是刚需。第二个理由是「一次算一批」。Excel 一次只能看一列R 的sapply()可以同时对多列套用同一个函数三行代码把均值、标准差、中位数全算出来。第三个理由是「分组方便」。你想按性别、按地区分别看统计量R 的aggregate()一行就能分组汇总Excel 得靠数据透视表来回拖。我第一次学的时候也觉得敲代码比点鼠标麻烦但处理到第三份数据时就明白前面那点学习成本早就赚回来了。R 不是让你变复杂是让重复劳动变少。2.3 第一个例子用内置数据跑通 summary()新手最怕「装环境」这一步所以第一个例子我们用 R 自带的数据集mtcars不用下载任何文件。打开 R 或 RStudio在控制台里逐行输入下面三行# 调用 R 内置的 mtcars 数据集它记录了 32 款车型的油耗、马力等指标 data(mtcars) # 挑出三个数值型变量每加仑英里数 mpg、马力 hp、车重 wt myvars - c(mpg, hp, wt) # 对这三列一次性输出最小值、四分位数、中位数、均值、最大值 summary(mtcars[myvars])跑完你会看到每个变量下面有一排数字最小值、下四分位数、中位数、均值、上四分位数、最大值。别小看这一排它已经告诉你三件事——数据范围有没有离谱值看最小最大、中间水平在哪看中位数和均值差多少、数据集中不集中看四分位数间距。比如mpg的均值和 median 如果差得远说明分布可能偏斜。这一步不需要你懂任何统计公式先养成「拿到数据先 summary 一下」的习惯比什么都重要。提示如果你还没装 R去官网下载基础版即可RStudio 只是更好用的编辑器不是必须。第一个例子在纯 R 控制台里就能跑。3. 从单列到多列把常用统计量一次算全跑通summary()只是热身它给的指标有限没有标准差、没有偏度。真实场景里你往往想一次性拿到更全的指标这时候就要学会「把函数套到多列上」。这一章讲两个核心动作用sapply()批量算标准统计量以及自己写一个函数把偏度峰度也装进去。学会这两招你就能对任意一份数值数据生成一张完整的「体检报告」而不是每次缺什么再补一行代码。3.1 sapply() 的用法一个函数套所有列sapply()的逻辑很直白你给它一个数据框和一個函数它就把这个函数依次应用到每一列再把结果拼成一行或一列返回。比如你想同时看三列的标准差# 对 myvars 里的三列分别计算标准差 sapply(mtcars[myvars], sd) # 想一次看多个指标就把函数换成自定义的匿名写法 sapply(mtcars[myvars], function(x) c(mean mean(x), sd sd(x), median median(x)))第一段代码返回三个数分别是 mpg、hp、wt 的标准差。第二段稍微绕一点function(x)是临时定义的一个小函数c(...)把均值、标准差、中位数打包成一个向量sapply会对每一列都执行一遍最后得到一个矩阵行是指标、列是变量。这里的关键参数是na.rm如果你的数据里有缺失值记得在mean()、sd()里加上na.rm TRUE否则结果会变成NA。新手最常见的翻车就是忘了这个参数算出来一片 NA 还以为数据坏了。3.2 自定义函数把偏度和峰度也装进来summary()和sapply()给不了偏度和峰度但这两个指标恰恰能告诉你分布形状。偏度大于 0 说明数据往右拖了一条长尾小于 0 往左拖峰度大于 0 说明比正态分布更尖小于 0 更平。R 基础包里没有现成函数自己写一个并不难# 自定义函数输入一列数据返回样本量、均值、标准差、偏度、峰度 mystats - function(x, na.omit FALSE) { if (na.omit) x - x[!is.na(x)] # 可选先剔除缺失值 m - mean(x) # 均值 n - length(x) # 样本量 s - sd(x) # 标准差 skew - sum((x - m)^3 / s^3) / n # 偏度 kurt - sum((x - m)^4 / s^4) / n - 3 # 峰度减 3 是为了和正态分布对齐 return(c(n n, mean m, stdev s, skew skew, kurtosis kurt)) } # 把这个函数套到三列上 sapply(mtcars[myvars], mystats)这段代码里na.omit是个开关默认FALSE表示不处理缺失值你调用时传TRUE就会先过滤掉 NA。skew和kurt那两行是公式的直接翻译新手不用背知道「偏度看尾巴往哪边拖、峰度看尖不尖」就够用。跑完你会得到一张五行三列的表比summary()多了形状信息。我第一次写这个函数时把s^3写成了s3结果全是 NaN排查了半天——所以公式里的括号和指数符号一定要看仔细。3.3 现成的包Hmisc 和 psych 的 describe()如果你不想自己写函数两个包可以直接用。Hmisc的describe()输出详细包含四分位数、偏度、峰度、缺失值个数psych的describe()输出更紧凑还额外给了标准误。安装和调用如下# 安装包只需第一次运行之后注释掉即可 install.packages(Hmisc) install.packages(psych) library(Hmisc) describe(mtcars[myvars]) # 输出较详细适合逐列细看 library(psych) describe(mtcars[myvars]) # 输出紧凑适合快速扫一遍两个包功能有重叠新手不用纠结选哪个先装psych就够它的输出列少、看着不晕。注意install.packages()只需要跑一次之后每次打开 R 只要library()加载即可。有人每次重启都重新安装白白等几分钟这是典型的踩坑。另外包名大小写敏感psych全小写Hmisc是大写 H 加小写 misc写错了会报「不存在这个包」。4. 分组看数据为什么整体均值会骗人整体均值有时候会骗人。比如一批员工薪资整体平均看着还行但按部门一分组发现某个部门全是高薪、另一个部门全是低薪混在一起就把差异抹平了。分组描述性统计就是让你按某个分类变量把数据切开分别算统计量。R 里做这件事有三条路aggregate()最直观by()适合套自定义函数doBy包的summaryBy()输出最整齐。这一章把三条路都走一遍你按场景挑着用。4.1 aggregate()一行代码按组算均值aggregate()的公式写法是「要算的列 ~ 分组列」读作「按分组列算要算的列」# 按气缸数 cyl 分组计算 mpg 的均值 aggregate(mpg ~ cyl, data mtcars, mean) # 想一次算多个变量左边用 cbind 把多列包起来 aggregate(cbind(mpg, hp, wt) ~ cyl, data mtcars, mean)第一行返回三行cyl 为 4、6、8 的三组各自 mpg 的均值。第二行把三个变量一起算返回三行四列。公式左边的cbind()是关键少了它就只能一次算一列。data 指定数据框mean是你要套用的函数换成sd、median都行。这个函数的好处是结果直接是数据框方便你接着往下处理缺点是只能套一个函数想同时看均值和标准差就得调两次。4.2 by() 加自定义函数一次输出多个指标by()的写法是「数据、分组、函数」三个参数它会把数据按分组切开对每一块套用你的函数# 先定义一个对单列算多个指标的辅助函数 dstats - function(x) sapply(x, mystats) # 按 cyl 分组对三列分别套用 mystats by(mtcars[myvars], mtcars$cyl, dstats)这里mtcars[myvars]是要分析的数据mtcars$cyl是分组依据dstats是套用的函数。返回结果是一个列表每个分组一个元素里面是五行三列的统计表。by()的灵活之处在于函数随便你换mystats能塞进去任何自定义逻辑都能塞。缺点是输出是列表想导出成表格得多一步do.call(rbind, ...)拼接。新手如果只是快速看一眼分组情况by()足够如果要整理成报告往下看summaryBy()。4.3 summaryBy()输出最像表格的分组结果doBy包的summaryBy()输出是规整的数据框最适合直接贴进报告install.packages(doBy) library(doBy) # 按 cyl 分组对 mpg、hp、wt 套用 mystats summaryBy(mpg hp wt ~ cyl, data mtcars, FUN mystats)公式左边用连接多个变量右边是分组变量FUN 指定函数。返回的表格每行一个分组列名带指标后缀一眼就能看出哪组均值高、哪组波动大。三个函数怎么选只想快速看均值用aggregate()要套复杂函数用by()要整齐表格用summaryBy()。我刚开始学的时候三个都试了一遍最后发现日常八成场景aggregate()就够剩下两成交给summaryBy()by()反而用得少——但知道它存在遇到怪需求时不至于卡住。5. 避坑指南新手跑描述性统计最容易翻车的五个地方这一章不教新东西专门讲翻车现场。下面五条是我带新手时反复见到的每条按「现象、原因、解决」写你跑代码报错或结果诡异时先来这里对一遍多半能自己救回来。5.1 结果全是 NA忘了处理缺失值现象mean()、sd()算出来是NA但数据明明有数字。原因那一列里混了至少一个缺失值R 默认遇到 NA 就返回 NA不帮你跳过。解决在函数里加na.rm TRUE比如mean(x, na.rm TRUE)用自定义函数时把na.omit参数传TRUE。更稳妥的做法是先sum(is.na(x))看一眼这列有几个缺失心里有数再决定是删还是补。5.2 包加载报错「不存在这个包」装了没加载或名字写错现象describe()报错说找不到函数。原因要么没install.packages()要么装了但没library()要么包名大小写写错。解决先确认install.packages(psych)跑过且没报错再library(psych)包名严格区分大小写Hmisc不能写成hmisc。还有一个隐蔽情况安装时选了镜像但网络断了包只装了一半重装一遍即可。5.3 分组结果对不上分组列类型不对现象aggregate()按某列分组结果组数比预期少。原因分组列可能是数值型但你想按类别分或者里面有隐藏空格导致同一类被拆成两组。解决先用class(mtcars$cyl)看类型用table(mtcars$cyl)看每类几个如果是字符列有空格用trimws()清一下。分组前养成table()一下的习惯能省掉大量「为什么少了一组」的困惑。5.4 自定义函数返回 NaN公式里除了零或样本量为 1现象偏度、峰度算出来是NaN或Inf。原因标准差s为 0所有值一样时公式里除了零或者样本量n为 1 时标准差算不出来。解决调用前先看这列是不是常量length(unique(x)) 1就说明没波动跳过即可样本量太小的列单独拎出来看别硬套公式。这不是代码错是数据本身不适合算这些指标。5.5 中文列名或路径导致乱码报错现象读入带中文列名的表格后函数报错说找不到列。原因不同系统编码不一致中文列名被读成了乱码。解决读数据时显式指定编码比如read.csv(data.csv, fileEncoding UTF-8)或者干脆在读入后先用colnames(df) - c(a,b,c)改成英文列名再分析。新手阶段别跟编码较劲改成英文最省心。6. 下一步学什么从描述性统计走向可视化与建模的学习路径跑通前面几章你已经能对一份数值数据算出中心趋势、离散程度、分布形状还能按组拆分。接下来该往哪走我的建议是先补可视化再碰建模中间穿插练手数据。可视化之所以排第一是因为数字看多了会麻木一张直方图或箱线图能让你瞬间看出偏态和异常值和描述性统计是绝配。R 里ggplot2是绕不开的它的逻辑是「数据 映射 几何对象」三层叠加新手先掌握直方图和箱线图两种就够用install.packages(ggplot2) library(ggplot2) # 直方图看 mpg 的分布形状binwidth 控制柱子宽度 ggplot(mtcars, aes(x mpg)) geom_histogram(binwidth 1, fill steelblue, color black) # 箱线图按 cyl 分组看 mpg 的中位数和异常值 ggplot(mtcars, aes(x factor(cyl), y mpg)) geom_boxplot()第一段里aes(x mpg)指定横轴映射哪一列binwidth 1是柱子宽度调小柱子变细、调大变粗多试几次就有手感。第二段factor(cyl)把数值型气缸数转成分类箱线图才能按组画。箱线图上的点如果跑到须线外面那就是异常值正好和你前面算的分位数对上。学完这两种图再补散点图看两列关系描述性统计的「看数据」环节就闭环了。再往后的路径我建议这样排先用mtcars、iris这些内置数据把summary()、sapply()、aggregate()、ggplot2各练三遍形成肌肉记忆然后找一份自己真正关心的数据比如记账表、运动记录完整走一遍「读入、清洗缺失值、描述统计、分组、画图」最后再碰建模。别急着上机器学习描述性统计没练熟就建模等于地基没打就盖楼。我自己的血泪经验是曾经跳过描述性统计直接跑回归结果模型系数怎么解释都不对回头一查发现某列有个录入错误的值把均值拉偏了白白浪费两天。从那以后我每次拿到新数据都强制先跑一遍summary()加直方图确认没异常再往下走。这个习惯看着笨但救过我很多次。希望帮到你从今天这份mtcars开始先把第一个summary()跑出来。本文还有配套的精品资源点击获取