🗺️ AI 學習與考證地圖
中級科目二程式實戰 · 相關與熱力圖

熱力圖的鐵律:
先算再畫、負一到一

正解 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。口訣:先算再畫、負一到一——熱力圖只畫你給它的矩陣

閱讀模式

00題目

分析師想繪製數值特徵的相關係數熱力圖,下列何者正確?

import seaborn as sns   # 統計繪圖庫
# df:數值特徵 + 可能混著的文字欄——四個選項四種畫法

先說:無腦上色機與兩兩交情表

先認清 sns.heatmap 的本性:它是一台無腦上色機——不懂統計、不會算相關,只會把你餵給它的每一格數字塗成顏色。所以整題其實在考「你餵它什麼」。正解的餵法分兩步:第一步「先算」——用 df.corr() 做出一張兩兩交情表(相關矩陣):+1 是形影不離的麻吉、−1 是你來我走的天敵、0 是互不相識的陌生人;第二步「再畫」——把交情表交給上色機,並把溫度計刻度錨在 −1 到 +1(交情的天生值域),紅到底就是滿分麻吉、藍到底就是滿分天敵。三個錯誤選項是三種餵錯:B 把整本 200 頁的流水帳直接塞進上色機(不是交情表——含文字頁還當場卡紙);C 堅信「人與人只有好感、沒有仇恨」,把溫度計下限設成 0——實跑 25 格裡 12 格的天敵關係集體隱形D 塞了一張點名次數表(一維的 value_counts)——上色機連攤都攤不開。

三個先立好的事實(全部實跑): 熱力圖不會幫你算相關——餵原始 df 含字串欄當場 ValueError: could not convert string to float: '社區店' r 的值域是 −1 ~ +1——本頁實跑 25 格裡 12 格為負;vmin=0 時 Normalize 實測 −0.87 與 0.0 映到同一個顏色 手算 Pearson(氣溫↔冰飲)=0.8956,與 pandas 一字不差——相關係數不是黑魔法,是一條除法。

先點開看:熱力圖是什麼相關係數 rvmin/vmax 色階錨

不熟相關與熱力圖?你需要先認識下列名詞

點擊後出現漸進式說明:白話說明 → 說清楚一點 → 常見錯誤與考點。

相關本體
相關係數 rr 的值域 −1~1Pearson 的公式Spearman 備胎
矩陣與圖
相關矩陣熱力圖是什麼對角線全 1對稱矩陣看一半
色階三寶
annot 印數字vmin/vmax 色階錨貼底:超出色階的下場center=0 與 coolwarm上三角遮罩
判讀防身
相關不是因果第三變數偏相關r 強弱速查量級霸凌重演

不熟 Python?你需要先認識下列名詞

點擊後出現漸進式說明

起手式
import seaborn as snsdf.corr 的簽名numeric_only=Trueheatmap 吃什麼
讀錯誤
value_counts 是什麼一維與二維讀 could not convert讀 Inconsistent shape
進階旋鈕
fmt='.2f'cmap 色盤np.triu 與 ones_likecorr.loc 讀一格

01逐行拆解:兩行三個零件

五段,一段一段走完。右上角的「看位置」可以把這一段放回完整程式裡看。

第 1 段工具與資料:上色機進場、日報攤開
import seaborn as sns   # 統計繪圖庫(慣用縮寫 sns)
# df:200 天門市日報——氣溫/冰飲/熱飲/降雨/來客 5 個數值欄+店型字串欄

seaborn 是 matplotlib 之上的統計繪圖庫(第 16 頁 barplot 的老朋友)——heatmap 是它的「矩陣上色機」。本頁的店:200 天日報、5 個數值欄(氣溫、冰飲、熱飲、降雨、來客)——外加一個店型字串欄,它就是 B 與 C 的地雷引信:相關只能算數值,字串混進來就爆。

相關名詞:import seaborn as sns熱力圖是什麼

第 2 段先算:df.corr(numeric_only=True) 造出交情表
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: '社區店');加上這個參數,字串欄被禮貌地繞過。

相關名詞:df.corr 的簽名numeric_only=True相關矩陣

第 3 段再畫:heatmap 三個旋鈕各司其職
sns.heatmap(corr, annot=True, vmin=-1, vmax=1)   # 再畫:色階錨滿值域、格上印數字

三個零件三個職責:corr——餵進去的是算好的矩陣(不是原始 df);annot=True——每格印出數值,讀圖不用猜色差;vmin=-1, vmax=1——把色階錨滿 r 的天生值域:不錨的話色階跟著資料浮動(本頁資料會變成 −0.89~1 的區間),同一個 0.5 在不同圖上顏色不同、跨圖不可比;錨滿了,顏色就是絕對語言

相關名詞:heatmap 吃什麼annot 印數字vmin/vmax 色階錨

第 4 段讀圖:三格關鍵相關的判讀
# 實跑關鍵格:氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868、降雨↔來客 −0.7469
# A 的三個零件全對:numeric_only 避開字串欄、annot 印數字、vmin/vmax 錨 −1~1 ○

讀圖三句話:氣溫↔冰飲 +0.8956——天越熱冰飲越好賣(強正相關、熱力圖上深紅);氣溫↔熱飲 −0.8868——天越熱熱飲越慘(強負相關、深藍);氣溫↔降雨 +0.0786——幾乎無關(近白)。正與負一樣有價值:負相關是「反向連動」的商業訊號(雨天來客 −0.7469 → 雨天要不要推外送?)——這正是 C 把負相關滅掉之所以致命。

相關名詞:r 強弱速查corr.loc 讀一格r 的值域 −1~1

第 5 段驗貨與進階:手算 Pearson、coolwarm、上三角遮罩
# 手算 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(...) 遮掉上三角——對稱矩陣看一半就夠,版面清爽一倍。

一句話記住本題:先算再畫、負一到一——熱力圖只畫你給它的矩陣。A 的每個零件都在做這件事;B 沒算、C 錨錯、D 餵錯。

相關名詞:Pearson 的公式center=0 與 coolwarm上三角遮罩

02相關矩陣解剖室:交情表長什麼樣

5×5 的兩兩交情表攤開——關鍵格、手算對帳、結構三性質:

互動實驗室:相關矩陣解剖室+0.8956/−0.8868 · 手算一字不差 · 對角線全 1
本站實跑判決:corr 是 5×5、對角線全 1(allclose 驗證)、上下三角完全對稱。三格關鍵:氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868、降雨↔來客 −0.7469——25 格裡 12 格是負的(C 的「相關必為正」當場陣亡)。手算 Pearson:r=Σ(x−x̄)(y−ȳ) ÷ √Σ(x−x̄)²·√Σ(y−ȳ)²=0.8956——與 pandas 一字不差(np.isclose=True)。

相關名詞:相關矩陣Pearson 的公式對角線全 1

03色階法庭:vmin/vmax 錨在哪裡差多少

同一張相關矩陣、三種色階設定——正解、C 的隱形術、進階版對照開庭:

互動實驗室:色階法庭−1~1 正解 · vmin=0 讓 12 格負相關貼底 · center=0 加分
vmin=0 的隱形術(實跑):matplotlib 的色階把低於 vmin 的值全部裁到底端——Normalize(vmin=0, vmax=1) 實測:−0.87 與 0.0 映到同一個顏色(both → 0.0)。本頁 25 格裡 12 格為負——vmin=0 之下這 12 格集體貼底、彼此不分:強負相關(氣溫↔熱飲 −0.8868、商業上最有行動價值的訊號之一)與「毫無關係」看起來一模一樣。色階錨錯不報錯——圖照畫、只是說謊:「不報錯的錯」家族的視覺化分部。

相關名詞:vmin/vmax 色階錨貼底:超出色階的下場center=0 與 coolwarm

04誤闖現場:B 與 D 餵錯東西的下場

上色機只認矩陣——原始流水帳與點名次數表闖進來會怎樣(全實跑):

互動實驗室:誤闖現場B 含字串欄 ValueError · 全數值=量級霸凌色塊 · D 一維 IndexError
本站實跑判決:Bsns.heatmap(df) 含店型字串欄——當場 ValueError: could not convert string to float: '社區店';就算改餵全數值欄,畫出來是 200×5 的原始值色塊——色階 0.1~971 被來客(327~971)獨佔、氣溫(9.1~38)整欄擠在色階最底部幾乎同色——第 26 頁量級霸凌在視覺化重演,而且這張圖跟「相關」半點關係都沒有Ddf.value_counts() 回傳「各列組合出現次數」的一維 Series(實跑長度 200)——heatmap 需要 2D,當場 IndexError: Inconsistent shape between the condition and the input

相關名詞:讀 could not convert量級霸凌重演value_counts 是什麼讀 Inconsistent shape

05相關不是因果法庭:冰飲害了熱飲?

熱力圖上一格深藍:冰飲↔熱飲 −0.7879——「賣冰飲搶了熱飲生意」?開庭:

互動實驗室:相關不是因果法庭−0.7879 的假相關 · 第三變數氣溫 · 偏相關只剩 +0.0308
本頁內建的因果課(實跑):冰飲↔熱飲 r=−0.7879——看起來像「冰飲賣得好、熱飲就滯銷」的互搶劇本。但兩者其實都被第三變數「氣溫」牽著走(氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868);用偏相關公式把氣溫的影響扣掉:r(冰飲, 熱飲|氣溫)=+0.0308——假相關完全消失。判讀鐵則:熱力圖給的是「連動的強度」,不是「誰造成誰」——冰淇淋銷量與溺水人數的老故事(本站相關與因果本尊頁),在你家門市的日報裡天天上演。

相關名詞:相關不是因果第三變數偏相關

06考場加碼:r 強弱速查與進階三旋鈕

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)))   # 對稱矩陣看一半就夠
經驗法則的但書(考場慎用):強弱門檻是領域相依的行話——行銷資料 0.6 已經很強、物理實驗 0.9 可能才及格;判讀永遠搭配樣本數與顯著性(上一頁的 p 值就是搭檔:r 是「連動多強」、p 是「這連動是不是抽樣運氣」)。另外 Pearson 只抓線性關係——U 形關係的 r 可能接近 0(怕這個就換 Spearman 或先畫散點圖)。
串起系列:「seaborn 二部曲」:第 16 頁 barplot(分組長條與 estimator)→ 本頁 heatmap(矩陣上色與色階)——同一個庫、兩種圖語。「量級霸凌三連」:第 7 頁分群、第 26 頁 K-means、本頁 B′ 的原始值色塊——量級問題連視覺化都不放過。「統計判讀線」:第 28 頁 t 檢定(p 是不是運氣)+本頁相關(r 連動多強)=報表判讀的左右手;「相關不是因果」與本站相關與因果本尊頁(冰淇淋與溺水)互為表裡。「不報錯的錯」:C 的 vmin=0 圖照畫、只是說謊——家族視覺化分部開張。

相關名詞:r 強弱速查Spearman 備胎fmt='.2f'

07四個選項收工

Acorr = df.corr(numeric_only=True);sns.heatmap(corr, annot=True, vmin=-1, vmax=1)正確

先算再畫、三個零件各司其職:numeric_only 繞開字串欄(pandas 3 不加會爆)、annot 每格印數字、vmin/vmax 錨滿 r 的值域 −1~1(顏色成為絕對語言)。實跑:5×5 矩陣、關鍵格 +0.8956/−0.8868、手算 Pearson 一字不差。

Bsns.heatmap(df)——直接把原始 DataFrame 傳入即可餵錯東西

heatmap 是無腦上色機、不會幫你算相關。實跑:含店型字串欄當場 ValueError: could not convert string to float: '社區店';就算全數值也只是 200×5 的原始值色塊——色階 0.1~971 被來客獨佔、與「相關」毫無關係。

Ccorr = df.corr();sns.heatmap(corr, vmin=0, vmax=1)——相關係數必為正值負相關隱形術

雙重死因: r 的值域是 −1~1——實跑 25 格裡 12 格為負;vmin=0 讓 −0.87 與 0.0 同色貼底(Normalize 實測)——最有價值的強負相關集體隱形、圖照畫不報錯。 df.corr() 不加 numeric_only、含字串欄在 pandas 3 先爆一顆 ValueError

Dcorr = df.value_counts();sns.heatmap(corr)張冠李戴

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

08自我檢測

八題,全部都是本題的延伸。答錯會直接告訴你錯在哪。

09重點整理

  1. 熱力圖=無腦上色機:不懂統計、只把你餵的每一格數字塗顏色——所以正解是兩步:先 df.corr() 做「兩兩交情表」、再 heatmap 上色。
  2. 正解 A 三零件(實跑):numeric_only=True 繞開字串欄;annot=True 每格印數字;vmin=-1, vmax=1 把色階錨滿 r 的值域——顏色成為跨圖可比的絕對語言。
  3. 本頁矩陣(實跑):5×5、對角線全 1、上下對稱;氣溫↔冰飲 +0.8956、氣溫↔熱飲 −0.8868、降雨↔來客 −0.7469、氣溫↔降雨 +0.0786。
  4. 手算對帳(實跑):Pearson r=Σ(x−x̄)(y−ȳ) ÷ √Σ(x−x̄)²·√Σ(y−ȳ)²=0.8956——與 pandas 一字不差。
  5. B 的死因(實跑):heatmap(df) 含字串欄當場 ValueError: could not convert string to float: '社區店';全數值版畫的是 200×5 原始值——色階 0.1~971 被來客獨佔(量級霸凌)、與相關無關。
  6. C 的死因(實跑):r 值域 −1~1、25 格裡 12 格為負;vmin=0 時 Normalize 實測 −0.87 與 0.0 同色——強負相關集體隱形、圖照畫不報錯;且 df.corr() 不加 numeric_only 在 pandas 3 先爆 ValueError。
  7. D 的死因(實跑):value_counts() 是各列組合出現次數的一維 Series(長度 200)——heatmap 需要 2D,當場 IndexError: Inconsistent shape
  8. 相關不是因果(實跑):冰飲↔熱飲 −0.7879 看似互搶——控制第三變數氣溫後偏相關只剩 +0.0308,假相關消失;熱力圖給連動強度、不給因果方向。
  9. r 強弱速查:|r| 0.8+ 非常強、0.6~0.8 強、0.3~0.6 中等、0.3 以下弱——門檻是領域行話,判讀搭配樣本數與 p 值(第 28 頁的搭檔)。
  10. Pearson 的但書:只抓線性關係——U 形關係 r 可能接近 0;名次型/非線性單調改用 Spearman,動手前先畫散點圖。
  11. 進階三旋鈕:cmap='coolwarm'+center=0(紅正藍負、白壓在 0)、fmt='.2f'、mask=np.triu(...)(對稱矩陣看一半)——面試加分版。
  12. 考場口訣先算再畫、負一到一——熱力圖只畫你給它的矩陣
完整程式碼