Kodama's home / tips.

行の長さの分布

ruby ヒストグラム クラス では, テキストファイルの行の長さの分布を調べたが, この項では, 少し異なる観点から調べてみる.

いくつかのグラフを作成するが, その意味の詳細については省略する. データ列を分析する手法としては, フラクタル解析や 時系列分析などのテキストを読むと良い.

ruby の多項式クラス から, polynomialm.rb の行の長さの分布を調べてみる.

  1. スクリプト
  2. 順位-長さ のグラフ
  3. 順位-長さ の片対数グラフ
  4. 長さ-累積度数 の片対数グラフ
  5. 順位-長さ の両対数グラフ
  6. ヒストグラム
  7. まとめ
    1. 分布の基本的な特性
    2. 人為的な調整/編集の影響

スクリプト

以下のようにして, データ列からグラフを作る.
  1. 空行を除くために 4文字以上の行をとりだし,
  2. 行の長さのデータを作る.
  3. 順位と長さの関連をしらべるために長さ順に整列,
  4. gnuplot でグラフにする.
$ gawk '(length($0)>3){print length($0)}'< polynomialm.rb | sort -nr | gnuplot gplot.txt > polym.png
以下で, gnuplot に与えるコマンドファイル gplot.txt を変えて様々なグラフを作る.

順位-長さ のグラフ

gnuplot のコマンドファイル(gplot.txt)

set terminal png
plot "< cat" using ($0+1):($1)

結果(図1)

順位-長さ の関係を, 通常の(線形な)グラフで見る. このグラフの素性は...?
Fig.1. distribution of line length

順位-長さ の片対数グラフ

gnuplot のコマンドファイル(gplot.txt)

set terminal png
set logscale y; plot "< cat" using ($0+1):($1) # linear-log

結果(図2)

順位-長さ の関係が, 片対数グラフでほぼ直線状になっている.
Fig.2. distribution of line length

長さ-累積度数 の片対数グラフ

図2 の縦-横を逆に見てみる. 長さ-累積度数のグラフと考えても良い.

gnuplot のコマンドファイル(gplot.txt)

set terminal png
set logscale y; plot "< cat" using ($1):($0+1) # linear-log

結果(図3)

長さ-累積度数 でみても 図2 とほぼ同様に解釈できる.
Fig.3. distribution of line length

順位-長さ の両対数グラフ

順位-長さ を log-log グラフでみる.

gnuplot のコマンドファイル(gplot.txt)

set terminal png
set logscale xy; plot "< cat" using ($0+1):($1) # log-log

結果(図4)

順位-長さ を log-log でみる. これと比べると, 図2 の片対数グラフの方が直線に近いことから, 行の長さはフラクタル的な分布よりも, 指数分布または幾何分布に近いことがわかる.
Fig.4. distribution of line length

ヒストグラム

ruby ヒストグラム クラス で用いた方法で, 4文字以上の行についてのヒストグラムを調べてみる.
 5-.:----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+- 91
10-.:----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---- 94
15-.:----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ 80
20-.:----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+--- 78
25-.:----+----+----+----+----+----+----+----+----+----+----+----+----+----+-- 72
30-.:----+----+----+----+----+----+----+----+----+----+----+----+----+ 65
35-.:----+----+----+----+----+----+----+----+----+----+----+ 55
40-.:----+----+----+----+----+----+----+----+- 41
45-.:----+----+----+----+----+----+----+----+----+----+-- 52
50-.:----+----+----+----+----+--- 28
55-.:----+----+----+----+--- 23
60-.:----+----+----+--- 18
65-.:----+----+----+----+ 20
70-.:----+----+ 10
75-.:----+---- 9
number: 736, average: 29.501359
standard deviation: 17.859430, coefficient of variation: 0.605377
range: 74.000000, range/average: 2.508359
variance: 318.959237, skewness: 0.658964, kurtosis: 2.643561

まとめ

分布の基本的な特性

行の長さの分布は, フラクタル的ではない. 指数分布または幾何分布になっている.

どの形式でグラフを作っても比較的滑らかなグラフが得られている. つまり, 自然に指数分布/幾何分布していることを意味している. これは, プログラムを書き下すときの改行するという行動が, ポアソン分布またはパスカル分布的に起こっているという事ではないだろうか.

人為的な調整/編集の影響

編集する場合, 読みにくくなるのを避けるため, 長すぎたり短すぎたりするのは避けるように調整する. この人為的な調整で, グラフに折れ曲がりができるはず.

編集によって, 20文字以下の行が少くなるために, サイズが 20 の辺りで急に折れ曲がっているなどの 人為的な編集の兆候が見られるのでは無いかと思っていた. グラフが滑らかというのは, この調整に特別な癖がないと云うことを意味しているのだろうか?

図2 で見ると, 行の長さが 20 と 60 の辺りで緩やかにカーブしていることがわかる. つまり, 多少は, 行の長さの調整の影響が見えているように思われる. ヒストグラムでも 20 以下のサイズの行が少めになっているように見える.
行に詰め込みすぎる癖があることは自覚しているが...


Kodama's home / tips.