ファイルの統計情報を得る(stats)

gnuplotにはファイルのデータに関する統計情報を得るためのコマンドstatsがあります。ここでは、その使い方を解説します。

statsコマンドの基本的使い方

例えば、test.datというデータファイルの統計情報を取得したいとき、statsコマンドを以下のように使います。

stats "test.dat"

すると、以下のような情報がプロンプトに表示されます。

gnuplot> stats "test.dat"

* FILE: 
  Records:           100
  Out of range:        0
  Invalid:             0
  Blank:               1
  Data Blocks:         1

* COLUMNS:
  Mean:               0.0000              0.0394
  Std Dev:            5.8315              0.1924
  Sample StdDev:      5.8609              0.1934
  Skewness:           0.0000              3.4702
  Kurtosis:           1.7998             15.8137
  Avg Dev:            5.0505              0.0955
  Sum:           1.24345e-014              3.9441
  Sum Sq.:         3400.6742              3.8574

  Mean Err.:          0.5832              0.0192
  Std Dev Err.:       0.4124              0.0136
  Skewness Err.:      0.2449              0.2449
  Kurtosis Err.:      0.4899              0.4899

  Minimum:          -10.0000 [  0]       -0.2170 [ 44]
  Maximum:           10.0000 [ 99]        0.9730 [ 49]
  Quartile:          -5.0505             -0.0318
  Median:             0.0000              0.0068
  Quartile:           5.0505              0.0345

  Linear Model:       y = -1.932e-019 x + 0.03944
  Slope:              -1.932e-019 +- 0.003333
  Intercept:          0.03944 +- 0.01944
  Correlation:        r = -5.855e-018
  Sum xy:             -1.665e-016

最初の、FILE:と書かれたフィールドの中の情報は、データ数、空行の数など、データファイル全体の情報を示してあり、COLUMNS:と書かれたフィールドの中は、xデータ(今の場合1コラム目)とyデータ(今の場合2コラム目)の平均値などの統計情報が示されています。最後の方には、xとyのデータの線形相関に関する情報も表示されています。これらの統計データの詳細については、後述の変数の意味をみれば大抵わかると思います。

xとyについて、どのコラムを使うかを明示的に指定するには、plotと同じく、usingを使います。例えば、同じtest.datに対して、

stats "test.dat" using 2:1

とすると、以下のように2コラム目をxデータ、1コラム目をyデータとした統計情報が得られます。(前の例と比べて、xとyが入れ替わっています)

* FILE: 
  Records:           100
  Out of range:        0
  Invalid:             0
  Blank:               1
  Data Blocks:         1

* COLUMNS:
  Mean:               0.0394              0.0000
  Std Dev:            0.1924              5.8315
  Sample StdDev:      0.1934              5.8609
  Skewness:           3.4702              0.0000
  Kurtosis:          15.8137              1.7998
  Avg Dev:            0.0955              5.0505
  Sum:                3.9441         1.24345e-014
  Sum Sq.:            3.8574           3400.6742

  Mean Err.:          0.0192              0.5832
  Std Dev Err.:       0.0136              0.4124
  Skewness Err.:      0.2449              0.2449
  Kurtosis Err.:      0.4899              0.4899

  Minimum:           -0.2170 [ 44]      -10.0000 [  0]
  Maximum:            0.9730 [ 49]       10.0000 [ 99]
  Quartile:          -0.0318             -5.0505
  Median:             0.0068              0.0000
  Quartile:           0.0345              5.0505

  Linear Model:       y = -1.775e-016 x + 1.313e-016
  Slope:              -1.775e-016 +- 3.062
  Intercept:          1.313e-016 +- 0.6013
  Correlation:        r = -5.855e-018
  Sum xy:             -1.665e-016

statsコマンドで生成される変数

実は、これらの統計情報は、STATS_***という変数に保存されています。show variablesを使って、変数を見てみましょう:

stats "test.dat"
show variables

すると、下記のように、たくさんのSTATS_から始まる変数が作られていることがわかります。

        User and default variables:
        pi = 3.14159265358979
        GNUTERM = "wxt"
        NaN = NaN
        ARGC = 0
        ARG0 = ""
        STATS_records = 100.0
        STATS_invalid = 0.0
        STATS_blank = 1.0
        STATS_blocks = 1.0
       **** 中略 ****
        STATS_correlation = -5.85526242668841e-018
        STATS_sumxy = -1.66533453693773e-016
        STATS_pos_min_y = -1.11111
        STATS_pos_max_y = -0.10101

これらの変数の意味は次の通りです。これらはスクリプトからでももちろん呼び出せますので、うまく使うと便利なスクリプトが書けます。

データ数の情報

変数内容
STATS_records 範囲内のデータの数
STATS_invalid 無効なデータ・適切でないデータの数
STATS_blank 空行の数
STATS_blocks ブロック(空行2行で区切られる; indexで指定できる)の数
STATS_outofrange 範囲外のデータの数
STATS_columns データのコラムの数

1次元データの統計情報

以下で_x_yで置き換えると、yデータに関する情報が格納されている変数となります。また、もしデータコラムが1つしかないデータファイルを指定したり、using 1のようにusingで1つのコラムしか指定しなかった場合は、_xの無い変数名(例えばSTATS_mean)となります。

変数内容
STATS_mean_x xデータの平均
STATS_stddev_x xデータの標準偏差
STATS_ssd_x xデータの標本標準偏差(sample standard deviation; 標準偏差を計算する際にNで割る代わりにN-1で割ったもの)
STATS_skewness_x xデータの歪度(わいど、skewness)
STATS_kurtosis_x xデータの尖度(せんど、kurtosis)
STATS_adev_x xデータの平均偏差(average deviation; 平均との差の絶対値の平均)
STATS_mean_err_x xデータの平均の誤差
STATS_stddev_err_xxデータの標準偏差の誤差
STATS_skewness_err_xxデータの歪度の誤差
STATS_kurtosis_err_xxデータの尖度の誤差
STATS_sum_x xデータの総和
STATS_sumsq_x xデータの二乗和
STATS_min_x xデータの最小値
STATS_max_x xデータの最大値
STATS_median_x xデータの中央値
STATS_lo_quartile_x xデータの下側四分位数
STATS_up_quartile_x xデータの上側四分位数
STATS_index_min_x xデータが最小値を取るデータの行数(例えば10行目にxが最大値を取るなら、この変数の値は10)
STATS_index_max_x xデータの最大値を取るデータの行数

2次元データの統計情報

以下は、xとyのデータの関係性を示すような統計情報です。データコラムが1コラムしかないようなデータファイルを指定した場合や、usingで一つのデータコラムのみを指定した場合は、以下の変数は生成されません。

変数内容
STATS_slope 線形の回帰曲線の傾き
STATS_intercept 線形の回帰曲線の切片
STATS_slope_err 線形の回帰曲線の傾きの誤差
STATS_intercept_err線形の回帰曲線の切片の誤差
STATS_correlation xデータとyデータの相関係数
STATS_sumxy xyの積和(x*yの和)
STATS_pos_min_y yが最小値を取るときのxの値
STATS_pos_max_y yが最大値を取るときのxの値

変数名の変更(nameオプション)

なお、nameというオプションを使うと、上述の変数の名前のSTATSの部分を任意に変更できます。例えば、

stats "test.dat" name "MyStats"

とすると、上の表のすべての変数名のSTATSの部分がMyStatsに入れ替わります。これは、複数のファイルの統計情報を利用する場合に便利です。

nooutputオプション

スクリプトでstatsコマンドを使う場合には、コンソールに情報を出力する必要はあまりありません。また、もしset print "filename"で出力をファイルに保存するような設定になっている場合、statsコマンドによる統計情報の出力もすべてset printで指定したファイルに書き込まれてしまいます。これらのような、statsによる出力を抑制したい場合には、nooutputオプションを用います。例えば、

stats "test.dat" nooutput

のようにすると、コンソールへの出力がなくなりますが、STATS_recordsなどの変数はすべて作成されます。

statsコマンドの応用

statsコマンドは以下のようにいろいろな応用が可能です。

あるデータ行のデータを入手する

statsコマンドでは、plotコマンドと同様に、usingeveryと共に使うことができます。あるデータファイルdata.datの10行目、3コラム目のデータを取得したいとします。その場合、以下のようにしてデータを得ることができます。

stats "data.dat" using 3 every ::10::10 nooutput

これを実行すると、変数STATS_max(またはSTATS_minなど)に欲しいデータが格納されます。

Yデータがある値に最も近くなるときのXの値を調べる

2次元のデータ(X: 1コラム目、Y: 2コラム目)のうちのYデータがある値Y0に最も近くなるXの値(X0とします)を調べたい場合、以下のようにします。

Y0 = 10.0
stats "data.dat" using 1:(abs($2-Y0)) nooutput
X0 = STATS_pos_min_y

つまり、YデータがY0に最も近いとき、Y-Y0の絶対値(abs(Y-Y0))は最小になるので、その時のXデータはSTATS_pos_min_y変数で得ることができます。