ヒストグラムでエラーを分析する

Web上にはヒストグラム・度数分布がどんなものかは複数の記事を見つけることはできましたが、その内容、見方について解説している記事があまりなかったので、私の経験をもとにExcelでのヒストグラムの作成実例と、その結果の読み解き方について解説します。

Excelデータはこちら。ダウンロードしてください。
https://1drv.ms/x/s!AmF9El5QuPUYgd02WlR8rqrXmQwcNg
# テストをした結果を処理しやすい形にまとめる
今回は、パケットデータを何かしら加工するプログラムを作成したとしましょう。
テストは1つのパターンのパケットを10000回プログラムに送り、途中にどんな処理エラーが出たかを記録します。
これを100パターンのパケットデータで繰り返してみます。
プログラムは処理アルゴリズムごとにA,B,C,Dの4種類で同じパターンのパケットで試します。
エラーの種類は、パケットを破棄したもの、パケットの欠損、処理のタイムオーバー、例外の4種類のカテゴリに分け、それぞれE1、X1、Q1、P1というコードで管理します。
この場合、プログラムごとにテストを行いますが、動作時のログはこのような形で出力するようになるでしょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/19de6f32-30e1-cd9c-7295-c940d545ee59.png" width=400>
本当は横に1000コラムあって、その時に発生したエラー番号を記録してもいいと思うのですが、横の集計って大変ですよね。
エラーも毎回発生するわけではないでしょうからちょっと無駄な気もします。
そこで、もうちょっとコンパクトにこのように記録してはいかがでしょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/04656045-cd81-9187-5893-af37251c66a7.png" width=400>
エラーがいつ発生したかはわかりませんが、エラーの発生順は記録されます。
もし発生回数も必要なら、250E1（250回目にE1エラー）のように記録してもよいかもしれません。
たくさん記録されてもアルファベットから次の1文字までがエラーコードという法則は生きています。
上記のように記録しても、次のように計算で値を展開することは可能です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/f1698c0b-194b-94a7-78ba-d6014b6379bb.png" width=700>
D1からG1までにエラーコードを入力して、セルD2以降に次の計算式を入力してコピーすればそれぞれのエラー個数が計算されます。

```
=INT(LEN($C2)-LEN(SUBSTITUTE($C2,D$1,"")))/LEN(D$1)
```
また、H列はその合計をオートSUMで求めれば総エラー数が求まります。
ここまではテスト業務のログデータを作る時にどんな作り方をするかというお話でした。
もっと単純に、例えばりんご農園ごとに1000個前後納入されるうち10個をサンプルとしてりんごの糖度を測定、管理するなら、次のような記録をすればよいでしょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/6f0a4838-e719-afda-1a70-9da75ca69234.png" width=400>
# ヒストグラムとは
ヒストグラムの解説は様々なところでされていますが、私なりに、今回のネタでの解説をします。
ヒストグラムというのは、統計分析の一種です。
エラーはない方がいいし、糖度なら高い方がいいに決まっています。
しかし、エラーは出てしまうものですし、糖度は無限に高いわけではありません。
そこで、平均的にどのくらいなのかを見るのは平均値という一つの値を見ることでわかります。
しかし、平均値だけではわからないことがあります。
それはバラつきです。言い換えれば安定性です。
一番の理想は、エラーがない状態で安定していることです。糖度ならある一定の甘さで安定していることです。
でも現実には、数個のエラーが平均的に出たりします。
その平均度合いがばらついていると、対処のしようがありません。平均的に悪いのであれば、それは論外で悪いので根本的な見直しをすると判断できますが、よかったり悪かったりしてると対策も困難になってきます。
りんごの品質なら、バラバラの糖度のりんごが店頭に並ぶということです。買わないとおいしくないかわからないなんてとても買えないですよね。
ということで、製品には、いい性能である他に、安定した品質をキープできるかというもう一つの観点が考えられます。
そのバラつきを表すのがヒストグラムです。
エラー数ごとに何テストあるかを集計してグラフ化します。
手法は後で説明するとして、まずこんなのがヒストグラムというものをお見せします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/ded494b0-907a-ac2e-c99a-72f0540927d7.png" width=300>
うわー、もう目も当てられないですね。100回繰り返し回数のうち70回以上必ずエラーが出ています。安定はしているのですが、品質が悪いということですね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/d8830e2d-37ea-e44e-8168-29b30726c6c4.png" width=300>
これはとても理想。うまくいってるとこのくらいになるでしょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/b289d16b-7fbd-ee10-83de-3cd07a3c4d18.png" width=300>
すばらしいデータです。エラーが一回も出ない。。。でもこれって本当かなと疑う必要もあるかもしれないです。やり方が悪くてエラーが検出できていない、もしくはデータ処理プロセスの中でとちってるのかもしれないです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/098a3f90-3538-b0d2-b9bf-cfd6a0fb2849.png" width=300>
このくらいの分布だとなんとなく安心します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/bd6f50ed-a298-41b3-292c-09d6817c0e5d.png" width=300>
これは全く不安定の例です。何かがおかしいです。製品だけではなくテスト方法も見直した方がいいかもしれないですね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/a70d3464-eb13-9689-e81f-447cd1f624b1.png" width=300>
これは何かがおかしいです。製品がこのようになる特性をわざとつけていたのならともかく、普通に製造したもので特性の山が2つや複数に分かれるということはあまりありえません。たとえばモノづくりで2つの素材をよく配合しないで作ったらこうなるかもしれないですが、ことコンピュータプログラムにおいてこのような傾向になることは考えにくいので、これはテスト方法をしっかり見直す必要があります。テスト方法やパラメータがテスト中にいつの間にか変わったとかなのかも。

というのがヒストグラムデータの活用です。
# ヒストグラムデータの作り方
ヒストグラムは、現象が出た回数ごとのデータ個数をグラフ化します。
現象が出た回数ごと・・・というのは1ステップの場合もありますし、100ステップの場合もあります。
一応目安のステップ数の計算方法もあるのですが、私は実際には自分でステップ数を決めています。思い通りのデータを見たいので。
まず、このステップ数を作成します。
今回はエラー回数0回から2ステップで30まで度数を切りました。
エラー回数は最大でも20くらいだったので余裕を見ています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/441ca114-76a5-c67f-de40-94cb0c2b88a4.png" width=200>
そして次の計算式をセルK2に作成し下にコピーします。

```
=COUNTIFS(H:H,">="&J2,H:H,"<"&J3)
```
それぞれのエラー回数ごとのテスト数が求められました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/b52ee6e1-6ea2-d7a3-f8cd-8cac61d6d0f9.png" width=200>

セルK17だけは次の計算式で30以上全部数えた方が安全かも。

```
=COUNTIFS(H:H,">="&J2)
```
で、このデータを棒グラフ化。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/526ce0ba-9cf3-e221-f15b-3dcdc8026300.png" width=400>

ヒストグラムは棒と棒の間を空けないのが普通だそうですので（私はあまり意識してないですが）棒グラフの棒を右クリックして、下図を参考に要素の間隔を0に設定してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/32dd7489-1d72-e91b-08c2-b2dcc0f3582f.png" width=600>
# まとめ
今回はテストプログラムにバグのログを吐き出させるような仕組みでExcelを使って後処理をする例で紹介しました。後からの処理だと度数のステップも任意に変えられるので別視点でチェックすることも容易です。
テストではなく生産検査であればプログラム化したほうがいいでしょうね。
ヒストグラムでは、エラーレポートだけではなく、処理速度のバラつきや精度も図式化できるので、特にテスト環境の問題かどうか切り分けることもできますので、活用していただきたいと思います。