Phân tích thành tố chính (principal component analysis) là phương pháp dùng để giản lược dữ liệu bằng cách chuyển các biến thành các thành tố, là những tổ hợp tuyến tính của các biến, với số lượng ít hơn nhưng vẫn thể hiện đúng thực tế. Nhờ đó các quá trình xử lý tiếp theo sau được dễ dàng hơn. Mặt khác, phương pháp này cũng góp phần phát hiện cấu trúc tiềm ẩn của dữ liệu, như mối tương quan giữa các biến, giữa các phần tử. Do đó, ta có thể định hướng quá trình xử lý tiếp theo.
Thí dụ trong hồ sơ sức khỏe của mọi người có hai biến là cân nặng và chiều cao. Ta có thể kết hợp hai biến này thành một thành tố, đặt tên là "thể hình" chẳng hạn. Sau đó, quá trình xử lý dữ liệu tiếp theo được dễ dàng hơn.
Phương pháp này thường được sử dụng như một bước khảo sát ban đầu, hỗ trợ cho các giai đoạn xử lý kế tiếp.
Phân tích thành tố chính có một số tính chất nổi bật sau:
`Y=c_1X_1+c_2X_2+...+c_nX_n=sum_(i=1)^n c_iX_i` | (3) |
Để dễ nắm bắt hơn cơ sở của phương pháp này, chúng ta khảo sát dữ liệu có hai biến. Xét dữ liệu gồm `p` phần tử và hai biến là `X_1` và `X_2`. Ta có thể biểu diễn dữ liệu này bằng `p` điểm trên hệ trục tọa độ `X_1` và `X_2` như Hình 1a.
Hình 1 Cơ sở của phân tích thành tố chính
Ta thấy giữa các biến và các phần tử có mối tương quan tuyến tính nhất định. Nếu ta sử dụng trục PC làm trục tọa độ mới thì vị trí của `p` điểm có thể biểu diễn một cách gần đúng bằng tọa độ của chúng trên trục PC này. Nói một cách khác, ta có thể dùng một biến mới, biểu diễn bằng trục PC, để thể hiện dữ liệu của `p` phần tử với một sai số nhỏ. Biến này được gọi là thành tố.
Tất nhiên để diễn tả chính xác hơn vị trí của các điểm, ta có thể dùng thêm một trục thứ hai (trục Z), vuông góc với trục PC. Tuy nhiên, do tọa độ của `p` điểm theo trục này không lớn nên vai trò của trục này để diễn tả vị trí `p` điểm là không nhiều. Nói một cách khác, để trình bày dữ liệu, ta có thể dùng thêm một thành tố khác (`Z`), độc lập tuyến tính với thành tố PC. Tuy nhiên vai trò của thành tố này đối với việc thể hiện dữ liệu là không đáng kể, có thể bỏ qua. Vì thế PC được gọi là thành tố chính.
Xét điểm O là tâm của `p` điểm, các tọa độ của O là `bar x_1` và `bar x_2`. Xét điểm Mj dùng để biểu diễn phần tử `j` của dữ liệu (Hình 2b). Khoảng cách `OM_j` được xác định bằng công thức:
`OM_j^2=(x_(1j)-bar x_1)^2+(x_(2j)-bar x_2)^2` | (4) |
hay :
`OM_j=sqrt( (x_(1j)-bar x_1)^2+(x_(2j)-bar x_2)^2 )` | (5) |
Gọi `Y` là một trục qua O. Chiếu Mj lên trục này, ta có điểm Hj. Vậy:
`OH_j=OM_j cos theta`(6)
hay :
`OH_j^2=[ (x_(1j)-bar x_1)^2+(x_(2j)-bar x_2)^2 ] cos^2 theta` | (7) |
Đặt :
`S=sum_(j=1)^m OH_j^2` | (8) |
Theo Hình 1, ta thấy để `Y` là thành tố chính đầu tiên thì `S` phải có giá trị lớn nhất.
Ghi chú
Ta cũng có nhận xét rằng nội dung (hoặc thông tin) của dữ liệu có thể được đặc trưng bằng tổng phương sai. Nếu tổng phương sai càng lớn, nội dung của dữ liệu càng được thể hiện đầy đủ.
Trong phần này ta sẽ xem xét một số nội dung cơ bản của phân tích thành tố chính. Để được thuận tiện, ta sẽ khảo sát một thí dụ và dùng R để xử lý kết quả.
Trên Bảng 1 là doanh số trung bình mỗi ngày của 9 cửa hàng. Dữ liệu này cũng được ghi lại trong tập tin doanh-so.csv.
CH | Thit_Ca | Rau_Qua | VPP | Nhua | Tong | Tr_Binh | TR_VN |
---|---|---|---|---|---|---|---|
AN | 31 | 29 | 25 | 27 | 112 | 28 | 1,15 |
CHI | 41 | 40 | 41 | 38 | 160 | 40 | 1,03 |
DUY | 30 | 35 | 56 | 47 | 168 | 42 | 0,63 |
KIM | 73 | 72 | 76 | 75 | 296 | 74 | 0,96 |
LONG | 70 | 69 | 61 | 64 | 264 | 66 | 1,11 |
NAM | 54 | 48 | 27 | 35 | 164 | 41 | 1,65 |
OANH | 28 | 35 | 68 | 57 | 188 | 47 | 0,5 |
THU | 66 | 62 | 44 | 48 | 220 | 55 | 1,39 |
VINH | 46 | 47 | 63 | 60 | 216 | 54 | 0,76 |
Bảng trên gồm 8 biến sau :
Trong dữ liệu này, bốn biến Thit_Ca, Rau_Qua, VPP, Nhua là bốn biến phân tích, được sử dụng để phân tích thành tố chính. Các biến còn lại là các biến phụ.
Trước hết, ta đưa bảng dữ liệu này vào R với tên ds. Sau đó xem xét sơ lược về mối tương quan giữa các biến (ngoại trừ CH) bằng lệnh cor(ds[,-1])
. Ta thu được kết quả sau:
> cor(ds[,-1])
Thit_Ca Rau_Qua VPP Nhua Tong Tr_Binh TR_VN
Thit_Ca 1.0000000 0.9778076 0.2470041 0.5387860 0.80786977 0.80786977 0.51511143
Rau_Qua 0.9778076 1.0000000 0.4369798 0.6935397 0.90903948 0.90903948 0.33277898
VPP 0.2470041 0.4369798 1.0000000 0.9439201 0.77012671 0.77012671 -0.68458540
Nhua 0.5387860 0.6935397 0.9439201 1.0000000 0.92997971 0.92997971 -0.41824727
Tong 0.8078698 0.9090395 0.7701267 0.9299797 1.00000000 1.00000000 -0.07627549
Tr_Binh 0.8078698 0.9090395 0.7701267 0.9299797 1.00000000 1.00000000 -0.07627549
TR_VN 0.5151114 0.3327790 -0.6845854 -0.4182473 -0.07627549 -0.07627549 1.00000000
Bảng kết quả này cho ta thấy một số điểm sau :
prcomp
Trong phụ kiện stats của R, ta có thể sử dụng hai hàm là prcomp
và princomp
để phân tích thành tố. Sự khác biệt chính của hai hàm này là cách phân giải (decomposition) ma trận tương quan hay ma trận hiệp phương sai. Ngoài ra, phương pháp xác định hiệp phương sai cũng khác nhau một ít.
prcomp
dùng phép phân giải dựa trên các giá trị suy biến (singular value) của các ma trận; vì thế cách phân giải này thường được biết dưới tên phân giải theo giá trị suy biến (singular value decomposition hay SVD). Ngoài ra, khi tính hiệp phương sai, xem dữ liệu như của một mẫu, nên chia cho `p-1`.princomp
dùng phép phân giải dựa trên các giá trị riêng (eigenvalue) của các ma trận, vì thế cách phân giải này thường được biết dưới tên phân giải theo giá trị riêng (eigen decomposition). Ngoài ra, khi tính hiệp phương sai, xem dữ liệu như của một tổng thể, nên chia cho `p`.Theo ý kiến của nhiều tác giả, prcomp
được sử dụng phổ biến hơn, do có mức độ chính xác cao hơn, cho kết quả tốt hơn. Trong thí dụ này, ta dùng hàm prcomp
để phân tích thành tố.
Khi sử dụng prcomp
, ta cần lưu ý đến các đối số center
và scale
. Hai đối số này liên quan đến sự chuyển đổi biến trước khi phân tích thành tố.
center = TRUE
(giá trị mặc định), các giá trị sau khi chuyển đổi `X_(cd)` có trung bình bằng 0 (biến định tâm), nghĩa là:
`X_(cd)=X-bar x`(9)
scale = TRUE
, các biến sẽ được chuẩn hóa (standardized), nghĩa là sau khi chuyển đổi, giá trị biến có phân phổi chuẩn với trung bình là 0 và độ lệch chuẩn là 1. Giá trị mặc định của đối số này là scale = FALSE
.Ta phân tích thành tố với 4 biến Thit_Ca, Rau_Qua, VPP, Nhua với các đối số mặc định và lưu kết quả vào biến pc với lệnh sau:
pc <- prcomp(ds[, 2:5])
Dùng hàm summary
để xem xét kết quả, ta có :
> summary(pc)
Importance of components:
PC1 PC2 PC3 PC4
Standard deviation 28.3768 17.7119 1.32015 0.5763
Proportion of Variance 0.7183 0.2798 0.00155 0.0003
Cumulative Proportion 0.7183 0.9981 0.99970 1.0000
Bảng này cho ta thấy :
Để tìm hiểu chi tiết hơn các thành tố, ta dùng lệnh print(pc)
, hay đơn giản hơn là pc
, ta thu được kết quả:
> pc
Standard deviations:
[1] 28.3767680 17.7119156 1.3201467 0.5762586
Rotation:
PC1 PC2 PC3 PC4
Thit_Ca 0.5107429 0.5812543 -0.1121297 -0.6234678
Rau_Qua 0.5060181 0.3578137 0.3976566 0.6765975
VPP 0.4827043 -0.6556658 0.4942081 -0.3047249
Nhua 0.5000839 -0.3228238 -0.7648885 0.2462650
Từ bảng kết quả này ta rút ra một số nhận xét sau:
Kết quả xử lý bằng lệnh prcomp
được lưu trong một danh sánh có 5 thành phần: "sdev", "rotation", "center", "scale", "x". Để biết được tọa độ mới của `p` phần tử trong không gian tạo từ các thành tố, ta dùng lệnh pc$x
. Ta có kết quả sau:
> pc$x
PC1 PC2 PC3 PC4
[1,] -43.190413 7.323178 -1.06479184 0.15173598
[2,] -19.292593 3.029956 1.68169077 -0.80705156
[3,] -15.699537 -17.893311 1.45595960 0.31361845
[4,] 48.641514 -1.812656 -0.18503726 -0.66046423
[5,] 32.849744 8.756190 -0.04096646 1.04210435
[6,] -16.862902 23.596563 -1.21899048 0.02800061
[7,] -5.927732 -30.152047 -0.03816854 0.36650570
[8,] 11.057330 20.237977 1.46063377 0.03987528
[9,] 8.424588 -13.085849 -2.05032958 -0.47432458
Ta cũng nhận xét thêm rằng tọa độ của các điểm trên PC3 và PC4 nhỏ hơn nhiều so với PC1 và PC2. Điều này một lần nữa cho ta thấy vai trò của PC3 và PC4 là không đáng kể trong việc thể hiện nội dung của dữ liệu.
Phân tích thành tố, trong chừng mực nào đó, là một phương pháp khá trừu tượng. Để phần nào làm việc nắm bắt phương pháp này dễ dàng hơn, người ta thường dùng các biểu đồ để trình bày kết quả. Có ba loại biểu đồ chính:
Để minh họa, ta sử dụng tiếp dữ liệu từ thí dụ trên. Tuy nhiên để các biểu đồ được rõ ràng hơn, ta sử dụng phụ kiện FactoMineR.
PCA
Trước hết, để phân tích thành tố chính, chúng ta không sử dụng prcomp
hay princomp
của phụ kiện stats mà sử dụng hàm PCA
của FactoMineR. Hàm này có khả năng xử lý thêm các biến phụ và kết quả tạo ra phong phú hơn nhiều với 21 hạng mục khác nhau (so với 5 hạng mục của prcomp). Nhờ đó tạo ra được các biểu đồ với chất lượng khá hơn. Khi sử dụng hàm này, ta lưu ý các đổi số sau:
scale.unit
: nếu đối số này bằng TRUE (giá trị mặc định), các biến sẽ được chuẩn hóa.ncp
: số thành tố được trình bày trong kết quả, giá trị mặc định là 5.quanti.sup
: danh sách các biến phụ có kiểu số.quali.sup
: danh sách các biến phụ có kiểu định danh.graph
: nếu đối số này bằng TRUE (giá trị mặc định), biểu đồ phần tử và biểu đồ biến sẽ được vẽ.axes
: danh sách hai thành tố được dùng để vẽ biểu đồ (khi graph = TRUE
), giá trị mặc định là c(1, 2).Như vậy, ta dùng đoạn lệnh sau để phân tích thành tố chính :
library(FactoMineR) ds <- ds[ , c("CH", "Thit_Ca", "Rau_Qua", "VPP", "Nhua", "Tong", "TR_VN")] pcf <- PCA(ds, ncp=4, quanti.sup=c(6,7), quali.sup=c(1:1), graph = FALSE)
Trong đoạn lệnh trên, ta đã khai báo thêm hai biến phụ có kiểu số (Tong và TR_VN) và một biến phụ có kiểu định danh (CH). Ở đây ta đặt graph = FALSE
vì ta muốn sử dụng lệnh vẽ riêng, có thể tinh chỉnh để biểu đồ đẹp hơn và đầy đủ hơn. Kết quả xử lý từ đoạn lệnh được lưu vào biến pcf. Ta có thể dùng lệnh summary
để xem xét kết quả.
> summary(pcf)
Call:
PCA(X = ds, ncp = 4, quanti.sup = c(6, 7), quali.sup = c(1:1),
graph = FALSE)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4
Variance 2.937 1.055 0.007 0.001
% of var. 73.435 26.368 0.168 0.030
Cumulative % of var. 73.435 99.802 99.970 100.000
Individuals
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2
1 | 2.796 | -2.760 28.808 0.974 | -0.445 2.086 0.025 | -0.071 8.264 0.001 |
2 | 1.271 | -1.249 5.904 0.966 | -0.199 0.416 0.024 | 0.109 19.790 0.007 |
3 | 1.489 | -1.013 3.879 0.462 | 1.088 12.461 0.533 | 0.097 15.539 0.004 |
4 | 3.114 | 3.111 36.617 0.998 | 0.117 0.145 0.001 | -0.012 0.256 0.000 |
5 | 2.183 | 2.114 16.907 0.938 | -0.538 3.054 0.061 | -0.001 0.004 0.000 |
6 | 1.799 | -1.071 4.337 0.354 | -1.443 21.930 0.644 | -0.081 10.980 0.002 |
7 | 1.892 | -0.382 0.551 0.041 | 1.853 36.190 0.959 | -0.001 0.001 0.000 |
8 | 1.443 | 0.705 1.882 0.239 | -1.255 16.599 0.757 | 0.095 15.056 0.004 |
9 | 0.995 | 0.543 1.115 0.298 | 0.822 7.118 0.683 | -0.135 30.109 0.018 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr cos2
Thit_Ca | 0.816 22.665 0.666 | -0.578 31.630 0.334 | -0.011 1.886 0.000 |
Rau_Qua | 0.915 28.480 0.837 | -0.402 15.349 0.162 | 0.033 16.026 0.001 |
VPP | 0.761 19.719 0.579 | 0.647 39.694 0.419 | 0.045 29.756 0.002 |
Nhua | 0.925 29.137 0.856 | 0.375 13.327 0.141 | -0.059 52.332 0.004 |
Supplementary continuous variables
Dim.1 cos2 Dim.2 cos2 Dim.3 cos2
Tong | 1.000 1.000 | 0.014 0.000 | 0.004 0.000 |
TR_VN | -0.062 0.004 | -0.978 0.956 | -0.102 0.011 |
Supplementary categories
Dist Dim.1 cos2 v.test Dim.2 cos2 v.test Dim.3 cos2 v.test
AN | 2.796 | -2.760 0.974 -1.610 | -0.445 0.025 -0.433 | -0.071 0.001 -0.862 |
CHI | 1.271 | -1.249 0.966 -0.729 | -0.199 0.024 -0.193 | 0.109 0.007 1.335 |
DUY | 1.489 | -1.013 0.462 -0.591 | 1.088 0.533 1.059 | 0.097 0.004 1.183 |
KIM | 3.114 | 3.111 0.998 1.815 | 0.117 0.001 0.114 | -0.012 0.000 -0.152 |
LONG | 2.183 | 2.114 0.938 1.234 | -0.538 0.061 -0.524 | -0.001 0.000 -0.018 |
NAM | 1.799 | -1.071 0.354 -0.625 | -1.443 0.644 -1.405 | -0.081 0.002 -0.994 |
OANH | 1.892 | -0.382 0.041 -0.223 | 1.853 0.959 1.805 | -0.001 0.000 -0.009 |
THU | 1.443 | 0.705 0.239 0.412 | -1.255 0.757 -1.222 | 0.095 0.004 1.164 |
VINH | 0.995 | 0.543 0.298 0.317 | 0.822 0.683 0.800 | -0.135 0.018 -1.646 |
Ta nhận thấy kết quả khi phân tích bằng lệnh PCA
phong phú hơn so với khi dùng lệnh prcomp
. Một số sự khác biệt giữa bảng kết quả này với kết quả mà ta đã thực hiện như tỷ lệ phương sai, do ở đây, chúng ta xử lý dữ liệu đã được chuẩn hóa. Mặt khác trên các cột "Dim" trong phần "Variables" không phải là hệ số tải mà là tọa độ của biến trong không gian thành tố.
Các biểu đồ mà ta sẽ vẽ trong phần sau sử dụng thông tin từ bảng kết quả này.
plot
Để vẽ bằng FactoMineR, cũng dùng lệnh plot
cho một số loại biểu đồ. Khi sử dụng lệnh này, ta cần lưu ý một số đối số sau:
axes
: danh sách hai thành tố được dùng để làm hai trục trên biểu đồ, giá trị mặc định là c(1, 2).choix
: loại biểu đồ dự định vẽ. Nếu là "ind", biểu đồ phần tử được vẽ; nếu là "var", biểu đồ biến được vẽ; nếu là "varcor", biểu đồ biến được vẽ cùng với vòng tròn tương quan (correlation circle).col.xx
: Màu sắc thể hiện của đối tượng xx.label
: Tên của đối tượng thể hiện trên biểu đồ, mặc định là "all".Đối với thí dụ đang xem xét, để vẽ biểu đồ biến, ta sử dụng lệnh sau:
plot(pcf, choix = "var", col.var = "red", col.quanti.sup = "blue", cex = 0.9, title = "Biểu đồ các biến trong phân tích thành tố")
Ta thu được Hình 2.
Hình 2 Biểu đồ biến trong phân tích thành tố.
Trên biểu đồ này, các biến được biểu diễn bằng các vectơ có gốc là gốc hệ tọa độ thay vì các điểm. Trong trường hợp của chúng ta, điểm ngọn của các vectơ nằm trên vòng tròn có bán kính 1 được gọi là vòng tròn tương quan (correlation circle). Tọa độ các điểm ngọn này được cho trong phần "Variables" của bảng kết quả bên trên (thí dụ biến Thit_Ca có Dim1 là `0,816` và Dim2 là `-0,445`).
Trên biểu đồ này, ta thấy biến Tong gần như trùng với trục thành tố 1, như vậy ý nghĩa của thành tố 1 này là tổng doanh số. Tương tự, biến TR_VN nằm rất gần trục thành tố 2, như vậy thành tố 2 biểu thị tỷ số của doanh số hai nhóm sản phẩm thịt cá và rau quả so với doanh số hai nhóm sản phẩm văn phòng phẩm và nhựa.
Để vẽ biểu đồ phần tử, ta dùng lệnh sau:
plot(pcf, choix = "ind", label = "quali", cex = 0.8, col.quali = "red", title = "Biểu đồ các phần tử trong phân tích thành tố")
Và ta thu được Hình 3.
Hình 3 Biểu đồ phần tử trong phân tích thành tố.
Kết hợp với biểu đồ biến ở Hình 2, ta có một số kết luận sau:
Dựa vào các biểu đồ này ta cũng có thể phân loại các cửa hàng theo một số tiêu chí dựa trên doanh số.
Ta thấy phụ kiện FactoMineR hỗ trợ tốt để vẽ biểu đồ biến và biểu đồ phần tử. Tuy nhiên phụ kiện này lại không hỗ trợ ta vẽ biểu đồ kép. Vì vậy để vẽ biểu đồ kép ta sử dụng phụ kiện stats (đã được kích hoạt sẵn khi khởi động R) và hàm biplot
. Với thí dụ trên, ta có thể sử dụng đoạn lệnh sau:
par(mar=c(5,3,5,1)) biplot(pc, xlim = c(-0.6, 0.7), cex = 0.9, main = "Biểu đồ kép trong phân tích thành tố") abline(h = 0, lty = "55") abline(v = 0, lty = "55")
Ta thu được biểu đồ kép trên Hinh 4
Hình 4 Biểu đồ kép trong phân tích thành tố.
Ta cũng lưu ý thêm là biểu đồ này được vẽ tương ứng với các biến được định tâm nhưng không chuẩn hóa. Các trục có hai thang đo, một thang cho giá trị định tâm, một thang cho hệ số tải.
Vấn đề có nên chuẩn hóa các biến hay không được tranh luận rất nhiều. Theo đó mỗi cách đều có những ưu điểm và hạn chế nhất định. Bạn có thể tham khảo về chủ đề này trong các tài liệu chuyên môn hay trên các diễn đàn về xử lý số liệu đa biến hay về phương pháp phân tích thành tố. Về mặt ứng dụng trong thực tiễn, ta có thể tham khảo xu hướng chung như sau:
Trong nhiều trường hợp, việc chọn lựa còn dựa vào kinh nghiệm của người xử lý dữ liệu.
Trong thí dụ trên, do hai thành tố chính có khả năng thể hiện đến 99,81% nội dung của dữ liệu nên điểm biểu diễn các biến gần như nằm trên vòng tròn tương quan. Nhưng khi số thành tố chính nhiều hơn 2, thì hai thành tố chính chỉ thể hiện một tỷ lệ ít hơn nội dung của dữ liệu. Vì thế các điểm biểu diễn không nằm trên vòng tròn, một số điểm còn nằm gần gốc tọa độ, tâm của vòng tròn tương quan. Khi ấy chỉ có các biến có điểm biểu diễn vừa gần các trục, vừa xa tâm mới có khả năng đóng góp (contribution) vào việc giải thích ý nghĩa các thành tố.
Như đã trình bày ở trên, phân tích thành tố chính được dùng như một bước khảo sát ban đầu. Từ kết quả của phương pháp xử lý này ta có thể tiếp tục theo một số hướng khác nhau.
Các nội dung này sẽ được đề cập trong các phần và các chương kế tiếp.
Trang web này được cập nhật lần cuối ngày 26/11/2018
Dữ liệu đa biến
Các chuyên đề
Xử lý dữ liệu
Ma trận
R