Up

散布図と回帰直線

 

変数の対の散布図と回帰直線

 

 

の描画を行う。回帰直線の係数は

 

 

の誤差の2乗和

 

 

を最小にするものとして求める。

いま、

 

 

とおけば、式(1)

 

 

と書くことができる。このとき、誤差の平方和を最小にするパラメータ値は次式で与えられる(岡本、2009p.26)。

 

 

ここで、のムーア・ペンローズ逆行列である。

 

Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたRスクリプトとファイルを参考・利用して、リスト1に示す散布図と回帰直線を描くPythonスクリプトを書いてみた。入力ファイル05-1-galton-x.csvは、Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたものである。

リスト1を実行すると、散布図と回帰直線のグラフが表示される(図1)。

図1

 

縦の橙色破線は、残差の例である。この2例は、Spiegelhalter(2019), p. xviに記載されているウェブサイトからダウンロードしたRスクリプト例で扱われているものである。

 

 

 

リスト1 散布図と回帰直線

 

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

 

#    The data file downloaded from Spiegelhalter(2019)'s website

d_csv = pd.read_csv('05-1-galton-x.csv')

Father = d_csv['Father']       #    Father's height

Gender = d_csv['Gender']       #    Child's gender

Height = d_csv['Height']       #    Child's height

Father_son  = Father[Gender=='M']

Height_son = Height[Gender=='M']

n = len(Father_son)

X = np.concatenate((np.ones((n,1)), np.reshape(Father_son, (n, 1))), axis=1)

b = np.linalg.pinv(X) @ np.reshape(Height_son, (n, 1))

print('b =\n', b)

 

def regression(v):          #    Regression line

    return b[0] + b[1] * v

 

plt.figure(figsize=(7,5))

for i in range(len(Father_son)):

    #      No jitter added

    plt.plot(Father_son.values[i], Height_son.values[i], 'o', c='k',

                markersize=10, fillstyle='none' )

plt.plot([55, 80],[55, 80], ls='--')

plt.plot([np.min(Father_son), np.max(Father_son)],

         [regression(np.min(Father_son)), regression(np.max(Father_son))],

         lw=3)

#

#      Arbitrary selection of two points by Spiegelhalter (2019)

#

pointA_F = Father_son.values[137-1]

pointA_H = Height_son.values[137-1]

pointB_F = Father_son.values[28-1]

pointB_H = Height_son.values[28-1]

#           Show residuals

plt.vlines(pointA_F, pointA_H, regression(pointA_F), ls='--', lw=2, color='m')

plt.vlines(pointB_F, pointB_H, regression(pointB_F), ls='--', lw=2, color='m')

 

plt.xlabel("Father's height (inches)", fontsize=14)

plt.ylabel("Son's height (inches)", fontsize=14)

 

plt.tight_layout()

plt.show()

 

 

 

参考文献

岡本安晴(2009) 統計学を学ぶための数学入門[下].培風館

岡本安晴(2019) いまさら聞けないPythonでデータ分析.丸善出版

Spiegelhalter, D. (2019). The art of statistics: Learning from data. Pelican

 

 

 

Home