Splunk: statsとchartの使い分け

時々よくわからなくなるのでメモ。

###### 実施環境： Splunk Free 8.2.2

 Splunk の SPL コマンドには、 stats コマンドと chart コマンドという2つの統計コマンドが存在します。
この2つは与える式によっては同じような結果を出力するため、しばしばどのように使い分けるべきか迷うことがあります。
実際のところ、どのように使い分ければよいのでしょうか。

結論から言えば、「2つのグループで分割される統計値」なら chart コマンド、それ以外であれば stats コマンドが適当です。

実際に動作を確認してみましょう。

まずは、グループで分割しない場合。

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number)
```

![スクリーンショット 2021-09-26 20.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/68e86e22-92fc-c0be-be27-1b2c447e52c4.png "stats 0グループ")

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number)
```
![スクリーンショット 2021-09-26 20.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/9071a558-e8cf-4b9e-6338-6de87931c344.png "chart 0グループ")

グループで分割しない場合、 stats コマンドと chart コマンドは同様の結果を出力します。

次に、1つのグループで分割する場合。

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1
```

![スクリーンショット 2021-09-26 20.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d32ff8c9-3ab5-8d9d-e631-ed3fe48bacfd.png "stats 1グループ")

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1
```

![スクリーンショット 2021-09-26 21.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/703adb75-9ada-fee8-70b9-eeb2b536490c.png "chart 1グループ")

1つのグループで分割する場合も、結果は同じです。

結果に違いが出てくるのは、グループが2つとなった場合です。

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1, Flag2
```

![スクリーンショット 2021-09-26 20.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a50eb04d-3249-eece-556b-ec7a78380fd9.png "stats 2グループ")


```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1, Flag2
```

![スクリーンショット 2021-09-26 21.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fe90abb4-2f98-dae3-8ac3-078bae882dce.png "chart 2グループ")

 stats コマンドの場合はグループ1とグループ2がそれぞれ列に入れられ2つの列の組み合わせで分割されますが、 chart コマンドの場合はグループ1は列に、グループ2は行になり、行と列の組み合わせで値が配置されます。

なお、上記の例では統計値を3つ計算していますが、統計値は1つに絞ったほうが見やすいかと思います。

さらにグループが3つ以上となった場合、 chart コマンドは使用できなくなります。

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| stats avg(Number), max(Number), min(Number) BY Flag1, Flag2, Flag3
```

![スクリーンショット 2021-09-26 20.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/88956482-c25a-97c9-d3cf-fbb32309a03f.png "stats 3グループ")

```Splunk:Splunk
| makeresults count=100
| eval Number = random() % 100, Flag1 = random() % 2, Flag2 = random() % 2, Flag3 = random() % 2
| chart avg(Number), max(Number), min(Number) BY Flag1, Flag2, Flag3
```

![スクリーンショット 2021-09-26 20.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/cfcae504-a0b2-fc0c-2032-87f55811e177.png "chart 3グループ")