Pythonによる2変量統計量の計算
2変量の統計量である共分散と相関係数を求める。
2つの変量の配列とが与えられているとき、2変量の統計量は以下のように求めることが出来る。
共分散行列(不偏分散の場合)
numpy.cov(X,Y)
共分散行列(分散の場合)
numpy.cov(X,
Y, ddof = 0)
ピアソンの積率相関係数
scipy.stats.pearsonr(X,
Y)
スピアマンの順位相関係数
scipy.stats.spearmanr(X,
Y)
ケンドールの順位相関係数
scipy.stats.kendalltau(X,
Y)
これらの関数を用いたスクリプト例を本ウェブサイト後半のリスト1に示す。スクリプトファイルとデータファイルは、まとめて圧縮ファイルfilesStatTwoVar.zipとした。ダウンロード解凍すれば、自由に利用できる。
リスト1は、データが図1に示す形式で用意されているExcelファイルを入力データファイルとするものである。
図1 年齢と身長(AgeHeight.xlsx)
図1のデータは、内閣府のホームページに掲載されている平成16年度の6歳から17歳までの平均身長を入力したものである。1行目に変数名が書かれ、データは2行目から入力されている。1列目にはデータの識別値が書かれているが、図1の場合は年齢を表す文字列が使われている。識別値は、文字列でも数値でもよく、同じ識別値を複数回用いてもよい。2列目に第1変量の値、3列目に第2変量の値が書かれている。
リスト1のスクリプトを実行すると、入力データファイル名の入力を求めるダイアログウィンドウが表示される(図2)。
図2
入力データファイル名(図2の場合は、図1のファイル名「AgeHeight.xlsx」が設定されている)を設定して、「開く」ボタンをクリックする。
出力テキストファイル名の設定を求めるダイアログウィンドウが表示される(図3)。
図3
適当なテキストファイル名を設定する。
「保存」ボタンをクリックすると、計算が始まり、終了すると、図3で設定した名前の出力ファイルが保存されたメッセージが表示される(図4)。
図4
スクリプトの実行終了後、出力ファイルを開くことができる。
出力テキストファイルをPython IDLEで開こうとすると図5のボックスが表示されることがある。
図5
「s-jis」と設定して、「OK」ボタンをクリックすれば、開くことが出来る(図6)。
図6
出力ファイルは以下のような内容である。
入力データファイル:D:/yasuharu/www/LaCoocan/Python/IntroPyStat/StatTwoVars/filesStatTwoVar/AgeHeight.xlsx
年齢
身長
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17]
[116.8, 122.6, 128.1, 133.5, 138.9,
145.1, 152.6, 159.9, 165.3, 168.4, 170, 170.8]
共分散行列
[[ 13.
69.64545455]
[ 69.64545455 381.52787879]]
ピアソンの積率相関係数 = 0.98891
スピアマンの順位相関係数 = 1.00000
ケンドールの順位相関係数 = 1.00000
ちなみに、図1のデータの散布図は、図7のようである。
図7
リスト1 2変量統計量の計算(StatTwoVars.py)
import tkinter as tk
import tkinter.filedialog as fd
import pandas as pd
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
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)
X_Name = data[0, 1]
Y_Name = data[0, 2]
print(X_Name, Y_Name)
fout.write('\n{0}\n{1}\n'.format(X_Name,
Y_Name))
X = data[1:, 1]
Y = data[1:, 2]
X = list(X)
Y = list(Y)
print(X)
print(Y)
fout.write('\n{}\n'.format(X))
fout.write('\n{}\n'.format(Y))
XY_cov = np.cov(X,Y)
# 不偏分散
print('共分散行列\n', XY_cov)
fout.write('\n共分散行列\n{}\n'.format(XY_cov))
p_r, _p = ss.pearsonr(X, Y)
print('\nピアソンの積率相関係数 = ', p_r)
fout.write('\nピアソンの積率相関係数 =
{0:.5f}\n'.format(p_r))
s_r, _p = ss.spearmanr(X, Y)
print('\nスピアマンの順位相関係数 = ', s_r)
fout.write('\nスピアマンの順位相関係数 =
{0:.5f}\n'.format(s_r))
k_tau, _p = ss.kendalltau(X, Y)
print('\nケンドールの順位相関係数 = ', k_tau)
fout.write('\nケンドールの順位相関係数 =
{0:.5f}\n'.format(k_tau))
fout.close()
print('\n出力ファイル{}が保存されました。\n'.format(foutnm))