回帰分析
単回帰分析を扱うが、多項式による回帰分析の例は、このウェブサイトで扱っている。
ポアッソン分布を用いた回帰分析も、このウェブサイトで扱った。
図1は、東京都の2024年7月の最高気温と最低気温の散布図である。
図1
最低気温をで、最高気温をで表したとき、をの1次式(単回帰モデル(simple linear regression model);岡本(2022),pp.34-37、岡本(2014),pp.10-12)で表すことを考える。図1のグラフ中では、直線で表されている。
は独立変数、は従属変数と呼ばれている。
いま、の平均値をで表し、式(1)を次のように変形する。
ここで、
であり、はを中心化した(centered)ものである。
このとき、誤差の2乗和を最小にするとの値は次式で与えられる。
ここで、とはとの標準偏差であり、はの平均値である。の標準偏差との標準偏差は中心化しただけであるので同じであることに注意。
回帰分析を行うスクリプト例をリスト1に用意した。ファイルはregfiles.zipにまとめた。圧縮ファイルregfiles.zipには、Jupyter Notebook用のファイルも含まれている。
リスト1のスクリプトを実行すると、入力データファイル名の設定が求められる。
File
Name(*.csv) =
図2の形式で作成されたCSV形式のファイルの名前を設定する。
図2
図2のデータは、気象庁のウエブサイトに公開されているデータから、2024年7月の東京都の日ごとの最高気温と最低気温のデータを読み取りCSVファイルTokyo2024JulyTemp.csvとしたものである。1行目に変数名を設定する。各変数のデータ値はその下に記入していく。変数数は、図2の例では3個であるが、4個以上であってもよい。回帰分析の対象とする変数は、実行時に選ぶ。
例として、図2のファイルを入力ファイルとして指定する。
File
Name(*.csv) = Tokyo2024JulyTemp.csv
ファイル名を設定すると、ファイルが読み込まれ、変数名のリストが表示される。変数名は、’と’で挟まれて表示されている。
独立変数とする変数名が「X =」と聞かれている。
File
Name(*.csv) = Tokyo2024JulyTemp.csv
['2024年7月東京' '最高気温' '最低気温']
X =
変数名の設定は、’と’をはずして設定する。
独立変数を設定すると、従属変数の設定が求められる。
['2024年7月東京' '最高気温' '最低気温']
X = 最低気温
Y =
従属変数を設定する。
['2024年7月東京' '最高気温' '最低気温']
X = 最低気温
Y = 最高気温
従属変数を設定すると計算が始まり、計算結果のグラフが表示される(図3)。
図3
回帰直線が表示されている。橙色の星印は、平均値を表している。従属変数の平均値は、回帰直線(2)の切片(intercept)の値である。(回帰係数:regression coefficient)の値は、グラフの上にreg.coef.の値として表示されている。は相関係数であり、は決定係数である。
図3のWindowを閉じると、端末には以下の出力が表示されている。
Sx = 1.6918908427129438
Sy = 3.0003763204831704
r
= 0.6750120497157768
a = 1.1970572325815512
b = 33.467741935483865
Reg.Line: Y = 1.20*(X-Xmean) + 33.47
Xmean = 24.98709677419355
Ymean = 33.467741935483865
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
inflnm = input('File Name(*.csv) = ')
data_frm = pd.read_csv(inflnm,
encoding='shift_jis')
print(data_frm.keys().values)
X_name = input('X = ')
X = data_frm[X_name].values
Y_name = input('Y = ')
Y = data_frm[Y_name].values
N = len(X)
XY = np.vstack((X, Y))
Cs = np.cov(XY)
# XとYの共分散行列
SDx = Cs[0][0]**0.5
# Xの標準偏差
SDy = Cs[1][1]**0.5
# Yの標準偏差
r = Cs[0][1] / (SDx*SDy) # XとYの相関係数
print('Sx =',SDx)
print('Sy =', SDy)
print('r =', r)
a = r * SDy/SDx
b = np.mean(Y)
print('a =', a)
print('b =', b)
print(f'Reg.Line: Y =
{a:.2f}*(X-Xmean) + {b:.2f}')
Xmean = np.mean(X)
Ymean = np.mean(Y)
print('Xmean =', Xmean)
print('Ymean =', Ymean)
Xmin = np.min(X)
Xmax = np.max(X)
plt.scatter(X, Y)
plt.xlabel(X_name, fontsize=14)
plt.ylabel(Y_name, fontsize=14)
plt.plot([Xmin, Xmax], [a*(Xmin -
Xmean) + b, a*(Xmax - Xmean) +b],
label='reg.line')
plt.plot([Xmean], [Ymean], marker='*',
markersize=16,
label=r'($\overline{X}$,$\overline{Y}$)')
plt.title(f'r = {r:.3f}, $R^2$ =
{r**2:.3f}, reg.coef.={a:.3f}', fontsize=16)
plt.legend()
plt.tight_layout()
plt.show()
岡本安晴(2019)いまさら聞けないPythonでデータ分析。丸善出版