커널 밀도 추정(Kernel Density Estimation, KDE): 데이터의 분포를 부드럽게 추정하는 기법
🔍 커널 밀도 추정(KDE)란?
커널 밀도 추정(KDE, Kernel Density Estimation)은 연속형 데이터의 확률 밀도 함수를 추정하는 비모수적(non-parametric) 기법입니다.
즉, 데이터가 어떤 특정한 분포(예: 정규분포)를 따른다고 가정하지 않고, 주어진 데이터로부터 부드러운 확률 밀도 함수(PDF)를 추정하는 방법입니다.
📌 주요 특징
- 히스토그램보다 부드러운 분포 곡선을 제공
- 적절한 밴드폭(bandwidth) 선택이 중요
- 공간 데이터 분석에서는 **핫스팟 분석(밀집 지역 탐색)**에 활용
📌 KDE의 핵심 개념
KDE는 각 데이터 포인트 주변에 커널 함수(kernel function)를 배치한 후, 이를 모두 합산하여 밀도 곡선을 형성하는 방식으로 동작합니다.
1️⃣ KDE 수식
커널 밀도 추정은 다음과 같은 수식으로 표현됩니다.
- f^(x)\hat{f}(x) : 추정된 확률 밀도 함수(PDF)
- nn : 데이터 개수
- hh : 밴드폭(Bandwidth) (핵심 파라미터)
- KK : 커널 함수 (예: 가우시안, 균등, 삼각형, Epanechnikov 등)
- xix_i : 개별 데이터 포인트
이때, **밴드폭(h)**은 곡선의 부드러움을 조절하는 중요한 요소입니다.
🔥 KDE의 핵심 요소
1️⃣ 커널 함수(Kernel Function)
커널 함수는 개별 데이터 포인트 주변에서 밀도를 퍼뜨리는 역할을 합니다. 대표적인 커널 함수는 다음과 같습니다.
커널 함수 공식 특징
가우시안 (Gaussian) | K(u)=12πe−u2/2K(u) = \frac{1}{\sqrt{2\pi}} e^{-u^2/2} | 가장 많이 사용됨 |
균등 (Uniform) | ( K(u) = \frac{1}{2}, \quad | u |
삼각형 (Triangle) | ( K(u) = 1 - | u |
Epanechnikov | ( K(u) = \frac{3}{4} (1 - u^2), \quad | u |
2️⃣ 밴드폭(Bandwidth, hh)
밴드폭은 밀도 함수의 부드러움을 결정하는 핵심 요소입니다.
- 너무 작으면(under-smoothing) → 노이즈가 많아지고 과적합(overfitting)
- 너무 크면(over-smoothing) → 데이터의 특징이 사라지고 분포가 과하게 평탄화
밴드폭 선택 방법
- Silverman’s rule-of-thumb: h=1.06⋅σ⋅n−1/5h = 1.06 \cdot \sigma \cdot n^{-1/5}
- Cross-validation (CV): 최적의 hh 값을 찾기 위해 사용
🚀 KDE의 활용 사례
🏙 1️⃣ 공간 데이터 분석 (핫스팟 탐색)
- 범죄 데이터에서 범죄 발생 밀집 지역(Hotspot) 식별
- 부동산 가격이 밀집된 지역을 분석하여 주거지 선호 지역 탐색
- 특정 상권에서 스타벅스, 다이소, 올리브영 등의 밀집도 분석
📊 2️⃣ 금융 및 경제 데이터 분석
- 주식 가격 변동성 밀도를 추정하여 리스크 평가
- 부동산 시장에서 특정 가격대의 거래 빈도 분석
🏥 3️⃣ 의료 및 보건 데이터 분석
- 질병 발생 데이터를 활용한 환자 밀집 지역 시각화
- 특정 바이러스 확산 패턴을 분석하여 감염 클러스터 탐색
📊 Python을 활용한 KDE 분석 예제
1️⃣ 1D 데이터 KDE 분석 (히스토그램과 비교)
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
# 샘플 데이터 생성 (정규분포)
data = np.random.normal(loc=50, scale=10, size=1000)
# KDE 적용
kde = gaussian_kde(data)
# 그래프 시각화
x_vals = np.linspace(min(data), max(data), 1000)
plt.hist(data, bins=30, density=True, alpha=0.5, color='gray', label="Histogram")
plt.plot(x_vals, kde(x_vals), color='red', label="KDE")
plt.legend()
plt.title("KDE vs Histogram")
plt.show()
🔹 결과: KDE는 히스토그램보다 부드러운 분포 곡선을 제공
2️⃣ 2D 공간 데이터 KDE 분석 (핫스팟 탐색)
import geopandas as gpd
from sklearn.neighbors import KernelDensity
# 샘플 데이터 (서울시 범죄 발생 위치)
gdf = gpd.read_file("seoul_crime.geojson")
# KDE 적용
kde = KernelDensity(bandwidth=0.01, kernel='gaussian')
kde.fit(gdf[['경도', '위도']])
# 공간 좌표를 그리드화하여 KDE 적용
import numpy as np
x_grid, y_grid = np.meshgrid(np.linspace(gdf['경도'].min(), gdf['경도'].max(), 100),
np.linspace(gdf['위도'].min(), gdf['위도'].max(), 100))
xy_samples = np.vstack([x_grid.ravel(), y_grid.ravel()]).T
density = kde.score_samples(xy_samples).reshape(x_grid.shape)
# 시각화
plt.figure(figsize=(8, 6))
plt.imshow(density, cmap='Reds', extent=(gdf['경도'].min(), gdf['경도'].max(),
gdf['위도'].min(), gdf['위도'].max()))
plt.scatter(gdf['경도'], gdf['위도'], s=5, color='black', alpha=0.5)
plt.colorbar(label="밀도")
plt.title("서울시 범죄 핫스팟 KDE 분석")
plt.show()
🔹 결과: 범죄 발생이 많은 지역을 **붉은 색(핫스팟)**으로 시각화
🎯 결론
**커널 밀도 추정(KDE)**는 연속형 데이터의 분포를 부드럽게 추정하는 강력한 도구입니다.
✅ 주요 장점
✔ 히스토그램보다 부드럽고 정확한 확률 밀도 추정
✔ 공간 데이터에서 핫스팟 및 이상값 탐색에 유용
✔ 금융, 보건, 부동산, 도시 분석 등 다양한 분야에 적용 가능
✅ 실제 활용 예시
🔹 부동산 시장 분석: 인기 지역 탐색
🔹 범죄 데이터 분석: 위험 지역 식별
🔹 질병 확산 모델링: 감염 클러스터 탐색
📌 공간 데이터 분석과 함께 활용하면 더욱 강력한 인사이트 도출이 가능합니다! 🚀
'💖 Hongsi's Study > 📊 통계・공간통계・공간최적화' 카테고리의 다른 글
[공간통계] 공간회귀분석 (Spatial Regression Analysis): SAR & GWR (0) | 2025.03.18 |
---|---|
[공간통계] Getis-Ord Gi*란? (0) | 2025.03.18 |
[공간통계] Geary's C란? (0) | 2025.03.18 |
[공간통계] Moran's I란? (0) | 2025.03.18 |
[통계 자료] 북한 주요도시 인구 (0) | 2024.12.24 |
댓글