1) Mô tả dữ liệu
Nguồn (data + code R): TNV. Hồi quy. NXB TH
TP.HCM, 2020.
Dữ liệu đo đạc mai rùa:
- 3 biến (variables)
- 24 quan trắc (observations) Tải thư viện:
library(magrittr)
library(dplyr)
library(GGally)
Đọc dữ liệu:
tt <- read.table("shell.txt", header = TRUE)
Xem 6 hàng đầu:
## length width height
## 1 98 81 38
## 2 103 84 38
## 3 103 86 42
## 4 105 86 42
## 5 109 88 44
## 6 123 92 50
## 'data.frame': 24 obs. of 3 variables:
## $ length: int 98 103 103 105 109 123 123 133 133 133 ...
## $ width : int 81 84 86 86 88 92 95 99 102 102 ...
## $ height: int 38 38 42 42 44 50 46 51 51 51 ...
Xem cấu trúc:
## 'data.frame': 24 obs. of 3 variables:
## $ length: int 98 103 103 105 109 123 123 133 133 133 ...
## $ width : int 81 84 86 86 88 92 95 99 102 102 ...
## $ height: int 38 38 42 42 44 50 46 51 51 51 ...
mối tương quan:
tt %>% select(length, width, height) %>% ggpairs(upper = list(continuous = "points"), lower = list(continuous = "cor"))

names(tt) # Cho biết tên các biến trong data.frame
## [1] "length" "width" "height"
Trong 14 biến các biến trên thấy nhiều biến tương quan
2) Thống kê mô tả
Tính trung bình mẫu của các biến:
## length width height
## 136.04167 102.58333 52.04167
Tính phương sai mẫu của các biến:
## length width height
## 451.51993 171.73188 64.73732
Dùng đồ thị boxplot:

## length width height
## [1,] 98 81 38
## [2,] 177 132 67
Nhận xét: từ đồ thị boxplot và kết quả tính phạm vi
biến thiên của dữ liệu (range), ta thấy rằng đơn vị và phương sai của
các biến rất khác biệt nhau. Do đó ta cần thực hiện chuẩn hóa dữ liệu
(standardizing data) trước khi xử lý. Ta có thể thực hiện quy tâm
(mean-centering) hoặc/và co giãn (scaling) dữ liệu. Các đồ thị boxplot
dưới đây sẽ minh họa các bước xử lý trên.
Quy tâm dữ liệu:
tt.n <- scale(tt, scale = FALSE) # Chỉ thực hiện quy tâm, không co giãn
tt.n <- as.data.frame(tt.n)
boxplot(tt)

Quy tâm và co giãn dữ liệu (chuẩn hóa):
tt.scale <- as.data.frame(scale(tt))
boxplot(tt.scale)

Tính ma trận hiệp phương sai (covariance matrix) và ma trận
hệ số tương quan (correlation matrix):
tt.cov <- cov(tt) # Ma trận hiệp phương sai tính từ dữ liệu chưa chuẩn hóa
tt.cov
## length width height
## length 451.5199 270.9746 165.95471
## width 270.9746 171.7319 101.84420
## height 165.9547 101.8442 64.73732
tt.cor <- cor(tt) # Ma trận hệ số tương quan tính từ dữ liệu chưa chuẩn hóa
tt.cor
## length width height
## length 1.0000000 0.9731162 0.9706748
## width 0.9731162 1.0000000 0.9659029
## height 0.9706748 0.9659029 1.0000000
Vẽ ma trận đồ thị phân tán:

Ta có thể nhận thấy rằng các biến có tương quan tuyến tính mạnh
plot(tt$height , tt$width, pch = 16, col = "blue")

3) Phân tích thành phần chính (PCA):
Ta thực hiện PCA từ bộ dữ liệu đã được chuẩn hóa
tt.scale.
pca_tt.scale <- princomp(tt.scale)
summary(pca_tt.scale)
## Importance of components:
## Comp.1 Comp.2 Comp.3
## Standard deviation 1.678484 0.1814027 0.157434408
## Proportion of Variance 0.979933 0.0114459 0.008621076
## Cumulative Proportion 0.979933 0.9913789 1.000000000
Trình bày các PC loadings:
##
## Loadings:
## Comp.1 Comp.2 Comp.3
## length 0.578 0.137 0.804
## width 0.577 0.628 -0.522
## height 0.577 -0.766 -0.284
##
## Comp.1 Comp.2 Comp.3
## SS loadings 1.000 1.000 1.000
## Proportion Var 0.333 0.333 0.333
## Cumulative Var 0.333 0.667 1.000
Trình bày 3 hàng đầu các PC scores:
pca_tt.scale$scores[1:3,]
## Comp.1 Comp.2 Comp.3
## [1,] -2.992145 0.05696787 -0.08482498
## [2,] -2.723970 0.23302866 -0.01510844
## [3,] -2.349171 -0.05201949 -0.23582973
Xác định số thành phần chính cần giữ lại: vẽ đồ thị
scree plot
screeplot(pca_tt.scale, type = "lines", main = "Scree plot")

Nhận xét: từ đô thị scree plot, ta thấy rằng có thể giữ lại
1 thành phần chính đầu (giải thích được \(98.%\) phương sai toàn phần).
Tiêu chuẩn khác: vì PCA được thực hiện trên dữ liệu chuẩn
hóa, ta có thể dùng tiêu chuẩn giữ lại các thành phần chính mà có trị
riêng (phương sai) lớn hơn 1. Tính các trị riêng:
eigenvalues_pca <- pca_tt.scale$sdev^2
eigenvalues_pca
## Comp.1 Comp.2 Comp.3
## 2.81730746 0.03290695 0.02478559
Vẽ các PC scores và loadings:
tt_scores <- pca_tt.scale$scores
# Plot the scores
plot(tt_scores, xlab = "PC 1 (36%)", ylab = "PC 2 (16.2%)", main = "Scores plot")
abline(h = 0, v = 0, col = "gray")
# Plot the scores as points
text(tt_scores[, 1] + 0.2, tt_scores[, 2], label = rownames(tt_scores), col="blue", cex=0.6)

LS0tDQp0aXRsZTogJ1BDQTogcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgduG7gSByxrDhu6N1ICh0dXRsZSBzaGVsbCknDQphdXRob3I6ICJoZW5yeSBkbyINCmRhdGU6ICIyOS8wNi8yMDIzIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQoNCiMjIyAxKSBNw7QgdOG6oyBk4buvIGxp4buHdSANCg0KKipOZ3Xhu5NuIChkYXRhICsgY29kZSBSKToqKiBUTlYuICpI4buTaSBxdXkqLiBOWEIgVEggVFAuSENNLCAyMDIwLg0KDQpE4buvIGxp4buHdSDEkW8gxJHhuqFjIG1haSByw7lhOiANCg0KICArIDMgYmnhur9uICh2YXJpYWJsZXMpDQogICsgMjQgcXVhbiB0cuG6r2MgKG9ic2VydmF0aW9ucykNCioqVOG6o2kgdGjGsCB2aeG7h246KioNCmBgYHtyfQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KEdHYWxseSkNCmBgYA0KIA0KDQoqKsSQ4buNYyBk4buvIGxp4buHdToqKg0KDQpgYGB7cn0NCg0KdHQgPC0gcmVhZC50YWJsZSgic2hlbGwudHh0IiwgaGVhZGVyID0gVFJVRSkNCg0KYGBgDQoNCioqWGVtIDYgaMOgbmcgxJHhuqd1OioqDQoNCmBgYHtyfQ0KaGVhZCh0dCkNCnN0cih0dCkNCg0KYGBgDQoqKlhlbSBj4bqldSB0csO6YzoqKg0KDQpgYGB7cn0NCnN0cih0dCkNCg0KYGBgDQoqKm3hu5FpIHTGsMahbmcgcXVhbjoqKg0KDQpgYGB7cn0NCnR0ICU+JSBzZWxlY3QobGVuZ3RoLCB3aWR0aCwgaGVpZ2h0KSAlPiUgZ2dwYWlycyh1cHBlciA9IGxpc3QoY29udGludW91cyA9ICJwb2ludHMiKSwgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAiY29yIikpDQpgYGANCg0KDQpgYGB7cn0NCm5hbWVzKHR0KSAjIENobyBiaeG6v3QgdMOqbiBjw6FjIGJp4bq/biB0cm9uZyBkYXRhLmZyYW1lICANCmBgYA0KDQpUcm9uZyAxNCBiaeG6v24gY8OhYyBiaeG6v24gdHLDqm4gdGjhuqV5IG5oaeG7gXUgYmnhur9uIHTGsMahbmcgcXVhbg0KDQoNCiMjIyAyKSBUaOG7kW5nIGvDqiBtw7QgdOG6oyANCg0KKipUw61uaCB0cnVuZyBiw6xuaCBt4bqrdSBj4bunYSBjw6FjIGJp4bq/bjoqKg0KDQpgYGB7cn0NCmFwcGx5KHR0LCAyLCBtZWFuKSANCmBgYA0KDQoqKlTDrW5oIHBoxrDGoW5nIHNhaSBt4bqrdSBj4bunYSBjw6FjIGJp4bq/bjoqKg0KDQpgYGB7cn0NCmFwcGx5KHR0LCAyLCB2YXIpDQpgYGANCg0KKipEw7luZyDEkeG7kyB0aOG7iyBib3hwbG90OioqDQoNCmBgYHtyfQ0KYm94cGxvdCh0dCkNCmBgYA0KDQpgYGB7cn0NCmFwcGx5KHR0LCAyLCByYW5nZSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqIHThu6sgxJHhu5MgdGjhu4sgYm94cGxvdCB2w6Aga+G6v3QgcXXhuqMgdMOtbmggcGjhuqFtIHZpIGJp4bq/biB0aGnDqm4gY+G7p2EgZOG7ryBsaeG7h3UgKHJhbmdlKSwgdGEgdGjhuqV5IHLhurFuZyDEkcahbiB24buLIHbDoCBwaMawxqFuZyBzYWkgY+G7p2EgY8OhYyBiaeG6v24gcuG6pXQga2jDoWMgYmnhu4d0IG5oYXUuIERvIMSRw7MgdGEgY+G6p24gdGjhu7FjIGhp4buHbiBjaHXhuqluIGjDs2EgZOG7ryBsaeG7h3UgKHN0YW5kYXJkaXppbmcgZGF0YSkgdHLGsOG7m2Mga2hpIHjhu60gbMO9LiBUYSBjw7MgdGjhu4MgdGjhu7FjIGhp4buHbiBxdXkgdMOibSAobWVhbi1jZW50ZXJpbmcpIGhv4bq3Yy92w6AgY28gZ2nDo24gKHNjYWxpbmcpIGThu68gbGnhu4d1LiBDw6FjIMSR4buTIHRo4buLIGJveHBsb3QgZMaw4bubaSDEkcOieSBz4bq9IG1pbmggaOG7jWEgY8OhYyBixrDhu5tjIHjhu60gbMO9IHRyw6puLiANCg0KKipRdXkgdMOibSBk4buvIGxp4buHdToqKg0KDQpgYGB7cn0NCnR0Lm4gPC0gc2NhbGUodHQsIHNjYWxlID0gRkFMU0UpICMgQ2jhu4kgdGjhu7FjIGhp4buHbiBxdXkgdMOibSwga2jDtG5nIGNvIGdpw6NuIA0KdHQubiA8LSBhcy5kYXRhLmZyYW1lKHR0Lm4pDQpib3hwbG90KHR0KQ0KYGBgDQoNCioqUXV5IHTDom0gdsOgIGNvIGdpw6NuIGThu68gbGnhu4d1IChjaHXhuqluIGjDs2EpOioqDQoNCmBgYHtyfQ0KdHQuc2NhbGUgPC0gYXMuZGF0YS5mcmFtZShzY2FsZSh0dCkpIA0KYm94cGxvdCh0dC5zY2FsZSkNCmBgYA0KDQoqKlTDrW5oIG1hIHRy4bqtbiBoaeG7h3AgcGjGsMahbmcgc2FpIChjb3ZhcmlhbmNlIG1hdHJpeCkgdsOgIG1hIHRy4bqtbiBo4buHIHPhu5EgdMawxqFuZyBxdWFuIChjb3JyZWxhdGlvbiBtYXRyaXgpOioqDQoNCmBgYHtyfQ0KdHQuY292IDwtIGNvdih0dCkgIyBNYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSB0w61uaCB04burIGThu68gbGnhu4d1IGNoxrBhIGNodeG6qW4gaMOzYSANCnR0LmNvdg0KYGBgDQoNCmBgYHtyfQ0KdHQuY29yIDwtIGNvcih0dCkgIyBNYSB0cuG6rW4gaOG7hyBz4buRIHTGsMahbmcgcXVhbiB0w61uaCB04burIGThu68gbGnhu4d1IGNoxrBhIGNodeG6qW4gaMOzYSANCnR0LmNvcg0KYGBgDQoNCioqVuG6vSBtYSB0cuG6rW4gxJHhu5MgdGjhu4sgcGjDom4gdMOhbjoqKg0KDQpgYGB7cn0NCnBhaXJzKHR0KQ0KYGBgDQoNClRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHLhurFuZyBjw6FjIGJp4bq/biBjw7MgdMawxqFuZyBxdWFuIHR1eeG6v24gdMOtbmggbeG6oW5oIA0KDQpgYGB7cn0NCnBsb3QodHQkaGVpZ2h0ICwgdHQkd2lkdGgsIHBjaCA9IDE2LCBjb2wgPSAiYmx1ZSIpDQpgYGANCg0KDQoNCiMjIyAzKSBQaMOibiB0w61jaCB0aMOgbmggcGjhuqduIGNow61uaCAoUENBKTogDQoNClRhIHRo4buxYyBoaeG7h24gUENBIHThu6sgYuG7mSBk4buvIGxp4buHdSDEkcOjIMSRxrDhu6NjIGNodeG6qW4gaMOzYSAqdHQuc2NhbGUqLiANCg0KYGBge3J9DQpwY2FfdHQuc2NhbGUgPC0gcHJpbmNvbXAodHQuc2NhbGUpDQpzdW1tYXJ5KHBjYV90dC5zY2FsZSkNCmBgYA0KDQoqKlRyw6xuaCBiw6B5IGPDoWMgUEMgbG9hZGluZ3M6KioNCg0KYGBge3J9DQpwY2FfdHQuc2NhbGUkbG9hZGluZ3MNCmBgYA0KDQoqKlRyw6xuaCBiw6B5IDMgaMOgbmcgxJHhuqd1IGPDoWMgUEMgc2NvcmVzOioqDQoNCmBgYHtyfQ0KcGNhX3R0LnNjYWxlJHNjb3Jlc1sxOjMsXQ0KYGBgDQoNCioqWMOhYyDEkeG7i25oIHPhu5EgdGjDoG5oIHBo4bqnbiBjaMOtbmggY+G6p24gZ2nhu68gbOG6oWk6KiogduG6vSDEkeG7kyB0aOG7iyBzY3JlZSBwbG90DQoNCmBgYHtyfQ0Kc2NyZWVwbG90KHBjYV90dC5zY2FsZSwgdHlwZSA9ICJsaW5lcyIsIG1haW4gPSAiU2NyZWUgcGxvdCIpDQpgYGANCg0KKk5o4bqtbiB4w6l0OiogdOG7qyDEkcO0IHRo4buLIHNjcmVlIHBsb3QsIHRhIHRo4bqleSBy4bqxbmcgY8OzIHRo4buDIGdp4buvIGzhuqFpIDEgdGjDoG5oIHBo4bqnbiBjaMOtbmggxJHhuqd1IChnaeG6o2kgdGjDrWNoIMSRxrDhu6NjICQ5OC4lJCBwaMawxqFuZyBzYWkgdG/DoG4gcGjhuqduKS4NCg0KKlRpw6p1IGNodeG6qW4ga2jDoWM6KiB2w6wgUENBIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gdHLDqm4gZOG7ryBsaeG7h3UgY2h14bqpbiBow7NhLCB0YSBjw7MgdGjhu4MgZMO5bmcgdGnDqnUgY2h14bqpbiBnaeG7ryBs4bqhaSBjw6FjIHRow6BuaCBwaOG6p24gY2jDrW5oIG3DoCBjw7MgdHLhu4sgcmnDqm5nIChwaMawxqFuZyBzYWkpIGzhu5tuIGjGoW4gMS4gVMOtbmggY8OhYyB0cuG7iyByacOqbmc6DQoNCmBgYHtyfQ0KZWlnZW52YWx1ZXNfcGNhIDwtIHBjYV90dC5zY2FsZSRzZGV2XjIgDQplaWdlbnZhbHVlc19wY2ENCmBgYA0KDQoqKlbhur0gY8OhYyBQQyBzY29yZXMgdsOgIGxvYWRpbmdzOioqDQoNCmBgYHtyfQ0KDQp0dF9zY29yZXMgPC0gcGNhX3R0LnNjYWxlJHNjb3Jlcw0KDQojIFBsb3QgdGhlIHNjb3Jlcw0KcGxvdCh0dF9zY29yZXMsIHhsYWIgPSAiUEMgMSAoMzYlKSIsIHlsYWIgPSAiUEMgMiAoMTYuMiUpIiwgbWFpbiA9ICJTY29yZXMgcGxvdCIpDQphYmxpbmUoaCA9IDAsIHYgPSAwLCBjb2wgPSAiZ3JheSIpDQoNCiMgUGxvdCB0aGUgc2NvcmVzIGFzIHBvaW50cw0KdGV4dCh0dF9zY29yZXNbLCAxXSArIDAuMiwgdHRfc2NvcmVzWywgMl0sIGxhYmVsID0gcm93bmFtZXModHRfc2NvcmVzKSwgY29sPSJibHVlIiwgY2V4PTAuNikNCmBgYA0KDQojIyMgNCkgUGjDom4gdMOtY2ggYuG6sW5nIGZheHRvZXh0cmENCg0KICArIFTDrW5oIHRvw6FuIA0KDQoNCktp4buDbSB0cmEgZ2dwYWlyDQoNCmBgYHtyfQ0KdHQgJT4lIHNlbGVjdChsZW5ndGgsIHdpZHRoLCBoZWlnaHQpICU+JSBnZ3BhaXJzKHVwcGVyID0gbGlzdChjb250aW51b3VzID0gInBvaW50cyIpLCBsb3dlciA9IGxpc3QoY29udGludW91cyA9ICJjb3IiKSkNCg0KYGBgDQoNCmBgYHtyfQ0KI1Bow6JuIHTDrWNoIFBDQQ0KcGNhIDwtIHByY29tcCh0dCwgc2NhbGUgPSBUUlVFKQ0KcHJpbnQocGNhKQ0KDQpgYGANCktp4buDbSB0cmEgYuG6sW5nIGzhu4duaCBzdW1tYXJ5DQpgYGB7cn0NCnN1bW1hcnkocGNhKQ0KDQpgYGANCkPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIFBDMSBnaeG6o2kgdGjDrWNoIDk3Ljk5ICUgcGjGsMahbmcgc2FpOg0KVuG6veG6vSBiaeG7g3UgxJHhu5MgIGLhurFuZyBow6BtIGZ2aXpfZWlnKCkgdHJvbmcgdGjGsCB2aeG7h24gZmFjdG9leHRyYQ0KDQpgYGB7cn0NCmxpYnJhcnkoZmFjdG9leHRyYSkNCmZ2aXpfZWlnKHBjYSkNCiNOaMawIHbhuq15IFBDMSBnaeG6o2kgdGjDrWNoIGfhuqduIDEwMCUgcGjGsMahbmcgc2FpDQpmdml6X3BjYV9pbmQocGNhLCBjb2wuaW5kID0gImNvczIiLCBncmFkaWVudC5jb2xzID0gYygicmVkIiwiYmx1ZSIsICJncmVlbjEiKSwgcmVwZWwgPSBUUlVFKQ0KI05oxrAgduG6rXkgY29tcG9uZW50IDEgZ2nhuqNpIHRow61jaCA5OCUsIGNvbXBvbmVudCAyIGdp4bqjaSB0aMOtY2ggMS4xICUuIA0KDQojYmnhu4N1IMSR4buTIDM6DQpmdml6X3BjYV92YXIocGNhLCBjb2wudmFyID0gImNvbnRyaWIiLCBncmFkaWVudC5jb2xzID0gYygicmVkIiwgImJsdWUiLCAiYmxhY2siKSwgcmVwZWwgPSBUUlVFKQ0KI1Bo4bqnbiB0csSDbSBj4bunYSBjb250cmlidXRpb24gY+G7p2EgbeG7l2kgbeG7mXQgY29tcG9uZW50DQoNCiNUw7NtIGzhuqFpIFBDQSBnacO6cCBjaG8gMyBiaeG6v24gZ2nhuqNtIDEgYmnhur9uLCBjw7MgdGjhu4MgZ2nhuqNpIHRow61jaCDEkcaw4bujYyAlIHBoxrDGoW5nIHNhaSwgZ2nDunAgY2hvIHBow6F0IGhp4buHbiBuZ2/huqFpIHZpIGhp4buHdSBxdeG6oy4NCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpgYGANCg0K