gnuplotにはファイルのデータに関する統計情報を得るためのコマンド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_***という変数に保存されています。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 | データのコラムの数 |
以下で_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_x | xデータの標準偏差の誤差 |
STATS_skewness_err_x | xデータの歪度の誤差 |
STATS_kurtosis_err_x | xデータの尖度の誤差 |
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データの最大値を取るデータの行数 |
以下は、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
というオプションを使うと、上述の変数の名前のSTATSの部分を任意に変更できます。例えば、
stats "test.dat" name "MyStats"
とすると、上の表のすべての変数名のSTATSの部分がMyStatsに入れ替わります。これは、複数のファイルの統計情報を利用する場合に便利です。
スクリプトでstats
コマンドを使う場合には、コンソールに情報を出力する必要はあまりありません。また、もしset print "filename"
で出力をファイルに保存するような設定になっている場合、stats
コマンドによる統計情報の出力もすべてset print
で指定したファイルに書き込まれてしまいます。これらのような、stats
による出力を抑制したい場合には、nooutput
オプションを用います。例えば、
stats "test.dat" nooutput
のようにすると、コンソールへの出力がなくなりますが、STATS_recordsなどの変数はすべて作成されます。
stats
コマンドは以下のようにいろいろな応用が可能です。
stats
コマンドでは、plot
コマンドと同様に、using
やevery
と共に使うことができます。あるデータファイルdata.dat
の10行目、3コラム目のデータを取得したいとします。その場合、以下のようにしてデータを得ることができます。
stats "data.dat" using 3 every ::10::10 nooutput
これを実行すると、変数STATS_max(またはSTATS_minなど)に欲しいデータが格納されます。
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変数で得ることができます。