相関係数の検定と推定
相関係数を求め、それに対するp値、信頼区間を求めるプログラムを書いてみた。検定、p値、信頼区間については、岡本安晴「データを使いこなすための統計入門」で説明している。
プログラムをリスト1に示す。プログラムファイルなどは、まとめて圧縮ファイル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]
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')