Data-Science-For-Beginners 实战:用 R 与 ggplot2 直方图完成数据分布可视化作业
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
本篇技术指南围绕 Data-Science-For-Beginners 课程中《Visualizing Distributions》一课的实践作业展开,讲解如何以明尼苏达州鸟类数据集(birds.csv)为起点,用 R 语言与 ggplot2 绘制直方图、二维直方图与密度图,最终独立完成"基于新数据集编写 R 脚本、用至少 5 个直方图讲述数据故事"的课后任务。读完本文,你将掌握geom_histogram的bins调参、geom_bin2d的双变量分布对比、geom_density的平滑曲线绘制,以及将文本型分类字段转换为可参与直方图分箱的实用技巧,并对照评分标准(Grille d'évaluation)自查作业质量。
一、任务解读:作业到底要求做什么
本课作业原文(法语版见 translations/fr/3-Data-Visualization/R/10-visualization-distributions/assignment.md,英文版见 translations/en/3-Data-Visualization/R/10-visualization-distributions/assignment.md)的核心诉求非常明确:
到目前为止,你已使用明尼苏达鸟类数据集探索了鸟类数量与种群密度。请将这些技术应用到另一个数据集(例如来自 Kaggle 的数据集)上,编写一个 R 脚本来讲述该数据集的故事,并且务必在分析中使用直方图。
其评分标准(Rubric)分三档:
| 优秀(Exemplaire) | 合格(Adéquat) | 待改进(À améliorer) |
|---|---|---|
| 脚本包含关于数据集的详细注释(含数据来源),且至少使用 5 个直方图来挖掘数据事实 | 脚本注释不完整或存在错误 | 脚本无注释且包含错误 |
可以看出,作业的验收点有三个:可运行的 R 脚本、包含数据来源在内的详细注释、不少于 5 个直方图。而直方图背后需要的全部技术,正是本课正文 3-Data-Visualization/R/10-visualization-distributions/README.md 所教授的。因此完成作业的第一步,是把这节课的图表工具箱学透。
二、准备数据环境:读取与清洗 birds 数据集
本课所有示例都基于仓库根目录下的 data/birds.csv(含表头共 443 行,即 442 条鸟类记录)。该文件带有UTF-8 BOM 编码,直接使用read.csv会把首列列名读成乱码,因此必须显式指定fileEncoding="UTF-8-BOM":
library(ggplot2) birds <- read.csv("../../data/birds.csv", fileEncoding="UTF-8-BOM") birds_filtered <- subset(birds, MaxWingspan < 500) head(birds_filtered)数据集的 13 个字段覆盖了每只鸟的分类学信息(Name、ScientificName、Category、Order、Family、Genus)、保护状态(ConservationStatus)以及四组长度/体重/翼展的最小值与最大值(MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan)。其中 LC、NT、VU、EN、CR、EX 是 IUCN 红色名录的简写,分别表示无危(Least Concern)、近危(Near Threatened)、易危(Vulnerable)、濒危(Endangered)、极危(Critically Endangered)、灭绝(Extinct)。
subset(birds, MaxWingspan < 500)是在承接上一课"剔除异常值"的结论——数据中存在个别记录异常大的翼展值,过滤后得到更可信的分布样本。后续所有分布分析都基于birds_filtered展开。
三、直方图基础:用 geom_histogram 观察分布形态
课程指出,散点图(如ggplot(data=birds_filtered, aes(x=Order, y=MaxLength)) + geom_point())只能给出分布的粗略概览,真正的分布形态应当用直方图来呈现。直方图本质上是一种"条块随数值高低起伏"的图表,它把连续数值切分成若干等宽区间(bin),再统计每个区间内的样本频数。
对全量数据绘制 MaxBodyMass(最大体重)的分布:
ggplot(data = birds_filtered, aes(x = MaxBodyMass)) + geom_histogram(bins=10) + ylab('Frequency')一眼即可看出:这 400 多只鸟的体重绝大多数集中在 2000 以下,分布严重右偏。直方图对数据分布的"骨架"描绘能力,是散点图难以替代的。
bins 参数:颗粒度决定洞察深度
直方图的细腻程度由bins参数控制。将区间数从 10 提高到 30:
ggplot(data = birds_filtered, aes(x = MaxBodyMass)) + geom_histogram(bins=30) + ylab('Frequency')区间越多,条块越细,分布细节越清晰。这是作业里可以反复利用的一个杠杆:针对不同字段尝试不同的 bins 值,观察分布的峰、谷与长尾。
用 subset 过滤数据以还原更干净的分布
左偏严重时,可以先用subset裁剪数据范围,让主体分布"拉开"。例如只保留体重在 1 到 60 之间的记录:
birds_filtered_1 <- subset(birds_filtered, MaxBodyMass > 1 & MaxBodyMass < 60) ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) + geom_histogram(bins=30) + ylab('Frequency')这种"先过滤、再分箱"的组合拳,在作业中可用于揭示某个子群体(如按 Category 或 Order 过滤)的内部分布规律,是产出第 3、4 个直方图的现成思路。
四、二维直方图:对比两个变量的分布关系
直方图不仅能刻画单变量,还能通过geom_bin2d()把两个数值变量放进同一张图,用颜色亮度表示二维分箱中的频数聚合度。例如对比 MaxBodyMass 与 MaxLength:
ggplot(data=birds_filtered_1, aes(x=MaxBodyMass, y=MaxLength)) + geom_bin2d() + scale_fill_continuous(type = "viridis")从图中可以观察到两个变量沿一条预期轴线的相关性,并存在一个明显的强收敛区域——这正是体重与体长在生物学上正相关的可视化证据。viridis色板提供了对色觉障碍友好的连续渐变色,适合作为默认配色。
五、处理文本数据:让分类字段参与直方图
直方图默认要求数值型输入。若想分析 ConservationStatus(保护状态)这类文本字段与数值字段(如 MinWingspan)的联合分布,课程给出了一个巧妙的文本转有序编码方案:先把分类缩写映射为带顺序的占位字符串,再作为填充色传入geom_histogram:
birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'EX'] <- 'x1' birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'CR'] <- 'x2' birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'EN'] <- 'x3' birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'NT'] <- 'x4' birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'VU'] <- 'x5' birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus == 'LC'] <- 'x6' ggplot(data=birds_filtered_1, aes(x = MinWingspan, fill = ConservationStatus)) + geom_histogram(position = "identity", alpha = 0.4, bins = 20) + scale_fill_manual(name="Conservation Status", values=c("red","green","blue","pink"), labels=c("Endangered","Near Threathened","Vulnerable","Least Concern"))这段代码的关键点有三:
- 编码映射:
x1~x6只是占位值,目的是让文本类别可以进入分箱逻辑;实际展示时通过scale_fill_manual的labels恢复语义化名称; - position = "identity":让不同类别的条块叠加而非堆叠,便于直接比对各组分布;
- alpha = 0.4:半透明叠加,防止后画的组完全遮住先画的组。
课程的结论是:最小翼展与保护状态之间并没有明显的相关性。作业阶段可以沿此法继续测试其他字段组合(MinLength、MaxBodyMass 等)与不同过滤条件,寻找真正有故事的关联。
六、密度图:让分布曲线平滑流动
直方图是"阶梯状"的,不够圆润。geom_density()用核密度估计把分布拟合成一条平滑曲线,是直方图的极佳补充。对 MinWingspan 绘制密度曲线:
ggplot(data = birds_filtered_1, aes(x = MinWingspan)) + geom_density()可以看到它与之前的直方图形态互相印证,只是曲线更平滑。同理,把前面略显"锯齿"的 MaxBodyMass 直方图换成密度图:
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) + geom_density()如果觉得默认曲线"太滑",可以用adjust参数控制带宽——adjust越小,曲线越贴近原始数据、越不平滑:
ggplot(data = birds_filtered_1, aes(x = MaxBodyMass)) + geom_density(adjust = 1/5)密度图还能用fill一次比较多个分组。例如按鸟的 Order(目)叠加展示体重密度:
ggplot(data=birds_filtered_1, aes(x = MaxBodyMass, fill = Order)) + geom_density(alpha=0.5)这张图在作业里非常"出彩":它用一张图讲清了"不同鸟类目的体重分布各有各的峰",是密度图(而非直方图)不可替代的叙事能力。注意其中alpha=0.5同样是半透明防遮挡。
七、作业落地:从"示例代码"到"完整脚本"
把上面的技术点串起来,作业的标准动作可以归纳为如下流程,直接决定了脚本能否同时满足"至少 5 个直方图"与"详细注释"两条优秀标准:
- 选数据集并注明来源:可以是 Kaggle 上任何带数值列的公开数据集。脚本头部用注释块写明数据集名称、下载地址/出处、行数列数概览,这正是评分标准中"包括其来源"的注释要求;
- 读取与清洗:参照
read.csv("../../data/birds.csv", fileEncoding="UTF-8-BOM")的写法,注意处理编码与异常值(subset过滤); - 至少 5 个直方图:按难度递增排列,例如——
- 单变量直方图 ×2(不同字段或不同
bins,对应文中geom_histogram(bins=10)与bins=30); - 过滤子集直方图 ×1(
subset+geom_histogram); - 二维直方图 ×1(
geom_bin2d对比两个数值列); - 文本分类着色直方图 ×1(编码映射 +
scale_fill_manual); - 若想升级,可再加入分组密度图(
geom_density+fill),用平滑曲线补足直方图的叙事盲区;
- 单变量直方图 ×2(不同字段或不同
- 每个图表配注释:在 R 代码中用
#说明"这张图想回答什么问题、观察到了什么事实",让脚本成为一份可读的"数据故事报告"; - 对照评分表自查:优秀档要求"脚本带注释、含来源、≥5 个直方图",缺注释、有报错则分别落入合格或待改进档。
八、延伸与挑战:从直方图走向更高级的分布图
课程末尾的挑战题建议读者搜索直方图在各领域的经典应用——它比散点图、柱状图、折线图更擅长揭示数据的集中趋势、离散程度与异常聚集,因此在质量检测、生物统计、金融风控等领域都是高频工具。进一步的自学方向是geom_density_2d()——它把密度估计扩展到二维,可以画出"连续概率密度等高线",适合观察两个变量联合分布的峰谷结构。完成本课作业后,用geom_density_2d替换geom_bin2d再做一次双变量对比,会是对分布可视化能力的又一次有效巩固。
相关资源索引
- 本课正文(含全部代码与图表):3-Data-Visualization/R/10-visualization-distributions/README.md
- 英文作业原文:translations/en/3-Data-Visualization/R/10-visualization-distributions/assignment.md
- 法语作业原文:translations/fr/3-Data-Visualization/R/10-visualization-distributions/assignment.md
- 示例数据集:data/birds.csv
- 本课全部运行结果图:3-Data-Visualization/R/10-visualization-distributions/images
- 同系列 R 可视化课程目录:3-Data-Visualization/R
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考