2006 年 2 月 19 日 19 時 46 分

重要度を見極める


このアーカイブは同期化されません。 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.
-------------------------------------------------------



Copyright (c) 1994-2007 Project Loafer. All rights reserved.