このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
さて、機能の結果を見ると、
色によって利用度合いがばらばらであることが判明した。
今日は、頻度をソートし、ABC 分析してみよう。
これによって重要度が分かるはずだ。
ABC 分析をするためには、まずは使用回数順にソートし、
多い順に出力する必要がある。
また、各要素の占める割合だけでなく、
それまでの使用回数の累計を元にした割合も出力する。
ソートは、sort 関数を使えば簡単にできる。
何をソートするかは自由だが、
今回は、元の色位置を覚えておきたいので、
ソート後の配列の各要素が、ソート前にどの位置にあったかを
調べることができるようにソートを使ってみよう。
頻度配列をそのままソートすると、元の情報が失われるので、
要素番号をソートすることで、元の順番が分かるようにする。
分かってしまえば、ソートは意外と簡単にできるのだ。
# まずは、0 から 255 まで順番に入った配列を用意し、
# それを、@freq 頻度表の値の大きい順に並べ替える。
# その結果、カラーテーブルの番号がソートされ、
# $from[0] には、最も使用回数が多い番号が入る。
my @from = sort { $freq[$b] <=> $freq[$a] } (0 .. $#freq);
# 出力用の書式を整える。
# 書式で利用する変数は事前に定義。
my ($num, $rr, $gg, $bb, $count, $ratio, $subtotal, $subratio);
# 毎ページ先頭に出力するヘッダ。自由な文字列を書ける。
# ピリオド 1 つの行で終了する。
format STDOUT_TOP =
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
.
# レコード用の書式。書式行と、変数行のペアとなる。
# これもピリオド 1 つの行で終了する。
# @ は対応する変数に置換される。
# < は左寄せ、> は右寄せ。他にもある。
# 特別な記号以外はそのまま出力される。
format STDOUT =
@@<< [@>>, @>>, @>>] @>>>>> (@>>>>>%) @>>>>>> (@>>>>>%)
'#', $num, $rr, $gg, $bb, $count, $ratio, $subtotal, $subratio
.
# $= はページの行数を決める。
# 今回はヘッダ 3 行とデータ 20 行で 23 行とする。
$= = 23;
# $^L ページ区切りに出力される文字。なしにしておく。
$^L = "";
# 割合を表示するために、全ピクセル数を計算しておく。
my $total = @$data * @{$data->[0]};
# 累計用の変数を 0 初期化。
$subtotal = 0;
# レポート開始。
foreach (0 .. $#freq) {
# ソート配列を参照してカラーテーブルの番号を取得。
$num = $from[$_];
# 頻度表を参照して使用回数を取得。
$count = $freq[$num];
# 使っていなければ出力しない。
next if $count;
# カラーテーブルを参照して、RGB 値を得る。
# unpack_rgb 関数は古い日記参照。
($rr, $gg, $bb) = unpack_rgb($colors->[$num]);
# 累計する。
$subtotal += $count;
# 割合は小数を使うので、整数演算を無効にしておく。
no integer;
# 割合は出力前に小数以下 2 桁分で書式化しておく。
$ratio = sprintf('%.2f', $count / $total * 100);
$subratio = sprintf('%.2f', $subtotal / $total * 100);
# 出力する。
write;
}
# 最後に、色数を出力する。
# ヒアドキュメント構文だ。<<"終端記号" と書くことで、
# 次の行から終端記号が単独である行までを
# 改行も含めてそのまま文字列として扱う。
# << の後がダブルクォートなので変数も展開される。
print <<"END_OF_DATA";
-------------------------------------------------------
Total $unique colors.
-------------------------------------------------------
END_OF_DATA
さて、実行して出力してみよう。
A クラスを 80% 以下としてみてみると、
なんと、たった 15 色しかないことが判明した。
B クラスを 95% 以下としてみてみても 35 色だけである。
つまり、ほとんどの色は効果的に利用されず、
無駄にカラーテーブルを消費していることが分かった。
つまり、C クラスを使わずに、A クラス周辺の色を
補ってやれば、もっと品質があがるのではないだろうか。
昨日同様、216 色のものを出力してみたものを書いておく。
かなり分析しやすくなった。
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#42 [ 0, 51, 51] 11705 ( 17.34%) 11705 ( 17.34%)
#43 [ 51, 51, 51] 8104 ( 12.01%) 19809 ( 29.35%)
#50 [102, 102, 51] 5746 ( 8.51%) 25555 ( 37.86%)
#86 [102, 102, 102] 4879 ( 7.23%) 30434 ( 45.09%)
#49 [ 51, 102, 51] 3343 ( 4.95%) 33777 ( 50.04%)
#85 [ 51, 102, 102] 3094 ( 4.58%) 36871 ( 54.62%)
#7 [ 51, 51, 0] 2221 ( 3.29%) 39092 ( 57.91%)
#0 [ 0, 0, 0] 2190 ( 3.24%) 41282 ( 61.16%)
#44 [102, 51, 51] 1942 ( 2.88%) 43224 ( 64.04%)
#215 [255, 255, 255] 1916 ( 2.84%) 45140 ( 66.87%)
#6 [ 0, 51, 0] 1869 ( 2.77%) 47009 ( 69.64%)
#36 [ 0, 0, 51] 1722 ( 2.55%) 48731 ( 72.19%)
#93 [153, 153, 102] 1435 ( 2.13%) 50166 ( 74.32%)
#129 [153, 153, 153] 1407 ( 2.08%) 51573 ( 76.40%)
#92 [102, 153, 102] 1356 ( 2.01%) 52929 ( 78.41%)
#128 [102, 153, 153] 1305 ( 1.93%) 54234 ( 80.35%)
#79 [ 51, 51, 102] 1128 ( 1.67%) 55362 ( 82.02%)
#78 [ 0, 51, 102] 973 ( 1.44%) 56335 ( 83.46%)
#51 [153, 102, 51] 886 ( 1.31%) 57221 ( 84.77%)
#8 [102, 51, 0] 810 ( 1.20%) 58031 ( 85.97%)
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#122 [102, 102, 153] 802 ( 1.19%) 58833 ( 87.16%)
#87 [153, 102, 102] 626 ( 0.93%) 59459 ( 88.09%)
#172 [204, 204, 204] 595 ( 0.88%) 60054 ( 88.97%)
#57 [153, 153, 51] 526 ( 0.78%) 60580 ( 89.75%)
#136 [204, 204, 153] 446 ( 0.66%) 61026 ( 90.41%)
#94 [204, 153, 102] 390 ( 0.58%) 61416 ( 90.99%)
#1 [ 51, 0, 0] 380 ( 0.56%) 61796 ( 91.55%)
#14 [102, 102, 0] 320 ( 0.47%) 62116 ( 92.02%)
#80 [102, 51, 102] 299 ( 0.44%) 62415 ( 92.47%)
#179 [255, 255, 204] 281 ( 0.42%) 62696 ( 92.88%)
#121 [ 51, 102, 153] 280 ( 0.41%) 62976 ( 93.30%)
#135 [153, 204, 153] 260 ( 0.39%) 63236 ( 93.68%)
#9 [153, 51, 0] 252 ( 0.37%) 63488 ( 94.06%)
#56 [102, 153, 51] 248 ( 0.37%) 63736 ( 94.42%)
#45 [153, 51, 51] 245 ( 0.36%) 63981 ( 94.79%)
#48 [ 0, 102, 51] 215 ( 0.32%) 64196 ( 95.11%)
#100 [204, 204, 102] 197 ( 0.29%) 64393 ( 95.40%)
#13 [ 51, 102, 0] 196 ( 0.29%) 64589 ( 95.69%)
#130 [204, 153, 153] 195 ( 0.29%) 64784 ( 95.98%)
#2 [102, 0, 0] 165 ( 0.24%) 64949 ( 96.22%)
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#58 [204, 153, 51] 156 ( 0.23%) 65105 ( 96.45%)
#15 [153, 102, 0] 154 ( 0.23%) 65259 ( 96.68%)
#84 [ 0, 102, 102] 152 ( 0.23%) 65411 ( 96.91%)
#171 [153, 204, 204] 148 ( 0.22%) 65559 ( 97.12%)
#101 [255, 204, 102] 144 ( 0.21%) 65703 ( 97.34%)
#107 [255, 255, 102] 135 ( 0.20%) 65838 ( 97.54%)
#178 [204, 255, 204] 131 ( 0.19%) 65969 ( 97.73%)
#99 [153, 204, 102] 123 ( 0.18%) 66092 ( 97.91%)
#165 [153, 153, 204] 104 ( 0.15%) 66196 ( 98.07%)
#37 [ 51, 0, 51] 100 ( 0.15%) 66296 ( 98.22%)
#38 [102, 0, 51] 99 ( 0.15%) 66395 ( 98.36%)
#173 [255, 204, 204] 89 ( 0.13%) 66484 ( 98.49%)
#64 [204, 204, 51] 75 ( 0.11%) 66559 ( 98.61%)
#123 [153, 102, 153] 74 ( 0.11%) 66633 ( 98.72%)
#137 [255, 204, 153] 69 ( 0.10%) 66702 ( 98.82%)
#52 [204, 102, 51] 63 ( 0.09%) 66765 ( 98.91%)
#214 [204, 255, 255] 62 ( 0.09%) 66827 ( 99.00%)
#21 [153, 153, 0] 61 ( 0.09%) 66888 ( 99.09%)
#16 [204, 102, 0] 51 ( 0.08%) 66939 ( 99.17%)
#164 [102, 153, 204] 48 ( 0.07%) 66987 ( 99.24%)
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#143 [255, 255, 153] 42 ( 0.06%) 67029 ( 99.30%)
#91 [ 51, 153, 102] 37 ( 0.05%) 67066 ( 99.36%)
#127 [ 51, 153, 153] 34 ( 0.05%) 67100 ( 99.41%)
#81 [153, 51, 102] 33 ( 0.05%) 67133 ( 99.46%)
#10 [204, 51, 0] 26 ( 0.04%) 67159 ( 99.49%)
#208 [204, 204, 255] 24 ( 0.04%) 67183 ( 99.53%)
#39 [153, 0, 51] 22 ( 0.03%) 67205 ( 99.56%)
#95 [255, 153, 102] 22 ( 0.03%) 67227 ( 99.60%)
#88 [204, 102, 102] 20 ( 0.03%) 67247 ( 99.63%)
#65 [255, 204, 51] 19 ( 0.03%) 67266 ( 99.65%)
#209 [255, 204, 255] 17 ( 0.03%) 67283 ( 99.68%)
#3 [153, 0, 0] 16 ( 0.02%) 67299 ( 99.70%)
#46 [204, 51, 51] 16 ( 0.02%) 67315 ( 99.73%)
#71 [255, 255, 51] 16 ( 0.02%) 67331 ( 99.75%)
#20 [102, 153, 0] 15 ( 0.02%) 67346 ( 99.77%)
#142 [204, 255, 153] 15 ( 0.02%) 67361 ( 99.79%)
#22 [204, 153, 0] 14 ( 0.02%) 67375 ( 99.81%)
#12 [ 0, 102, 0] 12 ( 0.02%) 67387 ( 99.83%)
#28 [204, 204, 0] 12 ( 0.02%) 67399 ( 99.85%)
#63 [153, 204, 51] 12 ( 0.02%) 67411 ( 99.87%)
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#166 [204, 153, 204] 12 ( 0.02%) 67423 ( 99.89%)
#131 [255, 153, 153] 10 ( 0.01%) 67433 ( 99.90%)
#82 [204, 51, 102] 8 ( 0.01%) 67441 ( 99.91%)
#124 [204, 102, 153] 6 ( 0.01%) 67447 ( 99.92%)
#98 [102, 204, 102] 5 ( 0.01%) 67452 ( 99.93%)
#167 [255, 153, 204] 5 ( 0.01%) 67457 ( 99.94%)
#106 [204, 255, 102] 4 ( 0.01%) 67461 ( 99.94%)
#141 [153, 255, 153] 4 ( 0.01%) 67465 ( 99.95%)
#40 [204, 0, 51] 3 ( 0.00%) 67468 ( 99.95%)
#55 [ 51, 153, 51] 3 ( 0.00%) 67471 ( 99.96%)
#76 [204, 0, 102] 3 ( 0.00%) 67474 ( 99.96%)
#29 [255, 204, 0] 2 ( 0.00%) 67476 ( 99.96%)
#53 [255, 102, 51] 2 ( 0.00%) 67478 ( 99.97%)
#59 [255, 153, 51] 2 ( 0.00%) 67480 ( 99.97%)
#72 [ 0, 0, 102] 2 ( 0.00%) 67482 ( 99.97%)
#75 [153, 0, 102] 2 ( 0.00%) 67484 ( 99.98%)
#83 [255, 51, 102] 2 ( 0.00%) 67486 ( 99.98%)
#125 [255, 102, 153] 2 ( 0.00%) 67488 ( 99.98%)
#207 [153, 204, 255] 2 ( 0.00%) 67490 ( 99.99%)
#4 [204, 0, 0] 1 ( 0.00%) 67491 ( 99.99%)
-------------------------------------------------------
Num [ R , G , B ] Count ( Ratio%) Total ( Ratio%)
-------------------------------------------------------
#19 [ 51, 153, 0] 1 ( 0.00%) 67492 ( 99.99%)
#27 [153, 204, 0] 1 ( 0.00%) 67493 ( 99.99%)
#89 [255, 102, 102] 1 ( 0.00%) 67494 ( 99.99%)
#105 [153, 255, 102] 1 ( 0.00%) 67495 ( 99.99%)
#114 [ 0, 51, 153] 1 ( 0.00%) 67496 ( 99.99%)
#115 [ 51, 51, 153] 1 ( 0.00%) 67497 (100.00%)
#119 [255, 51, 153] 1 ( 0.00%) 67498 (100.00%)
#134 [102, 204, 153] 1 ( 0.00%) 67499 (100.00%)
#158 [102, 102, 204] 1 ( 0.00%) 67500 (100.00%)
-------------------------------------------------------
Total 109 colors.
-------------------------------------------------------