順序統計量
1変量データを変数Xで表すとき、順序統計量などは以下のように得ることが出来る。
Xの値を大きさの順に並べたもの(順序統計量)
sorted(X)
最小値
min(X)
最大値
max(X)
第1四分位数、中央値、第3四分位数
numpy.percentile(X, [25, 50, 75])
関数numpy.percentileは、第2引数で指定したパーセントの値に対応する百分位数を返すものである。
これらの関数を使用したスクリプト例を本ウェブサイト後半のリスト1に示す。スクリプトファイルおよびサンプルデータファイルは、まとめて圧縮ファイルfilesStatOrder_nfd.zipとした。ダウンロード・解凍すれば、自由に利用できる。
リスト1のスクリプトでは、入出力のファイル名をダイアログウィンドウで設定し、入力データはExcelファイルから読み込み、データ値を変数Xで表している。
リスト1を実行すると、まず、入力データファイル名の設定が求められる(図1)。
図1
図1では、下図(図2)のExcelファイルの名前が設定されている。
・
・
・
図2
入力データファイルは、図2の形式のExcelファイルとして用意する。第1行目に変数の名前を並べる。1列目はデータの識別値で、図2の場合は通し番号であるが、文字列でもよい。また、同じ識別値を複数回用いてもよい。2列目にデータ値を書く。
図1の入力ファイル名の設定を行うと、次に出力テキストファイル名の設定が求められる。任意のテキストファイル名を設定して(図1の場合は「Results.txt」)、「Enter」キーを押すと、続いて、グラフの保存用ファイル名の設定が求められる(図1)。ファイル拡張子が「.png」である画像用の任意のファイル名(図1の場合は「MyFigure.png」)を設定して、「Enter」キーを押す。
データの読み込みが始まり、計算が行われ、パーセンタイル順位のグラフが表示される(図3)。
図3
図3のウィンドウを閉じると、スクリプトの実行終了となる(図4)。
図4
終了後に、保存されたファイルを開くことができる。
図4の出力テキストファイルをPython IDLEのエディタで開こうとすると図5のボックスが表示されることがある。
図5
このときは、「s-jis」と設定して「OJK」ボタンをクリックすればよい(図6)。
図6
出力テキストファイルを開くと、以下のような内容である。
変量: 気温
データ値:
[30.1 30.7 25.2 26 30.5 25.3 28.1 31.4
30.5 29.1 28.5 30.7 28.3 26.3 29.5
31.2 32 30.1 26.4 29 28.2 29.4 29.6 29.6
27.7 26.9 30.2 28.3 31.3 28 31.1
27 30 29.2 29.8 28.1 29.5 28.4 28.5 28.6
27.6 29.3 30.5 28.4 30.3 28.3
26.4 28.7 29.7]
順序統計量:
25.2 25.3 26
26.3 26.4 26.4 26.9 27
27.6 27.7
28 28.1 28.1 28.2 28.3 28.3 28.3 28.4 28.4 28.5
28.5 28.6 28.7 29
29.1 29.2 29.3 29.4 29.5 29.5
29.6 29.6 29.7 29.8 30
30.1 30.1 30.2 30.3 30.5
30.5 30.5 30.7 30.7 31.1 31.2 31.3 31.4 32
最小値 = 25.200
最大値 = 32.000
第1四分位数 = 28.100
中央値 = 29.100
第3四分位数 = 30.100
リスト1 順序統計量(StatOneVarOrder.py)
import pandas as pd
import numpy
as np
import scipy.stats
as ss
import matplotlib.pyplot
as plt
finnm = input('入力データファイル(*.xlsx)= ')
foutnm = input('出力テキストファイル(*.txt)= ')
fout = open(foutnm,
'w')
fpltnm = input('画像保存ファイル(*.png)= ')
#
# Excelファイルの読み込み
# モジュール xlrd がインストール済みであること
#
xlsx_fl = pd.ExcelFile(finnm)
# ExcelファイルからExcelFile型オブジェクトを生成
data_xlsx = pd.read_excel(xlsx_fl, header
= None) # ExcelFile型オブジェクトからDataFrame型オブジェクトを生成
data = data_xlsx.values
# Dataframe型オブジェクトからnumpyの配列オブジェクトを生成
print('\n', data)
var_name = data[0,1]
# 変量名
X = data[1:, 1]
# データ値、numpy.ndarray
print(X)
fout.write('\n変量: {}\n'.format(var_name))
fout.write('\nデータ値:\n{}\n'.format(X))
Y = sorted(X)
print(Y)
fout.write('\n順序統計量:\n')
nl = 0
for v in Y:
fout.write(' {}'.format(v))
nl
+= 1
if nl
>= 10:
nl = 0
fout.write('\n')
fout.write('\n')
Pctl = np.array([v+1
for v in range(len(Y))]) * 100 / len(Y)
# 日本語表記の設定
plt.rcParams['font.family']
= ['Yu Gothic', 'Noto Sans CJK JP', 'Hiragino Maru Gothic Pro']
plt.title('百分位数', fontsize = 20)
plt.plot(Pctl, Y)
plt.xlabel('パーセンタイル順位', fontsize =
12)
plt.ylabel(var_name, fontsize = 14)
plt.savefig(fpltnm)
plt.show()
X_min = min(X)
X_max = max(X)
print(X_min)
fout.write('\n最小値 = {0:.3f}\n'.format(X_min))
print(X_max)
fout.write('\n最大値 = {0:.3f}\n'.format(X_max))
Q1, Med, Q3 = np.percentile(X,
[25, 50, 75])
print(Q1, Med, Q3)
fout.write('\n第1四分位数 = {0:.3f}\n'.format(Q1))
fout.write('\n中央値 = {0:.3f}\n'.format(Med))
fout.write('\n第3四分位数 = {0:.3f}\n'.format(Q3))
fout.close()
print('\n出力テキストファイル:{}'.format(foutnm))
print('\n画像保存ファイル:{}\n'.format(fpltnm))