臺北市門牌,值多少錢?

如果兩間房子只隔一條街,一間是臺北市門牌,另一間是新北市門牌,市場會願意為臺北市那一邊多付多少錢?

這個問題之所以有趣,是因為臺北市門牌背後通常不只是一行地址。它可能代表更密集的就業機會、交通網絡、醫療與公共服務、學區與商業活動,也包含一種難以拆開的城市品牌與未來預期。直覺上,臺北市門牌應該比較值錢。真正難的是:它到底值多少?

為什麼不能直接比平均房價

最直接的做法,是拿臺北市平均房價減掉新北市平均房價。但這個比較太粗。臺北市核心區、新北市外圍區、老公寓、新大樓、捷運站旁、山坡地、河岸旁,全部混在一起,最後得到的數字不會只是「門牌」的價格,而是城市發展、房屋條件、交通可及性與區位差異的總和。

換句話說,我們真正想問的不是「臺北市是不是比新北市貴」,而是:當房子盡可能像、生活圈盡可能近時,臺北市側是否仍然比較貴?

邊界提供了一個比較乾淨的想法

第一性原理很簡單:房價可以粗略想成幾個部分相加,包括房子本身的條件、所在地點、交易時間,以及市場對城市側、制度與門牌的評價。如果兩間房子距離很遠,這些因素幾乎全部都不一樣;但如果它們在臺北/新北邊界附近,甚至只隔一條街,地理條件與生活圈就可能非常接近。

接下來,我們再控制屋齡、坪數、樓層、總樓層、建物類型、用途、建材、是否有停車位、交易時間,以及所屬邊界區段。這樣做不是把世界變成完美實驗,而是盡量把「房子不同」與「地點不同」壓低,讓剩下的臺北市側價差更接近一個 local conditional premium。

這裡的 premium 不是純粹的「門牌本身」價格。更準確地說,它是市場對臺北市側帶來的制度、公共服務、城市品牌、生活圈預期與其他無法完全拆開因素的合併定價。

本文的答案

在主規格中,臺北市側的估計溢價是 25.91%,95% confidence interval 為 18.58%33.71%。主規格使用 500m bandwidth、人工審核通過的 11 個連續邊界區段、matched formal sample,以及 property/time/segment controls。

Main estimate 25.91%
95% CI 18.58-33.71%
Formal sample 1,322
QA gates 13/13
Status formal

這個結果可以被解讀為「在本研究定義的局部邊界、樣本與控制條件下,臺北市側有顯著正價差」。它不能直接解讀為所有行政邊界都存在同樣大小的因果溢價,也不能拆解為學區、捷運、稅制、公共服務或品牌效果各自貢獻多少。

這不是 diagnostic-only run。pipeline 產生的 final_estimate_summary.json 顯示 research_goal_achieved = truediagnostic_only = falseblocked_by_qa = false,且 failed_gates = []。比較保守的說法是:排除 seg_0123 後,在目前 approved continuous segments、500m bandwidth 與 matched formal sample 上,臺北市側有約 25.91% 的 local conditional premium。

Dataset

  • Dataset: 內政部實價登錄買賣批次資料
  • Coverage: 110S3115S1,共 19 季
  • Unit: 住宅交易,清理後以中古住宅為主
  • Geocoding: 臺北市與新北市官方門牌座標;不使用第三方 geocoding API
  • Boundary: 官方行政邊界圖資,並人工審核連續邊界區段
  • Clean panel: 286,883 rows
  • Matched addresses: 283,808 rows,match rate 98.93%
  • Formal sample: 1,322 rows,臺北市側 661、新北市側 661
  • Privacy: 本站只發布 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_monthaddress_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 報告不確定性。

主模型估計:

log(unit price)=τTaipei side+f(distance)+Xβ+time FE+segment FE+ϵ\begin{aligned} \log(\text{unit price}) ={}& \tau \cdot \text{Taipei side} + f(\text{distance}) + X\beta \\ &+ \text{time FE} + \text{segment FE} + \epsilon \end{aligned}

其中 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_floor0.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.json
  • outputs/estimation/model_results_by_bandwidth.csv
  • outputs/qa/geocode_history_report.json
  • outputs/qa/formal_sample_selection_report.json
  • outputs/qa/balance_table.csv
  • outputs/qa/formal_robustness_report.json
  • outputs/qa/formal_placebo_report.json

本站發布的附屬資料只整理為 aggregate summary:summary JSON。如果要重跑正式結果,應以 repo 內 pipeline 與原始官方資料為準。