Python
數據科學初探:用 pandas、matplotlib、scikit-learn 讀懂 AI 寫的分析程式
數據科學初探:用 pandas、matplotlib、scikit-learn 讀懂 AI 寫的分析程式
九成的 AI Vibe Coding 案子都是從「幫我分析這份資料」開始的。pandas、matplotlib、scikit-learn 是這類任務背後最常出現的三個套件,AI 會很樂意幫你把程式寫出來,但你要能讀懂它在做什麼,才有辦法指揮 AI 修改、擴充,甚至在它犯錯的時候抓出來。
這篇文章會依序帶你看過三個套件各自負責什麼、資料清洗為什麼是你的責任而不是 AI 的,最後用三道遞進題(讀懂、改寫、抓錯)練習你剛學到的東西,其中「抓錯」那一題專門練習數據科學裡最難發現的問題:程式能跑、圖表能畫、模型能訓練,但結果是假的。
你將學到什麼
pandas 資料整理
讀取、篩選、分組統計,把 CSV 變成能分析的表格。
資料清洗
缺失值、重複列、型別錯誤,AI 拿到髒資料只會給出錯誤的結論。
matplotlib 視覺化
長條圖、折線圖、直方圖,三種最常用的圖表怎麼畫。
scikit-learn 入門機器學習
幾行程式碼訓練一個預測模型,讀懂 fit、predict、score。
抓出資料洩漏與過擬合
程式能跑、圖表能畫、模型能訓練,但結果可能是假的。
為什麼 Vibe Coder 需要懂數據科學基礎
- 資料分析是最常見的 AI 專案:九成的 AI Vibe Coding 案子都從「幫我分析這份資料」開始,你要能讀懂 pandas 的基本操作。
- 視覺化讓分析有說服力:matplotlib 把數字變成圖表,讓非技術背景的人也能理解分析結果。
- scikit-learn 讓機器學習不再神秘:用幾行程式碼訓練一個預測模型,你不需要懂數學,但要能讀懂 AI 給的 sklearn 程式。
- 讀懂完整的數據分析專案:學完這篇,你就有能力讀懂完整的 AI 數據分析專案,並精準指揮 AI 修改和擴充。
pandas:讀資料、清洗、篩選、統計,資料整理師。
matplotlib:折線圖、長條圖、散佈圖,視覺化說故事者。
scikit-learn:訓練模型、評估、預測,機器學習入門。
10-1 pandas:資料整理的瑞士刀
pandas 是數據分析的標準工具(pip install pandas)。核心資料結構是 DataFrame,你可以把它想成「Python 裡的 Excel 工作表」。
import pandas as pd
# 讀取 CSV
df = pd.read_csv("scores.csv", encoding="utf-8")
# 查看資料
df.head(5) # 前五行
df.shape # (行數,欄位數)
df.dtypes # 每欄的資料型別
df.describe() # 統計摘要(mean、std、min、max)
# 篩選
passed = df[df["score"] >= 60]
alice = df[df["name"] == "Alice"]
# 選取欄位
names = df["name"] # 單欄(Series)
subset = df[["name", "score"]] # 多欄(DataFrame)
# 排序
df_sorted = df.sort_values("score", ascending=False)
# 分組統計
df.groupby("class")["score"].mean() # 各班平均分
# 新增計算欄位(用英文代碼避免中文字面值,正式專案常見做法)
df["grade"] = df["score"].apply(
lambda x: "A" if x >= 90 else ("B" if x >= 60 else "C")
) # 90 分以上為 A;60 到 89 分為 B;其餘為 C
資料清洗:分析前的必要步驟
真實資料幾乎都有缺失值、重複列、型別錯誤。AI 拿到髒資料會給出錯誤的分析,清洗是你的責任,不是 AI 的。
# 查看缺失值
df.isnull().sum() # 每欄的缺失數量
# 處理缺失值
df.dropna() # 刪除含缺失值的列
df.fillna(0) # 填入預設值
df["score"].fillna(df["score"].mean()) # 填入平均值
# 處理重複列
df.duplicated().sum() # 重複列數量
df.drop_duplicates() # 刪除重複列
# 型別轉換
df["score"] = df["score"].astype(int)
df["date"] = pd.to_datetime(df["date"])
df["name"] = df["name"].str.strip() # 去空白
# 輸出
df.to_csv("cleaned.csv", index=False, encoding="utf-8")
df.to_json("report.json", force_ascii=False, indent=2)
「請對這個 DataFrame 進行清洗:①列出每欄的缺失值數量和建議處理方式;②刪除重複列;③確認每欄型別正確;④去除字串欄位前後空白;⑤輸出清洗報告(清洗前後各欄的 unique 數量)。」
10-2 matplotlib:把資料畫成圖
matplotlib 是 Python 最基礎的視覺化套件(pip install matplotlib),AI 產出的數據分析程式幾乎都用它。
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'Arial Unicode MS' # 中文字型
scores = [75, 82, 91, 68, 95, 77]
names = ["Alice", "Bob", "Carol", "Dave", "Eve", "Frank"]
# 長條圖
plt.figure(figsize=(8, 4))
plt.bar(names, scores, color="steelblue")
plt.title(" 學生成績分佈"); plt.ylabel(" 分數")
plt.savefig("bar.png", dpi=150, bbox_inches="tight")
plt.close()
# 折線圖
months = ["1月", "2月", "3月"]
sales = [100, 130, 115]
plt.plot(months, sales, marker="o", color="tomato")
plt.title(" 月銷售量"); plt.savefig("line.png", dpi=150)
plt.close()
# 直方圖(分佈)
plt.hist(scores, bins=5, color="mediumseagreen")
plt.title(" 成績分佈直方圖"); plt.savefig("hist.png", dpi=150)
plt.close()
看到 AI 產出 matplotlib 程式,確認三件事:①有 plt.close()(不關閉會造成記憶體洩漏);②有設中文字型(否則中文顯示為方框);③用 savefig 而不是 plt.show()(伺服器環境沒有視窗)。
10-3 scikit-learn:五行程式碼入門機器學習
scikit-learn(pip install scikit-learn)提供統一 API:fit() 訓練、predict() 預測、score() 評估。不需要懂數學,但要能讀懂 AI 寫的 sklearn 程式。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
import pandas as pd
# 準備資料
df = pd.read_csv("students.csv")
X = df[["study_hours", "attendance"]] # 特徵(input)
y = df["passed"] # 標籤(output:0 或 1)
# 切分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 訓練模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 預測並評估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f" 準確率:{acc:.2%}")
print(classification_report(y_test, y_pred))
test_size=0.2 留 20% 資料做測試,random_state=42 讓每次分割結果相同(可重現)。看到 AI 沒有切分訓練集和測試集,模型評估的準確率就是假的。
三道遞進題:讀懂、改寫、抓錯
讀懂:追蹤完整數據分析流程;改寫:從分析到視覺化再到模型,串成完整流程;抓錯:資料洩漏、過擬合、型別錯誤。
題目一 讀懂(基礎)
說明以下程式的每個步驟在做什麼:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("sales.csv")
df["date"] = pd.to_datetime(df["date"])
df = df.dropna(subset=["revenue"])
monthly = df.groupby(
df["date"].dt.to_period("M")
)["revenue"].sum().reset_index()
monthly.columns = ["month", "total"]
plt.figure(figsize=(10, 4))
plt.plot(monthly["month"].astype(str), monthly["total"])
plt.xticks(rotation=45)
plt.title(" 月營收趨勢")
plt.tight_layout()
plt.savefig("revenue.png", dpi=150)
plt.close()
任務:逐步說明 to_period("M")、groupby、xticks(rotation=45) 的作用。
to_period("M")把 datetime 轉成月份期間(如 2026-01),讓 groupby 按月分組而非按日分組。groupby(月份)["revenue"].sum()計算每月的 revenue 總和,reset_index()把分組 key 變成普通欄位。xticks(rotation=45)讓 X 軸標籤旋轉 45 度,防止月份文字重疊;tight_layout()自動調整邊距避免標籤被截斷。
題目二 改寫(進階)
好的數據分析程式有清晰的流程結構:載入、清洗、分析、視覺化、輸出,每個步驟是獨立函式。這樣 AI 才能精準修改某一步,不會動到其他部分。
請 AI 把以下分析程式重構為流程化架構:
import pandas as pd, matplotlib.pyplot as plt
df = pd.read_csv("students.csv")
df = df.dropna()
df = df[df["score"] >= 0]
avg = df.groupby("class")["score"].mean()
plt.bar(avg.index, avg.values)
plt.savefig("result.png")
plt.close()
「請把這段程式重構為流程化架構,拆成四個函式:load_data(回傳 DataFrame)、clean_data(清洗後回傳 DataFrame)、analyze(回傳分析結果 dict)、visualize(接收結果,輸出圖表)。每個函式加 docstring 和中文註解,main 函式串接四步驟。」
- 流程化結構讓每個步驟可以獨立測試。例如 clean_data 可以單獨測試清洗邏輯,不需要跑整個流程。
- analyze 回傳 dict 而非直接畫圖,讓分析結果可以被其他函式(如 visualize、export)重複使用。
- main 函式用
if __name__ == "__main__"包住,可以 import 這個模組的函式而不自動執行分析。
題目三 抓錯(高階)
數據科學的錯誤最難發現:程式能跑、圖表能畫、模型能訓練,但結果是假的。找出以下機器學習程式的所有問題:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
df = pd.read_csv("data.csv")
X = df.drop("label", axis=1)
y = df["label"]
model = LogisticRegression()
model.fit(X, y) # 問題一
y_pred = model.predict(X) # 問題二
print(f" 準確率:{accuracy_score(y, y_pred)}") # 問題三
df2 = pd.read_csv("new_data.csv")
df2["score"] = df2["score"].fillna(df2["score"].mean()) # 問題四
任務:找出四個問題,說明危險原因。
問題一:沒有切分訓練集和測試集,直接用全部資料訓練。模型可能「死背」訓練資料(過擬合),對新資料效果差。應用 train_test_split()。
問題二:用訓練集(X)做預測,這是資料洩漏(Data Leakage)。模型評估必須用它沒見過的測試集(X_test)。
問題三:訓練集準確率接近 100% 不代表模型好,代表它把訓練資料背起來了。必須評估 y_test 和 y_pred(測試集)。
問題四:用 new_data 的平均值填補缺失值,實際部署應用訓練集的平均值,不能用新資料計算,這也是一種資料洩漏。
術語速查表
| 術語 | 說明 |
|---|---|
pandas / DataFrame | Python 資料分析套件;DataFrame 是二維表格資料結構,類似 Excel 工作表。 |
df.head(n) | 顯示前 n 列(預設 5),快速查看資料內容。 |
df.describe() | 數值欄的統計摘要:count、mean、std、min、25%、50%、75%、max。 |
df.isnull().sum() | 各欄缺失值(NaN)的數量,清洗前必查。 |
df.groupby(col) | 依指定欄分組,後接聚合函式如 .mean()、.sum()、.count()。 |
df.apply(func) | 對每列(或每欄)套用函式,常搭配 lambda 建立計算欄位。 |
matplotlib.pyplot | Python 基礎視覺化套件,plt.bar()、plt.plot()、plt.hist() 是最常用的三種。 |
plt.savefig() | 儲存圖表到檔案,伺服器環境比 plt.show() 更常用,之後必加 plt.close()。 |
scikit-learn | Python 機器學習套件,統一 API:fit() 訓練、predict() 預測、score() 評估。 |
train_test_split() | 切分訓練集(訓練模型用)和測試集(評估模型用),防止用訓練資料評估造成過度樂觀。 |
| 過擬合(Overfitting) | 模型把訓練資料「背起來」,訓練準確率高但對新資料效果差。切分測試集可以偵測。 |
| 資料洩漏(Data Leakage) | 測試集資訊不應出現在訓練過程中(包含填補缺失值的統計量),否則評估結果不可信。 |
重點整理與完成清單
讀懂有資料庫、API、安全防護、合規設計的中型 Python 專案;指揮 AI 建立完整數據分析流程;精準識別安全漏洞並要求修正。
完成清單
- 能用 pandas 讀取、清洗、篩選、分組統計資料
- 能用 matplotlib 畫長條圖、折線圖、直方圖
- 能讀懂 sklearn 的 fit / predict / score 流程
- 知道訓練集和測試集的差異,能識別資料洩漏
- 完成作業題目一:說明 to_period、groupby、xticks 的作用
- 完成作業題目二:請 AI 重構為流程化架構
- 完成作業題目三:找出過擬合、資料洩漏四個問題
延伸學習
思維邏輯自我訓練:28 天養成計畫(含入門練習版)
四週把「有感覺」練成「有觀點」。每天一題、一個高階任務配一個低階任務,忙的日子也接得上。買這門課直接附贈《入門練習版》八單元 22 課完整講義與練習單,排在課程最前面,先把思維訓練三部曲、知識吸收金三角這些底層工具建立起來,再進入 28 天的每日練習。
NT$ 999
HE201|Harness Engineering System Design(6 小時)
六小時的實作課:從 Blueprint 走到可以跑的規格,再用 No-code、n8n 低程式碼與程式碼三條路各做一次同一個 harness,最後處理可靠度——重試、錯誤處理、人工覆核。7 章 54 課,含常見坑與排錯、Capstone 實作,附學員講義 PDF。
NT$ 5,999

