Debugging:錯誤訊息不是唯一錯誤
學習目標:區分 syntax/runtime errors 與不會報錯的 silent analytical errors。
「程式沒有報錯」常常被誤認為「分析沒有問題」。但一份分析程式碼可能完全順利執行,卻因為沒有先篩掉 draft 或 superseded 的列、把不同 unit(不同指標)的數值混在一起加總,或是某筆 record_id 因為重新提交而重複出現,導致同一筆資料被算了兩次,產生一個看起來正常、實際上錯誤的結果。這種錯誤 Python 不會報錯,只有靠人主動檢查才會被發現。
Runtime / Syntax Errors
- 程式無法執行,Python 直接丟出錯誤訊息
- 通常容易被發現,因為程式會停止
- 常見原因:欄位打錯字、型態不符、除以零
Silent Analytical Errors
- 程式順利執行完畢,沒有任何錯誤訊息
- 只有結果本身不合理,或有人重新驗證才會被發現
- 常見原因:未篩選 status、把不同 unit 的指標混在一起彙總、record_id 重複計算
import pandas as pd
df = pd.read_csv("DS202_Analysis_Package_Practice.csv", parse_dates=["period"])
# 沒有先篩選 status 為 validated,也沒有先依 unit 分組,
# 把不同指標(count、hours、usd...)的數值直接加總在一起
summary = df.groupby("group")["value"].sum()
print(summary)
# 程式完全不會報錯,但這個總和沒有任何業務意義| 方法 | 在做什麼 |
|---|---|
| 列數核對 | 篩選前後、groupby 前後的列數是否符合預期? |
| 小樣本人工核算 | 挑一小群資料自己手算,和程式輸出比對 |
| 邊界案例檢查 | 刻意檢查極端值、缺值或重複 record_id 的處理方式 |
| 敏感度測試 | 調整篩選條件或分組方式,看結論是否過度脆弱 |
篩選前有 480 列,篩選後應該少於 480 列;如果篩選後的列數和篩選前一樣,代表篩選條件根本沒有生效。用這種簡單的列數核對,往往比重新讀一次程式碼更快抓到問題。
- 篩選前後的列數,是否符合我的預期?
- 我有沒有挑一小群資料,自己手算一次來比對?
- 極端值、缺值、或重複出現的 record_id,被怎麼處理了?
- 如果我換一種合理的篩選或分組方式,結論會不會完全變了?
注意
一段分析程式碼完整執行完畢,沒有出現任何錯誤或警告訊息。這代表分析結果一定正確嗎?