[Announcing Smarter Real-Time Alerts With the KPSS Statistic for Signalflow | Splunk](https://www.splunk.com/en_us/blog/devops/introducing-the-kpss-statistic-in-signalflow.html)
昨年、異常を検出するための一般的な分析戦略を取り入れたSignalFlowプログラムのオープンソースライブラリであるBuilt-in Alert Conditionsをリリースしました。解釈可能なパラメータ(期間、パーセンテージ、標準偏差の数など)のセットで実験することにより、ユーザーは基本的な統計手法の専門家でなくても、アラートを自分の環境に合わせて調整することができます。警告条件は、SignalFlow言語のパワーと柔軟性をより広く利用できるようにし、顧客の幅広いユースケースにわたって多くのディテクタを強化するのに役立ちます。
信号がリソース(ディスクなど)の枯渇に注意を要するかどうか、あるいは、信号が報告されない場合にアラームを発生させるべきかどうか、ユーザは知る必要があります。一方、Sudden ChangeとHistorical Anomalyアラートのどちらを選択するかは、あまり明白ではありません。シグナルの現在値を先週観測された値と比較するのは意味があるのか(Historical Anomaly)、それとも前時間の値の方がより良い基準値となるのか(Sudden Change)。
この疑問を解決するために、[[KPSS検定]](Kwiatkowski-Phillips-Schmidt-Shin)による定常性とトレンド定常性をSignalFlowに追加することを発表します。
## What is Stationarity, and Why Should You Care?
時系列は、その値の分布が時間の経過とともに変化しない場合、定常である。これは、十分に大きなウィンドウで計算された統計値が、大きく変化しないことを意味します。チャート上では、定常時系列はほぼ水平な線として表示され、ジッターによって変化する可能性があります。
これに対して、トレンドや季節的な要素を持つ時系列は、定常的であるとは言えません。この記事では、定常性のテストに焦点を当てますが、トレンド-定常性のためのKPSS統計は、単純な線形トレンドの周りに定常である信号を検出するために使用することができることに留意してください。
信号の定常性は、アラートスキームに影響を与えます。信号が定常である場合、その分布のテールを理解することは、アラートのための閾値の選択を導くべきである。しきい値を決めるためにヒストグラムを検査することに興味がない場合は、急変警報(例えば過去5分間と過去1時間のデータを比較する)が賢明でしょう。信号がトレンドを持っている場合、二重指数平滑化などのより洗練された時系列モデルが適切であると思われます。例えば、シグナルに週ごとの季節性がある場合、ヒストリカルアノマリーアラートが最も良い結果を生むでしょう。このロジックは、以下のデシジョンツリーに要約されています。
![[Pasted image 20220606142708.png]]
この図は、ビジネス要件を実施するためにStatic Threshold警告を使用するシナリオをカバーしていません。例えば、SLAやレイテンシーに直接関連するシグナルの場合、統計的特性とは無関係に(十分に速くリクエストを処理できていないことを)通知することを望むかもしれません。また、「さらなる変換/モデリング」の目標は、正確にモデリングしアラートする方法を知っているクラス(定常性、線形トレンド、季節性)の一つに自分たちを位置づけることです。
## A Brief (Technical) Introduction to the KPSS Statistic
KPSS 検定は計量経済学にそのルーツがある。元の論文(下記参照)は、統計量を定義し、その分布を研究し、いくつかのマクロ経済時系列に(単位根検定と一緒に)適用した。
KPSS 統計量は次のように定義される。x1, ..., xn が時系列のいくつかのスライスのデータポイントであるとする。ここで,rt = rt-1 + ut はランダム・ウォーク,Āは定常ノイズであり,ut および Āは平均ゼロで正規分布する(特に,どちらも時間依存性を有さない).この統計量は,utの分散が0であるという仮説を検定する.これが成り立つなら,系列は,水準 r = r1 = ... = rn からノイズ的にしか異ならないだろう.
これは次のように計算される。↪L_1D7↩を系列の平均 (x1 + ... + xn)/nとし,e1 = x1 - ᵰ,..., en = xn - ᵰを残差とする.ここで,それらの残差の部分和のシーケンスを考える: s1 = e1, s2 = e1 + e2, ..., sn = e1 + e2 + ... + en. KPSS 統計量は,合計 s12 + s22 + ... + sn2 であり,元のデータのスケールに依存しないように適切に正規化される.元の系列がその平均のまわりで(特に、時間に依存しない方法で)騒がしく振動する場合、残差は決して蓄積されないはずです。平均からの偏差が時間に依存している場合、部分和のいくつかは予想より大きくなる可能性が非常に高くなります。
## Using KPSS in SignalFlow
SignalFlowに新しいストリーム・メソッド、その名もkpssが追加されました。以下はサンプルアプリケーションです。追加のドキュメントもあります。
kpss_1h = data('cpu.utilization').kpss(over='1h') # 過去1時間の統計値
kpss_smoothed = kpss_1h.percentile(50, over='1d') # 前日の典型的な1時間統計値
統計量は二乗和を含むので、極値によって影響を受けます。統計量のパーセンタイルを使用することで、その影響を軽減することができます。例えば、信号がほとんど定常状態でありながら、1日に1回(非常に一時的な)スパイクが発生した場合、そのスパイクはローリング1時間ウィンドウに2時間強しか含まれないため、信号kpss_smoothedに影響を与えないでしょう。
KPSS論文の仮定(すなわち、分布が分析される仮定)はモニタリングで生じるすべての時系列に適用されないかもしれず、KPSS統計量をそれ自体で使用することは出版可能な計量分析には適切ではないかもしれませんが、統計量は信号の振る舞いを特徴づけるための一歩です。統計量が何を測定し、どのような種類の行動を区別できるかを知るために、次の2つのシグナルを考えてみよう。
## Example of a Stationary Signal
第一に、キャッシュヒット率、すなわち、キャッ シュヒット数をキャッシュヒット数とキャッシュミス数の合計で割ったものである。キャッシュヒットとキャッシュミスはそれ自体、週単位で大まかな季節性があるが(この特定のデータベースに対するクエリの量は、部分的にユーザーの活動に依存するため)、キャッシュヒット比率はほぼ定常的であることが分かる。
![[Pasted image 20220606144225.png]]
オレンジ色の線は、過去3時間で見たキャッシュヒット率である。左軸にプロットしています。少し飛び跳ねていますが、明らかな傾向や季節性はありません。ピンクの破線は cache_hit_ratio.kpss(over='1h').percentile(pct, over='1d') (pct=10, 50, 90) に対応するもので、このキャッシュヒット率を呼び出すと、右図のようになります。これらは右軸に対してプロットされています。
KPSSの計算がデータの最後の25時間に依存するのに対し、チャートはデータの最後の3時間だけを示していることに注意してください。私たちは、シグナル cache_hit_ratio.kpss(over='1h').percentile(50, over='1d') を、「過去1日で、典型的な1時間はどのくらい定常的か」という質問に答えるものとして見ています。右軸は、典型的な1時間(3分ごとにサンプリング)の定常性スコアが約0.08であることを示しています。90パーセンタイルは、「過去1日で、大多数の時間はどの程度定常性があるか」という問いに対する答えです。
例えば、直近の5分間が直前の1時間と大きく異なる場合に検知する「急変アラート」、または、過去の経験やチャートの調査に基づいて閾値が設定される「静的閾値アラート」などがあります。
## Example of a Non-Stationary Signal
2つ目のシグナルである、本番クラスタ全体で実行されている分析ジョブの総数には、大まかな週ごとの季節性があります。そのため、正常値の範囲が時間帯や曜日に大きく依存するため、Static Thresholdアラートの価値は限定的です。このようなシグナルには、Historical Anomalyアラートが適切です。
![[Pasted image 20220606144401.png]]
実線は、ジョブシグナル総数のうち、正午のピークに続く下降中の直近3時間を示しています。破線は、前の例と同様に、1時間のKPSS統計のパーセンタイルを示しています。典型的な1時間(3分ごとにサンプリング)の定常性スコアが約1.15であることがわかります。
この統計量は定常性の「スコア」(0に近いほど定常性が高い)と考えることができ、固定値付近で推移しているように見える信号と、時間帯によって値が変化する信号をうまく区別しています。これらの値をどのように解釈すればよいのだろうか。
## Guidelines for the KPSS statistic
静的閾値または急変警報が適切な信号(上の決定木図における最初の分岐)を識別することを目的として、統計量に関するいくつかの大まかなガイドラインを提案します。
両方の計算例は、1時間のウィンドウで実行され、3分ごとにサンプリングされ、統計は長さ20の時系列で計算されることを意味します。我々はこれよりはるかに短い系列で計算することをお勧めしません。オリジナルのKPSS論文の実験では、系列の長さを30から500まで変化させています。例と同様に、より長いウィンドウで1時間の統計量を考慮すると、外れ値の影響を減らすことができます。従って、KPSS統計は20から50の範囲の長さを持つ系列で計算されると仮定します。
0.6未満の時系列は定常とみなされ、0.6から1.0の時系列は曖昧で、1.0以上の時系列は非定常とみなされます。これらの範囲の正当性については、最後のセクションを参照してください。
## Using Stationarity to Select an Alert Condition
キャッシュヒット率の例では、基準値に対して比率が「低すぎる」場合に警告するのが理にかなっています。これはパフォーマンスに影響する可能性があり、例えばクエリーパターンの変化やコードプッシュで説明できます。定常統計は、履歴異常アラート(例えば1週間間隔のウィンドウからのデータを使用)よりも、突然の変更アラート(すなわち、ベースラインを計算するために最近の履歴を使用)を示唆します。
SignalFxのアラートプレビュー機能を使用すると、過去数日間、Sudden Change条件ではアラートがゼロであるのに対し、Historical Anomaly条件ではアラートが生成されることがわかります。