GWR로 공간 비정상성을 해석하는 지역 회귀 모델
GWR의 지리적 가중치와 로컬 회귀계수 추정 방식을 정리하고, 대역폭 선택·진단·MGWR 확장 및 공간 데이터 분석 시 주의점을 다룬다.
2026-08-14 · 최초 발행 2024-04-29
위치에 따라 달라지는 회귀계수
전역 회귀는 모든 지역에서 설명변수와 반응변수의 관계가 같다고 본다. 하지만 주택가격, 질병 발생률, 교통량처럼 공간적 맥락에 영향을 받는 데이터는 이 가정이 맞지 않을 수 있다. GWR(Geographically Weighted Regression)은 이런 공간 비정상성(spatial non-stationarity)을 대상으로 한다.
GWR은 각 관측 위치에서 주변 관측치에 커널 가중치를 적용하고, 가중 최소제곱(Weighted Least Squares)으로 로컬 회귀계수를 계산한다. 위치 u의 회귀계수 β(u)를 구하므로, 변수의 영향력이 공간에 따라 어떻게 변하는지 지도 위에서 확인할 수 있다.
가중치는 거리 기반 커널과 대역폭(bandwidth)으로 결정한다. Gaussian과 bi-square 같은 커널을 사용하며, 대역폭이 작으면 가까운 관측치에 더 집중한 지역적 추정이 되고 대역폭이 커질수록 전역 추정에 가까워진다.
가중치와 대역폭이 모델의 범위를 정한다
데이터의 분포와 분석 대상의 연속성은 커널 선택에 영향을 준다. Gaussian은 거리에 따라 부드럽게 감쇠하고, bi-square는 가까운 관측치를 우선하면서 먼 관측치의 영향은 절단한다.
대역폭은 고정형과 적응형으로 나뉜다. 고정형은 거리를 기준으로 하며, 적응형은 최근접 k개를 기반으로 한다. 포인트 밀도가 고르지 않은 데이터에서는 적응형이 권장된다.
각 위치의 가중 행렬 W(u)을 구성한 뒤 WLS로 β(u)를 추정하면, 전역 회귀에서는 보이지 않던 지역별 영향력 차이를 해석할 수 있다. 다만 로컬 추정치에는 불확실성이 있으므로 표준오차와 t-통계량을 확인하고, FDR 등 다중검정 보정도 고려해야 한다.
적합도만으로는 충분하지 않다
대역폭은 CV 최소화 또는 AICc 최소화를 기준으로 탐색한다. CV는 예측에, AICc는 모형 균형에 초점이 있다. 어느 기준을 선택하든 과적합을 막는 규제적 선택이 필요하다.
적합 후에는 로컬 R², 잔차 모란의 I, 로컬 조건수를 함께 본다. 잔차의 공간자기상관은 설명하지 못한 공간 구조가 남았는지 보여주고, 극단적인 계수나 조건수는 로컬 다중공선성 또는 수치 불안정의 경고 신호가 된다.
변수별 공간적 작용 범위가 같지 않다면 MGWR(Multiscale GWR)을 고려할 수 있다. MGWR은 변수마다 다른 대역폭을 적용해 다중 스케일 효과를 반영한다. 이산형 또는 이분형 반응 변수에는 포아송·로지스틱 일반화 선형모형을 확장한 GW-GLM이 쓰인다. 이상치에 민감한 상황에서는 Huber 또는 비대칭 손실 기반의 Robust GWR이 대안이 된다.
좌표와 데이터 품질이 전제 조건이다
거리 가중치를 계산하므로 미터 단위의 투영 좌표계가 필요하다. 한국 데이터는 EPSG:5179 등 적정 UTM 또는 국가 좌표계를 사용한다.
변수 간 스케일 차이는 표준화로 완화할 수 있다. 결측과 이상치 처리뿐 아니라 동시성 및 측정오차도 검토 대상이다. 상관이 높은 변수는 PCA 같은 차원축소 또는 변수 선택으로 다룬다.
지역 차이를 읽어야 하는 분석
부동산과 도시계획에서는 주택가격을 면적, 준공연한, 지하철 접근성, 학군 등으로 설명하면서 지역별 가격 민감도를 지도화할 수 있다. 이는 세분화된 과세·개발정책 수립이나 개발 후보지의 로컬 탄력성 기반 투자 우선순위 선정에 활용된다.
공중보건과 역학에서는 질병 발생률과 환경·사회경제 지표의 관계를 지역별로 추정한다. 위험요인의 강도를 구분해 예방자원을 배분하고, 잔차 공간자기상관 분석으로 누락된 위험요인을 탐색할 수 있다.
교통과 환경 분석에서는 교통량 또는 PM2.5를 도로망, 지형, 기상과 연결해 지역별 영향 차이를 반영한다. 상권 분석에서는 매출과 유동인구, 경쟁 밀도, 접근성의 관계를 통해 점포 선정과 로컬 프로모션을 조정한다.
OLS와 비교하면 GWR은 공간 이질성이 큰 상황에서 로컬 적합을 제공하고, MGWR은 변수별 스케일까지 반영한다. 그만큼 계산량과 해석 복잡성도 커진다.
| 항목 | OLS | GWR | MGWR |
|---|---|---|---|
| 성능(설명력) | 공간 이질성 크면 낮아짐 | 로컬 적합으로 개선 | 변수별 스케일 반영으로 추가 개선 |
| 확장성(계산비용) | 낮음(O(n)) | 높음(대략 O(n·kNN)~O(n²)) | 매우 높음(반복 대역폭 추정) |
| 일관성(계수 안정성) | 전역 일관 | 지역 간 변동 큼 | 변수별 변동, 해석 복잡 |
| 안정성(수치/공선성) | 비교적 안정 | 로컬 공선성 민감 | 진단·규제가 더 중요 |
| 운영 편의 | 튜닝 적음 | 대역폭·커널·유의성 관리 필요 | 튜닝·해석 가장 복잡 |
분석은 전역 모델에서 시작해 로컬 모델로 좁힌다
입력은 좌표가 포함된 공간 데이터, 반응변수 Y, 설명변수 X, 투영 좌표계다. 전처리에서 결측·이상치를 처리하고 변수 변환·표준화와 좌표계 변환을 수행한다. 이후 CV/AICc 기준으로 대역폭을 탐색하면서 고정형 또는 적응형과 커널을 정한다.
로컬 추정 단계에서는 위치별 가중 행렬을 계산해 WLS를 적합한다. 결과물은 로컬 계수·표준오차·유의성 지도, 로컬 R², 예측 표면, 정책 인사이트로 구성할 수 있다.
GWR을 도입할 때는 적응형 대역폭이 밀도 불균질 데이터에 유리하고, 고정형은 해석이 단순하다는 점을 함께 고려한다. bi-square는 지역성을 강조하며 Gaussian은 매끄러운 표면을 만든다. 노이즈가 크다면 로버스트 옵션을 검토한다.
로컬 테스트가 수천 개 발생할 수 있으므로 FDR 또는 Bonferroni 같은 다중검정 보정이 필요하다. 데이터 규모가 크면 k-d tree, 멀티프로세싱, 샘플링, 타일링을 고려하고, 필요에 따라 MGWR 또는 近似 알고리즘을 활용한다. 경계나 희박 지역에서는 최소 이웃 수를 보장하고 외삽 경고 플래그를 두며, 결과를 해석할 때 지원 표본 크기를 참조한다.
OLS 대비 AICc 520% 감소, CV 오차 1030% 개선 사례가 다수 있으며 잔차 모란의 I 유의성 감소로 독립성 가정도 개선될 수 있다. 반면 과적합, 다중검정, 경계효과, 계산비용 증가는 함께 관리해야 할 리스크다.
Python mgwr로 로컬 계수 적합하기
전제조건: Python 3.10+, mgwr 2.2+, geopandas 0.14+, libpysal 4.10+. 좌표는 미터 단위 투영 좌표계(EPSG:5179 등)를 사용하며, 설명변수는 표준화가 권장된다.
# pip install mgwr geopandas libpysal shapely
import geopandas as gpd
import numpy as np
from mgwr.gwr import GWR, Sel_BW
from libpysal.weights import KNN
from esda.moran import Moran
# 1) 데이터 로드 및 전처리
gdf = gpd.read_file("data.geojson").dropna(subset=["price","floor_area","age","dist_subway"])
# 한국 예시: EPSG:5179 (미터 단위)로 투영
gdf = gdf.to_crs(5179)
# 설명변수 표준화
for col in ["floor_area","age","dist_subway"]:
gdf[f"z_{col}"] = (gdf[col] - gdf[col].mean())/gdf[col].std(ddof=0)
y = gdf["price"].values.reshape(-1, 1) # 반응변수
X = gdf[["z_floor_area","z_age","z_dist_subway"]].values # 설명변수 (절편은 GWR가 내부 처리)
coords = np.column_stack([gdf.geometry.x, gdf.geometry.y])
# 2) 대역폭 선택 (적응형: fixed=False)
selector = Sel_BW(coords, y, X, kernel="bisquare", fixed=False)
bw = selector.search(bw_min=20) # 데이터 스케일에 따라 탐색 범위 조정
# 3) GWR 적합
model = GWR(coords, y, X, bw=bw, kernel="bisquare", fixed=False)
results = model.fit()
# 4) 결과 병합
coef_names = ["b_area","b_age","b_dist"]
for i, name in enumerate(coef_names, start=1): # params: [intercept, x1, x2, x3,...]
gdf[name] = results.params[:, i]
gdf["b0"] = results.params[:, 0]
gdf["local_R2"] = results.localR2
# 5) 잔차 공간자기상관 점검
w = KNN.from_array(coords, k=8)
mi = Moran(results.resid_response.flatten(), w)
print(f"Bandwidth: {bw}, Local R2 mean: {gdf['local_R2'].mean():.3f}, Moran's I p={mi.p_sim:.4f}")
# 6) 저장/시각화
gdf.to_file("gwr_results.geojson", driver="GeoJSON")
# GIS에서 b_area, local_R2 레이어로 지도화
이웃 수 부족 메시지가 나오면 bw 또는 k(적응형)를 상향한다. 로컬 조건수가 높으면 변수 스케일을 조정하고 다중공선성 변수를 제거한다. 잔차 Moran’s I가 유의하면 변수 누락 또는 공간 효과를 추가하는 방향으로 모델 구조를 재검토한다.
GWR은 공간 비정상성을 수치로 드러내고 지역별 매개변수 추정을 정책과 사업 의사결정에 연결하는 방법이다. 먼저 전역 OLS로 베이스라인을 세운 뒤 공간 이질성 신호가 확인될 때 단계적으로 GWR을 도입하는 편이 적절하다.