正解 A 兩行三個零件:先 df.corr(numeric_only=True) 算相關矩陣、再 sns.heatmap(corr, annot=True, vmin=-1, vmax=1)——numeric_only 避開字串欄、annot 印數字、色階錨滿 r 的值域 −1~1。本站 seaborn 0.13.2 實跑(200 天門市日報):氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868、手算 Pearson 一字不差。B 直接餵原始 df——當場 ValueError(字串欄)、全數值也只是原始值色塊;C「相關必為正」——25 格裡 12 格是負的,vmin=0 讓 −0.87 與 0 同色貼底;D 的 value_counts 是一維 Series——IndexError。口訣:先算再畫、負一到一——熱力圖只畫你給它的矩陣。
分析師想繪製數值特徵的相關係數熱力圖,下列何者正確?
import seaborn as sns # 統計繪圖庫 # df:數值特徵 + 可能混著的文字欄——四個選項四種畫法
先認清 sns.heatmap 的本性:它是一台無腦上色機——不懂統計、不會算相關,只會把你餵給它的每一格數字塗成顏色。所以整題其實在考「你餵它什麼」。正解的餵法分兩步:第一步「先算」——用 df.corr() 做出一張兩兩交情表(相關矩陣):+1 是形影不離的麻吉、−1 是你來我走的天敵、0 是互不相識的陌生人;第二步「再畫」——把交情表交給上色機,並把溫度計刻度錨在 −1 到 +1(交情的天生值域),紅到底就是滿分麻吉、藍到底就是滿分天敵。三個錯誤選項是三種餵錯:B 把整本 200 頁的流水帳直接塞進上色機(不是交情表——含文字頁還當場卡紙);C 堅信「人與人只有好感、沒有仇恨」,把溫度計下限設成 0——實跑 25 格裡 12 格的天敵關係集體隱形;D 塞了一張點名次數表(一維的 value_counts)——上色機連攤都攤不開。
點擊後出現漸進式說明:白話說明 → 說清楚一點 → 常見錯誤與考點。
點擊後出現漸進式說明。
五段,一段一段走完。右上角的「看位置」可以把這一段放回完整程式裡看。
import seaborn as sns # 統計繪圖庫(慣用縮寫 sns) # df:200 天門市日報——氣溫/冰飲/熱飲/降雨/來客 5 個數值欄+店型字串欄
seaborn 是 matplotlib 之上的統計繪圖庫(第 16 頁 barplot 的老朋友)——heatmap 是它的「矩陣上色機」。本頁的店:200 天日報、5 個數值欄(氣溫、冰飲、熱飲、降雨、來客)——外加一個店型字串欄,它就是 B 與 C 的地雷引信:相關只能算數值,字串混進來就爆。
corr = df.corr(numeric_only=True) # 先算:5×5 相關矩陣(只吃數值欄) print(corr.shape) # (5, 5)——對角線全 1、上下三角對稱
df.corr() 把每一對數值欄的 Pearson 相關係數算好、排成 5×5 矩陣:對角線全 1(自己跟自己完全相關)、上下三角對稱(氣溫↔冰飲=冰飲↔氣溫)。numeric_only=True 是 A 的隱藏加分:pandas 3 預設 numeric_only=False——含字串欄的 df 直接 df.corr() 當場 ValueError(C 的第一條死因、實跑訊息 could not convert string to float: '社區店');加上這個參數,字串欄被禮貌地繞過。
sns.heatmap(corr, annot=True, vmin=-1, vmax=1) # 再畫:色階錨滿值域、格上印數字
三個零件三個職責:corr——餵進去的是算好的矩陣(不是原始 df);annot=True——每格印出數值,讀圖不用猜色差;vmin=-1, vmax=1——把色階錨滿 r 的天生值域:不錨的話色階跟著資料浮動(本頁資料會變成 −0.89~1 的區間),同一個 0.5 在不同圖上顏色不同、跨圖不可比;錨滿了,顏色就是絕對語言。
# 實跑關鍵格:氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868、降雨↔來客 −0.7469 # A 的三個零件全對:numeric_only 避開字串欄、annot 印數字、vmin/vmax 錨 −1~1 ○
讀圖三句話:氣溫↔冰飲 +0.8956——天越熱冰飲越好賣(強正相關、熱力圖上深紅);氣溫↔熱飲 −0.8868——天越熱熱飲越慘(強負相關、深藍);氣溫↔降雨 +0.0786——幾乎無關(近白)。正與負一樣有價值:負相關是「反向連動」的商業訊號(雨天來客 −0.7469 → 雨天要不要推外送?)——這正是 C 把負相關滅掉之所以致命。
# 手算 Pearson(氣溫↔冰飲):Σ(x−x̄)(y−ȳ) / √Σ(x−x̄)²·√Σ(y−ȳ)² = 0.8956 一字不差 # 進階寫法:sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0) # 加碼:mask=np.triu(np.ones_like(corr, bool))——對稱矩陣遮上三角看一半就夠
黑盒子拆開:Pearson r=「共變」除以「各自變動」——手算 0.8956 與 pandas 一字不差。進階三旋鈕(面試加分):cmap='coolwarm'+center=0——紅正藍負、白色壓在 0 上,正負一眼分家;fmt='.2f' 控制 annot 位數;mask=np.triu(...) 遮掉上三角——對稱矩陣看一半就夠,版面清爽一倍。
5×5 的兩兩交情表攤開——關鍵格、手算對帳、結構三性質:
同一張相關矩陣、三種色階設定——正解、C 的隱形術、進階版對照開庭:
上色機只認矩陣——原始流水帳與點名次數表闖進來會怎樣(全實跑):
sns.heatmap(df) 含店型字串欄——當場 ValueError: could not convert string to float: '社區店';就算改餵全數值欄,畫出來是 200×5 的原始值色塊——色階 0.1~971 被來客(327~971)獨佔、氣溫(9.1~38)整欄擠在色階最底部幾乎同色——第 26 頁量級霸凌在視覺化重演,而且這張圖跟「相關」半點關係都沒有。D:df.value_counts() 回傳「各列組合出現次數」的一維 Series(實跑長度 200)——heatmap 需要 2D,當場 IndexError: Inconsistent shape between the condition and the input。熱力圖上一格深藍:冰飲↔熱飲 −0.7879——「賣冰飲搶了熱飲生意」?開庭:
r 的強弱判讀速查(經驗法則、本頁實跑格對號入座):
| |r| | 慣用讀法 | 本頁實跑對應 |
|---|---|---|
| 0.8 ~ 1.0 | 非常強 | 氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868 |
| 0.6 ~ 0.8 | 強 | 降雨↔來客 −0.7469、冰飲↔熱飲 −0.7879(假相關!) |
| 0.3 ~ 0.6 | 中等 | 本頁未出現 |
| 0 ~ 0.3 | 弱~無 | 氣溫↔降雨 +0.0786、偏相關後的 +0.0308 |
# 進階三旋鈕(面試加分版):紅正藍負、白壓在 0、上三角遮掉 sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0, mask=np.triu(np.ones_like(corr, bool))) # 對稱矩陣看一半就夠
先算再畫、三個零件各司其職:numeric_only 繞開字串欄(pandas 3 不加會爆)、annot 每格印數字、vmin/vmax 錨滿 r 的值域 −1~1(顏色成為絕對語言)。實跑:5×5 矩陣、關鍵格 +0.8956/−0.8868、手算 Pearson 一字不差。
heatmap 是無腦上色機、不會幫你算相關。實跑:含店型字串欄當場 ValueError: could not convert string to float: '社區店';就算全數值也只是 200×5 的原始值色塊——色階 0.1~971 被來客獨佔、與「相關」毫無關係。
雙重死因:① r 的值域是 −1~1——實跑 25 格裡 12 格為負;vmin=0 讓 −0.87 與 0.0 同色貼底(Normalize 實測)——最有價值的強負相關集體隱形、圖照畫不報錯。② df.corr() 不加 numeric_only、含字串欄在 pandas 3 先爆一顆 ValueError。
value_counts() 是「各列組合出現次數」的一維 Series(實跑長度 200)——與相關係數毫無關係、也不是矩陣。實跑 IndexError: Inconsistent shape between the condition and the input——上色機連攤都攤不開。
再看一次同一道題。這次你手上有一句口訣了:先算再畫、負一到一——熱力圖只畫你給它的矩陣。
corr = df.corr(numeric_only=True) # 先算:交情表 sns.heatmap(corr, annot=True, vmin=-1, vmax=1) # 再畫:錨滿 −1~1
八題,全部都是本題的延伸。答錯會直接告訴你錯在哪。
「相關分析與熱力圖」是中級科目二機率統計與資料分析的視覺化招牌考點,corr、heatmap、r 值判讀輪流出場。最常見的六種問法:① 給四段畫法選正確(本題——先算再畫+色階);② 問 r 的值域與正負意義(−1~1、負相關一樣有價值);③ 問 vmin/vmax 或 annot 的作用(色階錨定、印數字);④ 問直接餵原始 df 會怎樣(報錯或無意義色塊);⑤ 給 r 值問強弱判讀(速查表);⑥ 問「相關高是否代表因果」(不是——第三變數)。一句口訣:先算再畫、負一到一。
Pearson r 量的是兩個變數線性連動的方向與強度:r=Σ(x−x̄)(y−ȳ) ÷ √Σ(x−x̄)²·√Σ(y−ȳ)²。分子是「共變」——x 高於平均時 y 也高於平均,乘積為正、累加變大;分母是兩邊各自的變動量,把單位除掉——所以 r 無單位、天生落在 −1~+1(把氣溫從 °C 換成 °F、r 一個位數都不動)。實跑手算氣溫↔冰飲=0.8956,與 df.corr() 一字不差。三個地標:+1 完美同向直線、−1 完美反向直線、0 無線性關係。注意「線性」二字:U 形關係(例:氣溫 vs 用電——冷熱兩頭都開空調)的 r 可能接近 0——r 低不等於無關,先畫散點圖。
色階是熱力圖的「溫度計」——vmin/vmax 決定刻度兩端錨在哪。不設:seaborn 用資料的 min/max 當兩端——本頁會變成 −0.89~1.0:看似無害,但「深藍」的意義從此隨資料浮動——這張圖的深藍是 −0.89、下一張圖的深藍可能只是 −0.3,跨圖比較全毀。錨滿 −1~1:顏色變成絕對語言——任何一張相關熱力圖上,同一個顏色永遠代表同一個 r。錨錯(C 的 vmin=0):低於 vmin 的值被裁到底端——Normalize 實測 −0.87 與 0.0 同色,12 格負相關集體隱形。三種設定三種世界——這題考的其實是「你知不知道自己在畫什麼刻度」。
兩層死法(實跑)。語法層:df 含店型字串欄——heatmap 要把每格轉成數字上色,遇到 '社區店' 當場 ValueError: could not convert string to float。語意層:就算全是數值欄、跑得動——畫出來是 200 列 × 5 欄的「原始值」色塊:每列是一天的日報、顏色是當天數值大小——色階 0.1~971 被來客(327~971)整欄佔滿,氣溫(9.1~38)壓在最底部幾乎同色(第 26 頁量級霸凌的視覺化版)。重點:這張圖沒有任何一格是「相關係數」——heatmap 從頭到尾沒算過相關,它只是把你給的數字塗色。「先算再畫」的「先算」就是這麼來的。
兩支函式回答完全不同的問題。df.corr():兩兩數值欄的相關係數矩陣——方陣、對稱、對角線 1,天生就是 heatmap 的正餐。df.value_counts():整個 df 的「各列組合出現了幾次」——回傳一維 Series(本頁 200 列日報幾乎不重複、實跑長度 200 全是 1);它的主場是類別欄的分布盤點(第 3 頁的老朋友),跟「相關」毫無血緣。實跑下場:heatmap 需要二維矩陣、塞一維 Series 當場 IndexError: Inconsistent shape between the condition and the input。順帶考點:真想畫「兩個類別欄的次數熱力圖」——那是 pd.crosstab(df.店型, df.另一類別) 再 heatmap,跟 corr 是兩條路。
不能——這正是本頁內建的因果課。冰飲↔熱飲 r=−0.7879 是真的(數學上),但兩者其實都被第三變數「氣溫」牽著走:氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868——天一熱,冰飲自己漲、熱飲自己跌,兩者互相沒動過手。驗證(實跑):偏相關公式 r(冰飲,熱飲|氣溫)=(r₁₂ − r₁₃r₂₃)/√(1−r₁₃²)(1−r₂₃²)=+0.0308——把氣溫的影響扣掉,假相關完全蒸發。經典同款:冰淇淋銷量與溺水人數(都因夏天——本站相關與因果本尊頁)。判讀鐵則:熱力圖給「連動強度」、不給「誰造成誰」——要談因果得靠實驗設計(第 28 頁 A/B 測試的隨機分流正是為此而生)。
五個旋鈕一次盤點。annot=True:每格印出數值——讀圖不用猜色差(本題 A 的第二零件);fmt='.2f':annot 的位數格式——預設科學記號很醜、'.2f' 兩位小數剛好;cmap='coolwarm':紅暖藍冷的雙向色盤——相關矩陣的天作之合(單向色盤如 viridis 分不出正負);center=0:把色盤的「白」壓在 0 上——正負以白為界一眼分家(與 vmin/vmax 併用更穩);mask=np.triu(np.ones_like(corr, bool)):布林遮罩蓋掉上三角——對稱矩陣看一半就夠,版面清爽、annot 不打架。面試版一行:sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0, vmin=-1, vmax=1, mask=...)——考場寫 A 的版本就滿分,旋鈕是加分題。
四條線。「seaborn 二部曲」:第 16 頁 barplot(estimator 與分組長條、ax.patches 對帳)→ 本頁 heatmap(矩陣上色、色階錨定)——同庫兩圖語。「統計判讀左右手」:第 28 頁 t 檢定答「差異是不是運氣」(p)、本頁相關答「連動有多強」(r)——報表判讀的兩把尺;「相關不是因果」由 A/B 測試的隨機分流接手解決。「量級霸凌三連」:第 7 頁 wine、第 26 頁客戶分群、本頁 B′ 的原始值色塊——量級問題連視覺化都不放過。「不報錯的錯」:C 的 vmin=0——圖照畫、只是說謊;與第 27 頁「四選項零報錯」、第 28 頁 B/D 判讀錯同門,防身三招不變:驗值域、讀文件、對帳。