Mục tiêu

Mục tiêu của bài viết này nhằm hướng dẫn người đọc sử dụng R trong phân tích dữ liệu đặc biệt là dữ liệu cảm quan. Từ đó có những góc nhìn, nhận xét và hướng đi mới cho công cuộc phát triển sản phẩm.

Đây là một bài hướng dẫn chi tiết từ việc đọc dữ liệu, trực quan hóa dữ liệu bằng các biểu đồ cho đến thực hiện các phân tích nâng cao bằng PCA, MCA hoặc kiểm định Friedmen khi thực hiện phân tích so hàng.

Giới thiệu công cụ

R là phần mềm phân tích thống kê/ đồ họa cho giới phân tích dữ liệu, thống kê. Trang web truy cập R là https://cran.r-project.org.

RStudio là IDE (Integrated Development Environment), một phần mềm cho phép truy cập trực tiếp vào phần mềm R, đồng thời hỗ trợ rất nhiều tính năng nâng cao, giúp cho việc quản lý và phân tích dữ liệu với R được hiệu quả hơn. Trang web truy cập RStudio là https://rstudio.com

Việc cài đặt hoàn toàn đơn giản bằng cách truy cập đường link phía bên trên, tải xuống, click cài đặt và “next” cho đến khi hoàn thành.

Một lưu ý quan trọng trong quá trình cài đặt là tên PC của bạn không nên chứa ký tự khoảng cách hoặc tên tiếng việt. Nếu gặp trường hợp này các bạn có thể xử lý bằng cách thay dổi tên biến toàn cục của máy tính bằng hướng dẫn sau đây: https://stackoverflow.com/questions/72138987/r-studio-fatal-error-r-tempdircontains-space

Package trong R:

Sức mạnh to lớn của R nằm ở tập hợp các thư viện được opensource từ những người sử dụng thông thường cho đến các nhà khoa học chuyên nghiệp. Do vậy chúng ta có thể sử dụng các thư viện này một cách miễn phí phục vụ cho các mục đích khác nhau như nghiên cứu khoa học, nghiên cứu xã hội, phân tích dữ liệu, học máy, …

Bài viết trình bày một số package thường được sử dụng cho những tác vụ hay gặp nhất khi làm việc với dữ liệu. Tất cả các package này đều có trên CRAN và dễ dàng cài đặt với cú pháp:

install.package("<package_name>")

Sau khi cài đặt package xong, chúng ta cần gọi nó ra trước khi sử dụng với cú pháp:

library(<package_name>)

Ví dụ: Cài đặt một số package sẽ dùng trong bài viết này.

install.package("dplyr")
install.package("ggplot2")
install.package("readxl")
install.packages("FactoMineR")
install.packages("corrplot")
install.packages("R4SPISE2022")
install.packages("ExPosition")

Sau khi cài đặt xong chúng ta cần gọi package ra trước khi thực hiện các phân tích dữ liệu.

library(dplyr)
library(tidyr)
library(readxl)
library(knitr)
library(FactoMineR)
library(ggplot2)
library(MASS)
library(corrplot)
library(R4SPISE2022)
library(ExPosition)

Đọc dữ liệu vào R

Cách đơn giản nhất để đọc được dữ liệu vào R mà không sử dụng các dòng code đó là từ giao diện Rstudio hãy thêm trực tiếp file dữ liệu mà chúng ta cần xử lý. Hãy quan sát các bước thực hiện sau đây.

Hãy nhìn ở góc trên bên phải màn hình nơi có cửa sổ chứa các biến sinh ra trong quá trình phân tích. Click vào Import Dataset và một cửa sổ mới hiện ra.

Ta có thể thêm các file dữ liệu ở các định dạng khác nhau. Excel là một trong những định dạng file lưu dữ liệu tương đối phổ biến hiện nay. Sau khi chọn được kiểu dữ liệu một cửa sổ mới lại được mở ra.

Các bạn chọn đường dẫn đến file dữ liệu đó và đặt tên một đối tượng để lưu dữ liệu đã đọc được vào trong đó.

Một cách khác là chúng ta có thể thao tác trực tiếp nhập dữ liệu bằng câu lệnh sau:

habeco <- read_excel("D:/Project/SENSORY_BEER_HABECO_2022-11-11/Habeco_chemicaldata.xlsx")
habeco <- data.frame(habeco, row.names = habeco$Sample)

Trực quan hóa dữ liệu

Đầu tiên, tôi sẽ vẽ một biểu đồ cột giữa các chỉ tiêu ở các mẫu khác nhau để xem bộ dữ liệu của mình đang có gì.

Bộ dữ liệu ban đầu
Sample CO2. dotrong..EBC. doaxit..ml.NaOH.10ml.bia. Alcohol…v.v. Sugar.res…m.m. Ea…m.m. Sugar.init..P. Color..EBC. pH
A A 5.03 0.25 1.2 4.37 3.34 1.73 10.07 6.23 4.22
B B 5.05 0.16 1.0 4.33 3.80 2.22 10.44 6.13 4.20
X X 5.28 0.17 1.0 4.31 3.83 2.25 10.43 6.09 4.33
Y Y 5.24 0.19 1.0 4.33 3.75 2.17 10.39 5.86 4.30
Z Z 5.23 0.16 1.0 4.32 3.78 2.19 10.40 6.13 4.45

Để dễ dàng thực hiện nhóm các dữ liệu theo tên sản phẩm. Chúng ta chuyển dữ liệu về dạng hàng dọc trong có Key chính là tên sản phẩm và các thuộc tính sẽ nằm ở cột có tên là criteria. Và đây là bảng dữ liệu sau khi chuyển

habeco1 <- gather(habeco, key="criteria", value="Score", 2:10)
Bộ dữ liệu sau khi chuyển
Sample criteria Score
A CO2. 5.03
B CO2. 5.05
X CO2. 5.28
Y CO2. 5.24
Z CO2. 5.23
A dotrong..EBC. 0.25
B dotrong..EBC. 0.16
X dotrong..EBC. 0.17
Y dotrong..EBC. 0.19
Z dotrong..EBC. 0.16

Package ggplot2 rất mạnh cho phép chúng ta có thể vẽ nhiều loại biểu đồ khác nhau. Ở đây, tôi ví dụ về biểu đổ cột trong đó dữ liệu sẽ được nhóm lại theo các mẫu và trong các mẫu sẽ có các loại chỉ tiêu khác nhau được thể hiện bằng màu sắc khác nhau.

ggplot(data = habeco1, aes(fill=criteria, y=Score, x=Sample)) + 
    geom_bar(position="dodge", stat="identity")

Hoặc ta có thể vẽ biểu đồ tương quan giữa các chỉ tiêu với nhau.

corr <- cor(habeco[,-1])

corrplot(corr, type = "upper", order = "hclust", tl.col = "black", tl.srt = 45)

Những hình cặp có màu càng đậm, hình tròn càng to là những cặp chỉ tiêu có tương quan mạnh với nhau. Trong khi màu xanh dương chỉ mối tương quan thuận có nghĩa là khi chỉ tiêu này tăng thì chỉ tiêu tương ứng trong cặp đang xét đo cũng có giá trị tăng theo. Đồng thời khi màu càng đậm về phía màu đỏ nâu thì chúng tương quan nghịch hay chỉ tiêu này tăng thì chỉ tiêu kia sẽ giảm trong sản phẩm.

Phân tích PCA

Với bộ dữ liệu như trên, mỗi sản phẩm được đo bởi 9 tính chất hóa lý có nghĩa là khi muốn biểu diễn một sản phẩm ta cần có không gian 9 chiều trong đó mỗi chiều tương ứng là 1 chỉ tiêu. Việc tưởng tượng không gian từ 4 chiều trở lên là một vấn đề khó khăn cho con người và sẽ thật trở lên vô cùng khó khăn nếu ta phải tưởng tượng cho những dữ liệu có không gian lên tới cả trăm hay nghìn chiều. Do vậy, PCA được sinh ra như một thuật toán làm giảm số chiều dữ liệu và giữ được nhiều thông tin nhất cho bộ dữ liệu đó.

Hãy cũng thử xem PCA sẽ giúp giảm chiều cho bộ dữ liệu trên thế nào nhé.

Để chạy PCA ta cần sử dụng hàm PCA có sẵn trong package FactomineR. Tuy nhiên trước khi sử dụng ta cần xác định rõ sẽ chạy trên các đặc trưng được đo bằng biến định lượng. Ví dụ như trong dữ liệu habeco cột đâu tiên là tên mẫu, do vậy cần loại bỏ cột đầu tiên nếu không sẽ báo lỗi.

habeco_chemicaldata <- habeco[,-1]
habeco.pca<-PCA(habeco_chemicaldata,
                scale.unit = TRUE,
                ncp = 5,
                graph=F)

Trong đó scale.unit = True sẽ giúp chuẩn hóa dữ liệu về cùng một thang đo tránh việc quan trọng hóa một chỉ tiêu có đơn vị đo lường lớn trong bảng dữ liệu. Do vậy, các chỉ tiêu mới có thể so sánh đươc với nhau. Nếu các chỉ tiêu đã có cùng thang đo thì không cần chuẩn hóa dữ liệu này. ncp là số lượng chiều ở không gian mục tiêu cuôi cùng (số chiều này cần nhỏ hơn min(số lượng quan sát và số lượng đặc trưng)).

Hãy quan sát lượng thông tin đưuọc diễn tả trên các chiều sau khi thwucj hiện PCA

habeco.pca$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## comp 1  6.8541941              76.157712                          76.15771
## comp 2  1.1053290              12.281433                          88.43915
## comp 3  0.8775165               9.750183                          98.18933
## comp 4  0.1629604               1.810671                         100.00000

Có thể thấy kết quả lượng thông tin được chiếu lên chiều thứ nhất comp1 là 76%. Các chiều phía sau là kết quả của việc chiếu dữ liệu lên trực giao với chiều thứ 1 nhằm đảm bảo lượng thông tin đã chiếu lên chiều phía trước rồi sẽ không bị lặp lại. Tổng phương sai diễn tả sau 2 trục đầu tiên là 88%. Vậy câu hỏi đặt ra là bao nhiêu chiều là đủ hay bao nhiêu % lượng thông tin diễn tả là đạt yêu cầu? Câu trả lời là không có văn bản chính thống nào cả. Tuy nhiên theo kinh nghiêm khi lượng dữ liệu diễn tả trên trục chính đầu tiên >50% là có thể chấp nhận được. Hoặc có thể sử dụng quy tắc Kaiser hoặc cùi trỏ để xác định số lượng chiều thông tin có ý nghĩa.

Biểu đồ cột diễn tả lượng thông tin được diễn tả trên các trục

barplot(habeco.pca$eig[,2],
        main="Eigenvalues",
        names.arg=1:nrow(habeco.pca$eig))

Một cách phân tích PCA khác dựa trên package của thầy Herve Abdi

Đầu tiên hãy gọi thư viện R4SPISEExPosition đó là những điều bạn cần. Cú pháp thực hiện phân tích cũng rất đơn giản bằng 2 hàm epPCAOTAplot.

habeco<-as.data.frame(habeco)
rownames(habeco)<-habeco[,1]

res.pca <- epPCA(habeco[,-1],
                 scale = T,
                 center = T,
                 graphs = F)

res.plot.pca <- OTAplot(resPCA = res.pca,
                        data = habeco[,-1],
)

Một số tùy chỉnh như: - nfactor4rotation = “Kaiser” cho biết tiêu chí chọn chiều theo nguyên lý của Kaiser. - biplot = FALSE: Không vẽ biểu đồ Biplot

Lưu ý: Để tìm hiều các tham số điền vào trong hàm hãy sử dụng “?” trước tên của hàm đó. Ví dụ: ?OTAplot Các kết quả thu được chứa trong đối tượng res.plot.pca và ta chỉ cần gọi ra để thu được đồ thị mong muốn.

Biểu đồ scree cũng tương tự như biểu đồ cột diễn tả lượng thông tin được diễn tả trên các trục đã trình bày phía trên.

res.plot.pca$results.graphs$scree

Một cách tương đối ta có thể sử dụng biểu đồ biplot đưuọc vẽ trên vòng tròn tương quan để nhìn trực quan để thấy mối quan hệ giữa các chỉ tiêu và các mẫu trên cùng một bản đồ.

res.plot.pca$results.graphs$cosineCircleArrowIJ12

Các chỉ tiêu (mũi tên) tạo với nhau góc càng nhọn thi cosin giữa chúng gần bằng 1 có nghĩa là tương quan thuận mạnh với nhau. Ngược lai cho các chỉ tiêu tạo với nhau góc tù thì có tương quan nghích. và vuông góc thì 2 chỉ tiêu không liên quan. Trong kết quả trên, có thể thấy trục chính 1 được minh họa bởi các thuộc tính Sugar, Color, Alcohol, Độ axit, Độ trong trong khi trục chính 2 được mô tả bởi các thuộc tính PH và CO2. Các thuộc tính Đường ban đầu, Ea và Đường xót tạo với nhau góc nhọn cho thấy các chỉ tiêu này tương quan thuận với nhau (nếu bia có Đường đầu cao thì Ea và Đường xót cũng cao). Tuy nhiên các chỉ tiêu đó lại tương quan nghịch với độ axit hay độ trong và cả alcohol. Khi lượng đường cao thì độ axit, độ trong và alcohol lại giảm. Tương tự cho các chỉ tiêu còn lại.

Các chấm xanh biểu thị cho các quan sát hay các mẫu bia khác nhau. Độ gần của câc điểm này thể hiện mức độ giống nhau của các mẫu. Tuy nhiên nếu biểu đồ trên không tự động thêm nhãn của mẫu ta có thể sử dụng câu lệnh sau để xem vị trí của các mẫu như thế nào tren bàn đồ PCA.

res.plot.pca$results.graphs$factorScoresI12

Nhìn chung mẫu A đang đứng các xa so với các mẫu còn lại và được có thể phân biệt với các mẫu còn lại theo trục chính 1. Mẫu B có thể phân biệt với các mẫu còn lại theo trục chính 2. Trong khi 3 mẫu X,Y,Z gần nhau nghĩa là có thể các mẫu này có các tính chất gần tương tự nhau. Ngoài ra khi chiếu lên biểu đồ biplot ta có thể nhận thấy mẫu A được đặc trưng bởi các yếu tố như Alcohol, độ chua, độ trong và màu sắc. Mẫu B được đặc trưng bởi Sugar trong khi X,Y,Z được đặc trưng bởi CO2 và pH. Điều này rất có lợi khi xác định vị trí dòng sản phẩm của mình so với các sản phẩm trên thị trường hoặc sản phẩm của đối thủ.

Phân tích MCA

Trong khi PCA dùng để xử lý có các dữ liệu định lượng thì MCA là lựa chọn phù hợp dùng để phân tích định tính. MCA thực hiện trực quan hóa thống kê để mô tả mối liên hệ giữa các mức độ của biến phân loại (categorical variable). Phân tích này đặc biệt tốt trong những nghiên cứu liên quan đến xã hội hoặc hành vi người tiêu dùng.

Đầu tiên, chúng ta cần nhập dữ liệu đã điều tra

habeco_customer_behavior <- read_excel("D:/Project/SENSORY_BEER_HABECO_2022-11-11/habecoext.xlsx")
kable(habeco_customer_behavior[1:5,1:8], caption = "Dữ liệu hành vi khách hàng")
Dữ liệu hành vi khách hàng
Panelist_Code Freq để giải khát vì công việc tiếp khách để gặp gỡ và tụ tập bạn bè vì thích uống bia để thư giãn
1 1 vài lần/năm y y y y n n
3 Hàng ngày n y y n y n
4 Hàng ngày y y y n y n
5 Hàng ngày n n n y n n
6 1 vài lần/tuần n n n n n y

Các biến phân loại (categorical variable) là các biến có giá trị thuộc vào 1 nhóm nào đó đã được quy định và nó không có giá trị định lượng. Ví dụ giới tính, tần suất sử dụng sản phẩm trên tuần, mục đích sủ dụng, … Trong bảng điều tra hành vi có thể thấy có những cột hành vi chỉ được lưa chọn 1 đáp án (sigle choice) nhưng có những hành vì được lựa chọn nhiều hơn 1 đáp án (multiple choice). Để thông kê những hành vi multiple choice ta cần thêm một bước là chuyển các giá trị đó về dạng sigle choice và gán giá trị TRUE/FALSE hoặc YES/NO tương ứng với kết quả lựa chọn của người điều tra.Trong phần này, chúng ta tập trung vào việc thực hiện phân tích. Những việc chuẩn bị bảng dữ liệu hay biến đổi nó về dạng dữ liệu phân loại có thể sẽ được giới thiệu trong một phần khác.

Sau khi thêm được dữ liệu, một số bước xử lý dữ liệu cần được tiến hành như: đặt cấu trúc dữ liệu thành Dataframe, một vài biến thông tin cá nhân, …

habeco_customer_behavior<-as.data.frame(habeco_customer_behavior)
rownames(habeco_customer_behavior)<-habeco_customer_behavior[,1]
habeco_customer_behavior<-habeco_customer_behavior[,-1]
habeco_customer_behavior$Set1_X<-as.factor(habeco_customer_behavior$Set1_X)
habeco_customer_behavior$Set1_A<-as.factor(habeco_customer_behavior$Set1_A)
habeco_customer_behavior$Set1_B<-as.factor(habeco_customer_behavior$Set1_B)

habeco_customer_behavior<-habeco_customer_behavior[,-c(16,56)]

Hàm as.factor đã được sử dụng ở trên nhắm mục đích chuyển dữ liệu xếp hạng của sản phẩm (ở dạng số nguyên) thành biến phân loại (categorical). Các dữ liệu còn lại đều là dữ liệu dạng phân loại rồi nên chúng ta không cần chuyển đổi.

Cúng tương tự như thực hiện phân tích PCA hàm MCA có sẵn trong gói FactomineR. Ở đây, chúng ta thực hiên phân tích trên đợt đầu tiên cho 3 sản phẩm X, A, B do vậy dữ liệu được lấy từ cột đầu tiên đến cột 60

habeco_customer_behavior<-habeco_customer_behavior[,1:60]
habeco_customer_behavior.mca<-MCA(habeco_customer_behavior,quanti.sup = 55,quali.sup = 58:60, graph = F)

quali.sup là những cột dữ liệu liên quan đến các biến xếp hạng của sản phẩm. quanti.sup là cột chứa dữ liệu ở dạng liên tục (trong ví dụ này là tuổi)

Một biểu đồ cột thể hiện mức độ phần trăm được giải thích theo các thứ nguyên của của MCA.

barplot(habeco_customer_behavior.mca$eig[,2],main="Eigenvalues", names.arg=1:nrow(habeco_customer_behavior.mca$eig))

Việc lựa chọn số lượng thứ nguyê giữ lại có thể theo kinh nghiệm bằng cách so sánh mức độ chênh lệch giữa 2 thứ nguyên liên tiếp. Như hình trên, thứ nguyên thứ 3 và 4 chênh lệch nhau không nhiều do vậy có thể chọn 3-4 thứ nguyên làm trục chính cho phân tích MCA.

Biểu đồ vị trí của các quan sát được tô màu sau khi thực hiện MCA được vẽ như sau

plot(habeco_customer_behavior.mca,
     invisible=c("var","quali.sup"),
     cex=1,label="none",
     title="Graph of the individuals",
     habillage=3)

Hãy thử thay đổi habillage để tạo ra những biểu đồ phù hợp với mục đích điều tra. Trong biểu đồ trên, có thể thấy những người uống bia vì công việc được chia thành 2 tập khá rõ ràng và ít đan xen với nhau.

Để rõ hơn việc lựa chọn mẫu nào ta hãy vẽ các điểm quanti.sup lên để thấy rõ hơn xu hướng lựa chọn của các nhóm này.

plot(habeco_customer_behavior.mca,
     invisible=c("var","quanti.sup"),
     cex=0.8,
     title="Graph of the individuals with supplementary ",
     habillage=3)

Có thể thấy được nhóm những người uống bia vì công việc (vì công viêc_y) có điểm quanti.sup là set1_B_3 nằm rất gần nhóm này. Điều này cho thấy những người uống bia vì công việc thường cho điểm mẫu bia B cao hơn 2 mẫu còn lại. Tương tự nhóm người uống bia không vì công việc lại thường cho điểm mẫu bia A và X cao hơn.

Một biểu đồ khác sử dụng hình ellipse tin cậy để mô tả nhóm đối tượng xem có trùng hay lẫn với nhau hay không cũng thường được sử dụng.

plotellipses(habeco_customer_behavior.mca,
             cex=0.2,
             magnify=14,
             keepvar=2:5)

Có thể thấy với các mục đích khác nhau như hình trên, các người thử phân biệt với nhau rất cụ thể cho cho điểm xếp hạng bia rất độc lập.

plotellipses(habeco_customer_behavior.mca,
             cex=0.4,
             magnify=18,
             keepvar=9)

Nhưng mục đích sử dụng bia vì bia ngon và bổ cho thấy không có sự phân biệt hay liên quan giữa sự cho điểm mẫu bia với mục đích này.

Kết luận

R và Rstudio cho thấy khả năng mạnh mẽ trong việc tính toán, phân tích dữ liệu và trực quan hóa dữ liệu. PCA và MCA là những công cụ hiệu giúp chúng ta có thể trích xuất những thông tin cần thiết từ bảng dữ liệu thu được và trực quan hóa trên đồ thị. Qua đó giúp ta có những hướng phát triển sản phẩm hay thấu hiểu người tiêu dùng hiệu quả hơn. Mọi chi tiết thắc mắc hoặc cần làm rõ vui lòng liên hệ:

+ TS.Hoàng Quốc Tuấn - tuan.hqibft@gmail.com
+ TS.Phạm Ngọc Hưng - hung.phamngoc@hust.edu.vn
+ Lê Tuấn Phúc - phuc.lt211194m@sis.hust.edu.vn