Phân tích dữ liệu bằng R cho người mới: lm, psych, ggplot2 và lavaan

Phân tích dữ liệu khảo sát bằng R từ A đến Z: nhập file .sav, thống kê mô tả, Cronbach's Alpha với gói psych, hồi quy tuyến tính bằng lm(), biểu đồ ggplot2 và CFA với lavaan; kết quả chạy thật bằng R 4.4.1.

Ảnh bìa động bài phân tích dữ liệu bằng R cho người mới

R là ngôn ngữ thống kê miễn phí, mã nguồn mở và ngày càng phổ biến trong nghiên cứu khoa học. Ưu điểm lớn nhất của phân tích dữ liệu bằng R là mọi bước đều được ghi lại trong một script: bạn, người hướng dẫn và hội đồng đều chạy lại được và nhận đúng con số. Bài viết này dành cho người mới, đi qua quy trình hoàn chỉnh với một bộ dữ liệu khảo sát: nhập dữ liệu, mô tả, hồi quy tuyến tính trong R bằng lm(), kiểm định độ tin cậy bằng gói psych, vẽ biểu đồ bằng ggplot2 và giới thiệu lavaan cho CFA, SEM. Toàn bộ kết quả trong bài được chạy thật bằng R 4.4.1 trên công cụ R trực tuyến của ResearchSTAT.

Ảnh động: script R được gõ dần và Console hiện kết quả summary của mô hình hồi quy cùng Cronbach's Alpha
Hình 1. Script R và Console: R² của mô hình, giá trị p của hệ số và raw_alpha của thang đo được đánh dấu (R 4.4.1, dữ liệu mô phỏng n = 400).

Vì sao nên học R khi làm luận văn?

  • Miễn phí và hợp pháp: không cần bản quyền như các phần mềm thương mại, cài được trên mọi máy.
  • Tái lập: script R là "nhật ký" của toàn bộ phân tích; sửa một bước rồi chạy lại cả quy trình chỉ mất vài giây.
  • Đầy đủ phương pháp: từ thống kê mô tả đến SEM, mô hình đa cấp, phân tích meta, học máy đều có gói chuyên dụng, phần lớn do chính các tác giả phương pháp viết.
  • Biểu đồ chất lượng xuất bản: ggplot2 cho phép tinh chỉnh từng chi tiết theo yêu cầu của tạp chí.

Nhược điểm là phải gõ lệnh và làm quen với cú pháp. Cách học nhanh nhất là bắt đầu từ một script mẫu có sẵn, chạy từng dòng và đọc kết quả, như các bước dưới đây.

Bước 1: Nhập dữ liệu khảo sát

Dữ liệu khảo sát thường ở dạng Excel hoặc SPSS (.sav). Gói haven đọc được file .sav và giữ nguyên nhãn biến, nhãn giá trị; gói readxl đọc file Excel.

library(haven)
data <- read_sav("khao_sat.sav")
dim(data)          # số dòng, số cột
str(data[, 1:10])  # kiểu dữ liệu của 10 cột đầu

Trên ResearchSTAT, bộ dữ liệu bạn chọn ở thanh trên được nạp sẵn vào biến data (cũng là df), nên bạn bỏ qua bước này và viết lệnh phân tích ngay. Lệnh dim(data) trong ví dụ trả về [1] 400 17: 400 người trả lời và 17 cột.

Bước 2: Tạo biến đại diện và thống kê mô tả

Biến đại diện của một thang đo là trung bình các câu hỏi thuộc thang đo đó. Hàm rowMeans() tính trung bình theo dòng; thêm na.rm = TRUE nếu muốn bỏ qua giá trị thiếu.

data$CLD <- rowMeans(data[, paste0("CLD", 1:4)])
data$SHL <- rowMeans(data[, paste0("SHL", 1:4)])
summary(data[, c("CLD", "SHL")])
psych::describe(data[, c("CLD", "SHL")])

summary() cho giá trị nhỏ nhất, tứ phân vị, trung vị, trung bình và lớn nhất; psych::describe() cho thêm độ lệch chuẩn, độ lệch (skew) và độ nhọn (kurtosis), những chỉ số thường được báo cáo khi kiểm tra phân phối chuẩn.

Bước 3: Kiểm định độ tin cậy bằng gói psych

Hàm psych::alpha() tính Cronbach's Alpha cùng tương quan biến - tổng và Alpha nếu loại biến (Revelle, 2024). Trong ví dụ, thang đo sự hài lòng có raw_alpha = 0,828, vượt ngưỡng 0,7 thường dùng. Phần item.stats của kết quả cho cột r.drop, tương đương "Corrected Item-Total Correlation" trong SPSS; các câu có r.drop dưới 0,3 cần xem xét.

a <- psych::alpha(data[, paste0("SHL", 1:4)])
a$total      # raw_alpha, std.alpha, average_r
a$item.stats # r.drop của từng câu

Bước 4: Hồi quy tuyến tính với lm()

Cú pháp công thức của R rất tự nhiên: biến_phụ_thuộc ~ biến_độc_lập_1 + biến_độc_lập_2.

m <- lm(SHL ~ CLD + GCA + NIT, data = data)
summary(m)
confint(m)
Đồ thị động điểm dữ liệu, đường hồi quy và khoảng tin cậy 95% của SHL theo CLD
Hình 2. Đường hồi quy đơn SHL theo CLD và khoảng tin cậy 95% (dữ liệu mô phỏng).

Kết quả summary(m) gồm bốn phần: lời gọi hàm (Call), phân phối phần dư (Residuals), bảng hệ số (Coefficients) và các chỉ số của mô hình.

Hệ sốEstimateStd. Errort valueGiá trị p
(Intercept)0,6080,2142,8480,005
CLD0,2380,0435,581< 0,001
GCA0,1830,0434,238< 0,001
NIT0,3930,0468,523< 0,001
Bảng 1. Kết quả lm() trên dữ liệu mô phỏng (DEMO), chạy bằng R 4.4.1.

Dòng Multiple R-squared: 0,3139, Adjusted R-squared: 0,3087 cho biết mô hình giải thích 31,4% biến thiên của sự hài lòng; F-statistic: 60,38 on 3 and 396 DF, p-value: < 2,2e-16 là kiểm định F của toàn mô hình. Các ký hiệu * sau giá trị p tương ứng p < 0,001. Điều thú vị: các con số này trùng khớp đến từng chữ số với lệnh regress theo cú pháp Stata trên cùng dữ liệu, xem bài hồi quy tuyến tính trong Stata.

Bước 5: Chẩn đoán mô hình

Hai kiểm tra quan trọng sau hồi quy là đa cộng tuyến và phương sai sai số thay đổi:

car::vif(m)        # hệ số phóng đại phương sai
lmtest::bptest(m)  # kiểm định Breusch-Pagan
plot(m, which = 1) # phần dư theo giá trị dự báo

Lưu ý: lmtest::bptest() mặc định dùng phiên bản "studentized" của Koenker, nên giá trị có thể khác estat hettest của Stata (mặc định dùng giá trị dự báo và giả định sai số chuẩn). Hãy ghi rõ phiên bản kiểm định trong luận văn.

Bước 6: Biểu đồ với ggplot2

ggplot2 xây biểu đồ theo từng lớp: dữ liệu, trục, kiểu hình học, nhãn (Wickham, 2016).

library(ggplot2)
ggplot(data, aes(x = SHL)) +
  geom_histogram(aes(y = after_stat(density)), binwidth = 0.25, fill = "#5B4FD9", colour = "white") +
  geom_density(colour = "#FF6600", linewidth = 1) +
  labs(x = "Sự hài lòng (trung bình 4 câu)", y = "Mật độ")
Biểu đồ động histogram điểm hài lòng kiểu ggplot2 với đường mật độ
Hình 3. Histogram và đường mật độ của biến SHL theo phong cách ggplot2 (dữ liệu mô phỏng).

Trên ResearchSTAT, mọi biểu đồ vẽ trong script (cả plot(), hist() và ggplot2) được lưu thành ảnh PNG, hiển thị dưới Console với nút sao chép và tải về.

Các gói R nên biết cho nghiên cứu định lượng

Sơ đồ động R ở trung tâm nối tới các nhóm gói haven, psych, car, lavaan, ggplot2, dplyr
Hình 4. Các gói R thường dùng theo từng nhiệm vụ trong luận văn.
  • haven, readxl: đọc dữ liệu SPSS, Stata, Excel.
  • dplyr, tidyr: lọc, đổi tên, tạo biến, chuyển dữ liệu dọc - ngang.
  • psych: thống kê mô tả, Cronbach's Alpha, EFA với fa().
  • car, lmtest, sandwich: VIF, kiểm định giả định, sai số chuẩn bền vững.
  • lavaan, semTools: CFA và SEM dựa trên hiệp phương sai (Rosseel, 2012), độ tin cậy tổng hợp, giá trị phân biệt.
  • ggplot2: biểu đồ chất lượng xuất bản.

Ví dụ một mô hình CFA bằng lavaan chỉ cần vài dòng:

library(lavaan)
mo_hinh <- 'CLD =~ CLD1 + CLD2 + CLD3 + CLD4
            SHL =~ SHL1 + SHL2 + SHL3 + SHL4'
fit <- cfa(mo_hinh, data = data)
summary(fit, fit.measures = TRUE, standardized = TRUE)

Đọc các chỉ số CFI, TLI, RMSEA trong kết quả theo hướng dẫn ở bài chỉ số phù hợp mô hình CFA, SEM.

Quy trình đề xuất cho người mới

Sơ đồ động sáu bước phân tích dữ liệu khảo sát bằng R
Hình 5. Sáu bước phân tích một bộ dữ liệu khảo sát bằng R.
  1. Nhập dữ liệu và kiểm tra cấu trúc với str().
  2. Làm sạch: giá trị ngoài khoảng, giá trị thiếu, đảo mã câu nghịch (xem bài làm sạch dữ liệu khảo sát).
  3. Mô tả và kiểm định độ tin cậy.
  4. Ước lượng mô hình: lm(), glm(), lavaan::sem().
  5. Chẩn đoán: VIF, phương sai sai số, phần dư.
  6. Báo cáo: bảng và hình, lưu script cùng dữ liệu để tái lập.

Chạy R ngay trên trình duyệt

Nếu chưa muốn cài R và RStudio, bạn có thể dùng công cụ R (RStudio) của ResearchSTAT: chọn dự án và bộ dữ liệu, viết script ở khung Source và bấm Chạy (Ctrl + Enter). Mã R chạy trong môi trường cô lập trên máy chủ với R 4.4.1 và các gói haven, psych, lavaan, semTools, car, lmtest, sandwich, ggplot2, dplyr, broom. Giao diện chia bốn khung Source, Environment, Console, Plots như RStudio; tải được file .txt, Word và ảnh biểu đồ. R là phần mềm mã nguồn mở của R Core Team; ResearchSTAT chỉ cung cấp môi trường chạy, không phải sản phẩm của Posit (đơn vị phát triển RStudio).

Có cần cài RStudio để học R không?

Không bắt buộc. RStudio là môi trường soạn thảo giúp làm việc thuận tiện hơn; bản thân R mới là phần thực hiện tính toán. Bạn có thể bắt đầu với công cụ R (RStudio) của ResearchSTAT, chạy R thật ngay trên trình duyệt, rồi cài R và RStudio trên máy khi đã quen.

Kết quả hồi quy của R và SPSS có giống nhau không?

Với cùng dữ liệu và cùng mô hình OLS, hệ số, sai số chuẩn, t và p giống nhau; chỉ khác cách trình bày. Khác biệt thường do cách xử lý giá trị thiếu.

Nên dùng lavaan hay AMOS cho CFA?

Cả hai đều ước lượng CB-SEM bằng hợp lý cực đại. lavaan miễn phí và tái lập được bằng script; AMOS có giao diện vẽ sơ đồ. Kết quả ước lượng ML tương đương khi dùng cùng quy ước.

Trích dẫn R trong luận văn như thế nào?

Dùng lệnh citation() trong R để lấy trích dẫn chuẩn của R Core Team, và citation("tên_gói") cho từng gói như lavaan, psych.

Ban biên tập VietSCI Editing Services

Nhóm biên tập và tư vấn phương pháp nghiên cứu định lượng. Nội dung chỉ nhằm mục đích tham khảo học thuật; hãy đối chiếu với yêu cầu của cơ sở đào tạo hoặc tạp chí.