Up

回帰分析

 

単回帰分析を扱うが、多項式による回帰分析の例は、このウェブサイトで扱っている。

ポアッソン分布を用いた回帰分析も、このウェブサイトで扱った。

 

 

図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のデータは、気象庁のウエブサイトに公開されているデータから、20247月の東京都の日ごとの最高気温と最低気温のデータを読み取り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

 

 

 

 

リスト1 単回帰分析

 

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)            #   XYの共分散行列

SDx = Cs[0][0]**0.5        #   Xの標準偏差

SDy = Cs[1][1]**0.5        #   Yの標準偏差

r = Cs[0][1] / (SDx*SDy)   #   XYの相関係数

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でデータ分析。丸善出版

 

 

Home