はじめに
エブリーの吉田です。
今回はDatadogのMonitor等で使用する関数、Smoothing(平滑化)について書いていきます。
公式ドキュメントにも色々書いてあるのですが、数学から離れて久しいため、再確認も兼ねてできるだけ丁寧に説明していきます。
https://docs.datadoghq.com/ja/dashboards/functions/smoothing/
datadogのsmoothingはEWMA, Median, Autosmoothがありますが、それぞれ数式以外の設定の仕方は公式ドキュメントを参照してください。
EWMA
EWMAは "Exponentially weighted moving average" の略で、いわゆる "指数移動平均" というやつです。
指数移動平均(以下EWMA)とは移動平均と呼ばれる平滑化の手法の一つです。
移動平均というと一般的には単純移動平均(Simple Moving Average、以下SMA)が代表例らしく他に加重移動平均(Weighted Moving Average、以下WMA)とEWMAの3つがあります。
単純移動平均(SMA)
他の移動平均と比較するためにもまずはSMAを説明します。
SMAでは、データを日ごとに区切り、各日のデータ(m1, m2...)に対してn日のSMAは以下の計算式で求められます。
はい、いわゆる平均と呼ばれるものです。
例として以下のデータを用意しました。
日付 | 売上 |
---|---|
11/1 | 100 |
11/2 | 150 |
11/3 | 90 |
11/4 | 50 |
11/5 | 120 |
11/6 | 100 |
11/7 | 110 |
11/8 | 90 |
11/9 | 120 |
11/10 | 600 |
この場合11/1から10日間でのSMAの式は以下になります
この式から分かる通り、SMAは"時間"という軸に対しては重みを付けずに平等に評価をしています。
加重移動平均(WMA)/指数移動平均(EWMA)
時間軸に対して評価を行わないのであれば、SMAが平滑化としては良いですが、時間軸に対して重みを付けたい場合はSMAは適切ではありません。
時間軸に対して重みを付けたい場合はWMAやEWMAの方が適切といえます。
WMAやEWMAは簡単に言うと時間軸で重みをつけることによって直近のデータは"重く"・時間が経ったデータは"軽く"扱う計算方式です。
違いは、WMAは重みを線形的につけるのに対してEWMAは指数的に重みを付けます。
実際に式を見てみましょう。
先ほどと同じく1日のデータ(1日目m1、2日目m2)に対してn日のWMAとEWMAは以下の計算式になります。
WMA:
EWMA:
なお、EWMA(1)は単純移動平均を用いて計算されます。
これまたSMAの例と同じデータを用いて計算してみましょう。
日付 | 売上 |
---|---|
11/1 | 100 |
11/2 | 150 |
11/3 | 90 |
11/4 | 50 |
11/5 | 120 |
11/6 | 100 |
11/7 | 110 |
11/8 | 90 |
11/9 | 120 |
11/10 | 600 |
この場合11/1から10日間でのWMAの式は以下になります
このようにWMAでは時間に対して重みを付けて評価を行います。
ではEWMAの場合はどうなるでしょうか。まずは式です。
初期値EWMA(0)を100とし、スムージングパラメーター(α)は以下の数値として進めます。
数式だけは分かりづらいかと思うので、図を用意しました。
EWMAまとめ
インフラストラクチャの監視ではより直近のメトリクスに重みを加えて評価をすることが適切なケースが多々あります。
SMAでは直近のスパイクに対してはしきい値を超えることができず、かといってそれに合わせたしきい値を設定するとかなりシビアになってしまいます。
スパイクの検出を行いたいが普段から不安定なリソースの動きを行うメトリクスの監視を行う場合、EWMAを用いることで平滑化によるノイズの除去をしつつも持続的なリソース消費の上昇を検知が行えます。
Median
Medianを日本語に訳すと"中央値"です。
念の為中央値の振り返りです。
中央値とはデータを大小で並べた際の中央の値を指します。
EWMAの節でも使用したデータ表の場合、
50,90,90,100,100,100,110,120,120,150,600
なので中央値は100となります。
上記からわかるように600や50といったハズレ値は除外されやすいです。
ユースケースとして、スパイクなどは無視し長期的に見てリソースが安定しているかどうかを確認する場合に使用することが望ましいと思われます。
逆に上限が決まっており、ハズレ値も検出したい場合はMedianは適していないです。
例えばディスク容量では、バッチサーバーなどで一時的にディスクをかなり消費することがあるかと思います。そういった場合、ディスク容量がいっぱいになるとシステム自体が落ちてしまうことがあるのでアラートとしてはMedianを使用するのは適切ではありません。ですが、DBのクエリやAPIサーバーのレスポンスタイムなど、全体のパフォーマンスを測定したい・ハズレ値が全体のトレンドとはならない場合は適していると言えます。
Autosmooth
Autosmoothはdatadogが独自にASAP(Prioritizing Attention via Time Series Smoothing)を独自改良したもので、細かい数式などは開示されていません。
公式のドキュメントとブログを読む限り、移動平均の何かしらが使われており、全体をみて適切なスパンに区切ってくれるというものかと思います。
automatically choosing the optimal size for the moving average window based on two properties of the smoothed timeseries: the roughness and the kurtosis (defined below).
細かい設定が不要で、Autosmoothを使うことで適切にデータを平滑化してくれる便利な機能です。
とはいえスパンを自動で分割されたりノイズ判定をよしなにするおかげでリアルタイムにデータを取り込みそれらを監視、しきい値を超えたらアラートを発するモニタリングには適していないように思え、実際datadogではAutosmoothはMonitorでは使用できなくなっています。
アラートが不要な分析に使用するのが良いと思います。
n日間移動平均
この節は平滑化の手法ではなく"間隔"についてです。
datadogでは、EWMAやMedianの末尾に数字がついていると思いますが、これはスパン、つまりは間隔を示しています。
datadogの場合はデータポイントのスパンなので ewma_5
を使用して1分間隔のメトリクスを監視している場合は直近5分間のメトリクスのEWMAを用いた計算になります。
この間隔は一般的にはn日間移動平均と称されることが多いかと思います。
今までは全日、10日間の移動平均を計算しましたが、全日より狭い範囲の移動平均を計算する場合、直近n日間の移動平均を計算しながらスライドしていきます。
例えば今までの表を使用してEWMAの5日間移動平均を計算する場合は以下のようになります。(小数点第一位で四捨五入してます)
nを3にした場合のWMAとEWMA、Medianの値はこの様になっています。 αは0.5になり、小数点第一位で四捨五入をしています。
日付 | 売上 | WMA | EWMA | Median |
---|---|---|---|---|
11/1 | 100 | |||
11/2 | 150 | |||
11/3 | 90 | 111.7 | 107.5 | 100 |
11/4 | 50 | 87 | 78.8 | 90 |
11/5 | 120 | 98 | 99.4 | 90 |
11/6 | 100 | 98.6 | 99.7 | 100 |
11/7 | 110 | 101.4 | 104.8 | 110 |
11/8 | 90 | 98.9 | 97.4 | 100 |
11/9 | 120 | 103.1 | 108.7 | 110 |
11/10 | 600 | 193.5 | 354.4 | 120 |
この用に間隔を狭くすればするほど直近の値に敏感になります。
まとめ
リソースモニタリングはノイズとの戦いだと思います。
しきい値を厳しくすると頻繁になってオオカミ少年状態、ゆるくしすぎると大事なときに鳴らない無用の長物。
それらを緩和するため、Smoothingを積極的に利用していきましょう。
ただ、そのSmoothingも適切なものを選ばないと意図していない挙動になることもご留意いただければと思います。