# 🎯 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). ![image](https://hackmd.io/_uploads/SJE8ZXnigg.png) 本講義以 **新竹市實價登錄資料** 為例,帶領大家從資料觀察、數學建模到迴歸分析的完整流程。 內容分為五個部分: 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 | ![image](https://hackmd.io/_uploads/BykyyjLsxg.png) --- ### 🔹 單價(單位:萬元/坪) > 已由「單價元平方公尺」轉換為「萬元/坪」。 | 統計量 | 定義 | 數值 | | ------------------- | ------- | ------ | | $L_2$ 最佳代表值 | 平均數 | 34.97 | | $L_1$ 最佳代表值 | 中位數 | 32.70 | | $L_\infty$ 最佳代表值 | 最大最小的中點 | 93.78 | ![image](https://hackmd.io/_uploads/rJYEls8sxe.png) --- 📌 **提醒:** 在做分析前,務必檢查 **欄位名稱與單位**,並思考「換算成什麼單位最適合呈現結果」。 ### ✅ 小結 | 誤差方式 | 對應代表值 | 優點與應用情境 | |----------|------------|----------------| | $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 --- ![image](https://hackmd.io/_uploads/Byk909Doee.png) ### 📉 雙變數模型(坪數 + 屋齡 → 總價) 在單變數模型(只用坪數解釋總價)的基礎上,我們再加入「屋齡」作為第二個解釋變數。 交易當下的屋齡是由 **建築完成年月** 與 **交易年月日** 轉換而來,計算方式為: - 先將民國年月日轉換成西元日期 - 再以「交易日期 - 建築完成日期」計算交易當下的屋齡(單位:年) --- 模型形式: $$ \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)**:若殘差隨預測值變大或變小(漏斗狀),表示誤差變異量不一致。 - **離群點**:遠離主要點群的殘差可能代表異常交易紀錄或特殊樣本。 👉 殘差圖的重點不是「殘差要小」,而是「殘差沒有結構性模式」──這樣模型假設才算合理。 --- ## 📊 範例三: 多變數線性回歸與資料解讀 我們先分別繪製 **總價與坪數**、**總價與屋齡** 的分布圖。 從圖中可以看到: - 總價與坪數大體上呈現明顯的線性關係 - 總價與屋齡的關係則相對模糊 ![image](https://hackmd.io/_uploads/rkLpcwqjgl.png =300x)![image](https://hackmd.io/_uploads/B1vJjP9sxx.png =300x) --- 接著比較兩種模型的迴歸結果: ### 單變數模型(坪數 → 總價) $$ \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 --- ### 殘差圖 ![image](https://hackmd.io/_uploads/HJo7_29ilx.png) 上圖為「多變數回歸模型(坪數 + 屋齡 → 總價)」的殘差圖。 橫軸是模型的 **預測值 $\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**:類別劃分理由、缺值處理方式與結果解讀