news 2026/9/14 13:56:22

Data-Science-For-Beginners 实战:用 R 与 ggplot2 直方图完成数据分布可视化作业

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Data-Science-For-Beginners 实战:用 R 与 ggplot2 直方图完成数据分布可视化作业

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_histogrambins调参、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_manuallabels恢复语义化名称;
  • 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 个直方图"与"详细注释"两条优秀标准:

  1. 选数据集并注明来源:可以是 Kaggle 上任何带数值列的公开数据集。脚本头部用注释块写明数据集名称、下载地址/出处、行数列数概览,这正是评分标准中"包括其来源"的注释要求;
  2. 读取与清洗:参照read.csv("../../data/birds.csv", fileEncoding="UTF-8-BOM")的写法,注意处理编码与异常值(subset过滤);
  3. 至少 5 个直方图:按难度递增排列,例如——
    • 单变量直方图 ×2(不同字段或不同bins,对应文中geom_histogram(bins=10)bins=30);
    • 过滤子集直方图 ×1(subset+geom_histogram);
    • 二维直方图 ×1(geom_bin2d对比两个数值列);
    • 文本分类着色直方图 ×1(编码映射 +scale_fill_manual);
    • 若想升级,可再加入分组密度图(geom_density+fill),用平滑曲线补足直方图的叙事盲区;
  4. 每个图表配注释:在 R 代码中用#说明"这张图想回答什么问题、观察到了什么事实",让脚本成为一份可读的"数据故事报告";
  5. 对照评分表自查:优秀档要求"脚本带注释、含来源、≥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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 13:53:39

微信小程序生鲜商城源码拆解:从全局配置到模板复用

简介&#xff1a;这套微信小程序生鲜商城项目附带完整截图与可运行源码&#xff0c;适合小程序入门开发者、前端学习者及电商项目实训人员&#xff0c;解决从页面设计到功能逻辑实现缺少完整参考的问题。资源压缩包共39个文件&#xff0c;大小仅576KB&#xff0c;其中15张png截…

作者头像 李华
网站建设 2026/9/14 13:51:05

Qt5.14.2 aarch64静态交叉编译完整手册与踩坑实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:48:19

Pytorch车牌识别实战:CNN+BiLSTM+CTC端到端方案解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:42:53

CMSIS-4遗产代码库的静态工程评测:迁移前如何摸清底细

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华