베스를 통해 변화점(감마-파송 분포) 검출

개요


감마포야슨 분포로 베스탄 모델링을 조립하고 싶어서 해봤어요.
나는 괜찮은 계수 데이터를 찾았지만 (파송 분포를 사용하고 싶어서) 도무지 찾을 수 없었다
이번에 구글 트렌드에서 90일 가까이 검색한 csv를 출력했습니다.
https://trends.google.co.jp/trends/?geo=JP
출력 데이터에 대해 베일스 모델링을 하고 변화점 검측을 실시했다.

최근 90일간의'미진현사'검색수


2019년 8월부터 검색량이 늘었다.

결실


pymc3의 샘플링 결과입니다.

시각화.유행을 잘 감지할 수 있을 것 같다.

코드

import pandas as pd
import numpy as np
import pymc3 as pm
import matplotlib.pyplot as plt

#前処理
df = pd.read_csv("../desktop/yonezu.csv")
df["日"] = pd.to_datetime(df["日"])
df.index = df["日"]
df.drop(["日"], axis=1, inplace=True)

#モデリング
weeks = df.reset_index().index
with pm.Model() as model:
    switchpoint = pm.DiscreteUniform('sp', 
                                     lower=weeks.min(),
                                     upper=weeks.max())
    lambda1 = pm.Gamma('lambda1', alpha=1, beta=1)
    lambda2 = pm.Gamma('lambda2', alpha=1, beta=1)
    lambda_ = pm.math.switch(switchpoint>=weeks, lambda1, lambda2)
    k = pm.Poisson('k', lambda_, observed = df["米津玄師"].values)
with model:
    trace = pm.sample(10000)
burnin = 100
chain = trace[burnin:]

#出力
pm.traceplot(chain)
df["bayes"] = np.hstack([np.array([chain.lambda1.mean()] * int(chain.sp.mean())), np.array([chain.lambda2.mean()] * (df.index.size - int(chain.sp.mean())))])
df.plot(subplots=False, sharex=True, figsize=(10, 8), title="ベイズによる米津玄師の変化点検知")

감상


변화점 검측, 실제 데이터 분석에 유용할 것 같아서 더 익숙해지고 싶어요.
나는 더욱 신경 쓰는 일을 하고 싶다.

참고 자료

좋은 웹페이지 즐겨찾기