AWK演習3
前回のヒストグラムでは、データ数が大きすぎるとき、*の数が行をあふれてしまうのでビジュアル的に見にくくなります。
以下がデータ数が600個のデータに適用したときの実行例です。
user:~/awk% awk -f height2.awk japanmenheight2.data | sort
145-150 *
150-155 ***
155-160 ******************************************
160-165 *********************************************************
***************************
165-170 *********************************************************
*****************************************************************
**********************************************
170-175 *********************************************************
*****************************************************************
*************************************
175-180 *********************************************************
*************************************************
180-185 *************************
185-190 **********
190-195 **
それゆえ、データ数がある程度多いときには、一行で*が終わるように尺度を変換するプログラムを作るのが今回の目的です。
考え方としては、一番多い階級の個数が、あらかじめ設定しておいた一行で表示する最大個数よりも大きくなったとき、全体の個数の尺度を変換するという考え方です。
ここでは、600人の日本人男性の身長のデータ
japanmenheight2.data(<−クリックしてダウンロードしてください)
を利用することにします。
(コピーアンドペーストで、Muleなどのエディタにでも貼り付けて保存してください。)
以下でプログラム例を示します。
BEGIN {
max = 50
}
{
for (i = 1; i <= NF; i++) {
$i=int($i/5)*5
cont[$i]++
num[$i]++
}
}
END {
sampmax = cont[1]
for (i in cont){
if (cont[i]>sampmax)
sampmax=cont[i]
else
continue
}
sho = int(sampmax/max)
for (i in cont)
cont[i]=int(cont[i]/(sho+1))
for (i in cont) {
while (cont[i]-- >0)
ast[i] = ast[i] "*"
}
for (i in num)
print i "-" i+5, ast[i], num[i]
}
<解説>
BGINEパターンで、一行に表示する文字数の最大数(ここでは50にしている)を指定します。
空のパターンで、連想配列count,numを用いて、+1していく、つまりカウントしていくわけですが、どうして2個も配列を使う必要があるのかは、また後で説明します。
今回はENDパターンがメインになります。
配列countの全ての添字に対し、for以下のループを繰り返します。
一番多い階級が最大個数maxよりも大きかったら、尺度を変換してやります。
まずある階級の個数が、最大個数maxよりも大きければ、その個数をmaxで割ってやります。
その商を用いて、countの配列全ての値を割ってやり、全ての要素の尺度を縮小してやります。
continueは階級の個数がmaxよりも小さければ、次の処理に移りなさいということです。
whileを使って、count[i]に入っている個数分*を、配列ast[]に足していきます。
whileのところの処理の意味は、count[i]を0以下になるまで一個ずつ減らしていって、
その減らした回数分*を付加するということです。
あとは表示するだけです。
countはさっき、0になるまで減らしてしまったので、空のパターンのアクションで、
余分にカウントしておいた配列num[]を使います。
あとは前回同様、表示するだけですが、一応尺度を変えているので、実際の個数が何個なのかが分からないので、正確な個数もヒストグラムの横に表示しています。
このプログラムを例えば、hist.awkという名前で保存します。
すると次のような結果になったと思います。
(以下は実行例)
user:~/awk% awk -f hist.awk japanmenheight2.data | sort
145-150 1
150-155 3
155-160 ********** 42
160-165 ********************* 84
165-170 ****************************************** 168
170-175 *************************************** 159
175-180 ************************** 106
180-185 ****** 25
185-190 ** 10
190-195 2
それぞれの階級で、尺度を縮小されたヒストグラムができていることが分かります。
ただこのプログラムはもっと簡単に改善できると思うので、あくまで参考程度にしてください。
次の演習で、簡単な統計処理をやって見ましょう。
演習4に進む
AWKの文法のページに戻る
もとのホームページに戻る