據(jù)故事:Data Science for Beginners 線圖、散點圖與條形圖作業(yè)實戰(zhàn)解析)
用 R 與 ggplot2 講好一個數(shù)據(jù)故事Data Science for Beginners 線圖、散點圖與條形圖作業(yè)實戰(zhàn)解析【免費下載鏈接】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 課程第 09 課R 版本的課后作業(yè)展開在明尼蘇達州鳥類數(shù)據(jù)集data/birds.csv中針對某一種特定鳥類深入挖掘數(shù)據(jù)并運用本課學(xué)過的線圖、散點圖與條形圖三種圖表類型在 notebook 中構(gòu)建一個完整的數(shù)據(jù)敘事。讀完本文你將掌握 ggplot2 從數(shù)據(jù)清洗、異常值發(fā)現(xiàn)到分組比較的完整可視化流程并能夠按照作業(yè)評估標準交出一份兼具清晰注釋、完整敘事與美觀圖表的作品。作業(yè)目標從畫圖到講故事作業(yè)原文見 translations/da/3-Data-Visualization/R/09-visualization-quantities/assignment.md英文原版見 translations/en/3-Data-Visualization/R/09-visualization-quantities/assignment.md給出了明確的任務(wù)描述在本課中你使用線圖line charts、散點圖scatterplots和條形圖bar charts來展示這個數(shù)據(jù)集中的有趣事實。本作業(yè)要求你更深入地挖掘數(shù)據(jù)集去發(fā)現(xiàn)關(guān)于某一種特定類型鳥類的有趣信息。例如你可以編寫一個腳本將你能找到的關(guān)于雪雁Snow Geese的所有有趣數(shù)據(jù)可視化出來。請在 notebook 中使用上述三種圖表類型來構(gòu)建一個故事。該作業(yè)的配套講義 translations/da/3-Data-Visualization/R/09-visualization-quantities/README.mdR 版本原稿見 3-Data-Visualization/R/09-visualization-quantities/README.md提供了完成作業(yè)所需的全部技術(shù)手段包括用ggplot2繪制線圖與散點圖觀察鳥類最大翼展的分布通過geom_text()標注異常值用subset()過濾疑似錄入錯誤的數(shù)據(jù)用dplyr的group_by()、summarise()與gather()分組統(tǒng)計并繪制條形圖用coord_flip()將條形圖轉(zhuǎn)為水平展示通過疊加superimpose多個geom_bar()層進行多指標對比。因此本作業(yè)本質(zhì)上是把講義中的每一段代碼從跟著課文學(xué)升級為圍繞一個主題自主綜合運用。下面我們按作業(yè)要求的三種圖表講一個故事的路徑完整走一遍。第一步準備數(shù)據(jù)選定主角作業(yè)要求的數(shù)據(jù)集存放在倉庫根目錄的 data/ 文件夾下。打開 R 控制臺導(dǎo)入數(shù)據(jù)集并查看前幾行birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)以文件頭 5 行為例數(shù)據(jù)結(jié)構(gòu)是文本與數(shù)值的混合體索引NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165fileEncoding UTF-8-BOM用于正確處理帶 BOM 頭的 CSV 文件。作業(yè)示例選定的主角是雪雁Snow goose學(xué)名Anser caerulescens它在數(shù)據(jù)集中對應(yīng)的記錄為體長 64–79 厘米、體重 2050–4050 克、翼展 135–165 厘米隸屬 Ducks/Geese/Waterfowl 類、Anseriformes 目、Anatidae 科、Anser 屬保護狀態(tài)為 LC無危。選定一個具體物種后作業(yè)的關(guān)鍵就成了圍繞它的這些數(shù)值維度設(shè)計出三種圖表來回答問題——它體長區(qū)間在同類中的位置它的翼展在全數(shù)據(jù)集中算大還是小它所屬類別的數(shù)量構(gòu)成如何第二步線圖與散點圖——發(fā)現(xiàn)異常值完成第一層敘事先裝包再畫線圖用ggplot2的第一步是安裝并載入包install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()ggplot()指定數(shù)據(jù)集與 x、y 軸變量group 1讓 ggplot2 把所有離散的 x 值視為一個序列進行連線geom_line()負責(zé)繪制線圖。此時可以看到一個非常明顯的事實至少有一個極端異常值——2000 多厘米的翼展意味著超過 20 米這顯然不可能是明尼蘇達州真實存在的鳥類多半是錄入時多打了一個 0。為了讓圖表可讀作業(yè)還要求對坐標軸進行打磨。在 README.md 的構(gòu)建鳥翼展線圖一節(jié)中給出了完整的標簽優(yōu)化方案ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line() theme(axis.text.x element_text(angle 45, hjust 1)) xlab(Birds) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)其中theme(axis.text.x element_text(angle 45, hjust 1))將 x 軸標簽旋轉(zhuǎn) 45 度xlab()/ylab()分別設(shè)置坐標軸標題ggtitle()設(shè)置圖表標題。生成的效果如講義中的配圖所示用散點圖給異常值點名即使旋轉(zhuǎn) 45 度幾百個鳥類名稱仍無法全部展示。講義的第二步策略是只標注異常值隱藏其余 x 軸標簽改用散點圖騰出標注空間ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_point() geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank()) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)geom_point()繪制散點geom_text()配合ifelse(MaxWingspan 500, as.character(Name), )只對翼展超過 500 厘米的個體輸出鳥名標簽hjust 0, vjust 0讓標簽從點的右上方開始排布三行theme()參數(shù)分別隱藏了 x 軸標題、刻度文字與刻度線讓畫面更清爽。過濾異常值讓數(shù)據(jù)講道理這一散點圖會揭示禿鷹Bald Eagle與草原隼Prairie Falcon的最大翼展各被多加了一個 0。講義隨即用subset()生成剔除異常值的新數(shù)據(jù)框并重新繪圖birds_filtered - subset(birds, MaxWingspan 500) ggplot(data birds_filtered, aes(x Name, y MaxWingspan, group 1)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.text.x element_blank(), axis.ticks.x element_blank())過濾后數(shù)據(jù)更加連貫、可解釋。需要留意的是過濾后的數(shù)據(jù)集中最大翼展約為 250 厘米如號手天鵝 Trumpeter swan此時若仍沿用 500的閾值geom_text()將不會再輸出任何標簽。作為實戰(zhàn)改進你可以將閾值下調(diào)到過濾后數(shù)據(jù)的合理區(qū)間例如MaxWingspan 240從而繼續(xù)在高翼展個體上做標注——這也正是圍繞具體問題調(diào)整可視化參數(shù)這一作業(yè)能力點的體現(xiàn)。第三步條形圖——用分組統(tǒng)計回答數(shù)量問題講義在探索條形圖一節(jié)提出了一組可以用條形圖回答的問題數(shù)據(jù)集里有多少種鳥類類別各自數(shù)量是多少有多少鳥是滅絕、瀕危、稀有或常見的在林奈分類體系中各屬、各目分別有多少種分組匯總 堆疊條形圖先安裝并載入數(shù)據(jù)處理所需的包然后按Category分組對多個數(shù)值列求均值并繪制堆疊條形圖install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse) birds_filtered %% group_by(Category) %% summarise(n n(), MinLength mean(MinLength), MaxLength mean(MaxLength), MinBodyMass mean(MinBodyMass), MaxBodyMass mean(MaxBodyMass), MinWingspan mean(MinWingspan), MaxWingspan mean(MaxWingspan)) %% gather(key, value, - c(Category, n)) %% ggplot(aes(x Category, y value, group key, fill key)) geom_bar(stat identity) scale_fill_manual(values c(#D62728, #FF7F0E, #8C564B, #2CA02C, #1F77B4, #9467BD)) xlab(Category) ggtitle(Birds of Minnesota)流程拆解group_by(Category)按類別分組summarise()對六個數(shù)值列求均值并記錄組內(nèi)個體數(shù)ngather(key, value, - c(Category, n))把寬表轉(zhuǎn)成長表使六個指標可以作為同一個 x 軸類別下的多根柱geom_bar(stat identity)直接使用數(shù)值作為柱高scale_fill_manual()為六個指標指定一組明確的色板。coord_flip水平條形圖更易讀上述堆疊圖因未分組數(shù)據(jù)過多而難以閱讀講義隨即給出更實用的方案先統(tǒng)計每個類別下的鳥類數(shù)量再用coord_flip()轉(zhuǎn)成水平條形圖birds_count - dplyr::count(birds_filtered, Category, sort TRUE) birds_count$Category - factor(birds_count$Category, levels birds_count$Category) ggplot(birds_count, aes(Category, n)) geom_bar(stat identity) coord_flip()dplyr::count(birds_filtered, Category, sort TRUE)統(tǒng)計各類別數(shù)量并按降序排列隨后把Category列轉(zhuǎn)成與排序一致的因子factor保證 ggplot2 按排序后的順序繪制coord_flip()將坐標軸對調(diào)形成橫向條形圖。這幅圖可以一眼看出該地區(qū)數(shù)量最多的鳥類類別是 Ducks/Geese/Waterfowl——考慮到明尼蘇達州是萬湖之地這個結(jié)果并不意外。你也可以沿這一思路做其他計數(shù)統(tǒng)計例如按ConservationStatus、Order或Genus計數(shù)通常會有新的發(fā)現(xiàn)。比較與疊加兩兩對比的進階敘事講義比較數(shù)據(jù)一節(jié)展示了基于類別對最大體長進行排序比較的做法birds_grouped - birds_filtered %% group_by(Category) %% summarise( MaxLength max(MaxLength, na.rm TRUE), MinLength max(MinLength, na.rm TRUE) ) %% arrange(Category) ggplot(birds_grouped, aes(Category, MaxLength)) geom_bar(stat identity) coord_flip()結(jié)果符合直覺蜂鳥的最大體長最小而鵜鶘與鵝類最大。na.rm TRUE用于在聚合時忽略缺失值。更進一步還可以在同一張圖上疊加兩個geom_bar()層同時呈現(xiàn)某一類別的最小與最大體長ggplot(data birds_grouped, aes(x Category)) geom_bar(aes(y MaxLength), stat identity, position identity, fill blue) geom_bar(aes(y MinLength), stat identity, position identity, fill orange) coord_flip()position identity讓兩層柱從同一基線開始繪制、相互覆蓋從而直觀比較每個類別體長的上界與下界。這種同坐標軸多幾何層的手法正是作業(yè)中用三種圖表講一個完整故事所需要的進階技巧。作業(yè)示范圍繞雪雁構(gòu)建三段式敘事將以上技術(shù)串起來一份達標的作業(yè)可以按如下結(jié)構(gòu)組織數(shù)據(jù)來自 data/birds.csv 中的 Snow goose 記錄開場線圖/散點圖先繪制全數(shù)據(jù)集的翼展分布指出雪雁在整條曲線中的位置——其翼展區(qū)間 135–165 厘米處于中上水平同時借助異常值標注完成對數(shù)據(jù)集質(zhì)量的第一印象判斷引出為什么要過濾數(shù)據(jù)這一話題。展開散點圖過濾掉禿鷹與草原隼兩處錄入錯誤后聚焦鴨雁類Ducks/Geese/Waterfowl對比雪雁與同屬的雪雁Rosss goose翼展 113–116 厘米、白額雁Greater white-fronted goose130–165 厘米在體長與體重上的差異。收束條形圖用dplyr::count()按Category統(tǒng)計數(shù)量說明雪雁所屬類別在明尼蘇達州是數(shù)量最多的類群再疊加MaxLength與MinLength兩層條形圖展示鴨雁類在體長維度上的跨度。每一步都配上注釋例如# 發(fā)現(xiàn)雪雁記錄中翼展 135–165 cm 處于該類群中位區(qū)間并用文字串起因果就同時滿足了評分標準中的清晰注釋與扎實敘事兩項。評估標準自檢清單作業(yè)的評估標準見 assignment.md分為三檔檔次要求優(yōu)秀Exemplary腳本包含清晰注釋、有說服力的敘事、吸引人的圖表合格Adequate上述三項缺一項需改進Needs Improvement上述三項缺兩項對照此表提交前可以逐項自檢注釋每個代碼塊是否有#注釋說明意圖關(guān)鍵步驟裝包、分組、過濾、疊加是否解釋清楚敘事圖表之間是否有邏輯遞進發(fā)現(xiàn) → 過濾 → 比較 → 結(jié)論能否回答雪雁這個物種在數(shù)據(jù)集中有什么獨特之處美觀是否應(yīng)用了theme()、xlab()/ylab()、ggtitle()、scale_fill_manual()、coord_flip()等讓圖表更專業(yè)的修飾手段倉庫中還提供了 Python 版本的第 09 課參考答案 3-Data-Visualization/09-visualization-quantities/solution/notebook.ipynb其中用pandas與matplotlib完成了觀察翼展 → 名稱與翼展對應(yīng) → 標注異常值的同一分析路徑可作為對照參考注意該 notebook 為 Python 內(nèi)核與本文的 R/ggplot2 實現(xiàn)語言不同。延伸挑戰(zhàn)講義末尾的挑戰(zhàn)環(huán)節(jié)建議本數(shù)據(jù)集提供了特定生態(tài)系統(tǒng)內(nèi)多種鳥類的豐富信息可以繼續(xù)在網(wǎng)上尋找其他與鳥類相關(guān)的數(shù)據(jù)集圍繞新數(shù)據(jù)練習(xí)構(gòu)圖去發(fā)現(xiàn)此前未意識到的規(guī)律。R 生態(tài)中除了ggplot2還可以嘗試lattice與plotly等可視化包將同樣的數(shù)據(jù) → 美學(xué) → 幾何思維遷移到更多工具上——這正是本課乃至整個 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創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考