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)

 

これらの関数を用いたスクリプト例を本ウェブサイト後半のリスト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))

 

 

 

Up