2022年9月19日月曜日

Pythonでヒストグラムを生成する【1/3】

ヒストグラムは、品質管理の七つ道具として有名で、これを作成するライブラリやソフトウェアは、数多くある。Pythonのライブラリにもmatlabがあるし、自分で作るものでもないのだが、Pythonistaたるものライブラリに頼らず自分で作っていきたいところである。
今回は、ExcelやLibre Office Calcで表示することを前提にCSVでヒストグラムを生成するコードを書いてみた。
出来栄えはこんな感じ、完璧なヒストグラムと言っても過言ではないではないだろう。


さて、これを作るにあたっては、元データを読み込んでから、いくつかステップを踏まねばならない。今回は以下の手順で行った。
  1. 横軸の作成
  2. データの分類
  3. グラフ化
以下では順を追ってみていきたい。

1.横軸の作成

横軸の作成の作成のためには、元データから最初の項目と最後の項目を確認したうえで、いくつのリストが必要かを確認し、横軸のデータを格納するリストを用意する必要がある。従って、以下のような処理が必要になる。
start = min(data_array)
end = max(data_array)
n = (end - start+1)// sep #(最大値-最小値+1)//横軸の幅
if (end - start+1)/sep != 0: 
	n += 1
ここでは、「(最大値 - 最小値+1) / 横軸の幅」の切り上げた値が用意すべきリストの数になることになる。つまり、1~100まで5刻みで横軸を用意したいのであれば、(100-1+1)/5 = 20、つまり20個のリストが必要となり、最後のリストには91~100までが格納される。また、1~101であれば、(101-1+1)/5 = 20.2となり、同様に21個のリストが必要となり、最後のリストには、101が格納される。
次に、軸の値を格納する必要がある。つまり、1~100まで10刻みであれば、1~10、11~20、21~30...といった形で軸の値をリストに格納していく必要がある。これは次のようになる。
#sep_listは軸の値を格納するためのリスト、sepは刻みの値、nは必要なリスト数
for i in range(n):
	if i == 0:
		sep_list.append([start, start + sep -1])
    else:
		previous = sep_list[i-1][1]
		nxt = previous + sep
		if nxt >= end:
			nxt = end
			if previous + 1 == nxt:
				sep_list.append([previous+1])
			else:
				sep_list.append([previous+1, nxt])
これは、前工程で確認したn個のリストの数だけループを回し、ループの最初で「[最小値,最小値+刻み-1,]」、それ以降は、「[前の値+1, 前の値+刻み]」といった形で処理を行っている。つまり、1~100を10刻みで軸とした場合は、最初のループで「[1, 1+10-1]」、二番目のループは「[10+1, 10+10]」という処理になっている。
これで横軸の作成が完了したので、次に収集したデータを分類して、ヒストグラム本体を作成していく。

2/3
3/3