1変量統計量
平均値、分散、標準偏差、不偏分散、歪度、尖度を求める。
データの配列をXで表すとき、これらの統計量はnumpyあるいはscipy.statsに用意されている関数を用いると以下のように得ることができる。
平均値
numpy.mean(X)
分散
numpy.var(X)
標準偏差
numpy.std(X)
不偏分散
numpy.var(X)
* len(X) / (len(X) - 1)
歪度
scipy.stats.skew(X)
尖度
scipy.stats.kurtosis(X)
上の関数の使用例を本ウェブサイト後半のリスト1に示す。スクリプトファイルとデータファイルは圧縮ファイルfilesStatOneVar.zipにまとめたので、ダウンロード解凍すれば自由に利用できる。
リスト1の前半は、入出力ファイル名の設定とExcelデータファイルからのデータの読み込みである。読み込んだデータは変数Xで表されている。
リスト1を実行すると、まず入力データファイル名の設定を求めるダイアログウィンドウが表示される(図1)。
図1
入力データファイルは、図2に示す形式のExcelファイルとして用意する。
・
・
・
図2 Excelファイル(temper.xlsx)
図2では、1行目に変量名が設定され、1列目はデータの識別値、図2では通し番号が設定されている。識別値は文字列でもよい。また、同じものを複数回用いてもよい。データ値は2列目に書く。図1のダイアログウィンドウに入力データファイル名(図1では、図2のファイル名temper.xlsxが設定されている)を設定して、「開く」ボタンをクリックすると、出力テキストファイル名の設定を求めるダイアログウィンドウが表示される(図3)。
図3
適当なテキストファイル名を設定して、「保存」ボタンをクリックする。
「保存」ボタンのクリックで、データが読み込みと計算が始まる。最後に、出力テキストファイル名がフルパスで表示されて、プログラムの実行終了となる(図4)。
図4
実行終了後、出力テキストファイル名を開くことができる。
出力テキストファイルをPython IDLEで開くときに、図5のようなダイアログボックスが表示されることがある。
図5
「utf-8」を「s-jis」に変更して「OK」ボタンをクリックすればよい(図6)。
図6
出力ファイルを開くと、以下のような内容になっている。
入力データファイル:D:/yasuharu/www/LaCoocan/Python/IntroPyStat/StatOneVar/filesStatOneVar/temper.xlsx
変量: 気温
データ値:
[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]
平均値 = 28.929
分散 = 2.591
標準偏差 = 1.610
不偏分散 = 2.645
歪度 = -0.416
尖度 = -0.368
import tkinter as tk
import tkinter.filedialog as fd
import pandas as pd
import numpy as np
import scipy.stats as ss
def askinfilename(msg = None, types =
[('', '*.*')]):
"""
入力用ファイル名の設定用ダイアログウィンドウ
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.askopenfilename(title = msg, filetypes = types)
rt.destroy()
return flnm
def askoutfilename(msg = None, types =
[('', '*.*')], deftype = '.txt'):
"""
出力用ファイル名の設定用ダイアログウィンドウ
"""
rt = tk.Tk()
rt.withdraw()
flnm =
fd.asksaveasfilename(title = msg, filetypes = types,
defaultextension = deftype)
rt.destroy()
return flnm
finnm = askinfilename('入力データExcelファイル', types = [('Excel(*.xlsx)', '*.xlsx')])
foutnm = askoutfilename(msg = '出力用テキスト', types = [('Text
(*.txt)', '*.txt')],
deftype = '.txt')
fout = open(foutnm, 'w')
fout.write('\n入力データファイル:{}\n'.format(finnm))
# ExcelデータファイルからExcelFile型のオブジェクトの生成
xlsx_fl = pd.ExcelFile(finnm)
# ExcelFile型のオブジェクトからDataFrame型のオブジェクトの生成
data_xlsx =
pd.read_excel(xlsx_fl, header =
None)
# DataFrame型のオブジェクトからndarray型のオブジェクトの生成
data = data_xlsx.values
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))
X_mean = np.mean(X)
# 平均値
print('平均値 = ', X_mean)
fout.write('\n平均値 = {0:.3f}\n'.format(X_mean))
X_var = np.var(X)
# 分散
print('分散 = ', X_var)
fout.write('\n分散 = {0:.3f}\n'.format(X_var))
X_sd = np.std(X)
# 標準偏差
print('標準偏差 = ', X_sd)
fout.write('\n標準偏差 = {0:.3f}\n'.format(X_sd))
X_uvar = X_var * len(X) / (len(X) -
1)
# 不偏分散
print('不偏分散 = ', X_uvar)
fout.write('\n不偏分散 =
{0:.3f}\n'.format(X_uvar))
X_skewness = ss.skew(X)
# 歪度
print('歪度 = ', X_skewness)
fout.write('\n歪度 =
{0:.3f}\n'.format(X_skewness))
X_kurtosis = ss.kurtosis(X)
# 尖度
print('尖度 = ', X_kurtosis)
fout.write('\n尖度 =
{0:.3f}\n'.format(X_kurtosis))
fout.close()
print('\n出力テキストファイル:\n{}\n'.format(foutnm))