Vibe Coding × Python x Data Visualization

對象:Python初學者 | 樣本資料集:ig_2025.csv | 環境:Google Colab
Pie 圓餅圖
Bar 長條圖
Line 折線圖
Scatter 散佈圖
Histogram 直方圖
Boxplot 盒鬚圖
學習進度 0 / 9
TOPIC 0
環境設定:套件匯入與中文字型
讓 Colab 的 matplotlib 正常顯示中文,避免變成方塊字
🎯學習重點|這一步你會學到
  • 知道資料視覺化最常用的四個套件:pandasnumpymatplotlib.pyplotseaborn
  • 理解為什麼 Colab 預設不能顯示中文,以及 fontManager 的角色。
  • 學會設定 plt.rcParams['font.family'] 讓整份 notebook 共用同一個字型。
  • 建立「先環境、再資料、再視覺化」的工作流程。
要能回答|要能回答這些核心問題
  • pandas / matplotlib / seaborn 各自負責什麼角色?
  • 為什麼不能直接用系統字型?Colab 的環境與本機有何差別?
  • 若字型設定失敗,哪些圖形會出現「tofu 方塊」?
  • 下一次新開 notebook 時,要複製貼上哪幾行才能重建環境?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
我正在使用 Google Colab,請幫我寫一段 Python 環境初始化程式碼,包含:
1) 匯入 pandas、numpy、matplotlib.pyplot、seaborn,並用慣例別名。
2) 下載 ChocolateClassicalSans-Regular.ttf 到 /usr/share/fonts/truetype/chocolateclassicalsans/ 並註冊給 matplotlib.fontManager。
3) 將 plt.rcParams['font.family'] 設為該中文字型,確保後續圖表能顯示中文。
4) 在設定完成後印出「✅ 中文字型設定完成!」,若失敗印出錯誤訊息。
5) 最後用一張含有中文標題的測試圖(例如 plt.title("測試中文"))驗證是否成功。
請用註解標示每個 step,並說明為什麼要這樣做。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
已新建 Colab notebook,並確認右上角顯示「已連線」
環境
執行 !pip list | grep -E "pandas|matplotlib|seaborn" 確認套件存在
套件
貼上老師提供的中文字型設定 script,並成功看到 ✅
字型
畫一張 plt.title("測試中文") 的空白圖驗證顯示正常
驗證
把這段 cell 存成可重用的「環境初始化」片段
保存
💡提醒
Colab 每次「重新啟動執行階段」後字型會失效,記得每次開機先跑一次初始化 cell。若看到 Glyph XXXX missing from current font,表示字型沒被成功載入;這時先檢查 fm.fontManager.addfont(...) 是否執行過,再重新 plt.rcParams['font.family']=...

附:如果用提示詞生成的代碼無法成功安裝中文字型,請使用老師提供的標準初始化 script(請直接貼到第一個 cell))
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
# step1: 取得中文字型檔並設定字型管理員(fontManager),以利 Matplotlib 正常顯示圖表中的中文
!mkdir -p /usr/share/fonts/truetype/chocolateclassicalsans/
!wget -O /usr/share/fonts/truetype/chocolateclassicalsans/ChocolateClassicalSans-Regular.ttf "https://github.com/google/fonts/raw/main/ofl/chocolateclassicalsans/ChocolateClassicalSans-Regular.ttf"
try:
    my_font = '/usr/share/fonts/truetype/chocolateclassicalsans/ChocolateClassicalSans-Regular.ttf'
    fm.fontManager.addfont(my_font)  # Add my_font to the font manager
    font_prop = fm.FontProperties(fname=my_font)
    plt.rcParams['font.family'] = font_prop.get_name()
    print("✅ 中文字型設定完成!")
except Exception as e:
    print(f"🚨 中文字型設定失敗:{e}")
TOPIC 1
載入與探索 ig_2025.csv
先認識資料結構再談畫圖:欄位、型別、缺值、分布輪廓
🎯學習重點|這一步你會學到
  • 使用 pd.read_csv() 讀檔,並以 head()info()describe() 做初步健檢。
  • 分辨「類別型 (categorical)」與「數值型 (numerical)」欄位──這決定了後面要用哪種圖。
  • isna().sum()duplicated().sum() 找出資料清理的優先順位。
  • 為後續視覺化建立「欄位地圖」:哪些欄適合比例、哪些適合分布、哪些適合時序。
要能回答|要能回答這些核心問題
  • 這份資料有幾列幾欄?每一欄的 dtype 是什麼?
  • 哪些欄是類別、哪些是數值、哪些是日期/時間?
  • 哪些欄位可能有極端值 (outlier) 或缺值 (NaN)?
  • 如果我要回答「某類別占比」、「隨時間變化」或「分數分布」,我該用哪幾欄?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
我有一個名為 ig_2025.csv 的檔案(已上傳到 Colab)。請用 pandas 幫我完成以下初步探索,並在每一步印出結果:
1) 用 pd.read_csv('ig_2025.csv') 讀入並命名為 df。
2) 顯示 df.shape、df.head(5)、df.info()、df.describe(include='all')。
3) 列出每一欄的缺值數量 (isna().sum()) 以及重複列數 (duplicated().sum())。
4) 將欄位分成三類印出:類別型欄位、數值型欄位、日期型欄位(若有)。
5) 用一段文字說明:若我想做「比例分析 / 類別比較 / 時序趨勢 / 數值分布 / 異常值偵測 / 雙變數關聯」分別建議使用哪些欄位。
請加上繁體中文註解。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
ig_2025.csv 已上傳到 Colab 的 /content/ 目錄
檔案
能正確讀入 df 並印出 shape(幾列幾欄)
讀檔
列出每一欄的 dtype 並標註屬於類別 / 數值 / 日期
型別
找出 NaN 最多的前 3 欄並思考後續處理方式
清理
在筆記寫下「每種圖我會用哪一欄」的對照表
設計
💡提醒
Vibe coding 不是「AI 寫什麼就貼什麼」。 請先用 df.head() 親眼看資料,再決定要不要接受 AI 給你的欄位分類。尤其是被存成字串的日期欄(例:"2025-03-12"),要記得用 pd.to_datetime() 轉型,後面畫折線圖才會順。
TOPIC 2
Pie Chart 圓餅圖:呈現「占比」
適合:類別少(2–5 項)、總和有意義、比例差異明顯
🎯學習重點|這一步你會學到
  • value_counts() 統計類別欄位的出現頻率。
  • plt.pie() 繪製圓餅圖,設定 labelsautopctstartangle
  • 理解圓餅圖的「使用時機」與「常被濫用」的情境。
  • 何時該改用 donut chart 或 100% stacked bar 取代 pie。
要能回答|要能回答這些核心問題
  • 哪一欄是「類別」?它的唯一值有幾種?
  • 類別數 > 6 時,為什麼圓餅圖會失效?
  • 最大類別占多少百分比?是否足以支撐一個「主結論」?
  • 若類別之間不互斥(e.g. 一則貼文同時有多個 hashtag),還能用圓餅圖嗎?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
使用 df(來自 ig_2025.csv),請用 matplotlib 畫一張 Pie Chart 呈現「貼文類型 (post_type)」的占比。要求:
1) 先用 df['post_type'].value_counts() 取出數量並印出。
2) 若類別數超過 5 個,將小於 3% 的合併為「其他」。
3) 圖表標題為「2025 IG 貼文類型占比」,每一塊顯示百分比 (autopct='%1.1f%%')。
4) 使用柔和色盤(例如 seaborn 的 pastel)。
5) 在圖下方加一段繁體中文結論,指出最大占比的類別與比例。
請以繁體中文註解每個步驟,並提醒「何時不該用 pie chart」。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
選定一個類別欄位(例如 post_type / category)
選欄
類別數 ≤ 6(否則合併「其他」)
設計
圖上顯示百分比與中文標籤
可讀
寫下一句結論(例:短影音占 45% 為最大宗)
敘事
💡提醒
圓餅圖是最容易被濫用的圖。當類別超過 6 個、比例差距很小、或類別不互斥時,改用 bar chart 幾乎都更清楚。學術報告若要比較「兩年之間」的比例變化,請用 100% stacked bar,不要用兩個並排的 pie。
TOPIC 3
Bar Chart 長條圖:呈現「類別之間的比較」
適合:類別 vs 數值、排名、多組比較(grouped / stacked)
🎯學習重點|這一步你會學到
  • groupby() + mean()/sum()/count() 聚合,再用 plt.bar()sns.barplot() 繪圖。
  • 知道何時要排序(sort_values)以加強敘事。
  • 區分 Grouped bar(多類別並排)與 Stacked bar(組成拆解)。
  • 加上數值標籤 (ax.bar_label) 提升可讀性。
要能回答|要能回答這些核心問題
  • 要比較「誰比較多」還是「組成結構」?(前者用 grouped、後者用 stacked)
  • 類別軸放 X 還是 Y?(類別名稱長時用水平 bar 比較好看)
  • 要用 mean 還是 sum 聚合?兩者故事不同。
  • Y 軸是否需要從 0 開始?(bar 圖必須從 0 開始才不誤導)
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
用 df(來自 ig_2025.csv)畫一張 Bar Chart 比較「不同貼文類型 (post_type) 的平均按讚數 (likes)」。要求:
1) 用 groupby('post_type')['likes'].mean().sort_values(ascending=False) 取得結果。
2) 用 seaborn 的 barplot 繪圖,X 軸為類別、Y 軸為平均讚數。
3) 在每根柱子上加上數值標籤(保留整數)。
4) 標題「2025 各類貼文平均讚數比較」,Y 軸標籤「平均按讚數」。
5) 旋轉 X 軸文字 30 度避免重疊。
6) 加一段繁體中文結論:最受歡迎的貼文類型是哪一類,其平均讚數是第二名的幾倍。
請用繁體中文註解,並提醒「bar chart 的 Y 軸為何必須從 0 開始」。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
確定類別欄與數值欄
選欄
決定聚合函數:mean / sum / count
聚合
依數值由大至小排序以便閱讀
排序
Y 軸從 0 開始、加數值標籤
規範
💡提醒
若觀察對象有「平均」之外的變異,建議同時用 error bar 或直接改用下一步的 boxplot。bar chart 很容易隱藏「一個爆紅貼文把平均值拉高」的事實。
TOPIC 4
Line Chart 折線圖:呈現「時間趨勢」
適合:連續時間、趨勢走向、多序列比較
🎯學習重點|這一步你會學到
  • pd.to_datetime() 轉型並以 set_index('date').resample('W') 做週彙總。
  • plt.plot()sns.lineplot() 畫趨勢,處理多序列 (hue=)。
  • 理解「時間粒度 (daily / weekly / monthly)」對訊號與雜訊的影響。
  • 加上移動平均 (rolling mean) 平滑抖動。
要能回答|要能回答這些核心問題
  • 時間欄位是否已是 datetime 型別?
  • 資料區間是多久?粒度要日、週還是月?
  • 是否有明顯的季節性 (e.g. 假日) 或轉折點?
  • 若要比較多類型貼文,是畫多條線還是 small multiples?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
用 df(來自 ig_2025.csv)畫一張 Line Chart 呈現「2025 年每週貼文數量的趨勢」。要求:
1) 將 df['date'] 用 pd.to_datetime 轉為時間型別。
2) 以週為單位聚合:df.set_index('date').resample('W').size()。
3) 用 matplotlib 畫折線圖,加上標題「2025 每週貼文量趨勢」與 X/Y 軸中文標籤。
4) 疊加一條 4 週移動平均 (rolling(4).mean()) 作為趨勢線,並以虛線呈現。
5) 標出全年最高峰週與最低谷週(用 annotate 加文字箭頭)。
6) 最後用繁體中文解讀:整體趨勢、峰谷原因推測、對下半年內容策略的建議。
請加繁體中文註解。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
時間欄已轉為 datetime,無 NaT
型別
決定時間粒度(D / W / M)並對齊資料量
粒度
加上移動平均或趨勢線
平滑
為峰/谷加註解並寫一句結論
敘事
💡提醒
Line chart 只適合連續的數值(時間、溫度、累積值)。類別與類別之間不要用折線相連,否則會暗示它們「有順序」而誤導讀者。多於 5 條線時,改用 small multiples(每個子圖一條線)。
TOPIC 5
Scatter Plot 散佈圖:呈現「兩個數值之間的關係」
適合:相關性、群聚、異常點、以及第三變數分群(顏色 / 大小)
🎯學習重點|這一步你會學到
  • plt.scatter()sns.scatterplot() 畫出雙變數散佈點。
  • 使用 hue(顏色)與 size(點大小)把第三、第四個變數編進同一張圖。
  • sns.regplotlmplot 加上迴歸線,並解讀 df.corr() 的 Pearson 係數。
  • 辨識四種典型樣態:正相關、負相關、無相關、非線性(U 型 / 倒 U 型)。
  • 處理資料點過多導致的「overplotting」:用 alphahexbin、或抽樣解決。
要能回答|要能回答這些核心問題
  • 我要看的兩個變數是否都是「連續數值」?如果一端是類別,散佈圖是對的選擇嗎?
  • 相關性是線性的嗎?相關係數多少?0.3、0.6、0.9 分別代表什麼強度?
  • 我看到的關係是因果還是僅有相關?有沒有潛在的混淆變數?
  • 資料點是否集中成一團(overplotting)?需要 log 軸或改畫 hexbin 嗎?
  • 離群點(outlier)是故事還是雜訊?移除後相關性會變弱還是變強?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
用 df(來自 ig_2025.csv)畫一張 Scatter Plot 探討「按讚數 (likes) 與留言數 (comments) 的關聯」。要求:
1) 先用 df[['likes','comments']].corr() 計算 Pearson 相關係數並印出。
2) 用 seaborn 的 scatterplot 繪圖:X=likes、Y=comments;用 hue=post_type 以顏色區分類型,alpha=0.5 降低 overplotting。
3) 疊加一條全體資料的迴歸線(sns.regplot,scatter=False),並在標題旁邊註明 r 值。
4) 若 likes 右偏嚴重,請再產生一張同時對 X、Y 取 log 軸的版本作對照。
5) 用 annotate 標出 1–2 個明顯離群點(例如 likes 最高但 comments 極低者)。
6) 標題「按讚數 vs 留言數關聯(依貼文類型著色)」,加上中文軸標籤與圖例。
7) 最後用繁體中文總結:整體相關強度與方向、哪一類貼文表現最突出、是否有離群點值得進一步探討。
請以繁體中文註解每個步驟,並提醒「相關 ≠ 因果」。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
X、Y 兩個欄位都是連續數值(不是類別、不是 ID)
選欄
先算 corr(),對相關強度有數值依據
統計
使用 alpha 或抽樣處理 overplotting
可讀
嘗試加 hue 第三變數,看是否有子群
分群
若右偏嚴重,改 log-log 軸比較
尺度
寫下「r 值 + 一句故事」作為結論
敘事
💡提醒
相關不等於因果。 散佈圖顯示的 r 值再高,也不代表一個變數造成另一個變數;背後可能藏著第三個混淆變數(例如「發文時段」同時影響 likes 與 comments)。此外,Pearson r 只衡量「線性關係」──若點呈 U 型或 J 型,r 可能接近 0 但關係其實很強,這時請用 Spearman 秩相關或直接看圖。點太多時 (>5,000) 改用 sns.kdeplot 密度圖或 plt.hexbin() 會比硬畫 scatter 清楚得多。
TOPIC 6
Histogram 直方圖:呈現「單一數值的分布」
適合:觀察偏態、集中趨勢、是否常態、是否雙峰
🎯學習重點|這一步你會學到
  • plt.hist()sns.histplot(),並調整 bins
  • 加上 KDE 平滑曲線理解機率密度。
  • 判讀偏態(right-skewed / left-skewed)、雙峰 (bimodal)、離群值。
  • 必要時對極端右偏資料取 np.log1p() 再畫。
要能回答|這些核心問題
  • bins 太多 / 太少分別會看到什麼?
  • 資料是右偏還是對稱?平均數和中位數哪個比較具代表性?
  • 是否出現雙峰?背後是否有子群體?
  • 對數變換後,分布形狀會改變我的解讀嗎?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
用 df(來自 ig_2025.csv)畫 Histogram 呈現「每則貼文按讚數 (likes) 的分布」。要求:
1) 先用 df['likes'].describe() 印出基本統計。
2) 用 seaborn 的 histplot 繪圖,bins=30,並疊加 KDE 曲線。
3) 用紅色虛線標出平均數、用綠色虛線標出中位數。
4) 若資料右偏明顯,再多畫一張「log1p(likes)」的直方圖並列比較。
5) 標題「2025 IG 貼文按讚數分布」。
6) 最後用繁體中文描述:偏態方向、是否有極端值、平均數與中位數哪個比較能代表典型貼文。
請加繁體中文註解。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
選好一個連續數值欄位(likes、comments、reach...)
選欄
嘗試 bins = 10 / 30 / 60 比較形狀
調參
同時標出平均數與中位數
統計
若右偏明顯,畫 log 版本對照
變換
💡提醒
直方圖對 bins 數量非常敏感,不同 bins 會說出不同故事。實務上建議至少畫 2 個版本對照,再決定最能呈現真相的版本放進簡報。
TOPIC 7
Boxplot 盒鬚圖:分組比較「分布與離群值」
適合:比較多組數值的中位數、IQR、離群程度
🎯學習重點|這一步你會學到
  • 讀懂五數摘要:Min、Q1、Median、Q3、Max,以及 IQR 與鬚 (whisker) 的定義。
  • sns.boxplot(x=類別, y=數值) 快速做分組比較。
  • 搭配 sns.stripplot / swarmplot 顯示原始點,避免被盒鬚圖過度抽象化。
  • 比較 boxplot 與 violin plot 的差異。
要能回答|要能回答這些核心問題
  • 哪一組的中位數最高?IQR 最大(變異最劇烈)?
  • 離群值是集中在某一組嗎?它們是 bug 還是現象?
  • boxplot 能不能看出「雙峰分布」?若不行,該補什麼圖?
  • 樣本數很不平均時,boxplot 的比較公平嗎?
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
用 df(來自 ig_2025.csv)畫一張 Boxplot,比較「不同貼文類型 (post_type) 的按讚數 (likes) 分布」。要求:
1) 用 seaborn 的 boxplot,X 軸為 post_type,Y 軸為 likes。
2) 疊上半透明的 stripplot,alpha=0.3,讓原始點可見。
3) 若 likes 右偏嚴重,將 Y 軸改為 log scale (plt.yscale('log'))。
4) 在圖中用文字標註每一組的樣本數 n=...。
5) 標題「各類貼文按讚數分布比較」。
6) 請用繁體中文總結:哪一類中位數最高?哪一類變異最大?離群值是否集中?
請加繁體中文註解,並於結尾比較 boxplot 與 violin plot 的差異。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
類別欄與數值欄都已確認無 NaN
資料
類別群組 ≥ 2 組才做 boxplot
設計
若右偏嚴重,考慮 log scale
尺度
在每組下方標註 n 以揭示樣本差異
誠實
💡提醒
Boxplot 看不出雙峰(它只呈現分位數)。若你懷疑資料有多個子群體,請並用 violin plot 或 swarmplot。分組樣本數差異大時(例 A=500、B=15),boxplot 容易讓小組看起來「更極端」,記得揭露 n。
TOPIC 8
圖形選擇總整理:何時用哪一種?
把「資料型態 × 問題類型」對照到正確的圖
🎯學習重點|這一步你會學到
  • 建立「問題 → 圖型」的決策路徑,而不是「套件會什麼就畫什麼」。
  • 分辨 part-to-whole、比較、趨勢、分布、異常值、關聯性六種問題類型。
  • 養成「先寫一句結論,再選圖」的表達習慣。
  • 把六張圖組合成一份小型 EDA 報告。
圖形回答的問題最佳情境要避免的陷阱
Pie占比(part-to-whole)類別 ≤ 5、差異大類別多、不互斥、想比較兩時期
Bar類別比較排名、分組統計Y 軸不從 0、類別過多未排序
Line時間趨勢連續時間、多序列把類別連成線、粒度太細
Histogram單一數值分布看偏態、雙峰bins 沒試過、不處理極端值
Boxplot分組分布 + 離群多組比較、找異常忽略雙峰、樣本差異大
Scatter雙變數關聯(相關性)兩個連續數值、找群聚/離群誤把相關當因果、overplotting、非線性時硬用 r
要能回答|要能回答這些核心問題
  • 若同學只給我一欄資料,我能否 60 秒內說出:該畫什麼圖、該問什麼問題?
  • 一份報告同時出現 pie + bar + line + hist + box + scatter 時,敘事主軸是否一致?
  • 哪些圖可以互相「交叉驗證」同一個結論?(例:boxplot 與 histogram、scatter 與 corr 表)
Vibe Coding Prompt|丟給 AI 的指令
COPY → PASTE TO AI
請幫我把前面六張圖(pie、bar、line、histogram、boxplot、scatter)整理成一份「2025 IG 資料 EDA 小報告」。要求:
1) 用 matplotlib 的 subplots(3,3) 將六張圖配置在同一張 figure,剩餘格子放文字結論。
2) 每張子圖都有中文標題與軸標籤,整體使用一致的色盤。
3) 在空白格用 ax.text() 寫出 6 條重點結論(每條一句、對應一張圖)。
4) 最後輸出為 'ig_2025_eda.png',解析度 150 dpi。
5) 在 notebook 印出完整的敘事段落(繁體中文,約 150-200 字),作為研究所報告的摘要。
請加繁體中文註解,並提醒整體色彩一致性與視覺層級。
To-Do 檢查清單|重點項目是否都完成
請按順序完成以下檢查
六張圖各自能獨立站得住腳
品質
色盤一致、字型一致、字級一致
一致性
每張圖都有一句中文結論
敘事
輸出 PNG 並嵌入簡報或報告
交付
💡提醒
Vibe coding 的核心:先想故事、再想圖、最後才寫 code。 AI 能幫你快速出圖,但決定「要回答什麼問題、要強調什麼重點」是你的工作。每交出一張圖前,請先問自己:這張圖讓讀者在 5 秒內能看到什麼結論?