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.

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)

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ố | Estimate | Std. Error | t value | Giá trị p |
|---|---|---|---|---|
| (Intercept) | 0,608 | 0,214 | 2,848 | 0,005 |
| CLD | 0,238 | 0,043 | 5,581 | < 0,001 |
| GCA | 0,183 | 0,043 | 4,238 | < 0,001 |
| NIT | 0,393 | 0,046 | 8,523 | < 0,001 |
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 độ")

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

- 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

- Nhập dữ liệu và kiểm tra cấu trúc với
str(). - 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).
- Mô tả và kiểm định độ tin cậy.
- Ước lượng mô hình:
lm(),glm(),lavaan::sem(). - Chẩn đoán: VIF, phương sai sai số, phần dư.
- 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.
