
用 R 与 ggplot2 直方图完成数据叙事Data-Science-For-Beginners「分布可视化」实践作业指南【免费下载链接】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 课程第 10 课可视化分布R 版本的实践作业帮你把课堂上学到的直方图技法真正落地独立挑选一个数据集编写带完整注释的 R 脚本用至少 5 个直方图讲出一个有依据、可复现的数据故事。读完本文你将掌握课程作业的全部技术要求数据加载与清洗、geom_histogram/geom_bin2d/geom_density的完整用法并理解评分细则Rubric中「Exemplary」档位的具体验收标准。本作业原文位于 translations/en/3-Data-Visualization/R/10-visualization-distributions/assignment.md课程正文见 3-Data-Visualization/R/10-visualization-distributions/README.md。作业任务解读作业原文的要求可以拆解为三个递进层次换一个数据集此前几课一直使用明尼苏达鸟类数据集data/birds.csv本作业要求你离开「舒适区」另选一个数据集——例如 Kaggle 等公开数据集平台上的开放数据——来检验自己是否真正掌握了分布可视化的能力。编写 R 脚本讲故事交付物不是零散的命令行片段而是一个结构完整、能够一次性运行、带充分注释说明的.R脚本脚本需要围绕数据讲述一个有起承转合的叙事数据来源是什么 → 数据长什么样 → 分布呈现什么规律 → 规律意味着什么。直方图是主角分析手段必须包含至少 5 个直方图含密度图用它们来挖掘数据洞察而不是只堆砌summary()之类的统计输出。这套要求正是对课程「Exploring distributions」部分的实践检验散点图只能给分布一个粗略印象直方图才能精确呈现数据沿坐标轴的分布形态。前置准备R 环境与数据集本作业建立在第 10 课的 R 技术栈之上核心依赖只有一个主流绘图包# 若尚未安装先执行 install.packages(ggplot2) library(ggplot2)在动手写自己的脚本之前先用课程自带数据完整演练一遍。加载课程数据时需要注意仓库中的 data/birds.csv 带有 UTF-8 的 BOM 头直接read.csv()会把第一列列名读成ï..Name因此课程代码显式指定了fileEncodingUTF-8-BOMbirds - read.csv(../../data/birds.csv, fileEncoding UTF-8-BOM) # 沿用上一课的做法剔除离群点翼展异常的巨型鸟类记录 birds_filtered - subset(birds, MaxWingspan 500) head(birds_filtered)数据集中每行是一条鸟类记录关键数值列包括MinLength/MaxLength体长厘米、MinBodyMass/MaxBodyMass体重克、MinWingspan/MaxWingspan翼展厘米另有Order、Family、Genus、ConservationStatus保护状态等分类列这些列正是「数值直方图」和「按类别分组直方图」两类分析的数据基础。实践提示课程的过滤阈值如MaxWingspan 500、MaxBodyMass 60是针对 birds.csv 的具体量纲设定的。换用你自己的数据集时务必先用summary()、range()、quantile()检查列的取值域再设定有业务意义的过滤区间不要照搬阈值。直方图技法速成作业里能用的 6 种图作业要求「至少 5 个直方图」课程正文恰好提供了 5 类以上可独立计数的直方图技法下面逐一给出可直接复制运行的代码与解读这就是你脚本的「弹药库」。1. 基础直方图geom_histogram直方图本质上是把数值区间切成若干bins分箱再统计每个箱内的记录数以条形的高低起伏展示数据分布ggplot(data birds_filtered, aes(x MaxBodyMass)) geom_histogram(bins 10) ylab(Frequency)可以看到数据集中的 400 多种鸟大部分MaxBodyMass落在 2000 克以下。bins是控制直方图粒度的关键参数箱数越多条形越细分布细节越丰富ggplot(data birds_filtered, aes(x MaxBodyMass)) geom_histogram(bins 30) ylab(Frequency)bins太小会丢失细节、过度平滑bins太大又会被噪声主导、出现大量空箱。实践中可以同时尝试 10/20/30/50 等值观察分布形态在不同粒度下的稳定性。2. 过滤后的直方图聚焦主分布左偏严重的图往往是因为少量极端值拉长了坐标轴。通过subset()圈定关注区间可以让直方图聚焦在主要数据上形态更清晰birds_filtered_1 - subset(birds_filtered, MaxBodyMass 1 MaxBodyMass 60) ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_histogram(bins 30) ylab(Frequency)注意上例的过滤区间来自课程原文其单位假设与 birds.csv 的实际数值量纲有关换数据集时请回到「前置准备」中的提示先确认列的实际范围再设定过滤条件。3. 二维直方图geom_bin2d观察双变量收敛当你想同时看两个数值分布的相互关系时散点图会因点重叠而难以读数二维直方图用颜色亮度表达密度是更专业的方案。以MaxBodyMass与MaxLength为例ggplot(data birds_filtered_1, aes(x MaxBodyMass, y MaxLength)) geom_bin2d() scale_fill_continuous(type viridis)运行后会看到两个变量沿一条对角轴呈现明显的相关趋势并在某一区域出现强烈的亮度收敛点——这就是「体重大致对应体长更长」的分布证据。viridis色阶对色觉障碍者友好是推荐的颜色方案。4. 按类别叠加的直方图处理文本分组geom_histogram默认只接受数值数据。当你想比较不同类别如保护状态在同一数值轴上的分布时需要把类别映射到fill上并使用position identity让多个直方图重叠而非堆叠同时用alpha控制透明度防止完全遮盖# 将保护状态缩写映射为可读标签 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 Threatened, Vulnerable, Least Concern) )课程结论是最小翼展与保护状态之间看不出明显的相关性。这正是「直方图也能证伪假设」的示范——分布图不仅用于确认规律也用于排除不成立的猜测。注意课程中把保护状态缩写改写成x1~x6的做法属于占位转换你的作业脚本里更推荐直接保留并映射为有意义的标签如上面的scale_fill_manual(labels...)写法。5. 密度图平滑的分布曲线直方图是「阶梯状」的若想让分布呈现平滑的弧线就用密度图KDE核密度估计。geom_density的adjust参数控制平滑程度取值越大曲线越平滑# 基础密度图 ggplot(data birds_filtered_1, aes(x MinWingspan)) geom_density() # MaxBodyMass 的密度图对比阶梯直方图更平滑 ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_density() # adjust 1/5保留更多细节、略为粗糙 ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_density(adjust 1/5)需要提醒的是密度图与直方图一样会被离群值影响当底层分布有界或不光滑时KDE 可能引入失真因此「先过滤离群点、再画密度图」的顺序很重要。6. 分面密度图一条代码展示多组分布把类别映射到fill密度图可以在一张图里对比多个分组的分布形态非常适合做组间比较ggplot(data birds_filtered_1, aes(x MaxBodyMass, fill Order)) geom_density(alpha 0.5)各目Order的体重密度曲线彼此错开直观呈现不同类群鸟类的体型差异。这张图与第 4 种的叠加直方图、第 5 种的密度图都可分别计入作业要求的「直方图」数量。课程还介绍了更高阶的二维密度等值线geom_density_2d()一维或多维的连续概率密度曲线适合在作业的「进阶部分」使用可作为第 6 个以上图的来源。规划你的脚本如何选数据集作业明确要求「tells a story about this dataset」因此选数据的标准不是「随便找一个」而是「有故事可讲」。结合直方图的技术特性推荐按以下标准筛选至少 23 个数值列直方图需要数值数据数值列越多可做的单变量分布、双变量二维直方图就越丰富至少 1 个分类列分组维度用于叠加直方图/分面密度图支撑「组间分布对比」这类叙事数据量适中且已基本干净几百到几千行最佳过大需要额外考虑抽样过小则直方图形状不稳定来源可查、有背景知识评分细则要求注明数据来源选择你了解背景的领域数据更容易写出有洞察的解读。选定后在脚本头部用注释块记录数据集的名称、来源、下载日期、列说明——这既是评分点也是让脚本「可复现」的第一步。组织脚本结构让分析成为叙事一个达到「Exemplary」档位的脚本不只是图的堆砌而是按「提出疑问 → 观察分布 → 得出结论」的逻辑组织的。建议骨架如下# # 标题你的数据集 分布特征分析 # 作者 / 日期你的名字 / 日期 # 数据来源数据集名称与获取渠道下载于 日期 # 列说明逐列简述含义与单位 # # 0. 环境准备 ------------------------------------------------- library(ggplot2) # 1. 加载数据注意编码与路径 -------------------------------- df - read.csv(path/to/your_dataset.csv, fileEncoding UTF-8-BOM) summary(df) # 2. 数据清洗剔除离群点、设定过滤区间 ------------------------ df_clean - subset(df, ...) # 依据 summary() 结果设定合理阈值 # 3. 单变量分布主角特征长什么样直方图 1、2换 bins 对比--- ggplot(df_clean, aes(x 数值列)) geom_histogram(bins 10) ylab(Frequency) ggplot(df_clean, aes(x 数值列)) geom_histogram(bins 30) ylab(Frequency) # 4. 组间比较不同类别分布是否不同直方图 3、4--------------- ggplot(df_clean, aes(x 数值列, fill 分类列)) geom_histogram(position identity, alpha 0.4, bins 20) # 5. 双变量关系两个分布如何相互关联直方图 5--------------- ggplot(df_clean, aes(x 列A, y 列B)) geom_bin2d() # 6. 平滑视角密度图验证/补充结论直方图 6可选----------- ggplot(df_clean, aes(x 数值列)) geom_density()每个数字小节前用一行注释写出你的假设与解读例如「若体重分布右偏说明少数大型个体主导了总量——这对后续分析意味着需要关注极端值」。这样脚本本身就成了一份带注释的分析报告评委或未来的你能顺着注释理解每一步的意图。对照评分细则自检作业的 Rubric 给出了三档标准直接决定了「完成」与「优秀」的差距档位达标要求常见失分点Exemplary优秀脚本附带关于数据集含来源的详细注释且至少使用 5 个直方图挖掘出有意义的洞察注释缺失来源信息图的数量不足 5 个分析停留在「画图」而没有解读Adequate合格提供了脚本但注释不完整或含错误部分图无法运行注释流于形式Needs Improvement待改进提供了无注释的脚本且包含错误无注释脚本运行报错没有使用直方图提交前请对照以下检查清单逐项自检脚本能从头到尾无报错运行RStudio 中source()或命令行执行均可脚本头部注释包含数据集名称、来源、下载日期、列说明直方图类图表geom_histogram/geom_bin2d/geom_density数量 ≥ 5每个直方图后都有文字注释说明图中分布说明了什么、支持或否定了什么假设至少有一张图体现了「过滤/分组/双变量」中的进阶用法而不全是基础geom_histogram。常见坑与调试建议BOM 编码问题从本仓库读 CSV 一定要带fileEncoding UTF-8-BOM否则第一列列名异常自己选的数据集若列名异常优先怀疑编码。离群点污染坐标轴先summary()/range()看数值范围再subset()过滤避免直方图被极值压扁成「一根柱子」。叠加图互相遮挡多个geom_histogram叠加时记得position identityalpha 1否则后画的组会盖住先画的组。分类列未转成合适形式fill映射需要分类变量若列是字符型也没关系ggplot2会自动按因子处理但注意控制类别数量过多类别会让图无法阅读。图太多、叙事分散每个图都要回答脚本注释中提出的问题如果一张图没有承担叙事职责就删掉它。完成后的进阶探索如果你的脚本已经稳定产出 5 个以上直方图课程还留了两个值得延伸的方向一是调研直方图在真实行业中的应用案例质量检测、金融风控、生物统计等领域都大量依赖分布分析思考它们用直方图「证明了什么」二是在脚本中尝试二维密度图geom_density_2d()将「两个分布的关系」从分箱视角升级为连续概率密度视角。完成这两步你的作业就不仅达标而且具备了一定的工程与叙事水准。总之这份作业考察的不是「会不会调用一个绘图函数」而是「能否用分布视角独立完成一次从数据到结论的完整分析」。把本指南中的 6 类直方图技法吃透、按叙事结构组织注释你交付的 R 脚本就是一份合格的、可复现、可引用的数据故事。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考