포인트 프로세스로 이벤트 발생 패턴 모델링하기
Poisson·Hawkes·Cox 포인트 프로세스의 조건부 강도, 군집성, 안정성 조건과 이벤트 로그 모델링·검증 방법을 정리한다.
2026-08-14 · 최초 발행 2025-10-14
이벤트 로그에서 먼저 봐야 할 것은 강도의 변화 방식이다
포인트 프로세스는 시간이나 공간에서 발생하는 불연속 사건의 위치와 시점을 기술하는 확률 과정이다. 중심에는 과거 이력 (H_t)가 주어졌을 때의 즉시 발생률인 조건부 강도 함수 (\lambda(t \mid H_t))가 있다.
사건이 서로 무관하게 발생하는지, 앞선 사건이 뒤따르는 사건을 부르는지, 또는 외부 환경 변화가 발생률을 흔드는지에 따라 선택할 모델이 달라진다.
Poisson Process는 사건 간 독립성과 무기억성을 전제로 한다. 강도는 일정한 (\lambda)일 수도 있고, 시간에 따라 달라지는 (\lambda(t))일 수도 있다. 발생 수는 포아송 분포를 따르고 사건 간 간격은 지수 분포를 따른다.
Hawkes Process는 자기흥분성을 모델에 넣는다. 이전 사건이 단기적으로 다음 사건의 강도를 높이는 구조이며, 강도는 다음처럼 표현한다.
[ \lambda(t) = \mu(t) + \Sigma g(t - t_i) ]
여기서 (g(\cdot))는 커널이며, 예를 들어 (\alpha \exp(-\beta t))를 사용할 수 있다. branching ratio는 (n = \int g)이고, 안정성을 위해 (n < 1)이어야 한다.
Cox Process는 Doubly Stochastic Poisson Process라고도 한다. 강도 (\lambda(t)) 자체를 확률과정으로 보고, 강도가 주어졌을 때는 Poisson으로 모델링한다. 이 구조는 주변적으로 이질성과 오버디스퍼전을 표현할 수 있다. 강도 과정은 가우시안 프로세스, 상태공간, 스플라인+랜덤효과 등으로 구성할 수 있다.
의존성과 군집성을 기준으로 모델을 고른다
Poisson 모델에서 핵심은 (\lambda) 또는 (\lambda(t))를 추정하는 일이다. 베이스라인 강도 추정 문제로 정리할 수 있다.
Hawkes 모델은 베이스라인 (\mu)와 커널 (g)의 파라미터를 함께 추정한다. 사건이 사건을 유발하는 군집 구조를 표현할 수 있어 여진이나 버스트 패턴에 맞는다.
Cox 모델은 (\lambda(t))의 사전 구조를 정해야 한다. 잠재 강도 과정까지 추정해야 하므로 불확정성이 커진다. 대신 환경이나 상태 변화에 따른 이질적 발생률을 모델 안에 담을 수 있다.
세 모델의 군집성 원인은 다르다. Poisson에는 독립 발생을 가정하므로 군집성이 없다. Hawkes의 군집은 사건 간 영향에서 나오고, Cox의 군집은 외생적 이질성이나 잠재 강도 변동에서 비롯된다.
안정성 조건도 구분해야 한다. Poisson은 (\lambda(t) \ge 0)을 만족해야 하며 시간에 따른 비정상성은 허용된다. Hawkes는 (n \ge 1)일 때 발산 위험이 있으므로 branching ratio를 계속 확인해야 한다. Cox는 (\lambda(t) \ge 0) 보장과 함께 상태모형의 안정성, 사전 설정의 적절성을 검토한다.
추정에는 최대우도(MLE), EM, Ogata thinning 기반의 방법을 사용할 수 있다. 적합 뒤에는 time-rescaling으로 잔차를 변환하고, 균일성 및 독립성 검정에 KS와 ACF를 적용한다.
금융·운영·재난 이벤트에 나타나는 차이
금융 틱데이터와 시장 마이크로구조에서는 호가·체결 이벤트의 버스트와 유동성 리스크를 다룰 수 있다. Hawkes는 자기흥분성을 반영하는 데 쓰이고, 시장 레짐 변동성처럼 외생 강도가 바뀌는 상황은 Cox로 포착할 수 있다.
IT 운영과 SRE 환경에서는 알람 스톰 탐지 및 예측 확률 추정이 대상이 된다. 상관된 알람 전파는 Hawkes 커널로 모델링할 수 있으며, 배포나 장애 윈도우에 따른 이질적 강도는 Cox 또는 비균질 Poisson에 반영한다.
소셜과 마케팅 반응 분석에서는 캠페인이나 게시물 확산을 초기 충격과 전염 효과로 나눌 수 있다. Hawkes의 (\mu)와 (g)는 이 분해에 사용되며, 요일과 시간대 패턴은 (\lambda(t))의 캘린더 효과로 모델링한다.
지진·여진 시계열에서는 Hawkes(ETAS)로 여진군을 다루고 (n < 1)을 모니터링한다. 기상과 지역 조건에서 비롯되는 공간-시간 이질성은 Cox의 랜덤 강도로 반영할 수 있다.
로그를 정리하고 강도를 검증까지 연결한다
입력은 타임스탬프 이벤트 로그, 관측 윈도우 ([0, T]), 보조 공변량이다. 처리 단계에서는 타임존·중복·서머타임을 정규화하고, 윈도우를 절단한 뒤 학습·검증 데이터를 나누어 모델을 적합한다. 결과로 강도 추정, 이벤트 예측, 이상치·버스트 경보, 시뮬레이션 기반 용량 산정을 얻는다.
Ogata thinning에서는 (t \leftarrow 0)에서 시작해 (\bar{\lambda} \ge \sup \lambda(t))인 상계를 선택한다. (u_1, u_2 \sim U(0,1))을 뽑고 (t \leftarrow t - \ln(u_1)/\bar{\lambda})로 다음 후보 시점을 만든다. (u_2 \le \lambda(t)/\bar{\lambda})이면 사건을 수용하고, 그렇지 않으면 거절한다. (t \ge T) 또는 충분한 사건이 발생하면 종료한다.
이 과정에서는 (\lambda(t))가 음수가 되지 않도록 하고, (\bar{\lambda})가 상계에 미달할 때 발생할 수 있는 수용률 저하와 편향 위험을 관리해야 한다. 수치 언더플로우도 고려 대상이다.
Hawkes를 실시간으로 운영할 때는 (n = \int_0^\infty g(s) ds < 1)을 유지하도록 지표와 경보 임계치를 관리한다. 지수 커널은 재귀 누적으로 최적화할 수 있지만, 커널 누적 합계의 누적오차 역시 점검해야 한다.
모델별 추정·운영 특성
| 항목 | Poisson Process | Hawkes Process | Cox Process |
|---|---|---|---|
| 의존성 구조 | 독립 | 자기흥분성(과거 사건 영향) | 외생 이질성(랜덤 강도) |
| 군집성/버스트 | 낮음 | 높음(커널형태에 좌우) | 중간~높음(잠재 강도 변동) |
| 일관성/해석성 | 높음, 단순 λ 해석 용이 | μ vs g 분해로 해석 가능 | 강도 과정 해석 난이도 존재 |
| 안정성 조건 | λ(t) ≥ 0 | n = ∫ g < 1 필수 | λ(t) ≥ 0, 상태모형 안정성 필요 |
| 추정 복잡도 | 낮음(폐형/수치 MLE) | 중간~높음(MLE/EM/경사법) | 높음(라틴트 과정 추정 필요) |
| 확장성 | 우수(대규모·온라인 용이) | 우수(지수 커널 재귀로 O(1)/사건 갱신) | 중간(근사·변분/SG-MCMC 필요) |
| 운영 편의 | 매우 우수 | 우수(안정성 모니터링 필요) | 보통(하이퍼/사전 설정 및 드리프트 관리 필요) |
Python으로 강도 기반 이벤트를 시뮬레이션한다
전제는 numpy 설치이며, 시각화에는 선택적으로 matplotlib를 사용할 수 있다. 난수 시드를 지정해 재현성을 확보한다.
비균질 Poisson 프로세스 시뮬레이션
import numpy as np
def simulate_inhom_poisson(intensity_fn, T, lam_upper, seed=42):
rng = np.random.default_rng(seed)
t, events = 0.0, []
while True:
t += -np.log(rng.uniform()) / lam_upper
if t > T:
break
if rng.uniform() <= max(0.0, intensity_fn(t)) / lam_upper:
events.append(t)
return np.array(events)
# 예: 일중 패턴 λ(t) = 5 + 15*sin^2(π t / T)
T = 3600.0
def lam_t(t):
return 5.0 + 15.0 * (np.sin(np.pi * t / T) ** 2)
events = simulate_inhom_poisson(lam_t, T, lam_upper=20.0)
print("Poisson events:", len(events))
지수 커널 Hawkes 시뮬레이션
import numpy as np
def simulate_hawkes_exp(mu, alpha, beta, T, seed=123):
assert alpha / beta < 1.0, "안정성 위반: branching ratio alpha/beta < 1 필요"
rng = np.random.default_rng(seed)
t, last, events = 0.0, 0.0, []
lambda_star = mu # 초기 상계
while t < T:
t += -np.log(rng.uniform()) / max(lambda_star, 1e-12)
if t > T: break
# 현재 강도 계산: μ + α * sum(exp(-β (t - ti)))
if events:
decay = np.exp(-beta * (t - np.array(events)))
lam_t = mu + alpha * np.sum(decay)
else:
lam_t = mu
# 상계 갱신(보수적): μ + α * (1 + 이전 잔광)
lambda_star = max(lambda_star, lam_t)
if rng.uniform() <= lam_t / max(lambda_star, 1e-12):
events.append(t)
# 점프 직후 상계 증가
lambda_star = lam_t + alpha
else:
# 거절 시 상계 소폭 감소(안정화)
lambda_star = max(mu + 1e-6, 0.9 * lambda_star)
return np.array(events)
events = simulate_hawkes_exp(mu=0.5, alpha=0.6, beta=1.2, T=100.0)
print("Hawkes events:", len(events))
실제 Ogata 구현에서는 시간에 따른 상계를 더 엄밀히 관리해야 한다. 위 코드는 교육용 간소화 버전이다.
조각별 랜덤 강도를 둔 Cox 프로세스
import numpy as np
def simulate_cox_piecewise(T, bins=50, shape=2.0, rate=1.0, seed=7):
# 1) 조각별 강도 λk ~ Gamma(shape, rate)로 양의 랜덤 강도 생성
rng = np.random.default_rng(seed)
dt = T / bins
lam = rng.gamma(shape, 1.0/rate, size=bins) # 평균 shape/rate
# 2) 각 조각에서 Poisson(Nk ~ Poisson(λk * dt)) 샘플링 후 균일 배치
events = []
t0 = 0.0
for k in range(bins):
nk = rng.poisson(lam[k] * dt)
if nk > 0:
events_k = t0 + rng.uniform(0.0, dt, size=nk)
events.extend(events_k.tolist())
t0 += dt
return np.sort(np.array(events)), lam
events, lam_pw = simulate_cox_piecewise(T=100.0, bins=40, shape=2.0, rate=1.0)
print("Cox events:", len(events), "평균 강도:", lam_pw.mean())
Time-rescaling에서는 (\tau_i = \int_{t_{i-1}}^{t_i} \lambda(s) ds)로 변환한 뒤 지수(1) 적합성을 확인한다. KS와 QQ-plot, 잔차 ACF로 독립성을 점검하고, Hawkes에서는 (n) 추정과 (\mu) 분해를 함께 확인한다.
예측·용량 계획·원인 분해에 쓰이는 결과
버스트와 여진 구조를 반영하면 순간 이벤트율 예측 MAE가 1030% 개선될 수 있으며, 도메인과 데이터에 따라 달라진다. 알람 스톰의 사전 경보에서는 조기 탐지 리드타임이 520% 증가할 수 있다.
시뮬레이션 기반 용량 계획은 피크 대비 과다·과소 프로비저닝을 줄여 인프라 비용을 5~15% 절감할 수 있다. SLA 위반 확률을 추정하고 완화 정책을 세우는 데도 연결된다.
Hawkes는 exogenous((\mu))와 endogenous((g))를 나누어 원인과 결과를 분리하는 데 쓰인다. Cox는 환경과 레짐의 이질성을 드러내 변화점 탐지를 지원한다.
독립성, 사건 간 영향, 환경 변동 중 무엇이 이벤트 발생을 주도하는지에 맞춰 Poisson, Hawkes, Cox를 선택하거나 결합할 수 있다. 이때 안정성 (n < 1), 잔차 검증, 온라인 갱신을 모델 운영 체계에 함께 둬야 한다.