Up

相関係数の検定と推定

 

相関係数を求め、それに対するp値、信頼区間を求めるプログラムを書いてみた。検定、p値、信頼区間については、岡本安晴データ使いこなすための統計入門で説明している。

プログラムをリストに示す。プログラムファイルなどは、まとめて圧縮ファイルtestrfiles.zipとしたので、ダウンロード展開すれば自由に利用できる。

相関係数などは、次のスクリプトで求めた。

 

results = ss.pearsonr(temps, hums)

r = results.statistic

p = results.pvalue

vL, vU = results.confidence_interval(0.95)

 

関数pearsonrの戻り値resultsに、相関係数、p値、信頼区間を求めるメソッドconfidence_intervalが含まれている。

リスト1のプログラムを実行すると、入力データファイル名の設定が求められる。入力データファイルはExcel形式のファイルである。

 

入力データファイル(*.xlsx= TempHum.xlsx

 

上の例では、TempHum.xlsxが設定されている。

ファイルTempHum.xlsxは、図1に示す形式のファイルである。

図1 東京の2022年の気温と湿度の月平均値

気象庁のホームページからダウンロードしたものを編集した。

 

図1のデータは、気象庁のホームページからダウンロードしたものを編集したものである。1行目に変数名が書かれている。1列目は、月を表し、2列目と3列目が平均気温と平均湿度である。2列目のデータと3列目のデータの相関係数が計算される。

入力ファイル名を設定すると、次に出力ファイル名の設定が求められる。出力ファイル名は、テキストファイル名(*.txt)を適当に設定する。

 

入力データファイル(*.xlsx= TempHum.xlsx

出力ファイル(*.txt= temp.txt

 

出力ファイル名を設定すると、計算が始まり、図2のグラフが表示される。

図2

 

相関係数が0.940と表示されているが、東京都の気温と湿度の相関関係はかなり高いと言えそうである。95%信頼区間も、約0.8以上の領域にある。

図2のウィンドウを閉じると、プログラムは実行終了である。端末には、次のメッセージが表示されている。

 

temp.txt was saved.

 

出力ファイルを開くと、以下のような内容である。

 

 

Input Data File = temp.txt

 

Data...

[['Month' 'MeanTemp' 'MeanHum']

 [1 4.9 52]

 [2 5.2 53]

 [3 10.9 63]

 [4 15.3 75]

 [5 18.8 75]

 [6 23 77]

 [7 27.4 79]

 [8 27.5 79]

 [9 24.4 81]

 [10 17.2 75]

 [11 14.5 70]

 [12 7.5 60]]

 

r = 0.940,  p-value = 0.00001,  95%CI = [0.795, 0.983]

 

 

 

リスト1 相関係数の検定(test_r.py

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

#import japanize_matplotlib      #     グラフ内で日本語表記を用いるときのみ必要

import scipy.stats as ss

 

 

finnm =  input('入力データファイル(*.xlsx= ')

txtoutnm = input('出力ファイル(*.txt= ')

txtout = open(txtoutnm, 'w')

with pd.ExcelFile(finnm) as xlsx_fl:

    data_xlsx = pd.read_excel(xlsx_fl, header = None)

data = data_xlsx.values

print('\n', data)

 

xname = data[0,1]

yname = data[0,2]

temps = data[1:, 1]

hums = data[1:, 2] 

#

#          ピアソンの相関係数の算出と検定

#

results = ss.pearsonr(temps, hums)

r = results.statistic

p = results.pvalue

vL, vU = results.confidence_interval(0.95)

 

plt.scatter(temps, hums)

plt.xlabel(xname)

plt.ylabel(yname)

plt.title(f'r = {r:.3f},  p-value = {p:.5f}\n95%CI = [{vL:.3f}, {vU:.3f}]')

plt.show()

 

txtout.write('\nInput Data File = ' + txtoutnm + '\n')

txtout.write(f'\nData...\n{data}\n')

txtout.write(f'\nr = {r:.3f},  p-value = {p:.5f}' +

             f',  95%CI = [{vL:.3f}, {vU:.3f}]')

 

txtout.close()

print('\n' + txtoutnm + ' was saved.\n')

 

 

 

Home