
Data Science For Beginners 可視化分布實戰用 Matplotlib 直方圖與 Seaborn 密度圖剖析鳥類數據分布【免費下載鏈接】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 課程「3-Data-Visualization」第 10 課可視化分布的完整技術指南圍繞明尼蘇達州鳥類數據集data/birds.csv展開。你將掌握一套可復用的分布分析工作流先借助散點圖建立總體直覺再用 Matplotlib 直方圖觀察數值分布并理解bins參數的粒度控制隨后用hist2d探查兩個變量的相關性最后引入 Seaborn 的kdeplot繪制平滑密度曲線與多維密度對比。讀完本文你可以獨立完成「數據加載 → 過濾 → 分布直方圖 → 密度圖」的完整分析鏈條并將這套方法遷移到任意數據集。數據準備加載明尼蘇達州鳥類數據集本課所有代碼均圍繞倉庫根目錄下的data/birds.csv展開。在動手之前先確認數據規模與結構該文件共 443 行1 行表頭 442 條鳥類記錄列名如下列名含義Name / ScientificName常用名 / 學名Category / Order / Family / Genus分類學層級類別、目、科、屬ConservationStatus保護狀態IUCN 縮寫見下文MinLength / MaxLength最小 / 最大體長MinBodyMass / MaxBodyMass最小 / 最大體重MinWingspan / MaxWingspan最小 / 最大翼展在課程配套的 notebook.ipynb 中位于3-Data-Visualization/10-visualization-distributions/目錄首先導入 Pandas 與 Matplotlib 并讀取數據import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()注意相對路徑../../data/birds.csv是從課程目錄3-Data-Visualization/10-visualization-distributions/出發向上兩級正好指向倉庫根目錄下的data/。若你直接使用倉庫根目錄作為工作目錄則應寫為pd.read_csv(data/birds.csv)。前 5 行示例輸出如下名稱學名類別目科屬保護狀態最小體長最大體長最小體重最大體重最小翼展最大翼展Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC475665210207694Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC455371210508593Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.36410661567113116Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165從表格可以看到這一數據集同時包含數值型字段長度、體重、翼展和文本型字段分類學信息、保護狀態為「數值分布」與「文本分組分布」兩種分析路徑都提供了素材。用散點圖建立分布直覺快速但不夠精確在上一課中我們已經通過散點圖發現過異常值。對于「分布」這一主題散點圖同樣是最快的入門觀察手段——它能把每條記錄直接投射到坐標系中直觀展示數據在某個軸上的組織方式。下面的代碼按鳥類的「目Order」繪制其最大體長的散點birds.plot(kindscatter, xMaxLength, yOrder, figsize(12,8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()從這張圖可以大致看出不同目之間體長的整體區間差異但它并不是展示「真實分布」的最優方式散點會把大量重疊的點擠在一起難以回答「大多數樣本落在哪個區間」「分布是集中還是分散」這類問題。這正是直方圖的用武之地。直方圖用 bins 控制分布觀察的粒度直方圖是觀察數值分布的標準工具。它把數值軸切分成若干等寬的區間bin用柱子的高低表示每個區間內的樣本數量——柱子的起伏就是分布的形狀。Matplotlib 中只需把kind設為histbirds[MaxBodyMass].plot(kind hist, bins 10, figsize (12,12)) plt.show()可以看到數據集中 400 多種鳥類里絕大多數個體的最大體重落在 2000 克以下直方圖呈現明顯的右偏長尾形態。這里的關鍵參數是bins它決定把數據切分成多少個區間bins 取值效果適用場景較小如 10柱子少、形狀粗糙但趨勢一目了然快速總覽較大如 30區間更細能看到更多局部細節深入分析過大區間過碎柱子起伏劇烈、噪聲明顯謹慎使用把bins提高到 30 再畫一次birds[MaxBodyMass].plot(kind hist, bins 30, figsize (12,12)) plt.show()這張圖呈現了更細粒度的分布細節但由于長尾的存在左側主峰依然被壓縮得很矮——數據仍然「偏向左」。數據過濾讓分布不再被長尾淹沒要得到更均衡的分布視圖可以先用布爾條件過濾數據只保留關注范圍內的樣本。課程給出的例子是只保留最大體重大于 1 且小于 60 的鳥類并展示 40 個區間filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kind hist, bins 40, figsize (12,12)) plt.show()過濾后生成的直方圖不再嚴重偏左分布形態清晰可辨。這一步同時演示了 Pandas 布爾索引在分析流程中的典型用法先圈定子集filteredBirds再對子集做可視化。后續的 2D 直方圖與密度圖都將復用這個filteredBirds數據框。? 動手練習嘗試更換過濾條件與數據字段例如用MaxWingspan或MinLength并觀察直方圖形狀的變化。若想去掉[MaxBodyMass]字段過濾、查看帶標簽的完整分布可以構造多字段的數據框后再繪圖。2D 直方圖用 hist2d 觀察兩個分布的收斂關系直方圖只能展示單個變量而hist2d可以把兩個變量的分布疊加到一張二維網格上每個格子的顏色亮度代表落在該格子內的樣本密度顏色越亮說明樣本越集中。課程用它對比MaxBodyMass與MaxLength的關系x filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)從結果可以看到這兩個變量沿一條預期的對角線方向呈現出明顯的相關趨勢并存在一個特別強的收斂點——即體重與體長同時落在中低區間的樣本高度集中。這正是「分布」視角下發現變量關聯的高效手段。文本數據的分布按保護狀態分組繪制直方圖直方圖默認面向數值數據。當你想觀察「文本類別下的數值分布」時需要先按類別切分數據再為每個類別分別繪制直方圖并疊加。本例關注的問題是不同保護狀態的鳥類其最小翼展MinWingspan分布如何首先理解數據集中保護狀態字段的取值它們來自 IUCN世界自然保護聯盟紅色名錄的分級體系縮寫含義CR極度瀕危Critically EndangeredEN瀕危EndangeredEX滅絕ExtinctLC無危Least ConcernNT近危Near ThreatenedVU易危Vulnerable用loc按保護狀態切分出六個子序列再用plt.hist疊加繪制通過alpha透明度、bins與自定義顏色區分不同分組x1 filteredBirds.loc[filteredBirds.ConservationStatusEX, MinWingspan] x2 filteredBirds.loc[filteredBirds.ConservationStatusCR, MinWingspan] x3 filteredBirds.loc[filteredBirds.ConservationStatusEN, MinWingspan] x4 filteredBirds.loc[filteredBirds.ConservationStatusNT, MinWingspan] x5 filteredBirds.loc[filteredBirds.ConservationStatusVU, MinWingspan] x6 filteredBirds.loc[filteredBirds.ConservationStatusLC, MinWingspan] kwargs dict(alpha0.5, bins20) plt.hist(x1, **kwargs, colorred, labelExtinct) plt.hist(x2, **kwargs, colororange, labelCritically Endangered) plt.hist(x3, **kwargs, coloryellow, labelEndangered) plt.hist(x4, **kwargs, colorgreen, labelNear Threatened) plt.hist(x5, **kwargs, colorblue, labelVulnerable) plt.hist(x6, **kwargs, colorgray, labelLeast Concern) plt.gca().set(titleConservation Status, ylabelMin Wingspan) plt.legend();觀察疊加后的直方圖可以發現最小翼展與保護狀態之間并沒有明顯的相關性——各狀態分組大致重疊未呈現「瀕危鳥翼展更小/更大」之類的系統性規律。這也提示我們不是每個分組變量都一定與數值變量存在關聯可視化恰恰是用來驗證而非預設這些關系的工具。? 動手練習把MinWingspan換成其他字段如MaxBodyMass、MaxLength或調整過濾條件繼續尋找可能存在相關性的組合。密度圖用 Seaborn 的 kdeplot 平滑分布曲線細心的讀者可能已經注意到直方圖是「階梯狀」的柱頂并不平滑。當你想得到一條連續、平滑的密度曲線時可以改用核密度估計KDE繪制密度圖。這一步需要引入新的繪圖庫 Seaborn。import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()從輸出可以看到密度曲線完整呼應了前面MinWingspan直方圖的形狀只是更平滑。Seaborn 官方文檔對 KDE 的評價值得牢記相比直方圖KDE 在同時繪制多個分布時更整潔、更易解讀但如果底層分布有界或不平滑它也可能引入失真而且與直方圖一樣表示質量嚴重依賴平滑參數的選取。換句話說離群值永遠是圖表的敵人。用 bw_adjust 調節平滑程度之前繪制的MaxBodyMass直方圖呈現明顯的鋸齒狀。用 KDE 重建這條曲線時默認的平滑參數已經能讓它變得順滑sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果你想要一條平滑但不至于過度抹平細節的曲線可以調整bw_adjust參數。該參數是一個縮放因子值越小帶寬越小曲線對局部細節越敏感更「毛糙」值越大帶寬越大曲線越平滑但細節越少。sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()當bw_adjust0.2時曲線明顯變得更「貼」數據、保留了更多局部起伏。實踐中應針對數據分布反復試驗該參數找到信息量與平滑度的平衡點。? 動手練習查閱kdeplot支持的其它參數如cut、clip、cumulative、multiple并逐一試驗效果。多維密度圖hue、fill 與 2D KDEKDE 的真正威力在于它可以用很少的代碼生成極具解釋力的多維可視化。下面這段代碼用data指定完整數據框用x指定數值字段用hue按鳥類的「目」分組著色并配合fill填充區域、common_norm是否對多條曲線共享歸一化、palette調色板、alpha透明度與linewidth描邊寬度美化輸出sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )參數作用說明hue按某列分組著色每個類別一條密度曲線fillTrue填充曲線下方區域便于比較面積與形狀common_normFalse每條曲線獨立歸一化避免樣本量差異造成曲線高低失真palette指定調色板如crest為連續漸變色系alpha.5設置透明度多條曲線疊加時避免互相遮擋linewidth0關閉描邊純填充風格KDE 還支持二維密度映射把兩個數值字段分別賦給x與y再用hue疊加第三個分類維度即可在平面上同時觀察「長度分布」與「保護狀態」的關系sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)這張圖把最小體長與最大體長的聯合密度按保護狀態分別著色。值得留意的是在倉庫的配套 solution/notebook.ipynb 中運行該單元格第 13 個代碼單元時 Seaborn 輸出了UserWarning: Dataset has 0 variance; skipping density estimate的提示——這是 KDE 面對零方差子組時的正常降級行為說明「易危Vulnerable」等分組的樣本可能在長度字段上取值過于集中。這本身就是一個值得進一步研究的問題按體長來看「易危」鳥類的聚集是否有統計意義樣本量是否足以支撐結論進階練習與作業動手挑戰直方圖比基礎散點圖、柱狀圖、折線圖更復雜。去網上搜集直方圖的優秀應用案例思考它們被用在哪些領域、回答了什么問題、又是如何設計區間與標注的。把這套「分布思維」遷移到自己的數據上是最快的進階路徑。課程作業assignment.md 要求你脫離鳥類數據集另選一個你感興趣的數據集例如來自公開數據競賽平臺的資源構建一個 Notebook 講述該數據集的故事并確保在講解過程中至少使用直方圖。評價標準如下優秀合格待改進Notebook 包含數據集來源與注釋并使用至少 5 張直方圖挖掘數據事實Notebook 注釋不完整或存在 BugNotebook 沒有注釋且包含 Bug運行環境與倉庫證據本課所有可執行代碼都沉淀在倉庫的以下位置可作為復現與深挖的依據數據文件data/birds.csv442 條鳥類記錄字段含長度、體重、翼展及分類學與保護狀態信息空白練習 Notebook3-Data-Visualization/10-visualization-distributions/notebook.ipynb完整參考答案3-Data-Visualization/10-visualization-distributions/solution/notebook.ipynb其中的輸出結果證實上述全部代碼在 Python 3.7 環境下可實際運行kdeplot輸出伴隨的 FutureWarning 與 UserWarning 均為舊版庫的兼容提示不影響結果課程圖例3-Data-Visualization/10-visualization-distributions/images/直方圖、密度圖、散點圖與 2D 圖共 17 張環境依賴運行本課代碼需要pandas、matplotlib與seaborn三個 Python 庫。若使用新版 Seaborn建議將sns.kdeplot(series)的傳參方式升級為sns.kdeplot(datadf, xcolumn)以消除棄用警告。分析順序上推薦始終遵循「散點總覽 → 直方圖定粒度 → 過濾聚焦 → 密度圖平滑」的遞進路徑這樣既能快速發現問題數據也能獲得最準確的分布結論。【免費下載鏈接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!項目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考