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_nfd.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」が設定されている)を設定して、「Enter」キーを押す。
出力テキストファイル名の設定が求められる(図2)。適当なテキストファイル名を設定する。
テキストファイル名を設定して「Enter」キーを押すと、データが読み込まれて計算が始まる。
計算が終了すると、図2で設定した名前の出力ファイルが保存されたメッセージが表示される(図3)。
図3
スクリプトの実行終了後、出力ファイルを開くことができる。
出力テキストファイルをPython IDLEで開こうとすると図4のボックスが表示されることがある。
図4
「s-jis」と設定して、「OK」ボタンをクリックすれば、開くことが出来る(図5)。
図5
出力ファイルは以下のような内容である。
入力データファイル: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のデータの散布図は、図6のようである。
図6
リスト1 2変量統計量の計算(StatTwoVars.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')
fout.write('\n入力データファイル:{}\n'.format(finnm))
#
# 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)
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))