Ch.6 「経済分析における回帰分析」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.6の「経済分析における回帰分析」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題6.1の解答例

問題6.2の解答例

下記を実行することで回帰式の係数$\alpha, \beta, \gamma, \delta$と相関係数$r_{XY}, r_{ZY}$を計算することができる。

import numpy as np

x = np.array([7.7, 8.4, 9.6, 10.9, 10.4, 10.7, 11.7, 11.9]) 
y = np.array([73.4, 77.2, 84.6, 93.0, 92.5, 93.8, 99.9, 105.4])
z = np.array([30.6, 32.3, 35.0, 38.0, 38.8, 40.7, 42.0, 44.0])

beta = np.sum((y-np.mean(y))*(x-np.mean(x)))/np.sum((y-np.mean(y))**2)
delta = np.sum((y-np.mean(y))*(z-np.mean(z)))/np.sum((y-np.mean(y))**2)

alpha = np.mean(x)-beta*np.mean(y)
gamma = np.mean(z)-delta*np.mean(y)

r_xy = np.sum((y-np.mean(y))*(x-np.mean(x)))/np.sqrt(np.sum((y-np.mean(y))**2)*np.sum((x-np.mean(x))**2))
r_zy = np.sum((y-np.mean(y))*(z-np.mean(z)))/np.sqrt(np.sum((y-np.mean(y))**2)*np.sum((z-np.mean(z))**2))

print("(alpha,beta): ({:.2f},{:.3f})".format(alpha,beta))
print("(gamma,delta): ({:.2f},{:.2f})".format(gamma,delta))
print("(r_xy,r_zy): ({:.2f},{:.2f})".format(r_xy,r_zy))

・実行結果

> print("(alpha,beta): ({:.2f},{:.3f})".format(alpha,beta))
(alpha,beta): (-2.07,0.136)
> print("(gamma,delta): ({:.2f},{:.2f})".format(gamma,delta))
(gamma,delta): (-0.78,0.43)
> print("(r_xy,r_zy): ({:.2f},{:.2f})".format(r_xy,r_zy))
(r_xy,r_zy): (0.99,0.99)

問題6.3の解答例

i)
下記を実行することで、回帰式$y = \beta_0 + \beta_1 x_1$のパラメータ推定を行うことができる。

import numpy as np

beta = np.zeros(2)

x = np.array([[27464., 4.47], [29810., 4.44], [31824., 4.46], [34122., 4.41], [37708., 4.38], [41807., 4.22], [46930., 4.17], [52116., 4.17], [58104., 4.13], [62340., 4.11], [68468., 4.05], [75429., 4.01], [82601., 3.94], [92406., 3.86]]) 
y = np.array([24231., 26092., 27799., 29375., 32093., 34896., 39339., 43927., 48324., 51859., 56515., 61918., 67402., 74760.])

beta[1] = np.sum((x[:,0]-np.mean(x[:,0]))*(y-np.mean(y)))/np.sum((x[:,0]-np.mean(x[:,0]))**2) 
beta[0] = np.mean(y) - beta[1]*np.mean(x[:,0])

print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))

・実行結果

> print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))
Estimated (beta_0, beta_1): (2700.3, 0.78)

ⅱ)
下記を実行することで、回帰式$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2$のパラメータ推定を行うことができる。

import numpy as np

X = np.array([[1., 27464., 4.47], [1., 29810., 4.44], [1., 31824., 4.46], [1., 34122., 4.41], [1., 37708., 4.38], [1., 41807., 4.22], [1., 46930., 4.17], [1., 52116., 4.17], [1., 58104., 4.13], [1., 62340., 4.11], [1., 68468., 4.05], [1., 75429., 4.01], [1., 82601., 3.94], [1., 92406., 3.86]]) 
y = np.array([24231., 26092., 27799., 29375., 32093., 34896., 39339., 43927., 48324., 51859., 56515., 61918., 67402., 74760.])

beta = np.dot(np.linalg.inv(np.dot(X.T,X)), np.dot(X.T,y))

print("Estimated (beta_0, beta_1, beta[2]): ({:.1f}, {:.2f}, {:.2f})".format(beta[0], beta[1], beta[2]))

・実行結果

> print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))
Estimated (beta_0, beta_1, beta[2]): (-3805.9, 0.80, 1383.99)

まとめ