Up

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)

 

これらの関数を用いたスクリプト例を本ウェブサイト後半のリスに示す。スクリプトファイルとデータファイルは、まとめて圧縮ファイル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))

 

 

 

Up