소셜미디어 확산을 Hawkes 과정으로 — 분기율 n*는 무엇을 말하는가

리트윗이 리트윗을 부르는 확산을 점과정으로 모델링한다. 트위터 cascade 20개에서 분기율 n*가 임계선에 바싹 붙는 현상을 직접 재현하고, 그 숫자를 어떻게 의심하고 추궁하는지 보인다.

1. 왜 하필 이 모델인가 — 리트윗이 리트윗을 부를 때

트위터(현 X)에서 누군가 글을 하나 올립니다. 이 글을 트윗(tweet)이라 부릅니다. 다른 사람이 그 트윗을 자기 팔로워에게 그대로 퍼뜨리는 행동이 리트윗(retweet)입니다. 그리고 그 리트윗을 본 또 다른 사람이 다시 리트윗하고… 이렇게 하나의 원본 트윗에서 가지를 치며 퍼져 나간 리트윗 전체의 묶음을, 정보 확산의 사슬이라는 뜻에서 cascade(캐스케이드)라고 부릅니다. 우리말로는 확산 사슬 정도가 적당합니다.

바이럴(viral)이라는 말은 바로 이 사슬이 바이러스처럼 사람에서 사람으로 번져 커지는 현상을 가리킵니다. 우리가 답하고 싶은 질문은 소박합니다. 이 사슬은 얼마나 잘 번지는가? 좀 더 정확히는 — 리트윗 하나가 평균적으로 몇 개의 새 리트윗을 직접 불러오는가? 이 수가 크면 사슬은 눈덩이처럼 커지고, 작으면 몇 다리 못 가 사그라듭니다.

이 질문에 답하려면 “사건이 또 다른 사건을 불러오는” 구조를 다룰 수 있는 수학 도구가 필요합니다. 가장 널리 쓰이는 것이 이 글의 주인공인 Hawkes 과정(호크스 프로세스)입니다. 이름은 1971년 이 모델을 제안한 통계학자 Alan Hawkes에서 왔습니다.[1] 이 글의 목표는 이 모델을 — 통계를 전공하지 않은 분도 따라올 수 있도록 — 개념부터 쌓아 올려, 실제 트위터 데이터에 우리 손으로 적합시켜 보는 것입니다.

2. 사건이 사건을 부른다 — Hawkes 과정

먼저 비교 대상부터 봅시다. 어떤 사건이 완전히 무작위로, 서로 무관하게 일어난다고 해봅시다. 예를 들어 한적한 시골 도로를 지나가는 자동차. 한 대가 지나갔다고 다음 차가 더 빨리 오지는 않습니다. 이렇게 “과거가 미래에 영향을 주지 않는” 사건 흐름을 푸아송 과정(Poisson process)이라 부릅니다. 사건이 일어나는 평균 빈도가 시간에 관계없이 일정한, 가장 단순한 모형입니다.

리트윗은 다릅니다. 누군가 리트윗하면 그의 팔로워들이 그 글을 보게 되고, 그래서 다음 리트윗이 일어날 가능성이 잠깐 올라갑니다. 즉 과거의 사건이 미래의 사건을 끌어올립니다. 이렇게 “자기 자신을 촉발한다”는 뜻에서 Hawkes 과정을 자기촉발 점과정(self-exciting point process)이라고 부릅니다. 점과정이란 시간 축 위에 사건들이 점처럼 찍히는 과정을 말합니다.

이 “끌어올림”을 어떻게 수치로 표현할까요? 매 순간 사건이 일어나려는 기세를 생각합니다. 평소에는 낮다가, 사건이 하나 터지면 확 치솟고, 시간이 지나면 다시 가라앉는 기세. 이 기세를 강도(intensity)라 하고 $\lambda(t)$로 씁니다. 직관적으로 $\lambda(t)$가 높을수록 그 순간 사건이 일어나기 쉽습니다.

Hawkes 과정의 핵심 발상은 이겁니다. 지금 이 순간의 기세는, 과거에 일어난 모든 사건이 각각 남긴 여운을 전부 더한 것이다. 사건 하나하나가 터질 때 기세를 끌어올리고, 그 끌어올림은 시간이 지나며 서서히 식습니다. 식어가는 그 여운의 모양을 함수로 그린 것을 커널(kernel) $\varphi$라 합니다. 그러면 지금의 기세는 과거 사건들의 여운을 모두 합한 값이 됩니다.

λ(t)  =  tj<tφ(ttj)\lambda(t) \;=\; \sum_{t_j < t} \varphi(t - t_j)
지금 시각 $t$의 기세 $\lambda(t)$는, 지금보다 앞서 일어난 모든 사건 $t_j$가 남긴 여운 $\varphi(t-t_j)$를 전부 더한 값이다. $t-t_j$는 “그 사건이 일어난 지 얼마나 지났는가”이고, $\varphi$는 그 경과 시간에 따라 여운이 얼마나 남아 있는지를 준다.

커널 $\varphi$의 모양을 어떻게 정하느냐가 모델의 성격을 결정합니다 — 여운이 빠르게 식는지, 오래 끄는지. 이 선택이 뒤에서 이야기의 한 축이 됩니다. 지금은 “사건마다 여운을 남기고, 그 여운의 합이 기세”라는 그림만 쥐고 가면 충분합니다.

3. 사슬은 불어나는가 잦아드는가 — 분기율 n*

이제 1절의 질문 “리트윗 하나가 평균 몇 개의 새 리트윗을 직접 부르는가”로 돌아갑니다. Hawkes 과정에는 이 수에 정확히 대응하는 양이 있습니다. 분기율(branching ratio) $n^*$입니다. 가지(branch)를 얼마나 치는가의 비율이라는 뜻입니다.

가장 친숙한 비유는 전염병입니다. 감염자 한 명이 평균 몇 명에게 직접 옮기는가를 감염재생산수라 하고 $R$이라 씁니다. 코로나 시기에 “$R$이 1을 넘으면 유행이 커진다”는 말을 많이 들으셨을 겁니다. 분기율 $n^*$는 정보 확산판 $R$입니다. 이건 느슨한 비유가 아니라 수학적으로 증명된 등식입니다 — Hawkes 과정과 전염병 SIR 모형을 잇는 연구에서, 둘을 적절히 대응시키면 분기율과 기초감염재생산수가 정확히 같아진다는 것이 보여졌습니다($n^*=R_0$).[9]

그래서 $R$을 읽듯 $n^*$를 읽으면 됩니다.

$n^*<1$ 임계 미만(subcritical). 한 사건이 평균 한 개 미만을 부르니, 사슬은 갈수록 힘을 잃고 반드시 사그라든다.
$n^*=1$ 임계(critical). 딱 본전. 평균적으로 자신을 하나씩만 대체하는, 꺼지지도 폭발하지도 않는 경계.
$n^*>1$ 초임계(supercritical). 한 사건이 평균 한 개 넘게 부르니, 사슬이 멈추지 않고 폭발할 수 있다.

이 분류는 Hawkes 과정을 “이민-출산 과정”으로 보는 고전적 관점에서 나옵니다.[2] 씨앗 트윗을 이민자(외부에서 들어온 첫 사건), 그것이 부른 리트윗을 자식, 자식이 부른 리트윗을 손자… 로 보면, $n^*$는 한 세대가 평균 몇 명의 자식을 남기는지에 해당합니다. 자식을 평균 한 명 미만 남기면 가문은 언젠가 끊기고($n^*<1$), 한 명 넘게 남기면 불어납니다($n^*>1$). 인구학의 직관 그대로입니다.

그러면 $n^*$는 커널 $\varphi$로부터 어떻게 계산될까요? 정의는 단순합니다 — 한 사건이 남기는 여운을 시간 전체에 걸쳐 모두 더한 양이 곧 그 사건이 평균적으로 부르는 자식의 수, 즉 $n^*$입니다.

n  =  0φ(τ)dτn^{*} \;=\; \int_{0}^{\infty} \varphi(\tau)\, d\tau
한 사건이 일어난 뒤 경과 시간 $\tau$에 대해 여운 $\varphi(\tau)$를 0부터 무한대까지 적분(연속적인 합)한 값. “그 사건이 평생 동안 끌어올린 기세의 총량”이 곧 평균 자식 수 $n^*$가 된다.

이 글에서 먼저 쓸 커널은 여운이 지수적으로 식는 가장 단순한 형태, 지수 커널(exponential kernel)입니다. 사건 직후 크기 $\alpha$로 치솟았다가 속도 $\delta$로 식는 모양입니다. 이 커널을 위 적분에 넣으면 $n^*$가 아주 깔끔한 형태로 나옵니다.

φ(τ)  =  αeδτn  =  0αeδτdτ  =  αδ\varphi(\tau) \;=\; \alpha\, e^{-\delta \tau} \quad\Longrightarrow\quad n^{*} \;=\; \int_{0}^{\infty} \alpha\, e^{-\delta \tau}\, d\tau \;=\; \frac{\alpha}{\delta}
$\alpha$는 사건 직후 여운의 크기(얼마나 세게 끌어올리나), $\delta$는 식는 속도(얼마나 빨리 가라앉나). 둘의 비 $\alpha/\delta$가 분기율이다. “$\Longrightarrow$”는 왼쪽 커널을 위 적분 정의에 넣으면 오른쪽이 유도된다는 뜻이다. 세게 끌어올릴수록($\alpha$↑) $n^*$가 크고, 빨리 식을수록($\delta$↑) 작아지는 것이 직관과 맞는다.

이제 도구가 갖춰졌습니다. 사건이 사건을 부르는 과정(Hawkes), 그 번짐의 세기를 재는 한 숫자($n^*=\alpha/\delta$), 그리고 그 숫자를 읽는 법(1을 기준으로 한 임계 분류). 다음으로 할 일은, 이 $\alpha$와 $\delta$를 실제 데이터로부터 알아내는 것입니다. 그러려면 먼저 데이터가 어떻게 생겼는지부터 봐야 합니다.

4. 데이터를 만나다 — SMH 리트윗 cascade

모델에 숫자를 채우기 전에, 그 숫자가 나올 데이터를 먼저 들여다봅니다. 우리가 쓰는 것은 SMH라는 이름의 데이터셋입니다. 출처를 분명히 해두는 게 중요한데 — 이 데이터는 바로 우리가 따라가고 있는 그 Hawkes 튜토리얼(Rizoiu 외, 2017)[8]의 공개 저장소에 딸려 배포된 예제 데이터입니다. 2017년 호주 일간지 Sydney Morning Herald(약칭 SMH)의 트위터 계정을 추적해 모은 리트윗 cascade 20개로 이루어져 있습니다.[10] 즉 이 글은 “남의 벤치마크로 새 발견을 했다”가 아니라, 교과서가 쓰는 바로 그 예제 데이터를, 우리 손으로 처음부터 다시 분석하는 재현 작업입니다.

각 cascade는 CSV 파일 하나이고, 한 줄이 트윗 하나입니다. 열은 세 개입니다 — 사건 시각(씨앗으로부터 몇 초 뒤인가, 그래서 첫 줄은 항상 0), magnitude(그 트윗을 올린 사용자의 팔로워 수), 익명화된 사용자 ID.[10] 우리가 지금 쓰는 단순 모델은 시각만 사용합니다(팔로워 수는 뒤에서 다시 이야기합니다).

데이터가 어떻게 생겼는지 두 가지만 봅니다.

좌: 20개 cascade의 누적 이벤트 곡선 — 초반에 몰리고 긴 꼬리. 우: cascade 크기 분포, 중앙값 76, 총 2104개.
(A) 20개 cascade 각각에서 누적 이벤트 비율을 정규화 시간(0=씨앗, 1=마지막 리트윗)에 대해 그렸다. 거의 모든 곡선이 왼쪽 위로 급히 솟구친 뒤 평평해진다. 중앙값으로 보면 전체 리트윗의 절반이 cascade가 사는 시간의 단 10% 안에 일어난다. 처음 잠깐 폭발하고, 나머지는 길고 성긴 꼬리다. (B) cascade 크기는 50개에서 317개까지 제각각이고, 중앙값은 76, 20개를 합치면 2,104개 이벤트다.

이 “초반 폭발 + 긴 꼬리” 모양을 기억해 두십시오. 사건 사이 간격이 처음엔 촘촘하다가 갈수록 벌어지고, 많은 cascade가 한참 잠잠하다 끝납니다(20개 중 16개에서 마지막 간격이 그 cascade 평균 간격의 3배를 넘습니다). 이 구조가 뒤에서 $n^*$를 해석할 때 결정적인 역할을 합니다.

5. 모델을 데이터에 맞추기 — 최대우도추정

이제 핵심 작업입니다. 데이터는 사건이 일어난 시각들만 줍니다. 우리가 알고 싶은 건 커널의 $\alpha$와 $\delta$(그래서 $n^*=\alpha/\delta$)인데, 이건 데이터에 직접 적혀 있지 않습니다. 관측된 시각들을 가장 그럴듯하게 만들어내는 $\alpha,\delta$를 거꾸로 찾아내는 것 — 이것이 적합(fitting)이고, 그 표준 방법이 최대우도추정(maximum likelihood estimation, MLE)입니다.[3]

“가장 그럴듯하게”를 수치로 만든 것이 우도(likelihood)입니다. 점과정의 로그우도는 두 항의 줄다리기로 되어 있습니다.[4]

logL  =  ilogλ(ti)① 보상    0Tλ(s)ds② 벌점\log L \;=\; \underbrace{\sum_{i} \log \lambda(t_i)}_{\text{① 보상}} \;-\; \underbrace{\int_{0}^{T} \lambda(s)\, ds}_{\text{② 벌점}}
① 보상 항: 실제로 사건이 일어난 순간 $t_i$마다 그때의 기세 $\lambda(t_i)$가 높았을수록 커진다 — “사건이 난 자리에선 기세가 높았어야 한다.” ② 벌점 항: 관측 구간 $[0,T]$ 전체에 걸쳐 기세를 적분한 것으로, 기세를 높게 잡을수록 커지는 벌점이다 — “기세를 높게 잡았다면 그만큼 사건이 더 났어야 하는데, 안 난 만큼은 감점.” 적합은 이 둘의 합 $\log L$을 가장 크게 만드는 $\alpha,\delta$를 찾는다.

왜 벌점이 필요할까요? 보상만 있다면 기세를 무한히 키우는 게 언제나 유리할 겁니다. 벌점이 그걸 막습니다 — “그렇게 기세가 높았다면 왜 사건이 그만큼 안 났느냐”고 되묻는 것이죠. 두 힘이 균형을 이루는 지점이 데이터에 가장 잘 맞는 $\alpha,\delta$입니다. 우리 cascade 모델($\mu=0$, 지수 커널)에서는 이 두 항을 닫힌 형태로 쓸 수 있어, 컴퓨터가 수치 최적화로 최댓값을 찾습니다.

이걸 직접 코드로 구현했습니다. 핵심은 로그우도 함수 하나와, 그것을 최대화(음의 로그우도를 최소화)하는 최적화 호출입니다. 여러 시작점에서 출발해 가장 좋은 해를 고르는데, 이는 우도 곡면이 울퉁불퉁해 한 번의 시도로는 엉뚱한 봉우리에 갇힐 수 있다는 알려진 주의사항[7]을 따른 것입니다.

python
import numpy as np
from scipy.optimize import minimize

def neg_log_likelihood(params, t, T):
    log_alpha, log_delta = params          # 양수 보장 위해 로그공간에서 최적화
    a, d = np.exp(log_alpha), np.exp(log_delta)
    # ① 보상: 각 사건 시각에서의 로그 기세 (자신보다 앞선 사건들의 여운 합)
    reward = 0.0
    for i in range(1, len(t)):
        intensity = a * np.sum(np.exp(-d * (t[i] - t[:i])))
        reward += np.log(intensity)
    # ② 벌점: 구간 전체에 걸친 기세의 적분 (지수커널은 닫힌 형태)
    penalty = np.sum((a / d) * (1.0 - np.exp(-d * (T - t))))
    return -(reward - penalty)            # 음의 로그우도

def fit_exponential(t, T, n_starts=10, seed=0):
    rng = np.random.default_rng(seed); best = None
    for _ in range(n_starts):             # 여러 시작점 -> 가장 좋은 해 채택
        x0 = rng.uniform(-12, 0, size=2)
        r = minimize(neg_log_likelihood, x0, args=(t, T),
                     method="L-BFGS-B", bounds=[(-23, 2.3)] * 2)
        if r.success and (best is None or r.fun < best.fun):
            best = r
    a, d = np.exp(best.x)
    return {"alpha": a, "delta": d, "n_star": a / d}   # n* = alpha / delta

이 코드를 20개 cascade에 각각 돌렸습니다. 관측 종료 시각 $T$는 관례대로 그 cascade의 마지막 사건 시각으로 두었습니다(데이터가 거기서 끝나니까요). 결과는 이렇습니다.

20 / 20
전부 수렴 (적합 성공)
$n^* \approx 0.99$
20개 cascade의 분기율 중앙값
(개별값은 대부분 0.97~1.00에 응집)

숫자가 직접 나왔습니다. 20개 cascade 전부 적합에 성공했고, 추정된 분기율 $n^*$의 중앙값은 약 0.99 — 임계선 $n^*=1$에 바싹 붙은 값입니다. 3절의 분류로 읽으면 임계 근접(near-critical), 즉 “폭주 직전의 아슬아슬한 상태”라는 해석이 따라옵니다.

그런데 여기서 멈추고 의심해야 합니다. 이 0.99는 정말 “트위터 바이럴이 본질적으로 임계 상태”라는 뜻일까요? 아니면 우리가 모델을 적합하는 방식이 만들어낸 숫자일까요? 흥미롭게도, 우리가 따라온 바로 그 튜토리얼도 같은 종류의 데이터에서 거의 같은 값($n^*=0.997$)을 얻고는, 그것을 “임계의 증거”가 아니라 다른 신호로 읽습니다.[8] 다음 절에서 이 숫자를 어떻게 읽어야 하는지 — 그리고 왜 한 가지로 단정할 수 없는지 — 를 정직하게 따져봅니다.

6. 이 0.99를 어떻게 읽을까 — 두 갈래의 해석

$n^*\approx0.99$. 액면 그대로 읽으면 “트위터 바이럴은 폭주 직전의 임계 상태”라는 멋진 결론이 됩니다. 하지만 결론을 내리기 전에, 이 숫자가 나온 두 가지 가능한 경로를 갈라봐야 합니다. 하나는 데이터가 정말 그렇다는 것이고, 다른 하나는 우리가 적합한 방식이 그렇게 만들었다는 것입니다. 이 분야의 문헌도 정확히 이 두 갈래로 나뉘어 있습니다.

갈래 하나 — 진짜 임계라는 관점. 금융 시장에서 거래의 자기촉발을 Hawkes로 재면 분기율이 1에 매우 가깝게 나온다는 보고가 있습니다. Hardiman, Bercot, Bouchaud(2013)는 E-mini S&P 선물 데이터에서 커널의 적분이 분석 기간과 무관하게 1에 수렴한다고 보고하며, 시장이 늘 임계 근처에서 작동해왔다고 해석합니다.[6] 이 관점에서 보면 $n^*\approx1$은 자기조직화된 임계성의 실재하는 증거입니다.

갈래 둘 — 추정의 함정이라는 관점. 같은 현상을 정반대로 읽는 강력한 반론이 있습니다. Filimonov & Sornette(2015)는 같은 종류의 금융 데이터를 분석하며, 임계로 보이는 그 값이 상당 부분 추정 과정의 인공물일 수 있음을 보입니다.[7] 그들이 짚은 함정들은 구체적입니다 — 소수의 이상치(outlier)나, 데이터 생성 과정이 도중에 바뀌는 레짐 변화(regime shift)가 있으면, 참값이 임계가 아니어도 추정된 분기율이 1 근처로 끌려 올라간다는 것입니다. 실제로 그들은 참 분기율이 0인 인위적 데이터에서조차 추정이 1 근처를 맴도는 사례를 만들어 보입니다.

여기서 정직해야 할 대목이 있다. Filimonov & Sornette의 분석은 고빈도 금융 데이터를 대상으로 하고, 그들이 짚은 편향의 상당수는 멱법칙 커널을 쓸 때의 문제다. 우리의 트위터 cascade와 지수 커널에 이 결론을 그대로 옮길 수는 없다. 다만 그들의 핵심 교훈 — “$n^*\approx1$은 그 자체로 임계의 증거가 못 되며, 데이터 구조와 추정 방식이 만든 값일 수 있다” — 은 도메인을 넘어 새겨둘 만하다. 이 두 논문은 사실 서로 다른 숫자를 두고 논쟁 중이다(전자는 $n^*\approx1$, 후자는 자신들의 추정으로 $n\approx0.7$–$0.8$). 결론이 합의되지 않은 영역이라는 뜻이다.

그리고 우리가 따라온 튜토리얼(Rizoiu 외, 2017) 자체가 세 번째 단서를 줍니다. 그들은 한 리트윗 cascade에 지수 커널을 적합해 $n^*=0.997$을 얻는데, 이것을 “임계의 발견”으로 자축하지 않습니다. 오히려 그 높은 $n^*$ 때문에 cascade 최종 크기 예측이 1,603개로 터무니없이 부정확해진다고 지적하고는, 곧장 더 나은 커널로 갈아탑니다.[8] 즉 교과서의 태도는 “$n^*\approx1$은 자랑거리가 아니라, 지수 커널이 이 데이터에 잘 안 맞는다는 신호일 수 있다”에 가깝습니다.

그렇다면 그 “더 나은 커널”을 우리도 써봐야겠지요.

7. 커널을 바꿔보다 — 멱법칙, 그리고 그 대가

왜 다른 커널을 생각할까요? 2절에서 커널 $\varphi$는 “사건의 여운이 식는 모양”이라 했습니다. 지수 커널은 여운이 지수적으로 — 즉 매우 빠르게 — 식습니다. 그런데 사람의 반응은 그렇지 않을 때가 많습니다. 어떤 게시물은 며칠 뒤에도 드문드문 리트윗되죠. 이렇게 오래 끄는 꼬리를 가진 반응은, 여운이 천천히 줄어드는 멱법칙 커널(power-law kernel)로 더 잘 그려진다는 것이 소셜·인간 동역학 연구의 오랜 관찰입니다.[5] 우리가 4절에서 본 “긴 꼬리”가 바로 이 이야기와 맞닿습니다.

φ(τ)  =  κ(τ+c)(1+θ)n  =  κcθθ\varphi(\tau) \;=\; \kappa\, (\tau + c)^{-(1+\theta)} \quad\Longrightarrow\quad n^{*} \;=\; \frac{\kappa\, c^{-\theta}}{\theta}
멱법칙 커널. $\theta$가 꼬리가 식는 속도를 정하고(작을수록 더 길게 끈다), $c$는 사건 직후의 완충, $\kappa$는 전체 크기다. 지수 커널이 파라미터 두 개($\alpha,\delta$)였던 데 비해 셋($\kappa,c,\theta$)으로 늘었다. 이 점이 곧 대가로 돌아온다.

이제 직접 만져봅시다. 아래 그림에서 슬라이더로 관측창을, 토글로 커널을 바꿀 수 있습니다. 먼저 지수 커널 상태에서 슬라이더를 움직여 보십시오. 20개 cascade의 $n^*$가 거의 모든 구간에서 임계선 바로 아래에 머뭅니다. 이어 토글을 멱법칙으로 바꿔 보십시오. 가설대로라면 $n^*$가 내려가야 할 텐데 — 내려가지 않습니다. 커널을 바꿔도 임계 근접은 사라지지 않습니다.

20개 cascade의 추정 n* — 관측창과 커널을 바꿔가며 T = 1.00× · 중앙값 n* = 1.001
짧게관측 종료 시점 T길게
0.5×1.0× ← 마지막 사건2.0×
커널:
점 하나가 cascade 하나의 n*. 청록은 임계선 아래, 붉은색은 임계선 위. 슬라이더로 관측창을, 토글로 커널을 바꿔보라.

이건 6절의 “갈래 둘”을 곧장 입증하진 않지만, 적어도 “지수 커널이라는 특정 가정이 $n^*$를 부풀렸다”는 단순한 설명만으로는 부족함을 보여줍니다. 임계 근접은 커널 선택보다 끈질깁니다.

그런데 멱법칙에는 약속한 대가가 있습니다. 파라미터가 셋으로 늘면서, 데이터가 그 셋을 따로따로 가려내지 못하는 문제가 생깁니다. 짧은 cascade에서는 $\kappa$를 키우고 $c$를 함께 조정하면 거의 똑같이 잘 맞는 조합이 무수히 많습니다. 이를 비식별성(non-identifiability)이라 합니다 — 데이터가 답을 하나로 못 좁히는 상태죠.

다만 좋은 소식이 있습니다. 개별 파라미터는 못 가려도, 우리가 정작 알고 싶은 $n^*$(셋의 특정 조합)는 또렷이 결정됩니다. 아래 두 그림은 한 cascade를 80번 적합한, 거의 똑같이 좋은 해들입니다. 왼쪽에서 $\kappa$는 79부터 148까지 두 배 가까이 흩어지는데, 오른쪽에서 그 같은 해들의 $n^*$는 0.99 한 점에 모입니다.

한 cascade · 거의 똑같이 좋은 80개 적합해
왼쪽: κ는 79~148로 흩어진다(모양은 비식별). 오른쪽: 같은 해들의 n*는 0.99에 모인다(분기율은 식별).

비유하자면, 항아리의 정확한 형태(매끈한지 잘록한지)는 못 맞혀도 거기 담긴 물의 총량은 정확히 잴 수 있는 셈입니다. $n^*$는 커널 모양 전체를 적분한 “총량”이라(3절), 모양의 세부가 흔들려도 총량은 안정적입니다.

8. 정리 — 그리고 공개 코드

우리가 한 일을 되짚어 봅니다. Hawkes 과정으로 트위터 리트윗 cascade를 모델링하는 법을 개념부터 쌓고($\lambda(t)$, 커널 $\varphi$, 분기율 $n^*$), 교과서가 쓰는 SMH 데이터를 직접 들여다본 뒤(초반 폭발 + 긴 꼬리), 우리 손으로 짠 코드로 지수 커널을 적합해 $n^*\approx0.99$를 재현했고, 멱법칙으로도 같은 임계 근접이 남는 것을 확인했습니다.

분명히 해둘 것이 있습니다. 우리는 “이 0.99가 어디서 왔는가”에 답하지 못했습니다. 이 글이 한 일은 답을 내놓은 것이 아니라, 그 질문을 어떻게 던지고 어떻게 추궁하는지를 보인 것입니다 — 관측창을 흔들어 보고(6·7절), 커널을 갈아 끼워 보고(7절), 비식별성을 점검하고(7절), 그래도 임계 근접이 남는지 확인하는 일련의 점검들입니다. 그리고 이 데이터·이 모델로는 그 모든 점검 끝에도 “진짜 임계”와 “추정 인공물”이 갈리지 않았습니다. 단일 씨앗에 짧은 cascade라는 설정 자체가 둘을 분리할 정보를 충분히 담고 있지 않기 때문입니다.

깨끗한 답이 나오지 않는 것 또한 정직한 결과입니다. 입문서로서 이 글이 남기고 싶은 것은 “바이럴의 분기율은 X다”라는 결론이 아니라, $n^*\approx0.99$ 같은 그럴듯한 숫자를 만났을 때 그것을 곧이곧대로 믿지 않고 출처를 추궁하는 방법과, 그 방법이 어디서 한계에 부딪히는지에 대한 감각입니다. 모델이 내놓는 숫자는 답이 아니라 질문의 시작이라는 것 — 그것이 이 글의 전부입니다.

이 글의 모든 분석은 재현 가능합니다. Hawkes 적합(지수·멱법칙), 관측창 스윕, 식별성 진단, 그리고 위 인터랙티브를 만든 코드와 데이터 전체를 공개합니다.

코드 · 데이터 — [공개 저장소 링크]
MLE 구현, EDA, 그림 생성, 인터랙티브 위젯 데이터 포함. 원본 SMH 데이터는 Rizoiu 외(2017)[8][10]의 저장소(CC BY-NC 4.0)에서 가져왔습니다.

참고문헌

  1. [1] Hawkes, A. G. (1971). Spectra of some self-exciting and mutually exciting point processes. Biometrika 58(1), 83–90. doi:10.1093/biomet/58.1.83.
  2. [2] Hawkes, A. G., & Oakes, D. (1974). A cluster process representation of a self-exciting process. Journal of Applied Probability 11(3), 493–503. doi:10.2307/3212693.
  3. [3] Ogata, Y. (1978). The asymptotic behaviour of maximum likelihood estimators for stationary point processes. Annals of the Institute of Statistical Mathematics 30(1), 243–261. doi:10.1007/BF02480216.
  4. [4] Daley, D. J., & Vere-Jones, D. (2003). An Introduction to the Theory of Point Processes, Vol. I: Elementary Theory and Methods (2nd ed.). Springer. doi:10.1007/b97277.
  5. [5] Crane, R., & Sornette, D. (2008). Robust dynamic classes revealed by measuring the response function of a social system. PNAS 105(41), 15649–15653. doi:10.1073/pnas.0803685105. (arXiv:0803.2189)
  6. [6] Hardiman, S. J., Bercot, N., & Bouchaud, J.-P. (2013). Critical reflexivity in financial markets: a Hawkes process analysis. European Physical Journal B 86, 442. doi:10.1140/epjb/e2013-40107-3. (arXiv:1302.1405)
  7. [7] Filimonov, V., & Sornette, D. (2015). Apparent criticality and calibration issues in the Hawkes self-excited point process model: application to high-frequency financial data. Quantitative Finance 15(8), 1293–1314. doi:10.1080/14697688.2015.1032544. (arXiv:1308.6756)
  8. [8] Rizoiu, M.-A., Lee, Y., Mishra, S., & Xie, L. (2017). A Tutorial on Hawkes Processes for Events in Social Media. In Frontiers of Multimedia Research. ACM Books / Morgan & Claypool. (arXiv:1708.06401)
  9. [9] Rizoiu, M.-A., Mishra, S., Kong, Q., Carman, M., & Xie, L. (2018). SIR-Hawkes: Linking Epidemic Models and Hawkes Processes to Model Diffusions in Finite Populations. WWW '18, 419–428. doi:10.1145/3178876.3186108. (arXiv:1711.01679)
  10. [10] computationalmedia/cascade-influence repository — SMH 데이터셋 출처. github.com/computationalmedia/cascade-influence (CC BY-NC 4.0).