# 🎯 20251011 Teng Lecture 1 從資料到模型 — 新竹市房價線性回歸分析
*Acknowledgement: This version is modified from [Prof. Ming-Hsuan Kang](https://www.math.nycu.edu.tw/faculty/faculty_content.php?S_ID=82&SC_ID=1)'s handout for the executive course at the Science School at NYCU in Fall, 2025. [Source](https://hackmd.io/vne5jLrWSW2Y5XZn4YZCEA).

本講義以 **新竹市實價登錄資料** 為例,帶領大家從資料觀察、數學建模到迴歸分析的完整流程。
內容分為五個部分:
1. **問題發想與資料觀察**
2. **資料視覺化**
3. **線性回歸模型**
4. **殘差與模型診斷**
5. **缺失值與類別變數**
透過這些步驟,你將能夠:
- 從資料中找出有意義的問題
- 建立合適的迴歸模型
- 使用誤差指標與殘差圖診斷模型
👉 目標不是單純跑出數字,而是**把數據轉化為可支撐觀點的論述**。
重點:著重於 **模型的解釋**(理解變數與房價之間的關係),與如何透過簡單的特徵工程得到更精確的預測。
本次課程的所有[範例程式碼](https://colab.research.google.com/drive/1Dtcq1xOhxBNxTghqTkua42_HkOrE5IEY?usp=sharing) 均可點擊參閱。建議同學先嘗試獨立透過 AI 撰寫程式碼,若遇到困難,再參考並修改範例程式碼。
---
## 1. 問題發想與資料觀察
在開始建模之前,先要有「問題」與「資料」。
### 1.1 為什麼要做新竹房市分析?
假設我們想針對 **新竹地區的房市** 做一些基本分析,請思考:
- 有哪些因素可能會影響房價?
- 你對哪些問題感到好奇?
舉例:
- 大樓的房價會比透天便宜嗎?
- 老屋比新屋便宜嗎?
- 有電梯的房子會比較貴嗎?
- 單價與總價差異大嗎?
### 1.2 從哪裡取得資料?
這裡我們使用 **[內政部實價登錄平台](https://lvr.land.moi.gov.tw/)**的資料。
範例中,我們下載了「[新竹市 114 年第二季不動產買賣交易資料](https://drive.google.com/file/d/1-DgygaC-DnCbBdnqrjNPZ0FImfreHeMU/view?usp=sharing)」(CSV 格式),作為分析的起點。(從網站下載會得到一個壓縮檔,我們使用的是 o_lvr_land_A.cvs這個檔案)。
### 1.3 開啟檔案,看看資料長什麼樣
請用 **Excel 或 Google 試算表**開啟資料檔案,觀察:
* 有哪些欄位?(例如:總價元、單價元平方公尺、建物型態…)
* 每一列(一筆資料)代表的是什麼?(一筆房屋交易紀錄)
* 欄位的格式正確嗎?(例如:日期的顯示方式是否清楚)
* 有沒有缺漏值?
💡 注意:有些我們真正關注的資訊可能**沒有直接出現**,但可以透過其他欄位推算出來。
例如:**屋齡** 可以由「建築完工日期」推算;**單價(萬元/坪)** 可以由「單價元平方公尺」再轉換單位得到。
👉 在這個階段,我們不需要寫程式,只要「閱讀資料」並思考哪些欄位需要進一步處理或轉換即可。
### 1.4 簡單的資料前處理
在正式分析之前,通常需要進行 **資料前處理 (data preprocessing)**。
常見的處理方式包含:
- 刪除或填補缺漏值
- 檢查欄位格式是否正確(例如:價格應為數值、日期應為時間格式)
- 移除明顯錯誤或不合理的資料
⚠️ 在這個主題裡,我們只在程式中處理最基本的部分(例如刪除缺值),不會深入探討更進階的清理與轉換技巧。
### 1.5 什麼是解釋變數與目標變數?
在資料分析裡,我們通常想預測一個量(例如房屋總價),這個量叫做**應變數**(dependent variable), 也稱作**目標變數** (target variable)。
而可能影響它的條件(例如坪數、屋齡、樓層),叫做 **自變數**(independent variable), **解釋變數** (explanatory variables),也稱作 **特徵** (features)。
小提醒:
- 如果我們想知道「哪一區房價比較高」,目標變數就是 **單價** 或 **總價**,解釋變數可能是「行政區」。
- 如果我們想預測「房子未來可能賣多少錢」,目標變數就是 **總價**,解釋變數可能是「坪數、屋齡、樓層…」。
### 1.6 設定明確的分析問題
在觀察資料後,試著先設定一些具體的分析問題,例如:
- 房屋總價與面積有什麼關係?
- 哪一區的房價最高?
- 屋齡與單價是否存在關聯?
- 不同建物型態的房價有顯著差異嗎?
這些問題多半是「描述性」的:我們想知道資料中有哪些規律、哪些差異。
接下來,我們要把問題提升一個層次:
能否用數學方法來系統化這些關係,甚至用來預測未來房價?
## 2. 資料視覺化
資料視覺化又稱為探索式資料分析Exploratory Data Analysis (EDA) 目標是,看看資料有什麼特徵。
### 2.1 單一變數的分佈情況
👀 在建模之前,先看看資料的樣子!
在進行任何建模或誤差計算之前,我們應該先對資料本身有一些「基本的感覺」。
> ✅ 這是資料科學中非常重要的一步:**「先看資料,再建模。」**
可以透過簡單的 **直方圖(histogram)** 來觀察:
- 資料是集中還是分散?
- 是否有極端值?
- 是否偏斜(skewed)?
- 總價與單價的分布是否相似?
#### 資料觀察重點
- **總價分布圖**:呈現新竹市整體房價的「落點集中區」,但可能被少數高價住宅拉高平均值。
- **單價分布圖(元/坪)**:觀察房屋「每坪價值」的分布,但小坪數高價物件可能使分布呈現右偏。
- 這些圖有助於思考:是否應該取對數?是否應該刪除極端值?或進行分群分析?
👉 這些視覺化能幫助我們更合理地選擇「適合的代表值」,而不是盲目相信平均數。
### 2.2 觀察應變數和自變數的關係
#### 散布圖 scatter plot
看 $y$ 與各 $x_i$ 的散布圖
在做回歸之前,建議先畫出每個解釋變數 $x_i$ 與目標變數 $y$ 的散點圖($y$ vs $x_i$)。
透過圖形可以快速判斷:
- $y$ 與 $x_i$ 是否呈現**近似線性**關係?
- 哪些變數看起來對 $y$ 有明顯影響?哪些幾乎沒有關聯?
- 是否存在離群點或特殊案例(例如超高價豪宅、凶宅、只交易車位等)?
> **觀察重點**:如果 $y$ 與某個 $x_i$ 看起來沒有關聯,直接把它放進模型可能貢獻不大,反而增加複雜度。
#### 盒鬚圖 boxplot
如果$x_i$是類別型資料,則可以個類別做分群,對$y$話盒鬚圖。
## 3. 數學模型與誤差的觀念
數學建模可以分成兩個主要步驟:
1. **決定函數型式**:
我們需要先假設一個函數型式(function form),來描述解釋變數與目標變數之間的關係。這個型式通常是一個帶有參數的函數家族。
* 有時候這個型式是透過 **理論推導** 而來,例如物理公式(牛頓運動定律、電阻定律)或經濟學模型,告訴我們「合理的數學關係應該長什麼樣子」。
* 在資料分析的實務裡,也常會 **先以簡單假設出發**,例如先嘗試線性模型,再依據資料的表現逐步修正。
* 簡單來說,這一步驟就是決定我們用什麼「形狀」的函數去逼近資料中的關係。
2. **決定參數**:
在型式決定後,我們再利用誤差函數(error function),也稱損失函數(loss function)來衡量模型與資料的差距,並透過最佳化方法找到最適當的參數值。
---
### 3.1 什麼是數學模型?
在本課題中,我們以解釋變數 $x_1, x_2, \dots, x_p$(如:建坪、屋齡、樓層、地段…)去描述目標變數 $y$(如:總價或單價)。
一個帶參數的模型可寫成:
$$
y \approx f(x_1, x_2, \dots, x_p;\,\theta),
$$
其中 $\theta$ 表示模型參數。它可能是:一個常數、向量,或更複雜的函數係數。
---
| 模型類型 | 數學形式 | 參數 $\theta$ 的樣子 |
|----------|-----------|------------------------|
| **常數模型** | $y \approx m$ | $\theta = m$(一個常數) |
| **線性模型** | $y \approx \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p$ | $\theta = (\beta_0, \beta_1, \dots, \beta_p)$(一組係數向量) |
| **非線性 / 特徵映射模型** | $y \approx g(\phi(x);\theta)$ | $\theta$ 可能是多項式的係數,或神經網路中的權重與偏差 |
---
### 3.2 用誤差函數找最適參數
選定型式後,下一步是決定參數 $\theta$。方法是定義一個**誤差函數** $E(\theta)$,來衡量模型預測與真實數據的差距,然後求解最佳化問題:
$$
\min_{\theta}\; E(\theta).
$$
以下以最簡單的「常數模型」為例,示範不同誤差衡量方式如何導向不同的「最佳代表值」。
**情境:** 有 $n$ 筆房價資料 $y_1,\dots,y_n$,用單一數字 $m$ 代表整體水準。
1. **平方誤差($L^2$)**
$$
E(m)=\sum_{i=1}^n (y_i-m)^2
$$
最佳解是 **平均數** $\displaystyle m^\star=\frac{1}{n}\sum_{i=1}^n y_i$。
(較重懲極端誤差,對離群值敏感。)
2. **絕對誤差($L^1$)**
$$
E(m)=\sum_{i=1}^n |y_i-m|
$$
最佳解是 **中位數(median)**。
(對離群值較穩健,常用於偏斜分布。)
3. **最大誤差($L^\infty$)**
$$
E(m)=\max_{1\le i\le n}|y_i-m|
$$
最佳解是資料的 **最小值與最大值的中點**。
(側重「最壞情況」的誤差控制。)
---
### 3.3 常數模型
從數學建模的角度來看,最簡單的模型是「用一個固定數字」,也就是常數模型,來代表整體房價水準:
$$
y \approx m
$$
問題是:**我們該選擇哪個數字 $m$,才最能代表整體房價?**
- 用平均數好,還是中位數好?
- 用「總價」還是「單價」來當代表?
這個看似簡單的問題,正是我們進入數據分析世界的第一步。
---
### 💬 討論題
1. 全國人民的收入,應該用 **平均數** 還是 **中位數** 來代表?
2. 全班學生的數學成績,應該用哪個數字代表整體水準?
## 📊 範例一:房價代表值分析
**資料來源:** 內政部實價登錄網站 — 新竹市 114 年第二季買賣交易資料
在開始程式實作前,請先注意 **資料檔案的使用方式**:
* 下載的 CSV 檔案必須先「提供給 Colab 使用」。
* 方式一:**直接上傳到 Colab 的暫存資料夾**。
* 優點:操作簡單。
* 缺點:若你將 Colab 程式碼分享給同學,對方可能無法執行(因為無法讀取你本地上傳的檔案)。
* 方式二:**放到 Google 雲端硬碟,並打開共享權限(至少取得連結可讀取)**。
* 優點:分享程式碼時,其他人也能存取同一份資料,不會出現「讀不到檔案」的問題。
💡 不論使用哪一種方式,只要在程式碼中告訴 ChatGPT 你希望的讀取路徑(例如「本地上傳」或「Google Drive 連結」),ChatGPT 都能幫你修改成對應的讀取程式。
---
在進行分析時,要特別注意 **資料欄位的意義與單位**。
- **總價**
原始欄位是 **「總價元」**,直接使用數字會顯得過大(例如 12,000,000 元)。
在報告或分析中,我們將其換算為 **「百萬元」**:
$$
\text{總價(百萬元)} = \frac{\text{總價(元)}}{1,000,000}
$$
- **單價**
原始欄位是 **「單價元平方公尺」**,而房地產市場上常用 **「萬元/坪」**。
我們進行轉換:
$$
1 \ \text{坪} \approx 3.3 \ \text{平方公尺}
$$
$$
\text{單價(萬元/坪)} = \frac{\text{單價(元/平方公尺)} \times 3.3}{10000}
$$
👉 **思考問題:** 為什麼我們在總價選擇「百萬元」為單位,在單價選擇「萬元/坪」?
其實這牽涉到「什麼單位比較容易閱讀與理解」,不同單位會影響到呈現的清晰度與說服力。
---
### 🔹 總價(單位:百萬元)
| 統計量 | 定義 | 數值 |
| ------------------- | ------- | ----- |
| $L_2$ 最佳代表值 | 平均數 | 17.98 |
| $L_1$ 最佳代表值 | 中位數 | 12.00 |
| $L_\infty$ 最佳代表值 | 最大最小的中點 | 847.67 |

---
### 🔹 單價(單位:萬元/坪)
> 已由「單價元平方公尺」轉換為「萬元/坪」。
| 統計量 | 定義 | 數值 |
| ------------------- | ------- | ------ |
| $L_2$ 最佳代表值 | 平均數 | 34.97 |
| $L_1$ 最佳代表值 | 中位數 | 32.70 |
| $L_\infty$ 最佳代表值 | 最大最小的中點 | 93.78 |

---
📌 **提醒:** 在做分析前,務必檢查 **欄位名稱與單位**,並思考「換算成什麼單位最適合呈現結果」。
### ✅ 小結
| 誤差方式 | 對應代表值 | 優點與應用情境 |
|----------|------------|----------------|
| $L^2$ | 平均數 | 強調整體趨勢,但會受極端值影響 |
| $L^1$ | 中位數 | 穩定、適合代表「典型情況」 |
| $L^\infty$ | 最大最小中點 | 強調最壞情況的誤差控制,完全由極端值決定 |
---
### 💬 討論情境
1. **一般民眾(分享資訊給朋友)**
如果你只是想讓朋友大概了解「新竹房價多少」,你會選哪一個代表值?為什麼?
2. **房仲業者(對潛在客戶)**
如果你是房仲,要告訴客戶「新竹房價大概多少」,你會選哪一個代表值?為什麼?
## 🧪 練習一:資料處理與代表值分析
### 說明
我們先從最簡單的資料處理開始,練習如何從原始資料建立代表值,並用圖像來呈現。
---
### 任務
1. **資料下載與程式撰寫**
- 前往 **內政部實價登錄網站**,下載「新竹市 114 年第二季 買賣交易資料」(CSV 格式)。
- 在 **Colab Code cell(程式碼區塊)** 中完成:
- 讀取資料檔案
- 新增欄位:計算每坪單價(萬元/坪)
$$
\text{單價(萬元/坪)} = \frac{\text{單價(元/平方公尺)}}{10000} \times 3.3
$$
- 繪製單價分布圖,並清楚標示三種代表值:
* 平均值($L^2$ 最佳代表值)
* 中位數($L^1$ 最佳代表值)
* 中點值($L^\infty$ 最佳代表值)
2. **資料觀察與說明**
- 在 **Colab Markdown cell(文字區塊)** 中回答:
* 哪些變數可以作為自變數,為什麼?
---
### 繳交要求
✅ Colab Notebook 應包含:
- **Code cell**:完整程式碼,產生統計與圖表
- **Markdown cell**:簡短文字說明,解釋過濾條件與結果觀察
---
### 💡 使用 AI 的建議
在這個練習裡,你們會需要觀察資料並回答一些開放性的問題(例如:哪些物件類型應該排除?有沒有極端值?)。
請注意:**不要直接把問題丟給 AI,然後照單全收。**
建議的使用方式如下:
1. **先提供自己的觀點**
* 例如:
> 我覺得車位不應該和建物一起分析,因為車位的坪數和總價差異很大。
* 再把這個想法丟給 AI,請它幫你 **潤飾、整理成更完整的說明**。
2. **如果沒有頭緒**
* 你可以請 AI 提供幾種不同的可能觀點(例如 A、B、C 三種角度),然後再由你們小組自己討論、選擇並修改。
* 例如:
> 「請給我三種不同的理由,解釋為什麼可能需要排除某些房市交易資料。」
這樣的流程可以幫助你們:
* 先練習自己的思考
* 再用 AI 來補充或修正
* 避免變成完全由 AI 代寫,而是「你們自己的觀點 + AI 的協助」
---
## 3.4 線性回歸模型
### 3.4.1 單變數模型(坪數)
最簡單的情況是只考慮「坪數 $x$」:
$$
\hat{y} = w_0 + w_1 x
$$
係數意義:
- $w_0$:固定成本(不隨坪數變動,例如地段或公設)
- $w_1$:每多一坪,房價平均增加的金額
---
### 3.4.2 雙變數模型(坪數與屋齡)
若再加入「屋齡 $x_2$」,模型變成:
$$
\hat{y} = w_0 + w_1 x_1 + w_2 x_2
$$
此時:
- $w_0$:固定成本(不隨坪數與屋齡變動)
- $w_1$:在屋齡固定時,坪數增加一單位對總價的影響
- $w_2$:在坪數固定時,屋齡增加一單位對總價的影響
---
### 3.4.3 具體範例:從方程式到矩陣
假設有三筆資料(坪數 $x_1$、屋齡 $x_2$、總價 $y$):
| 樣本 | 坪數 $x_1$ | 屋齡 $x_2$ | 總價 $y$ |
|:---:|:----------:|:----------:|:--------:|
| A | 15 | 5 | 1200 |
| B | 25 | 10 | 1650 |
| C | 35 | 15 | 2000 |
矩陣形式:
$$
\begin{bmatrix}
1200 \\ 1650 \\ 2000
\end{bmatrix}
\approx
\begin{bmatrix}
1 & 15 & 5 \\
1 & 25 & 10 \\
1 & 35 & 15
\end{bmatrix}
\begin{bmatrix}
w_0 \\ w_1 \\ w_2
\end{bmatrix}
\quad\Longleftrightarrow\quad
y \approx Xw
$$
---
### 3.4.4 誤差衡量的選擇
標準線性回歸使用 **$L^2$ 誤差(平方和誤差)**:
$$
E(w) = \|y - Xw\|_2^2 = \sum(y_i-w_0-w_1x_{1i}-w_2x_{2i})^2
$$
---
## 📊 範例二:房價線性回歸分析
資料來源:內政部實價登錄 — 新竹市 114 年第二季買賣交易資料
在這裡,我們以 **建物移轉總面積平方公尺(轉換為坪)** 作為解釋變數,
「總價(百萬元)」作為目標變數,建立線性回歸模型。
---
### 🔹 資料前處理重點
* 交易標的需先過濾,不同型態不宜混合:
- 土地與建物
- 土地與建物及車位
- 建物
- 建物及車位
- 車位(常見建物面積為 0,不適合分析)
👉 本範例僅選擇 **「房地(土地+建物)」** 子集建模。
資料數:394
### 📈 單變數模型(坪數 → 總價)
$\hat{y} = w_0 + w_1 \cdot \text{坪數}$
- 截距 $w_0 = 3.42$
- 斜率 $w_1 = 0.22$ (每坪約增加 0.22 百萬)
**誤差指標:**
- MSE = 61.36
- MAE = 4.09
- Max Error = 81.56
---

### 📉 雙變數模型(坪數 + 屋齡 → 總價)
在單變數模型(只用坪數解釋總價)的基礎上,我們再加入「屋齡」作為第二個解釋變數。
交易當下的屋齡是由 **建築完成年月** 與 **交易年月日** 轉換而來,計算方式為:
- 先將民國年月日轉換成西元日期
- 再以「交易日期 - 建築完成日期」計算交易當下的屋齡(單位:年)
---
模型形式:
$$
\hat{y} = w_0 + w_1 \cdot \text{坪數} + w_2 \cdot \text{屋齡}
$$
- 截距 $w_0 = 4.44$
- $w_1$(坪數)= 0.22
- $w_2$(屋齡)= -0.04 (屋齡每多一年,總價平均下降 0.04 百萬)
**誤差指標:**
- MSE = 61.08
- MAE = 4.02
- Max Error = 83.06
---
### 💡 小結
- 加入「屋齡」後,MSE 與 MAE **略微改善**,但 Max Error 反而更大。
- 說明模型變數增加不一定能顯著提升效果,反而可能增加解釋的複雜度。
- 我們採用 **MSE 來求解最佳係數**,但同時檢視 **MAE 與 Max Error**,有助於觀察資料中是否存在極端值或「最差情況」。
## 🧪 練習二:線性回歸模型建立與誤差比較 (不用做)
### 說明
在代表值分析後,我們進一步建立數學模型,嘗試用迴歸來解釋房價。
---
### 任務
1. **資料處理與建模**
- 在 **Colab Code cell** 中完成:
* 過濾交易標的:
僅保留「房地(土地+建物)」並比對教材範例
* 建立解釋變數:
- 坪數(由建物面積轉換)
- 屋齡(由建築完成年月計算)
- 自選一個額外變數(請選擇數值型的欄位)
* 目標變數:總價(百萬元)
* 建立兩個模型:
- 模型 A:坪數 → 總價
- 模型 B:坪數 + 屋齡 + 自選變數 → 總價
2. **小組討論與說明**
- 在 **Colab Markdown cell** 中回答:
* 自選變數是否應納入模型?為什麼?
* 如果要改善模型,還會加入哪些變數?
---
### 繳交要求
✅ Colab Notebook 應包含:
- **Code cell**:完整建模與誤差計算程式碼
- **Markdown cell**:比較與討論說明(以數據為依據)
---
## 4. 模型診斷
在建構數學模型時,**視覺化與比較基準 (benchmark)** 的設定非常重要。
視覺化不只是把結果畫出來,而是幫助我們判斷模型是否合理,並建立後續比較的標準。
---
### 4.2 基準模型(Benchmark)的概念
模型沒有絕對的「好壞」,通常需要**比較基準**來評估:
1. 先選一個直觀且解釋力強的變數(例如:坪數),建立**基準模型**。
2. 之後逐步加入其他變數(例如:屋齡、樓層、建物型態),比較誤差指標(MSE、MAE、Max Error)與係數變動。
若加入新變數後:
- 誤差明顯下降 → 新變數有實質貢獻。
- 誤差幾乎沒變 → 新變數貢獻有限。
- 原本變數係數大幅變動 → 可能存在**多重共線性**或模型重新分配解釋力。
---
### 4.3 殘差圖
在回歸分析中,**殘差圖(Residual plot)** 是最基本也最重要的模型診斷工具。
殘差定義為:
$$
r_i = y_i - \hat{y}_i
$$
其中 $y_i$ 是實際值,$\hat{y}_i$ 是模型的預測值。
---
#### 如何繪製殘差圖?
1. 使用模型計算每筆資料的預測值 $\hat{y}_i$。
2. 計算殘差 $r_i = y_i - \hat{y}_i$。
3. 以 **預測值 $\hat{y}_i$ 為橫軸**,**殘差 $r_i$ 為縱軸**,繪製散點圖。
4. 在圖中加上一條 $y=0$ 的水平虛線,作為殘差的基準線。
---
#### 如何解讀殘差圖?
- **隨機性檢查**:如果點大致隨機分佈在 0 附近,代表模型已捕捉到主要的線性趨勢。
- **系統性偏差**:若殘差呈現曲線或趨勢,代表線性模型不足以描述資料關係。
- **異質變異(Heteroscedasticity)**:若殘差隨預測值變大或變小(漏斗狀),表示誤差變異量不一致。
- **離群點**:遠離主要點群的殘差可能代表異常交易紀錄或特殊樣本。
👉 殘差圖的重點不是「殘差要小」,而是「殘差沒有結構性模式」──這樣模型假設才算合理。
---
## 📊 範例三: 多變數線性回歸與資料解讀
我們先分別繪製 **總價與坪數**、**總價與屋齡** 的分布圖。
從圖中可以看到:
- 總價與坪數大體上呈現明顯的線性關係
- 總價與屋齡的關係則相對模糊

---
接著比較兩種模型的迴歸結果:
### 單變數模型(坪數 → 總價)
$$
\hat{y} = w_0 + w_1 \cdot \text{坪數}
$$
- 截距 $w_0 = 3.42$
- 斜率 $w_1 = 0.22$(每坪約增加 $0.22$ 百萬元)
**誤差指標:**
- MSE = 61.36
- MAE = 4.09
- Max Error = 81.56
---
### 雙變數模型(坪數 + 屋齡 → 總價)
$$
\hat{y} = w_0 + w_1 \cdot \text{坪數} + w_2 \cdot \text{屋齡}
$$
- 截距 $w_0 = 4.44$
- $w_1$(坪數) = 0.22
- $w_2$(屋齡) = -0.04(屋齡每多一年,總價平均下降 $0.04$ 百萬元)
**誤差指標:**
- MSE = 61.08
- MAE = 4.02
- Max Error = 83.06
---
### 殘差圖

上圖為「多變數回歸模型(坪數 + 屋齡 → 總價)」的殘差圖。
橫軸是模型的 **預測值 $\hat{y}$**,縱軸是 **殘差 $r_i = y_i - \hat{y}_i$**。
🔍 **觀察與解讀**
- 理想情況下,殘差應該隨機分布在 0 附近,沒有系統性的模式。
- 在此圖中,可以看到:當 $\hat{y}$ 變大時,殘差的波動範圍也變大(呈現漏斗狀)。
- 這代表:模型對於 **高價房屋** 的預測不穩定,誤差更大。
👉 可能的改善方式:
- 嘗試變數轉換(例如對總價取對數)。
- 考慮更多解釋變數(例如地點、樓層)。
### 🔎 解讀與思考
- **屋齡係數**:為負,表示屋齡增加會讓總價下降,這符合直覺。
- **誤差改善有限**:加入屋齡後,MSE 與 MAE 只略微下降,顯示屋齡在此資料集的影響並不顯著。
- **坪數係數穩定**:坪數依然是最主要的解釋變數。
---
### 💬 思考問題
結果不只是數據上的比較,更要成為你論述的依據:
- 如果屋齡對房價影響有限,代表什麼?
- 在新竹這樣的市場,可能是「坪數」遠比「屋齡」重要。
- 也可能暗示:現在新成屋價格持續走高,讓「舊屋便宜」的效果被抵銷。
👉 你會怎麼把這些數據轉化為一個「故事」?
例如:
- 「在新竹,買舊不如買新,因為新成屋價格高漲,越早入市越好。」
- 或者「坪數是價格的主要決定因素,屋齡的影響反而有限。」
## 🧪 練習三:從模型到觀點 (不用做)
### 說明
光是跑數字還不夠,我們需要練習把數據轉化為可以支撐自己觀點的論述。除了回歸線與誤差指標之外,也要觀察 **殘差值**,因為殘差能反映模型是否有系統性的偏差。
---
### 任務
1. **圖像觀察**
- 在 **Colab Code cell** 中:
* 繪製總價 $y$ 與三個變數(坪數、屋齡、自選變數)的散點圖
* 在圖上加上回歸線
* **額外繪製殘差圖**:橫軸為預測值 $\hat{y}$,縱軸為殘差 $r_i = y_i - \hat{y}_i$
2. **模型比較**
- 在 **Colab Code cell** 中輸出:
* 迴歸係數 $w_i$
* 誤差指標(MSE / MAE / Max Error)
* **殘差值前 5 筆**(方便檢查異常點)
- 在 **Colab Markdown cell** 中回答:
* 新增變數後,模型是否比單變數模型更好?
* 坪數係數是否明顯改變?如果改變很大,代表什麼?
* 殘差圖是否顯示出某種規律(例如曲線、漏斗狀)?
3. **觀點建構**
- 在 **Colab Markdown cell** 中撰寫論述:
* 哪些變數與房價關聯最明顯?哪些影響有限?
* 如果屋齡影響有限,你會怎麼解讀?(例如:新成屋價格高,買舊不如買新)
* 如果自選變數顯著,你會怎麼解釋?(例如:樓層或地點重要性)
* 如果殘差分佈不隨機,你會怎麼推測模型需要改進?
- 提醒:
* 可以把單變數模型當作 **benchmark(基準)** 來比較
* 模型沒有絕對好壞,重點是你是否能 **用數據支撐觀點**
---
### 繳交要求
✅ Colab Notebook 應包含:
- **Code cell**:繪圖、係數、誤差輸出與殘差值
- **Markdown cell**:撰寫數據解讀與觀點論述
## 5. 缺失值與類別變數的處理
在房價分析中,除了「數值型變數」(例如屋齡、坪數、樓層)以外,
我們也常遇到「類別型變數」,例如:
- 建物型態:公寓 / 大樓 / 透天
- 是否有車位:有 / 沒有
- 所在行政區:東區 / 北區 / 香山區 …
同時,資料中也常出現 **缺失值 (Missing Data)**,例如:
「屋齡」沒有填寫、「建物型態」遺漏或「單價」缺失。
這些問題如果不處理,就沒辦法順利建模。
### 5.1 缺失值處理(Missing Data)
#### ❌ 錯誤做法:隨便補值
- **不能直接把缺失補成 `0`**,因為通常沒有實際意義:
- 例:屋齡缺失 ≠ 屋齡 0 年。
- 隨意把缺失用平均數/中位數補上,也可能讓模型忽略「缺失本身」的重要訊息。
#### ✅ 正確觀念:把「缺失」視為一種訊息
常見做法包括:
1. **刪除(Drop)**
- 當缺失比例很小,可以刪除含缺失的列。缺點是可能樣本數大幅下降,可能造成偏差。
2. **把缺失當成一類(適用於類別型變數)**
- 例如:建物型態 = {公寓, 大樓, 透天, **缺失**},把「缺失」視為一個合法類別。
3. **建立缺失指標(Missing Value Indicator,適用於數值型變數)**
- 對於數值型欄位 $x_i$,可另外新增一個 0/1 欄位 $z_i$:
$$
z_i = \begin{cases}
1 & \text{如果 } x_i \text{ 缺失} \\
0 & \text{否則}
\end{cases}
$$
- 同時,對 $x_i$ 做0的填補,填完0的變數另外更名為$\tilde{x}_i$, 再把 $z_i$ 放入模型。這樣模型能同時學到「數值大小」與「是否缺失」兩種信號。
- 如果原來的模型是
$$y=w_0+w_1 x +\varepsilon.$$
現在則變成
$$y=w_0+w_1 \tilde{x} + w_2 z +\varepsilon.$$
若樣本點的這個變數是缺失值,這個樣本點的模型變成
$$y=w_0+w_1 \times 0 + w_2 \times 1 + \varepsilon= (w_0+w_2) + \varepsilon.$$
若樣本點的這個變數不是缺失值,這個樣本點的模型變成
$$y=w_0+w_1 \times x + w_2 \times 0+ \varepsilon = w_0 + w_1 x +\varepsilon.$$
- 以上的方法等價於,對於有缺失值的樣本群建立一個與這個變數無關的模型,再對無缺失值的樣本群建立一個與這個變數有關的線性模型。
### 5.2 類別變數處理(Categorical Variables)
類別變數本身沒有數值大小意義,不能直接丟進設計矩陣 $X$,需要轉換成數值形式。常見方法如下:
#### 方法一:分別建模(Separate models)
- 把資料依類別切分(例如按建物型態分成三個子集),對每個子集各自建模。
- **優點**:直觀,係數容易解釋。
- **缺點**:樣本被分割,某些類別樣本可能太少,不利於跨類別比較。
#### 方法二:One-hot encoding(虛擬變數 / Dummy variables)
- 將 $k$ 種類別轉換成 $k-1$ 個指示變數,保留一類作為基準(baseline)。
例如:
$$
\text{公寓}=(1,0),\quad \text{大樓}=(0,1),\quad \text{透天}=(0,0).
$$
- **優點**:所有資料可在同一模型中使用;係數可解釋為「相對於基準類別」的影響。
- **缺點**:類別過多會造成維度膨脹。
---
### 5.3 線性代數詮釋
- One-hot encoding 在統計學上稱為 **虛擬變數(Dummy Variables)** 或 **指示變數(Indicator Variables)**。
- 線性代數角度來看,這相當於把類別對應到 $\mathbb{R}^k$ 中的基底向量 $e_i$,再與數值變數一起放入設計矩陣 $X$。
---
### 5.4 注意事項
- 若有 $k$ 種類別,通常只建立 $k-1$ 個指示變數(避免多重共線性)。
- 二元變數(如「是否有車位」)可直接用 0/1 表示。
- 類別過多時(如 20 個行政區),可合併小樣本類別為「其他」,或使用後續課程將介紹的降維方法。
- **不要隨意用 0 填補缺失**(除非 0 有明確意義)。若需填補,應同時建立缺失指標,或將缺失視為一個獨立類別。
---
### 5.5 與缺失指標(Missing Indicator)的概念連結
- 把缺失視為訊息,並用 0/1 指示變數表示,**本質上與 dummy variable 是一樣的概念**:
- dummy variable 表示「屬於某一類別?」
- missing indicator 表示「是否缺失?」
- 因此在實務上,處理缺失值與處理類別變數可以放在同一個思考框架下。
---
## 📊 範例四:類別變數的處理(建物主要用途)
假設有三筆資料(坪數 $x_1$、屋齡 $x_2$、主要用途、總價 $y$):
| 樣本 | 坪數 $x_1$ | 屋齡 $x_2$ | 主要用途 | 總價 $y$ |
|:---:|:----------:|:----------:|:--------:|:--------:|
| A | 15 | 5 | 住家 | 1200 |
| B | 25 | 10 | 商辦 | 1650 |
| C | 35 | 15 | 其他 | 2000 |
---
### 類別重劃分
「主要用途」原始資料有許多不同類別(例如住家用、商業用、工業用、農業用、辦公用、其他 …),若全部納入會讓模型變得過於複雜,且許多類別樣本數偏少。
👉 在這裡,我們將「主要用途」重新劃分為三類:
- **住家**(作為基準類別 baseline)
- **商辦**(商業或辦公用途)
- **其他**(剩下所有用途)
---
### Dummy variable 轉換
將「主要用途」轉換成數值欄位:
| 樣本 | 坪數 $x_1$ | 屋齡 $x_2$ | $I_{\text{商辦}}$ | $I_{\text{其他}}$ | 總價 $y$ |
|:---:|:----------:|:----------:|:----------------:|:----------------:|:--------:|
| A | 15 | 5 | 0 | 0 | 1200 |
| B | 25 | 10 | 1 | 0 | 1650 |
| C | 35 | 15 | 0 | 1 | 2000 |
此時「住家」作為基準類別,對應 $I_{\text{商辦}}=0, I_{\text{其他}}=0$。
👉 **特別說明**:這樣的數值化(0/1)處理就是 dummy variable 的核心。
類別原本是文字(住家 / 商辦 / 其他),無法直接帶入數學公式。
經過轉換後,模型才能把它們和連續變數(如坪數、屋齡)一起放進函數裡進行計算。
---
### 線性迴歸模型
對應的迴歸方程式為:
$$
\hat{y} = w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + w_{\text{商辦}} \cdot I_{\text{商辦}} + w_{\text{其他}} \cdot I_{\text{其他}}
$$
這裡:
- $x_1$ = 坪數
- $x_2$ = 屋齡
- $I_{\text{商辦}}, I_{\text{其他}}$ = dummy variables
⚠️ **重點**:Dummy variable 的建立屬於 **資料前處理** 的一環。它只是把類別資訊轉換成數值,方便丟進數學模型計算,並不代表我們已經決定要用哪一種模型(線性回歸、樹模型、或其他)。
### 1. 類別重劃分
「主要用途」原始資料有許多不同類別(例如住家用、商業用、工業用、農業用、辦公用、其他 …),若全部納入會讓模型變得過於複雜,且許多類別樣本數偏少。
👉 在這裡,我們將「主要用途」重新劃分為三類:
- **住家**(作為基準類別 baseline)
- **商辦**(商業或辦公用途)
- **其他**(剩下所有用途)
---
### 2. 模型建立
我們使用 **坪數** 與「主要用途」作為解釋變數,**總價(百萬元)」作為目標變數,建立線性迴歸模型。模型結果如下:
變數 係數
- 截距: 3.338
- 坪數: 0.235
- 其他: -0.787
- 商辦: 2.090
對應的迴歸方程式為:
$$
\hat{y} = w_0 + w_1 \cdot \text{坪數} + w_{\text{其他}} \cdot I_{\text{其他}} + w_{\text{商辦}} \cdot I_{\text{商辦}}
$$
其中:
- $I_{\text{其他}} = 1$ 表示「其他」用途,否則為 0
- $I_{\text{商辦}} = 1$ 表示「商辦」用途,否則為 0
- 「住家」作為基準類別,對應 $I_{\text{其他}}=0, I_{\text{商辦}}=0$
---
### 3. 結果解讀
- **截距 ($w_0 = 3.34$)**:代表基準類別「住家」在坪數為 0 時的基準價格(雖然坪數=0 不具實際意義,但係數能作為比較基準)。
- **坪數 ($w_1 = 0.235$)**:對於「住家」類型,每增加 1 坪,總價平均增加 0.235 百萬。
- **其他 ($w_{\text{其他}} = -0.79$)**:相較於「住家」,「其他」用途的房價平均少了約 0.79 百萬。
- **商辦 ($w_{\text{商辦}} = 2.09$)**:相較於「住家」,「商辦」用途的房價平均多了約 2.09 百萬。
---
### 4. 小結
這個範例說明了:
1. 在處理類別變數時,必須先決定 **如何劃分類別**,以符合我們關心的議題。
2. **基準類別的選擇** 會影響其他係數的解釋方式,但不影響模型本身的預測結果。
3. 「住家」作為基準,顯示「商辦」相較之下更貴,「其他」則較便宜,這符合我們對市場的直觀理解。
## 🧪 練習四:類別變數的建模與解釋 (要做!最終結果)
### 說明
這次我們要練習 **處理類別型變數**。
請自己選擇資料中的一個「類別型欄位」(例如主要用途、建物型態等),並思考如何將它轉換成可用於線性回歸的形式。
---
### 任務
1. **資料處理與建模**
- 在 **Colab Code cell** 中完成:
<!--
* 檢查所選類別欄位是否有缺值,並決定如何處理(例如:將缺值歸入「其他」、或獨立成一類)。
* 規劃類別劃分方式(例如:住家 / 商辦 / 其他)。
* 使用 `pd.get_dummies` 建立 dummy variables,並將 baseline 類別留白。
* 與「坪數、屋齡」一起放進迴歸模型,目標變數為 **總價(百萬元)**。
* 輸出迴歸係數與誤差指標(MSE / MAE / Max Error)。 -->
* Give us your proposed model and report your MSE, MAE, and max error. Note: $y$ = 單價(萬元/坪).
<!--2. **結果比較與觀察**
- 與單變數模型(坪數 → 總價)比較:
* 加入類別變數後,誤差是否改善? 和練習三的結果作比較。
* 相對於 baseline,其他類別的房價高還是低? -->
2. **小組討論與說明**
- 在 **Colab Markdown cell** 中回答:
* 你們為什麼選擇這個類別欄位?
* 類別劃分方式是否合理?有沒有其他可能的劃分?
* 缺值的處理方式會不會影響結果?
* 你們得到的結果和直覺是否一致?
---
### 繳交要求
✅ Colab Notebook 應包含:
- **Code cell**:完整資料處理、建模與誤差計算程式碼
- **Markdown cell**:類別劃分理由、缺值處理方式與結果解讀