到分组可视化)
简介这份PDF资料面向R语言初学者与数据分析入门者系统讲解描述性统计分析的完整方法体系帮助读者快速掌握从基础统计量到分组分析与可视化的核心技能。内容覆盖summary()、sapply()等内置函数偏度与峰度的自定义函数写法Hmisc与psych包的describe()进阶用法以及aggregate()、by()、doBy包的summaryBy()分组统计方案并配合ggplot2绘制直方图与箱线图直观呈现数据分布。资源包共1个PDF文件约98KB篇幅精炼、代码示例完整便于随查随用。目前已有553人学习适合希望夯实数据探索基础、为后续数据挖掘与机器学习打底的学习者参考。1. 拿到一份数据第一件事到底该干什么刚接触数据分析的人最容易犯的毛病是拿到表格就急着画图、跑模型结果图做得花里胡哨别人一问「这批数据平均多少、有没有离谱的值、分布偏不偏」就答不上来。描述性统计分析就是解决这个尴尬的它不预测未来也不证明因果只老老实实回答「我手上这堆数长什么样」。你可以把它想成体检报告——身高体重、血压心率几项指标一摆健康状况先有个底。R 语言在这件事上特别顺手summary()一行就能出结果ggplot2几笔就能把分布画出来。这篇指南面向零基础新手带你从「什么是描述性统计」一路走到「第一个例子跑通」不深挖公式推导只求你敢打开 R 动手试。2. 为什么值得先学描述性统计它是所有分析的底座2.1 不做描述性统计后面全是空中楼阁很多人学 R 的第一反应是冲着机器学习、预测模型去的觉得算均值、看分布太「小儿科」。但真实项目里翻车的往往不是模型不够高级而是数据本身有问题没被发现。比如某公司做用户消费分析直接拿原始金额去算平均值结果被几个异常大额订单拉高了一大截结论完全失真。如果先做一遍描述性统计看一眼最大值和四分位数这种坑当场就能发现。描述性统计干三件事看中心在哪均值、中位数、看数据散不散方差、标准差、极差、看形状偏不偏偏度、峰度。这三类信息合起来相当于给数据拍了张 X 光片。你后面无论做分组对比、画图、还是喂给模型心里都有底。入门阶段先把这套基本功练熟比急着学复杂算法划算得多。我第一次学的时候也跳过这一步后来做模拟项目X时被异常值坑得很惨才回头补的课。2.2 R 为什么适合干这件事R 本身就是为统计分析生的内置函数和第三方包极其丰富。summary()是自带的基础款装上psych或Hmisc包又能拿到更细的偏度峰度画图有ggplot2撑场面。更关键的是R 处理的是「向量化」操作——你写一行sapply(mtcars, mean)它自动对每一列求均值不用写循环。对新手来说这意味着少量代码就能看到结果正反馈来得快不容易半途放弃。2.3 第一个例子用内置数据跑通 summary()不用自己找数据R 自带一个叫mtcars的数据集记录了三十多款车型的油耗、马力、重量等信息正好拿来练手。打开 R 或 RStudio在控制台里逐行输入# 调用 R 内置的 mtcars 数据集 data(mtcars) # 挑出三个数值型变量每加仑英里数、马力、车重 myvars - c(mpg, hp, wt) # 对这三列做基础描述性统计 summary(mtcars[myvars])跑完你会看到每列下面列出最小值、第一四分位数、中位数、均值、第三四分位数、最大值。这几行数字就是描述性统计最核心的骨架中位数和均值告诉你「中心在哪」四分位数之间的间距告诉你「中间一半数据有多散」最小最大值帮你快速扫一眼有没有离谱的值。myvars这个向量是你自己定义的列名集合想换变量改这里就行mtcars[myvars]是「按列名取子集」的写法R 里非常常用记住这个方括号加字符向量的组合后面会反复出现。提示如果你还没装 R先去官网下载安装包再装一个 RStudio界面友好很多。装好后新建一个 Script 文件把代码写进去再运行比在控制台一行行敲更利于保存和修改。3. 从内置函数到自定义把统计量算全3.1 用 sapply() 批量算均值、标准差summary()给的是「套餐」但有时候你只想要某几个指标比如均值和标准差。这时候用sapply()对每一列套用函数# 对三列分别求均值 sapply(mtcars[myvars], mean) # 对三列分别求标准差 sapply(mtcars[myvars], sd)sapply的意思是「简化版 apply」给它一个数据框和一个函数它把函数挨个应用到每一列上再把结果拼成一个向量返回。第一个参数是数据第二个参数是函数名注意不要加括号写mean而不是mean()。同理你可以换成median、var、min、max、range、quantile一行换一个指标非常灵活。新手常犯的错是写成sapply(mtcars[myvars], mean())多了对括号R 会先算出一个数再传进去直接报错。记住传函数名本身不传调用结果。3.2 自定义函数把偏度和峰度一次算出来内置函数没直接给偏度和峰度但可以自己写。别被公式吓到你只需要知道偏度衡量分布左右对称不对称0 附近算对称正数尾巴偏右峰度衡量尖不尖0 附近接近正态。下面这个函数把样本量、均值、标准差、偏度、峰度打包返回# 自定义描述性统计函数 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 # 峰度 return(c(n n, mean m, stdev s, skew skew, kurtosis kurt)) } # 应用到三列上 sapply(mtcars[myvars], mystats)逐段看function(x, na.omit FALSE)定义了一个接收一列数据和可选开关的函数if (na.omit)那段是「要不要先去掉缺失值」的开关默认不去中间五行分别算五个统计量return(c(...))把结果拼成一个带名字的向量。na.omit这个参数名容易和 R 自带的na.omit()函数混淆这里只是借了个名字当开关实际逻辑是手动筛掉NA。跑完你会得到一张小表每列五个指标比summary()多了偏度峰度适合写报告时直接引用。3.3 装个包让 describe() 帮你算全不想自己写函数就借现成的包。psych包的describe()一次给出样本量、均值、标准差、中位数、截尾均值、绝对中位差、最小值、最大值、极差、偏度、峰度、标准误基本覆盖入门所需# 安装并加载 psych 包只需安装一次 install.packages(psych) library(psych) # 对三列做详细描述性统计 describe(mtcars[myvars])install.packages()是下载安装只需跑一次library()是每次新开 R 会话都要跑的加载命令忘了加载会报「找不到函数」。Hmisc包里也有个同名describe()输出格式略有不同两个包别同时加载否则后加载的会覆盖前面的同名函数这是新手很容易踩的坑。入门阶段选一个用熟就行我一般推荐psych输出更整齐。4. 分组对比不同类别的数据要分开看4.1 为什么必须分组把全部车型混在一起算平均油耗意义不大——四缸、六缸、八缸车本来就不是一个物种。分组描述性统计就是「先按某个类别拆开再各自算指标」。mtcars里的cyl列记录气缸数正好拿来当分组变量。这一步在真实业务里对应「按地区、按渠道、按用户等级分别看」是描述性统计从「看整体」升级到「看结构」的关键。4.2 用 aggregate() 做单指标分组# 按气缸数分组计算每组的平均油耗 aggregate(mpg ~ cyl, data mtcars, mean)公式写法mpg ~ cyl读作「mpg 按 cyl 分组」左边是要算的变量右边是分组变量data指定数据来源最后一个参数是要应用的函数。输出是一张两列小表气缸数、对应均值。想同时算多个变量把左边写成cbind(mpg, hp, wt) ~ cyl即可。aggregate的局限是一次只能套一个函数想要多个指标就得跑多行或者换下面的方法。4.3 用 by() 一次算多个统计量# 先定义一个对单列算多个指标的辅助函数 dstats - function(x) sapply(x, mystats) # 按气缸数分组对三列分别套用 by(mtcars[myvars], mtcars$cyl, dstats)by()的三个参数分别是数据、分组向量、要应用的函数。这里先把mystats用sapply包一层是因为by传进来的每个分组是一个数据框得再对框里每一列套一次函数。输出是按组排列的列表每组一张小表。列表读起来不如数据框直观但胜在灵活什么自定义函数都能塞进去。如果你觉得列表难读可以试试doBy包的summaryBy()公式写法和aggregate类似但支持一次算多个指标输出也更像一张规整的表。5. 避坑指南新手最容易翻车的五个地方5.1 函数名后面多写了括号现象运行sapply(mtcars, mean())报错提示参数不对。原因mean()是「调用函数」会立刻算出一个数而sapply要的是「函数本身」。解决去掉括号写mean。同理sd、median都一样。这个错我见过太多次记住一句话——把函数当参数传时它是个「东西」不是「动作」。5.2 忘了加载包就调用函数现象明明装过psych一跑describe()就提示「could not find function」。原因install.packages()只是下载到本地每次新开 R 会话都得library(psych)才能用。解决脚本开头统一写加载语句。另外两个包有同名函数时后加载的会盖住先加载的排查时先看search()输出的加载顺序。5.3 缺失值把均值变成 NA现象算出来均值是NA其他指标正常。原因数据里有缺失值mean()默认不跳过一遇到NA整个结果就变NA。解决要么在函数里加na.rm TRUE如mean(x, na.rm TRUE)要么用自定义函数里的na.omit开关先剔除。注意summary()会自动报告缺失个数养成先看一眼的习惯。5.4 把分类变量当数值算均值现象对「性别」「地区」这类列求均值结果毫无意义。原因这些列在 R 里可能是因子或字符mean()对它们要么报错要么给出荒谬结果。解决先用str()看每列类型数值型才做数值统计分类型只做频数统计table()。summary()对因子会自动给频数这点比手写函数省心。5.5 分组变量写错导致组数不对现象按cyl分组结果只出来一组或组数明显偏少。原因分组列里混进了缺失值或者列名拼错被当成常量。解决分组前先table(mtcars$cyl, useNA ifany)看一眼各组数量和缺失情况确认分组变量干净再往下走。6. 画出来才算真看懂ggplot2 入门与下一步路径数字看多了会麻木画成图往往一眼就能发现问题。ggplot2是 R 里最主流的绘图包入门只需记住「数据 映射 几何对象」三层结构。先看直方图看单变量分布# 安装并加载 ggplot2 install.packages(ggplot2) library(ggplot2) # 画 mpg 的直方图binwidth 控制柱子宽度 ggplot(mtcars, aes(x mpg)) geom_histogram(binwidth 1, fill blue, color black)ggplot(mtcars, aes(x mpg))声明「用 mtcars 数据x 轴放 mpg」aes是「美学映射」的缩写 geom_histogram(...)叠加一个直方图层binwidth 1表示每 1 个单位一根柱子调大柱子变粗、调小变细多试几次就有手感。再看箱线图按组对比分布# 按气缸数分组画 mpg 的箱线图 ggplot(mtcars, aes(x factor(cyl), y mpg)) geom_boxplot()factor(cyl)是把气缸数转成分类变量否则 ggplot 会把它当连续数值处理箱线图就画不出来。箱线图中间那条粗线是中位数箱体上下边是四分位数伸出去的须和单独的点帮你快速识别异常值——这正是描述性统计「看形状、找异常」的图形版。学到这里你已经能独立完成「读数据 → 算指标 → 分组对比 → 画图」这一整条入门链路。下一步建议按这个顺序推进先把dplyr包的分组汇总group_bysummarise练熟它比aggregate更通用再学tidyr做数据整形然后回头补一点统计基础搞清楚标准差和标准误的区别、偏度峰度怎么解读最后再碰建模。别急着跳步描述性统计这套东西看着简单真正做项目时 80% 的洞察都出在这一层。我自己的血泪经验是每次拿到新数据不管多急都强制先跑一遍summary()加分组箱线图再决定下一步做什么——这个习惯帮我挡掉了太多后面才发现的脏数据。希望帮到你。本文还有配套的精品资源点击获取