Cox Process와 Marked Point Process로 공간 이벤트 모델링하기

Cox Process와 Marked Point Process의 랜덤 강도·마크 모델을 바탕으로 공간 및 시공간 이벤트의 클러스터링과 이질성을 분석하는 방법을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

랜덤 강도로 포아송 가정의 빈틈을 다루는 방법

공간·시공간 이벤트는 균일하게 발생하지 않고, 특정 구역이나 시점에 모이며 속성도 제각각인 경우가 많다. Cox Process와 Marked Point Process는 이런 클러스터링과 이질성을 확률적으로 표현하는 데 쓰인다.

Cox Process에서는 강도함수 Λ(x) 자체를 확률과정으로 둔다. Λ(x)가 주어진 조건에서는 포아송 과정이지만, 주변적으로 보면 클러스터링과 과산포(overdispersion)를 담을 수 있는 이중 확률 포아송 과정(doubly-stochastic Poisson process)이다.

대표적인 형태인 Log-Gaussian Cox Process(LGCP)는 다음과 같이 강도를 정의한다.

log Λ(x) = μ + Z(x)

여기서 Z(x)는 가우시안 랜덤 필드다. 공간적 상관과 불확실성을 강도 모델 안에 포함할 수 있다.

Marked Point Process는 각 점 x_i에 마크 m_i를 연결한다. 마크는 범주형, 연속형, 벡터형일 수 있으며, p(m|x, Λ, θ_m)로 위치·강도·공간 공변량에 따른 의존성을 모델링한다. 크기, 지속시간, 원인 코드처럼 여러 마크를 한 점에 함께 붙일 수도 있다.

동차 또는 비동차 포아송 과정은 결정적인 λ(x)를 사용하므로 과산포와 클러스터링을 표현하는 데 한계가 있다. Cox Process는 랜덤 강도로 클러스터와 불확실성을 반영하고, Marked Point Process는 관측된 속성까지 분석 범위에 넣는다.

강도와 마크를 함께 설계할 때의 선택지

강도는 결정적으로 둘 수도, 확률적으로 둘 수도 있다. LGCP에서는 공간 상관의 범위와 분산, 비정상성을 표현할 수 있다. 로그 링크를 사용하면 강도를 양수로 유지할 수 있으며, 공변량을 포함한 구성은 다음과 같다.

log Λ(x) = β0 + β^T f(x) + Z(x)

마크가 단순한 경우에는 p(m|x) 또는 p(m|Λ(x))처럼 조건부 독립을 가정할 수 있다. 예를 들어 사고 심각도를 Multinomial(π(x))으로 둘 수 있다. 마크 사이의 상관이나 마크와 위치의 상호작용이 중요하다면 공분산 구조, 공변량, 강도를 포함한 GLM/GLMM, Copula, DDP 등을 적용한다.

LGCP의 추론에는 합성우도(composite likelihood), MCMC, INLA, 변분추론을 선택할 수 있다. 공간을 격자로 나눈 뒤 근사 우도를 계산하는 방식도 사용된다. 적합 뒤에는 K-function/PCF, Quadrat 검정, PIT/CRPS, 스패셜 CV로 진단하며, 경계 보정(edge correction)은 필수다.

생성 단계에서는 비균질 포아송 얇아내기(thinning)를 적용한다. 랜덤 필드를 샘플링하고 λ_max를 구한 다음 후보를 생성해 수락 또는 기각한다. 마크는 p(m|x, Λ)에 따라 독립 또는 종속 구조로 샘플링한다. 규모가 큰 시뮬레이션에서는 벡터화와 타일링이 필요하다.

데이터에서 리스크 맵까지 이어지는 흐름

입력은 좌표형 이벤트 데이터의 시점·위치, 공변량 래스터 또는 벡터, 경계 다각형, 마크 데이터로 구성된다. 전처리 후 강도와 랜덤 필드를 적합하고, 포인트 생성 또는 추론을 수행한 뒤 마크 모델을 붙인다. 검증을 거치면 리스크 맵, 예측 점패턴, 마크 분포 추정, 정책·운영 의사결정 지표를 만들 수 있다.

조건부에러/예외수렴 실패경계편향데이터 수집/정의이벤트, 마크, 경계, 공변량전처리좌표 정합, 투영, 결측/이상치처리강도 모델링λ(x)=exp(βX+Z),하이퍼파라미터 추정포인트 생성/추론Thinning 또는 우도 기반 추정마크 모델링p(m|x, λ, θ_m),GLM/GLMM/Copula검증/진단K/PCF, CV, CRPS, PIT출력/배포리스크 맵, 알림/자원배치 APIλ(x)≤0?하이퍼 재설정MCMC 튜닝스텝/사전 재설정경계 보정/표본 재가중

단순 포아송 모델과 비교할 지점

항목 동차/비동차 Poisson Cox (LGCP) Marked Point Process
성능 고속, 매개변수 적음 중간, 랜덤필드 비용 중간~높음, 마크 차원 영향
확장성 매우 높음 격자/근사 선택에 좌우 마크 수·유형에 좌우
일관성 단순 가정 하 강함 사전/커널 가정 민감 마크-위치 의존성 설계 중요
안정성 과산포/클러스터 미포착 위험 불확실성 캡처, 과적합 위험 모델 복잡도-안정성 트레이드오프
운영 편의 구현 용이 하이퍼파라미터 튜닝 필요 데이터 스키마/피처 관리 필요

LGCP는 커널의 범위와 분산, 격자 해상도에 따라 메모리와 시간 복잡도가 커진다.

사건의 위치와 속성을 같이 보는 장면

도시 안전과 모빌리티에서는 사고·범죄 핫스팟을 추정하고 순찰이나 신호를 최적화하는 데 사용할 수 있다. 교통량과 조도 같은 공변량을 포함해 LGCP를 적합한 뒤 리스크 맵을 만들고, 사고 심각도 마크의 조건부 분포를 추정한다.

통신·보안 운영에서는 장애 이벤트의 클러스터를 탐지하거나 DDoS·침입 패턴을 분석할 수 있다. 시공간 Cox 모델로 버스트를 표현하고, 공격 유형·규모 마크에 GLM을 적용한 뒤 실시간 임계치 기반 경보로 연결한다.

환경·생태 모니터링에서는 수목의 분포와 직경·건강도 마크를 함께 추정해 질병 확산 위험을 예측할 수 있다. LGCP로 서식지 적합도를 모델링하고 직경, 감염 여부를 결합해 보존·방제 자원 배치에 활용한다.

리스크 맵 예측 오차는 동일 공변량 대비 PIT, CRPS 기준으로 1030% 개선 가능하며, 데이터와 도메인에 따라 달라진다. 핫스팟을 기준으로 자원을 재배치하면 대응시간을 515% 단축하고 발생 밀도 상위 k% 영역의 커버리지를 높일 수 있다. 클러스터링과 과산포를 명시적으로 반영하면 설명가능성이 개선되고, 마크를 통해 우선순위와 규모 계획을 포함한 다차원 의사결정을 지원한다.

LGCP를 근사하고 마크를 부여하는 코드

다음 예시는 가우시안 필터로 근사한 랜덤 필드를 사용한다. 환경은 Python 3.10+, numpy>=1.23, scipy>=1.10이며, 데모 용도다. 대규모 또는 정밀 추정에는 전용 패키지를 권장한다.

# Python 3.10+, numpy 1.23+, scipy 1.10+
import numpy as np
from scipy.ndimage import gaussian_filter
from scipy.interpolate import RegularGridInterpolator

rng = np.random.default_rng(42)

# 1) 공간 격자 및 랜덤 필드(Z) 생성
L = 64  # 격자 해상도
x = np.linspace(0, 1, L)
y = np.linspace(0, 1, L)
xx, yy = np.meshgrid(x, y, indexing='xy')

# 백색 잡음 → 가우시안 필터로 평활화(랜덤 필드 근사)
Z = gaussian_filter(rng.standard_normal((L, L)), sigma=3.0)
Z = (Z - Z.mean()) / Z.std()

# 2) 강도함수 Lambda(x) 구성: log Lambda = mu + sigma*Z
mu, sigma = -1.2, 1.0
Lambda = np.exp(mu + sigma * Z)  # 양수 보장
Lambda_max = float(Lambda.max())
assert Lambda_max > 0.0

# 3) 비균질 포아송 얇아내기(thinning)
area = 1.0  # [0,1]^2
N_prop = rng.poisson(Lambda_max * area)  # 후보 수
# 균일 위치 샘플
U = rng.random((N_prop, 2))
# 격자 보간으로 Lambda(x) 평가
interp = RegularGridInterpolator((x, y), Lambda.T, bounds_error=False, fill_value=None)
lam_u = interp(U)

# 수락 확률
acc_prob = lam_u / Lambda_max
accept = rng.random(N_prop) < acc_prob
points = U[accept]
print(f"생성된 포인트 수: {len(points)}")

# 4) 마크 생성 예시
#   - 범주형 마크: 고위험(1)/저위험(0) 확률 = sigmoid(a + b*log Lambda)
def sigmoid(z): return 1 / (1 + np.exp(-z))
a, b = -1.0, 1.2
lam_at_pts = interp(points)
p_high = sigmoid(a + b * np.log(lam_at_pts))
mark_cat = (rng.random(len(points)) < p_high).astype(int)

#   - 연속형 마크: Gamma(shape=k, scale=θ), θ가 Lambda에 역비례
k = 2.0
theta = 0.5 / (lam_at_pts + 1e-6)
mark_cont = rng.gamma(shape=k, scale=theta)

print(f"범주형 1 비율: {mark_cat.mean():.3f}, 연속형 마크 평균: {mark_cont.mean():.3f}")

Lambda_max가 평균보다 훨씬 클 때는 얇아내기 효율이 떨어진다. 타일별 최대값을 쓰거나 적응형 얇아내기를 적용할 수 있다. 수치 안정성을 위해 λ(x)의 하한을 예를 들어 1e-9로 설정하고, 경계 보정과 공간 CV로 일반화 성능을 점검한다. 시공간으로 확장할 때는 시간 축을 더하고 AR(1)/OU 프로세스로 Z(x,t)를 정의한다.

복잡도를 높이기 전에 확인할 트레이드오프

범위와 분산에는 약한 정보 사전을 적용하고 민감도 분석을 병행할 수 있다. 다만 지나친 평활화는 핫스팟을 사라지게 하고, 평활화가 부족하면 과적합과 노이즈로 이어진다.

격자 해상도는 분석 목표 해상도의 2~4배로 오버샘플링하되 메모리 예산 안에서 정한다. 고해상도는 정확도와 계산·메모리 비용 사이의 선택이다.

마크 의존성은 단순한 독립 가정에서 시작해 잔차 상관을 확인한 뒤 종속 구조를 추가하는 편이 낫다. 모델이 복잡해질수록 해석성과 안정성은 낮아질 수 있다.

Cox Process와 Marked Point Process는 랜덤 강도와 마크 의존성으로 현실 이벤트의 클러스터링과 이질성을 모델링한다. 전처리, 강도, 마크, 검증을 순서대로 다루고 경계 보정·CV·진단 지표를 함께 적용해야 한다. 근사와 추론 기법은 필요한 수준까지 점진적으로 복잡하게 선택한다.

포인트 프로세스Cox Process공간 통계LGCP마크 분포