Learning Objectives
- 檢查資料的型別與缺值,選擇合適的補值方法並說明理由
- 合併兩份資料、做每日彙總,算出每人用電並比較平日與週末
- 畫出清楚的時間序列圖,用移動平均與每月平均看趨勢
- 用相關與迴歸描述用電與氣溫的關係,依組檢查殘差,最後寫成一份有限制說明的短報告
專題:天氣越熱,宿舍用電越多嗎?
最後一課把前面學過的步驟串成一個完整的分析。情境:學校想了解五棟宿舍(A~E)的用電,問題是
宿舍的用電隨時間怎麼變化?和氣溫有多大關係?平日和週末有什麼不同?
有兩份資料:
| 檔案 | 內容 |
|---|---|
dorm_power.csv |
2026 年 9 月 1 日到 12 月 31 日,每棟每天的用電(kWh)與當天住宿人數;5 棟 × 122 天=610 列 |
weather.csv |
同一段期間每天的最高、最低氣溫、雨量與濕度 |
兩份都是程式產生的模擬資料,不是任何學校的真實資料。這一課的流程:
- 讀檔、檢查型別與缺值,決定怎麼補值
- 合併用電與天氣,每日彙總,算每人用電
- 畫時間序列圖,看趨勢
- 相關與迴歸,檢查殘差
- 寫成一份短報告
每一步都只用 pandas、matplotlib、scipy 的標準寫法。
步驟 1:讀檔、找出缺值、補值
parse_dates 讓日期欄變成真正的時間型別。注意第 12 行:缺值在加總時會被略過,等於當成 0。
步驟 2:合併天氣、每日彙總、平日與週末
分析單位是「一天」:把五棟加總成每天一列,再接上同一天的天氣。
步驟 3:時間序列圖怎麼畫比較清楚
每天的用電上上下下(平日、週末交替),直接畫折線會很亂。兩個常用的工具(第 12 課):
rolling(7, center=True).mean():7 日移動平均,剛好涵蓋一個星期,把平日與週末的起伏平均掉。resample("ME").mean():依月份彙總(ME是月底),看大方向。
用電與氣溫的單位不同,常見的作法是畫在同一張圖的左右兩個 y 軸(雙軸)。雙軸的兩個比例可以任意調整, 兩條線看起來多「同步」是畫圖的人決定的(第 14 課),所以這裡改用上下兩個子圖、共用 x 軸。
步驟 3:每月平均、移動平均與時間序列圖
這次讀天氣時用 index_col="date",讓日期直接成為索引。最後一步出圖。
步驟 4:相關、迴歸與依組看殘差
散布圖的每個點是一天。平日、週末用不同顏色畫,看它們和迴歸直線的關係。
實作:每一棟對氣溫有多敏感
換成以「棟」為單位:對每一棟分別做「每日用電 kwh 對最高氣溫 temp_max」的迴歸。
- 讀入兩份資料(日期要
parse_dates),依棟別、日期排序,依棟別內插補值。 - 用電與天氣依
date合併(每棟每天一列)。 - 用
for name, part in data.groupby("building"):逐棟做stats.linregress,記下斜率slope、相關係數r,以及每人每日用電的平均kwh_per_person(kwh / residents的平均)。 - 組成資料表,以
building為索引,四捨五入到小數 2 位,依斜率由大到小排序後印出。
寫完想一想:斜率最大的那一棟,是不是因為人最多?每人用電又是哪一棟最高?
步驟 5:寫成短報告
把前面的結果依第 23 課的結構寫下來(數字都來自上面的範例與實作題):
問題 宿舍用電隨時間怎麼變化?和氣溫有多大關係?
資料 五棟宿舍 2026 年 9 月 1 日到 12 月 31 日每日用電(5 棟 × 122 天=610 筆)與每日天氣;兩份都是模擬資料。 有 6 筆用電缺值(約 1%),依同一棟前後兩天線性內插補值。分析單位是「一天」(五棟加總)。
結果 五棟每日總用電的月平均由 9 月約 6468 kWh 降到 12 月約 2754 kWh。每日總用電和最高氣溫呈強烈正相關(r = 0.84,n = 122 天); 簡單線性迴歸的斜率約 471 kWh/°C,R² 約 0.71。週末的總用電(平均約 3118 kWh)比平日(約 4699 kWh)少,但每人用電相近(3.51 與 3.54 kWh), 差異主要來自住宿人數;迴歸的殘差在週末平均約 −1238 kWh,表示只用氣溫的直線會高估週末用電。 逐棟來看,C 棟對氣溫最敏感(斜率約 146 kWh/°C),每人用電也最高(約 3.84 kWh)。
限制 這是觀察資料:氣溫和學期的進度(考試週、連假)同時在變,用電與氣溫的關聯不能全部歸因於冷氣。 散布圖顯示關係不是一條直線:最高氣溫低於約 26°C 時用電大致持平,直線的斜率只是整段期間的粗略摘要。 只有一個學期四個月的資料,最高氣溫的範圍有限,結果不應外推到這個範圍以外。
結論 在這份資料裡,天熱時用電明顯較多,週末用電少主要是人少。若要估計節能措施的效果,模型除了氣溫還應納入人數與星期幾,並處理低溫時關係變平的情形。
接下來可以自己延伸:只用 26°C 以上的日子重做迴歸、把人數加進模型(多元迴歸)、比較考試週與一般週、改用每人用電當成 y,或做第 22 課提醒的事:事先寫下要做哪些分析。
小測驗:專題的每一步
每日五棟總用電要用 groupby("date")["kwh"].sum() 算。為什麼要先補值,不能直接加總?
下面程式會印出什麼?
import pandas as pd
s = pd.Series([10, None, 30, None, None, 60])
print(s.interpolate().tolist())
週末的總用電比平日少很多,但每人用電差不多。最合理的解讀是什麼?
用電與最高氣溫 r = 0.84。報告裡下列哪一句最恰當?
這一課的時間序列圖把用電和氣溫畫成上下兩個子圖,而不是同一張圖的左右兩個 y 軸。主要原因是什麼?
重點整理與接下來
- 先檢查型別與缺值,再決定怎麼補;加總類的計算特別要注意缺值會被當成 0。
- 想清楚分析單位(每棟每天、每天、每棟),用 groupby 彙總、merge 合併,合併後檢查列數。
- 比較時考慮「每人」等標準化的量;週末用電少主要是人少。
- 時間序列用移動平均與每月平均看趨勢;不同單位的變數用上下子圖、共用 x 軸。
- 相關與迴歸描述關係,依組看殘差可以找出模型漏掉的因素。
- 報告寫出資料、補值方式、數字、限制與恰當的結論。
這是資料分析軌的最後一課。你已經走過一次完整的流程:從問題、資料、清理、彙總、視覺化、統計,到寫成報告。 下一步可以拿自己感興趣的公開資料試一次,並把每一個步驟都寫成可以重新執行的程式。