UPDATE: 2021-09-25 06:02:19

はじめに

ここではデータ分析のための線形代数の章末問題をRで回答していきます。

表1.1が表すアンケートデータ

D <- matrix(c(1,3,1,1,4,5,26,
              1,2,1,3,1,3,22,
              2,3,1,1,1,5,27,
              1,2,2,1,1,5,34,
              1,2,2,2,3,2,28,
              3,4,1,1,3,5,20,
              4,1,2,3,4,4,18,
              4,4,1,2,4,4,30,
              2,3,2,4,2,4,23,
              1,2,2,1,4,1,32),
            nrow = 10, ncol = 7, byrow = TRUE)
colnames(D) <- paste0("Q", 1:7)
rownames(D) <- paste0("ID", 1:10)

# 1.1のアンケートデータ
D
##      Q1 Q2 Q3 Q4 Q5 Q6 Q7
## ID1   1  3  1  1  4  5 26
## ID2   1  2  1  3  1  3 22
## ID3   2  3  1  1  1  5 27
## ID4   1  2  2  1  1  5 34
## ID5   1  2  2  2  3  2 28
## ID6   3  4  1  1  3  5 20
## ID7   4  1  2  3  4  4 18
## ID8   4  4  1  2  4  4 30
## ID9   2  3  2  4  2  4 23
## ID10  1  2  2  1  4  1 32

5章の章末問題

5.1 次の1から6の行列の行列式を求めよ。行列式が定義されていない場合は「定義されていない」と答えること。

\[ (1) \begin{bmatrix} 2 & 1 \\ -1 & -2 \end{bmatrix}, (2) \begin{bmatrix} 3 & 2 & 0 \\ 7 & 4 & 0 \end{bmatrix}, (3) \begin{bmatrix} 1 & 2 \\ -1 & -2 \\ \end{bmatrix}, \\ (4) \begin{bmatrix} 7 & 0 & 2 \\ 5 & -3 & 4 \\ -9 & 1 & 0 \end{bmatrix}, (5) \begin{bmatrix} 3 & 1 & 7 \\ 2 & -3 & 1 \\ -5 & 1 & 9 \end{bmatrix}, (6) \begin{bmatrix} -1 & 7 & 2 \\ 1 & -5 & -2 \\ -1 & 9 & 2 \end{bmatrix} \]

m1 <- matrix(
  c(2,1,
    -1,-2),
  nrow = 2, ncol = 2, byrow = TRUE)

m2 <- matrix(
  c(3,2,0,
    7,4,0),
  nrow = 2, ncol = 3, byrow = TRUE)

m3 <- matrix(
  c(1,2,
    -1,-2),
  nrow = 2, ncol = 2, byrow = TRUE)

m4 <- matrix(
  c(7,0,2,
    5,-3,4,
    -9,1,0),
  nrow = 3, ncol = 3, byrow = TRUE)

m5 <- matrix(
  c(3,1,7,
    2,-3,1,
    -5,1,9),
  nrow = 3, ncol = 3, byrow = TRUE)

m6 <- matrix(
  c(-1,7,2,
    1,-5,-2,
    -1,9,2),
  nrow = 3, ncol = 3, byrow = TRUE)

5.1.1

# m1[1,1]*m1[2,2] - m1[1,2]*m1[2,1]
det(m1)
## [1] -3

5.1.2

# 定義されない

5.1.3

# m3[1,1]*m3[2,2] - m3[1,2]*m3[2,1]
det(m3)
## [1] 0

5.1.4

det(m4)
## [1] -72
# 第1行の−2倍を第2行に加える
m4[2,] <- m4[2,] + m4[1,]*-2
# 第1行と第3列で余因子展開
# m[i,j]*(-1)^(i+j)*|m|
m4[1,3] * (-1)^(1+3) * det(m4[-1,-3])
## [1] -72

5.1.5

det(m5)
## [1] -198

5.1.6

det(m6)
## [1] 0

5.2 次の1から6の行列階数を求めよ。

\[ (1) \begin{bmatrix} 4 & 1 \\ 0 & 0 \end{bmatrix}, (2) \begin{bmatrix} 1 & -5 \\ -2 & 10 \\ -3 & 15 \end{bmatrix}, (3) \begin{bmatrix} 0 & 0 & 0 \\ 0 & 2 & 1 \end{bmatrix}, \\ (4) \begin{bmatrix} -2 & 1 \\ 8 & 7 \\ \end{bmatrix}, (5) \begin{bmatrix} -5 & 1 & 6 \\ 3 & -3 & 4 \\ 1 & 1 & 7 \end{bmatrix}, (6) \begin{bmatrix} 4 & -3 & -7 & 1 & 8 \\ 1 & 7 & 6 & -8 & 4 \end{bmatrix} \]

library(matlib)
m1 <- matrix(
  c(4,1,
    0,0),
  nrow = 2, ncol = 2, byrow = TRUE)

m2 <- matrix(
  c(1,-5,
    -2,10,
    -3,15),
  nrow = 3, ncol = 2, byrow = TRUE)

m3 <- matrix(
  c(0,0,0,
    0,2,1),
  nrow = 2, ncol = 3, byrow = TRUE)

m4 <- matrix(
  c(-2,1,
    8,7),
  nrow = 2, ncol = 2, byrow = TRUE)

m5 <- matrix(
  c(-5,1,6,
    3,-3,4,
    1,1,7),
  nrow = 3, ncol = 3, byrow = TRUE)

m6 <- matrix(
  c(4,-3,-7,1,8,
    1,7,6,-8,4),
  nrow = 2, ncol = 5, byrow = TRUE)

5.2.1

# 第2行はゼロベクトル、第1行は非ゼロベクトル
# 階数は1
R(m1)
## [1] 1

5.2.2

# 第1列を−5倍すれば、第2列になる
# 階数は1
R(m2)
## [1] 1

5.2.3

# 第1行はゼロベクトル、第2行は非ゼロベクトル
# 階数は1

5.2.4

# 列、行ベクトルは、一方が他方のスカラ倍ではなく
# 階数は2
R(m4)
## [1] 2

5.2.5

# 階数は3
R(m5)
## [1] 3

5.2.6

# 2×5行列であり、階数は2以下
# 階数は2
R(m6)
## [1] 2

5.3 以下の行列について1から6に答えよ。

\[ \begin{bmatrix} 2 & 3 & 4 & 5 \\ 0 & 0 & -1 & -4 \\ 0 & 1 & 3 & 0 \\ 1 & 3 & 0 & 7 \end{bmatrix} \]

m <- matrix(
  c(2,3,4,5,
    0,0,-1,-4,
    0,1,3,0,
    1,3,0,7),
  nrow = 4, ncol = 4, byrow = TRUE)

5.3.1 第(1,1)要素の余因子

i <- 1
j <- 1
m11 <- m[-1*i, -1*j]
cm11 <- (-1)^(i+j) * det(m11)
cm11
## [1] 43

5.3.2 第(1,2)要素の余因子

i <- 1
j <- 2
m12 <- m[-1*i, -1*j]
cm12 <- (-1)^(i+j) * det(m12)
cm12
## [1] -12

5.3.3 第(3,2)要素の余因子

i <- 3
j <- 2
m32 <- m[-1*i, -1*j]
cm32 <- (-1)^(i+j) * det(m32)
cm32
## [1] 25

5.3.4 第2行を展開して行列式を求めよ

i <- 2
j1 <- 3
j2 <- 4
m[i, j1]*(-1)^(i+j1)*det(m[-1*i, -1*j1]) + m[i, j2]*(-1)^(i+j2)*det(m[-1*i, -1*j2])
## [1] 61

5.3.5 第1列を展開して行列式を求めよ

i1 <- 1
i2 <- 4
j <- 1
m[i1, j]*(-1)^(i1+j)*det(m[-1*i1, -1*j]) + m[i2, j]*(-1)^(i2+j)*det(m[-1*i2, -1*j])
## [1] 61

5.3.6 第1行から第4行の2倍を引き、第1列を展開して行列式を求めよ

# 第1行から第4行の2倍を引く
m[1,] <- m[1,] - 2*m[4,]
i <- 4
j <- 1
m[i, j]*(-1)^(i+j)*det(m[-1*i, -1*j])
## [1] 61

5.4 次の行列の行列式を以下の1から5の手順に従って答えよ。

\[ \begin{bmatrix} 2 & 7 & 6 & -8 & 2 \\ 0 & 0 & 5 & 0 & 2\\ 0 & -4 & -1 & 9 & -3 \\ 0 & 0 & 0 & 2 & 7 \\ 0 & 0 & 0 & 1 & 0 \end{bmatrix} \] ### 5.4.1 第1列で展開する

# この問題の回答はとばす
# 行列式の答えとして−280が得られる

5.4.2 展開で得られた行列式の第1行と第2行を入れ換える

5.4.3 第1列で展開する

5.4.4 第1列で展開する

5.5 次の1から4の行列の逆行列を求めよ。正則行列ではない場合には「正則行列ではない」と答え、定義されていない場合には「定義されていない」と答えよ。

\[ (1) \begin{bmatrix} 1 & 4 \\ -1 & 5 \end{bmatrix}, (2) \begin{bmatrix} -1 & 2 \\ 2 & -4 \end{bmatrix}, (3) \begin{bmatrix} 3 & 2 & 1 \\ -5 & 1 & 2 \end{bmatrix}, (4) \begin{bmatrix} 1 & 0 & -1 \\ 2 & -2 & 0 \\ 0 & 3 & 1 \end{bmatrix} \]

m1 <- matrix(
  c(1,4,
    -1,5),
  nrow = 2, ncol = 2, byrow = TRUE)

m2 <- matrix(
  c(-1,2,
    2,-4),
  nrow = 2, ncol = 2, byrow = TRUE)

m3 <- matrix(
  c(3,2,1,
    -5,1,2),
  nrow = 2, ncol = 3, byrow = TRUE)

m4 <- matrix(
  c(1,0,-1,
    2,-2,0,
    0,3,1),
  nrow = 3, ncol = 3, byrow = TRUE)

5.5.1

det(m1)
## [1] 9
solve(m1)
##           [,1]       [,2]
## [1,] 0.5555556 -0.4444444
## [2,] 0.1111111  0.1111111

5.5.2

# 行列式は0であり、正則行列ではない
det(m2)
## [1] 0

5.5.3

# 定義されない

5.5.4

det(m4)
## [1] -8
solve(m4)
##       [,1]   [,2] [,3]
## [1,]  0.25  0.375 0.25
## [2,]  0.25 -0.125 0.25
## [3,] -0.75  0.375 0.25

5.6 次の1と2について、行列の列からなるベクトルが直交しているかどうかを調べ、直行している場合には、列からベクトルを基準化し、基準化したベクトルを列に持つ行列式が5.128を満たすことを確かめよ。

\[ (1) \begin{bmatrix} 6 & 4 \\ -8 & 3 \end{bmatrix}, (2) \begin{bmatrix} 2 & 1 & -2 \\ 1 & -2 & 4 \\ 0 & 2 & 5 \end{bmatrix} \]

m1 <- matrix(
  c(6,4,
    -8,3),
  nrow = 2, ncol = 2, byrow = TRUE)

m2 <- matrix(
  c(2,1,-2,
    1,-2,4,
    0,2,5),
  nrow = 3, ncol = 3, byrow = TRUE)
m11 <- m1[,1]
m12 <- m1[,2]
# 内積は0で直交
t(m11) %*% m12
##      [,1]
## [1,]    0
# 各ベクトルの長さ
norm_m11 <- sqrt(sum(m11^2))
norm_m11
## [1] 10
norm_m12 <- sqrt(sum(m12^2))
norm_m12
## [1] 5
# 基準化したベクトルを列に持つ
m1_scale <- cbind((m1[,1] / norm_m11), (m1[,2] / norm_m12))
m1_scale
##      [,1] [,2]
## [1,]  0.6  0.8
## [2,] -0.8  0.6
# 直交行列の転置行列と直交行列の積は単位行列
t(m1_scale) %*% m1_scale
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1
m21 <- m2[,1]
m22 <- m2[,2]
m23 <- m2[,3]
# 内積は0で直交
t(m21) %*% m22
##      [,1]
## [1,]    0
t(m22) %*% m23
##      [,1]
## [1,]    0
t(m23) %*% m21
##      [,1]
## [1,]    0
# 各ベクトルの長さ
norm_m21 <- sqrt(sum(m21^2))
norm_m21
## [1] 2.236068
norm_m22 <- sqrt(sum(m22^2))
norm_m22
## [1] 3
norm_m23 <- sqrt(sum(m23^2))
norm_m23
## [1] 6.708204
# 基準化したベクトルを列に持つ
m2_scale <- cbind((m2[,1] / norm_m21), (m2[,2] / norm_m22), (m2[,3] / norm_m23))
m2_scale
##           [,1]       [,2]       [,3]
## [1,] 0.8944272  0.3333333 -0.2981424
## [2,] 0.4472136 -0.6666667  0.5962848
## [3,] 0.0000000  0.6666667  0.7453560
# 直交行列の転置行列と直交行列の積は単位行列
t(m2_scale) %*% m2_scale
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1

5.7 表1.1の回答者1から5の設問5と6に対する回答を用いて、1から8に答えよ。

D56 <- D[1:5, 5:6]
D56
##     Q5 Q6
## ID1  4  5
## ID2  1  3
## ID3  1  5
## ID4  1  5
## ID5  3  2

5.7.1 偏差行列を求めよ。

D5_m <- mean(D56[,1])
D6_m <- mean(D56[,2])

D_hensa <- cbind(D56[,1] - D5_m, D56[,2] - D6_m)
D_hensa
##     [,1] [,2]
## ID1    2    1
## ID2   -1   -1
## ID3   -1    1
## ID4   -1    1
## ID5    1   -2

5.7.2 設問5と6の横座標と縦座標にとり、偏差行列の散布図を描け。

plot(D_hensa, xlim = c(-3, 3), ylim = c(-3, 3))
abline(h = 0, v = 0)

5.7.3 設問5の座標の2乗和と設問6の座標の2乗和を求めよ。

sum(D_hensa[,1]^2)
## [1] 8
sum(D_hensa[,2]^2)
## [1] 8

5.7.4 設問5と6各々の分散を求めよ。

sum(D_hensa[,1]^2)/nrow(D_hensa)
## [1] 1.6
sum(D_hensa[,2]^2)/nrow(D_hensa)
## [1] 1.6

5.7.5 分散の5倍が座標の2乗和になることを、設問5と設問6の各々について確かめよ。

nrow(D_hensa) * sum(D_hensa[,1]^2)/nrow(D_hensa) == sum(D_hensa[,1]^2)
## [1] TRUE
nrow(D_hensa) * sum(D_hensa[,2]^2)/nrow(D_hensa) == sum(D_hensa[,2]^2)
## [1] TRUE

5.7.6 散布図の座標軸を反時計回りに30度回転したときに得られる次元での5人の回答者の座標を求めよ。

R <- matrix(c(sqrt(3)/2, 1/2,
              -1/2, sqrt(3)/2),
            nrow = 2, ncol = 2, byrow = TRUE)
R1 <- R %*% t(D_hensa)
R1 
##             ID1        ID2        ID3        ID4        ID5
## [1,]  2.2320508 -1.3660254 -0.3660254 -0.3660254 -0.1339746
## [2,] -0.1339746 -0.3660254  1.3660254  1.3660254 -2.2320508
R2 <- D_hensa %*% t(R) 
R2
##           [,1]       [,2]
## ID1  2.2320508 -0.1339746
## ID2 -1.3660254 -0.3660254
## ID3 -0.3660254  1.3660254
## ID4 -0.3660254  1.3660254
## ID5 -0.1339746 -2.2320508

5.7.7 上の6の次元の座標の2乗和を、2つの次元の各々について求めよ。

sum(R2[,1]^2)
## [1] 7.133975
sum(R2[,2]^2)
## [1] 8.866025

5.7.8 上の7の2つの2乗和が、3で求めた2つの2乗和の和に等しいことを確かめよ。

all.equal(sum(D_hensa[, 1] ^ 2) + sum(D_hensa[, 2] ^ 2), sum(R2[, 1] ^ 2) + sum(R2[, 2] ^ 2))
## [1] TRUE

セッション情報

sessionInfo()
## R version 4.0.3 (2020-10-10)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] matlib_0.9.5
## 
## loaded via a namespace (and not attached):
##  [1] zip_2.1.1         Rcpp_1.0.6        highr_0.8         cellranger_1.1.0 
##  [5] compiler_4.0.3    pillar_1.6.2      forcats_0.5.1     tools_4.0.3      
##  [9] digest_0.6.27     jsonlite_1.7.2    evaluate_0.14     lifecycle_1.0.0  
## [13] tibble_3.1.3      pkgconfig_2.0.3   rlang_0.4.10      openxlsx_4.2.3   
## [17] crosstalk_1.1.1   curl_4.3          yaml_2.2.1        haven_2.3.1      
## [21] xfun_0.24         rio_0.5.16        stringr_1.4.0     knitr_1.33       
## [25] vctrs_0.3.8       htmlwidgets_1.5.3 systemfonts_1.0.2 hms_1.0.0        
## [29] data.table_1.13.6 R6_2.5.0          textshaping_0.3.5 fansi_0.4.2      
## [33] readxl_1.3.1      rgl_0.107.10      foreign_0.8-80    rmarkdown_2.6    
## [37] carData_3.0-4     car_3.0-10        magrittr_2.0.1    htmltools_0.5.1.1
## [41] ellipsis_0.3.2    MASS_7.3-53       abind_1.4-5       xtable_1.8-4     
## [45] ragg_1.1.3        utf8_1.1.4        stringi_1.5.3     crayon_1.4.0