臺北市門牌,值多少錢?
如果兩間房子只隔一條街,一間是臺北市門牌,另一間是新北市門牌,市場會願意為臺北市那一邊多付多少錢?
這個問題之所以有趣,是因為臺北市門牌背後通常不只是一行地址。它可能代表更密集的就業機會、交通網絡、醫療與公共服務、學區與商業活動,也包含一種難以拆開的城市品牌與未來預期。直覺上,臺北市門牌應該比較值錢。真正難的是:它到底值多少?
為什麼不能直接比平均房價
最直接的做法,是拿臺北市平均房價減掉新北市平均房價。但這個比較太粗。臺北市核心區、新北市外圍區、老公寓、新大樓、捷運站旁、山坡地、河岸旁,全部混在一起,最後得到的數字不會只是「門牌」的價格,而是城市發展、房屋條件、交通可及性與區位差異的總和。
換句話說,我們真正想問的不是「臺北市是不是比新北市貴」,而是:當房子盡可能像、生活圈盡可能近時,臺北市側是否仍然比較貴?
邊界提供了一個比較乾淨的想法
第一性原理很簡單:房價可以粗略想成幾個部分相加,包括房子本身的條件、所在地點、交易時間,以及市場對城市側、制度與門牌的評價。如果兩間房子距離很遠,這些因素幾乎全部都不一樣;但如果它們在臺北/新北邊界附近,甚至只隔一條街,地理條件與生活圈就可能非常接近。
接下來,我們再控制屋齡、坪數、樓層、總樓層、建物類型、用途、建材、是否有停車位、交易時間,以及所屬邊界區段。這樣做不是把世界變成完美實驗,而是盡量把「房子不同」與「地點不同」壓低,讓剩下的臺北市側價差更接近一個 local conditional premium。
這裡的 premium 不是純粹的「門牌本身」價格。更準確地說,它是市場對臺北市側帶來的制度、公共服務、城市品牌、生活圈預期與其他無法完全拆開因素的合併定價。
本文的答案
在主規格中,臺北市側的估計溢價是 25.91%,95% confidence interval 為 18.58% 到 33.71%。主規格使用 500m bandwidth、人工審核通過的 11 個連續邊界區段、matched formal sample,以及 property/time/segment controls。
這個結果可以被解讀為「在本研究定義的局部邊界、樣本與控制條件下,臺北市側有顯著正價差」。它不能直接解讀為所有行政邊界都存在同樣大小的因果溢價,也不能拆解為學區、捷運、稅制、公共服務或品牌效果各自貢獻多少。
這不是 diagnostic-only run。pipeline 產生的 final_estimate_summary.json 顯示 research_goal_achieved = true、diagnostic_only = false、blocked_by_qa = false,且 failed_gates = []。比較保守的說法是:排除 seg_0123 後,在目前 approved continuous segments、500m bandwidth 與 matched formal sample 上,臺北市側有約 25.91% 的 local conditional premium。
Dataset
Dataset: 內政部實價登錄買賣批次資料Coverage:110S3到115S1,共 19 季Unit: 住宅交易,清理後以中古住宅為主Geocoding: 臺北市與新北市官方門牌座標;不使用第三方 geocoding APIBoundary: 官方行政邊界圖資,並人工審核連續邊界區段Clean panel: 286,883 rowsMatched addresses: 283,808 rows,match rate98.93%Formal sample: 1,322 rows,臺北市側 661、新北市側 661Privacy: 本站只發布 aggregate summary,不發布 raw transactions、raw address coordinates 或 address-level outputs
附屬資料包含公開摘要 JSON:taipei-border-premium summary,以及可在 Colab 重跑主估計的去識別化 model-ready dataset:model input CSV。它們不包含原始交易地址、門牌座標、geocoded panel 或地址層級 outputs。若讀者要做 full raw-data reproduction,仍應從官方來源取得原始資料並重跑 pipeline;PyInvest 只保存可公開審查與重現主估計的 artifacts。
Method
資料流程分成六步。
第一,清理實價登錄歷史資料,保留可比較的中古住宅交易,並標準化城市、行政區、地址與房屋特徵欄位。主要欄位包含 unit_price_ping, area_building_ping, building_age, floor, total_floor, has_parking, year_month 與 address_key。
第二,用官方門牌座標匹配交易地址。清理後樣本共有 286,883 筆,成功匹配 283,808 筆,整體 match rate 為 98.93%。臺北市 failure rate 為 0.74%,新北市為 1.19%,兩側差距約 0.46 percentage points。
第三,計算每筆交易到臺北/新北邊界的距離與城市側,並排除官方座標與城市側不一致的點位。主 bandwidth 500m 的 city-side exclusion gate 通過。
第四,人工審核可用的連續邊界區段。官方邊界檔只能告訴我們行政界線在哪裡,不能判斷那一段是否真的是隔街生活圈,或其實被河流、山區、橋樑、重劃區切開。正式模型使用 11 個 approved segments:seg_0045, seg_0046, seg_0053, seg_0054, seg_0055, seg_0056, seg_0122, seg_0124, seg_0127, seg_0179, seg_0180。
第五,在 approved segments 內建立 matched formal sample。matching rule 是 segment_level_1to1_exact_parking_nn:對 has_parking_int 做 exact matching,並對 area_building_ping, building_age, floor, total_floor 做 nearest-neighbor matching。matching 前 pooled continuous candidate 有 2,668 筆,complete-case pool 有 2,490 筆,最後 formal sample 有 1,322 筆。
第六,估計包含房屋特徵、年月固定效果與邊界區段固定效果的 semi-log 模型,並用 HC1 robust standard errors 報告不確定性。
主模型估計:
其中 tau 轉換為百分比溢價:exp(tau) - 1。主規格的 tau = 0.2304,HC1 standard error 為 0.0306。
seg_0123 沒有放進正式樣本。原因不是它缺資料,而是包含它時 pooled sample 在新北市側 250m fake cutoff 會出現顯著 placebo jump。排除 seg_0123 後,same-side placebo gate 才通過。這件事必須視為研究設計的一部分,而不是事後隱藏的清理細節。
Findings
Finding 1: 主規格估計為 25.91%
主規格在 500m bandwidth、control_parking、matched complete cases 與 approved continuous segments 下,臺北市側溢價為 25.91%。95% confidence interval 為 18.58% 到 33.71%,p-value 為 5.43e-14。
| Bandwidth | Premium | 95% CI | N | Taipei / NTPC |
|---|---|---|---|---|
| 500m | 25.91% | 18.58% to 33.71% | 1,322 | 661 / 661 |
Finding 2: 地理匹配品質足以支持邊界分析
整體地址 match rate 是 98.93%。更重要的是,兩個城市的 failure rate 差距不大:臺北市 0.74%,新北市 1.19%。如果其中一側系統性 geocode failure 嚴重,邊界估計會有選樣風險;這次的差距約 0.46 percentage points,沒有觸發 geocode gate。
| City | Total | Matched | Match rate | Failure rate |
|---|---|---|---|---|
| 臺北市 | 77,050 | 76,482 | 99.26% | 0.74% |
| 新北市 | 209,833 | 207,326 | 98.81% | 1.19% |
Finding 3: Matching 後的 observable balance 通過 gate
Formal sample 兩側各 661 筆。has_parking_int 的平均值完全一致,兩側 parking share 都是 30.71%。四個連續房屋特徵的 standardized mean difference 都低於常用的 0.25 門檻;最大絕對值是 total_floor 的 0.128。
| Covariate | Taipei mean | NTPC mean | SMD |
|---|---|---|---|
| area_building_ping | 33.11 | 34.25 | -0.077 |
| building_age | 28.33 | 29.35 | -0.073 |
| floor | 5.38 | 5.50 | -0.025 |
| total_floor | 8.70 | 9.49 | -0.128 |
| has_parking_int | 0.307 | 0.307 | 0.000 |
Finding 4: 300m、500m、1000m 的方向穩定,但短 bandwidth 很敏感
正式 robustness gate 要求 300m、500m、1000m 在方向與幅度上不能互相矛盾。control_parking 規格下,三者分別是 32.17%、25.91%、30.35%,方向穩定。
100m 與 200m 也保留在附屬資料中,但樣本數很小,confidence interval 很寬。200m 的 point estimate 是 67.49%,但 N 只有 96,95% confidence interval 從 -42.66% 到 389.29%。所以它比較像敏感度警訊,不適合作為主結論。
Finding 5: Same-side placebo checks 沒有出現 5% 顯著跳躍
Placebo 設計是在同一城市側內,把距離真實邊界 250m、500m、750m 的位置設為 fake cutoffs,檢查價格是否在非行政邊界處也跳躍。所有 same-side placebo p-values 都大於 0.05。
| Side | Fake cutoff | Premium | p-value |
|---|---|---|---|
| Taipei | 250m | -2.03% | 0.565 |
| Taipei | 500m | 8.65% | 0.066 |
| Taipei | 750m | 1.43% | 0.782 |
| NTPC | 250m | -4.28% | 0.217 |
| NTPC | 500m | -3.74% | 0.359 |
| NTPC | 750m | -6.45% | 0.259 |
Checks
這篇文章設定為 dataAnalysis: true,因為正式 pipeline 的 13 個 publication gates 全部通過。這些 checks 不是裝飾。它們限制了這篇文章可以說什麼:主結論只對「通過審核的連續邊界區段、matched formal sample、500m 主規格」有效。
| Check | Result | Evidence |
|---|---|---|
| Raw data readiness | pass | 19 季官方 ZIP,manifest、checksum、ZIP magic、schema gate 完整 |
| Historical clean panel | pass | 286,883 cleaned residential rows |
| Geocode QA | pass | match rate 98.93%,city failure gap 0.46pp |
| City-side validation | pass | 87 筆 city-side invalid matched rows 已排除 |
| Boundary review | pass | 11 個 approved continuous segments |
| Formal sample | pass | matched sample 1,322 筆,臺北市側 661、新北市側 661 |
| Balance | pass | max |SMD| = 0.128 |
| Parking contamination | pass | 兩側 parking share 都是 30.71% |
| Community dominance | pass | max address-key share 1.21% |
| Robustness | pass | 300m、500m、1000m 方向穩定為正 |
| Placebo | pass | same-side fake cutoffs 皆不顯著 |
公開 artifact 包含 aggregate results 與一份最小 model-ready regression dataset。完整 raw transactions、門牌座標、geocoded panels、boundary sample 與 formal sample 都不放在本站,避免把可定位資料或大型中間產物混進文章發布流程。
Caveats
第一,seg_0123 沒有放進正式樣本,原因是 sensitivity-informed review 後無法通過 placebo gate。這讓正式結果比較保守,但也代表 segment selection 需要持續審視。
第二,模型目前沒有加入捷運站、學區、土地使用、商圈或其他外部 amenity controls。臺北市側 dummy 吸收的是一組 bundled boundary effect,不是單一制度或單一公共服務的純因果效果。
第三,這是 local conditional premium,不是平均房價差,也不是投資建議。樣本外推到其他行政邊界、其他時期或個別社區前,需要重新檢查資料與設計。
第四,實價登錄資料可能有修訂、登錄延遲與欄位品質問題。這次的 pipeline 有 data readiness 與 geocode QA,但不能完全消除來源資料本身的 revision risk。
第五,這是 MVP research-ready result,不是 paper-grade final result。更強的版本應該事前固定 segment rule,加入外部 amenity controls,並在後續官方資料或 holdout period 上重跑。
Reproducibility
主 pipeline 在 reproduction packet 或研究工作區內執行:
PYTHONPATH=src /opt/homebrew/bin/uv run --locked --offline python -m taipei_border_premium.historical_mvp
檢查最終 summary:
/usr/bin/python3 -m json.tool outputs/estimation/final_estimate_summary.json
最小結果檢查:
/usr/bin/python3 - <<'PY'
import json
from pathlib import Path
summary = json.loads(
Path("outputs/estimation/final_estimate_summary.json").read_text()
)
assert summary["research_goal_achieved"] is True
assert summary["diagnostic_only"] is False
assert summary["blocked_by_qa"] is False
assert summary["failed_gates"] == []
estimate = summary["main_estimate"]
print("premium_pct =", estimate["premium_pct"])
print("ci =", estimate["ci_low"], estimate["ci_high"])
print("n =", estimate["n_taipei"], estimate["n_ntpc"])
print("segments =", estimate["selected_segment_ids"])
PY
預期重點輸出:
premium_pct = 25.914364373710576
ci = 18.575711306110733 33.70720682169337
n = 661 661
segments = seg_0045,seg_0046,seg_0053,seg_0054,seg_0055,seg_0056,seg_0122,seg_0124,seg_0127,seg_0179,seg_0180
主要 source artifacts:
outputs/estimation/final_estimate_summary.jsonoutputs/estimation/model_results_by_bandwidth.csvoutputs/qa/geocode_history_report.jsonoutputs/qa/formal_sample_selection_report.jsonoutputs/qa/balance_table.csvoutputs/qa/formal_robustness_report.jsonoutputs/qa/formal_placebo_report.json
本站發布的附屬資料只整理為 aggregate summary:summary JSON。如果要重跑正式結果,應以 repo 內 pipeline 與原始官方資料為準。