1 Giới thiệu

Tài liệu này là một tấm bản đồ tổng quan về những gì ngôn ngữ R có thể làm trong công việc phân tích dữ liệu, được viết cho người lần đầu tiếp cận. Mục tiêu của nó không phải là dạy bạn thành thạo từng kỹ thuật, mà là giúp bạn nhìn thấy toàn cảnh: R được dùng vào những việc gì, mỗi việc cần công cụ nào, và bạn nên học theo trình tự ra sao. Khi đã có bản đồ này trong đầu, bạn sẽ biết mình đang đứng ở đâu và cần đi tiếp về hướng nào.

Cách tiếp cận của tài liệu là đi từ bức tranh lớn đến từng nhánh cụ thể. Phần đầu thiết lập nền tảng tối thiểu để bạn khởi động. Phần giữa tập trung vào việc viết và xuất bản tài liệu, vì đây là kỹ năng giúp bạn biến phân tích thành sản phẩm chia sẻ được. Phần sau lần lượt giới thiệu năm lĩnh vực ứng dụng chính của R, mỗi lĩnh vực kèm một ví dụ đặt trong tình huống thực tế để bạn thấy được giá trị ứng dụng chứ không chỉ là cú pháp. Những phần chuyên sâu của từng lĩnh vực sẽ được trình bày trong các tài liệu riêng về sau; ở đây ta chỉ vẽ bản đồ.

Về cách trình bày code. Phần lớn đoạn code trong tài liệu được trình bày để minh họa và không tự chạy khi kết xuất, nhằm đảm bảo tài liệu xuất bản trơn tru. Một số ví dụ trực quan hóa cốt lõi sử dụng dữ liệu có sẵn trong R sẽ chạy thật để bạn thấy kết quả. Khi áp dụng vào dự án của mình, bạn sẽ chạy chúng trong một phiên làm việc thực tế.

2 Bức tranh lớn: R làm được những gì

Nhiều người mới lầm tưởng R chỉ là một công cụ thống kê. Thực ra R là một nền tảng hoàn chỉnh cho cả vòng đời của dữ liệu, từ lúc thu thập đến lúc trình bày. Có thể hình dung năng lực của R trải trên năm lĩnh vực, và toàn bộ tài liệu này được tổ chức quanh chúng.

Lĩnh vực thứ nhất là nghiên cứu định lượng học thuật, nơi R thực hiện các kiểm định thống kê, phân tích nhân tố và mô hình cấu trúc. Lĩnh vực thứ hai là phân tích kinh doanh và dữ liệu, tập trung vào việc khám phá dữ liệu và trực quan hóa để rút ra hiểu biết. Lĩnh vực thứ ba là dashboard tương tác, biến phân tích tĩnh thành ứng dụng web cho người dùng tự khám phá. Lĩnh vực thứ tư là data engineering, nơi R kết nối cơ sở dữ liệu, xử lý dữ liệu lớn và xây dựng các quy trình tự động. Lĩnh vực thứ năm là trình bày và truyền đạt, gồm việc tạo báo cáo, trang web và trình chiếu trực tiếp từ code.

Một điều quan trọng cần nhận ra ngay là cả năm lĩnh vực này đều chia sẻ chung một nền tảng: cùng một ngôn ngữ, cùng một bộ công cụ xử lý dữ liệu, và cùng một triết lý về tính tái lập. Vì vậy, công sức bạn bỏ ra học phần nền tảng sẽ được dùng lại ở mọi lĩnh vực. Đó là lý do tài liệu này dành ưu tiên cho phần nền trước khi đi vào từng nhánh.

3 R và RStudio

R là ngôn ngữ và môi trường thực hiện mọi phép tính. RStudio là môi trường làm việc tích hợp bao quanh R, cung cấp giao diện thuận tiện để viết code, xem kết quả và quản lý dự án. Bạn cài R trước rồi cài RStudio sau, và trong thực tế hằng ngày bạn luôn mở RStudio chứ không mở R trực tiếp. Một cách ví von quen thuộc, R là động cơ còn RStudio là khoang lái.

Khi mở RStudio, màn hình được chia thành các khung có vai trò riêng. Khung Source là nơi bạn viết và lưu code thành tệp. Khung Console là nơi R thực thi lệnh và in kết quả. Khung Environment liệt kê các đối tượng dữ liệu đang nằm trong bộ nhớ. Khung còn lại gom các thẻ tiện ích như xem biểu đồ, quản lý gói và tra cứu trợ giúp. Nguyên tắc làm việc lành mạnh là viết code ở khung Source rồi cho chạy, thay vì gõ trực tiếp vào Console, bởi mọi thứ gõ thẳng vào Console sẽ mất khi đóng phần mềm.

Về cú pháp, chỉ cần nắm vài ký hiệu là đủ để bắt đầu. Ký hiệu <- dùng để gán giá trị vào một tên. Lời gọi hàm có dạng tên hàm theo sau bởi cặp ngoặc chứa đối số. Ký hiệu $ truy cập một cột trong bảng dữ liệu. Cặp ngoặc vuông trích xuất theo hàng và cột. Mọi nội dung sau dấu # là ghi chú cho người đọc.

x <- c(4, 5, 6)        # gán một dãy số vào tên x
mean(x)                # gọi hàm tính trung bình
mtcars$mpg             # truy cập cột mpg trong bảng dữ liệu mtcars
mtcars[1:3, ]          # lấy ba hàng đầu, giữ mọi cột

4 Gói lệnh và hệ sinh thái tidyverse

Bản thân R chỉ cung cấp các chức năng cơ bản. Mọi năng lực chuyên sâu đến từ các gói, là những phần mở rộng do cộng đồng phát triển. Bạn cài một gói một lần duy nhất bằng install.packages, nhưng phải nạp nó vào mỗi phiên làm việc bằng library. Việc phân biệt hai thao tác này giúp tránh lỗi phổ biến nhất của người mới, đó là gọi một hàm trước khi nạp gói chứa nó.

Trong số hàng nghìn gói của R, có một bộ đặc biệt quan trọng tên là tidyverse. Theo R for Data Science của Wickham và cộng sự, tidyverse là một tập hợp các gói được thiết kế để phối hợp với nhau, dựa trên một triết lý chung về cấu trúc dữ liệu gọn gàng. Nhờ triết lý nhất quán này, khi đã quen một gói trong tidyverse bạn sẽ học các gói còn lại dễ dàng hơn nhiều. Các thành phần thường dùng gồm dplyr để biến đổi dữ liệu, ggplot2 để vẽ biểu đồ, tidyr để sắp xếp dữ liệu, và readr cùng readxl để nhập dữ liệu.

library(tidyverse)   # nạp cả bộ tidyverse trong một lệnh

Một đặc trưng của tidyverse là toán tử ống dẫn, viết là |> hoặc %>%, cho phép nối các bước xử lý thành một chuỗi đọc từ trái sang phải như một câu văn. Thay vì lồng nhiều hàm vào nhau khó đọc, bạn diễn đạt ý tưởng theo trình tự tự nhiên: lấy dữ liệu này, rồi lọc, rồi nhóm, rồi tóm tắt.

5 Quy trình khoa học dữ liệu

Để không bị lạc giữa vô số hàm và kỹ thuật, bạn cần một khung tư duy về trình tự công việc. R for Data Science đề xuất một mô hình đã trở thành chuẩn mực, gồm sáu bước nối tiếp nhau. Trước hết là nhập dữ liệu vào R. Tiếp theo là làm cho dữ liệu gọn gàng, nghĩa là sắp xếp sao cho mỗi biến là một cột và mỗi quan sát là một hàng. Sau đó là biến đổi dữ liệu, gồm lọc, tạo biến mới và tính toán tóm tắt. Kế đến là trực quan hóa để khám phá, rồi mô hình hóa để trả lời câu hỏi nghiên cứu. Cuối cùng là truyền đạt kết quả cho người khác.

Hai bước trực quan hóa và mô hình hóa là phần thú vị nhất, nhưng chúng chỉ thực hiện được sau khi dữ liệu đã sạch và gọn. Trên thực tế, người làm dữ liệu thường dành phần lớn thời gian cho các bước nhập, làm sạch và biến đổi. Đoạn code dưới đây minh họa một chuỗi xử lý điển hình trên dữ liệu mtcars có sẵn trong R, trả lời câu hỏi thực tế: trung bình, các xe có số xi-lanh khác nhau tiêu hao nhiên liệu ra sao?

mtcars |>
  group_by(cyl) |>                                  # nhóm theo số xi-lanh
  summarise(
    so_xe       = n(),
    mpg_trung_binh = round(mean(mpg), 1),           # mpg = số dặm mỗi gallon
    trong_luong_tb = round(mean(wt), 2)
  ) |>
  arrange(desc(mpg_trung_binh))

Kết quả cho thấy một quy luật rõ ràng và có ý nghĩa thực tiễn: xe càng nhiều xi-lanh thì càng nặng và càng tốn nhiên liệu. Đây chính là tinh thần của khoa học dữ liệu, biến một bảng số thô thành một phát biểu mà người ra quyết định có thể dùng được.

6 Hiểu lỗi và tổ chức dự án

Đối với người mới, kỹ năng đọc thông báo lỗi quan trọng không kém việc viết code. Thông báo lỗi trong R là một câu mô tả vấn đề, không phải một lời quở trách. Nguyên tắc là luôn đọc dòng bắt đầu bằng chữ Error, vì nó nói thẳng cái gì đang sai. Chẳng hạn, thông báo cho biết đường dẫn không tồn tại nghĩa là R không tìm thấy tệp ở vị trí bạn chỉ định; thông báo không tìm thấy hàm nghĩa là bạn chưa nạp gói chứa hàm đó. Cũng cần phân biệt lỗi với cảnh báo: lỗi làm dừng chương trình và buộc phải sửa, còn cảnh báo chỉ nhắc nhở trong khi code vẫn chạy.

Về tổ chức công việc, công cụ then chốt là R Project. Khi bạn tạo một R Project, RStudio tự đặt thư mục làm việc bằng thư mục chứa dự án, nhờ đó bạn không phải khai báo đường dẫn thủ công và mọi đường dẫn tương đối đều hoạt động ổn định. Một cấu trúc thư mục hợp lý nên tách riêng dữ liệu gốc, code và kết quả đầu ra, đồng thời không bao giờ chỉnh sửa dữ liệu gốc bằng tay mà luôn xử lý qua code.

Đằng sau những thực hành này là một nguyên tắc lớn gọi là tính tái lập. Một phân tích được xem là đáng tin khi người khác có thể chạy lại đúng quy trình của bạn và thu được cùng kết quả. Điều này đòi hỏi code phải tự chạy được từ đầu đến cuối mà không phụ thuộc vào trạng thái đã lưu sẵn trong bộ nhớ. Vì lý do đó, bạn nên tắt tính năng tự lưu môi trường khi thoát RStudio, để mỗi phiên làm việc đều bắt đầu từ một môi trường sạch.

7 Tài liệu tái lập: R Markdown và Quarto

Khi đã có kết quả phân tích, bạn cần một cách trình bày sao cho phần diễn giải và phần kết quả luôn nhất quán với nhau. Đây là lúc các công cụ tài liệu tái lập phát huy vai trò. Chúng cho phép bạn trộn ba thành phần trong cùng một tệp: văn bản giải thích, code thực thi được, và kết quả cùng biểu đồ do code sinh ra. Khi kết xuất, toàn bộ được dệt thành một báo cáo hoàn chỉnh.

Có hai công cụ cho việc này, và việc hiểu mối quan hệ giữa chúng rất quan trọng. R Markdown là công cụ ra đời trước, đã là nền tảng của nghiên cứu tái lập trong R hơn một thập kỷ. Quarto là công cụ mới hơn, ra mắt năm 2022, và được Posit định vị là bản kế nhiệm chính thức của R Markdown. Theo tài liệu so sánh của cộng đồng, Quarto được khuyến nghị cho các dự án mới vì được phát triển tích cực, hỗ trợ nhiều ngôn ngữ và nhiều định dạng đầu ra hơn, đồng thời tích hợp sẵn nhiều tính năng mà R Markdown phải cài thêm gói. Tuy vậy, R Markdown không hề biến mất; hàng triệu tài liệu vẫn đang dùng nó và sẽ tiếp tục hoạt động.

Lời khuyên thực tế là như sau. Nếu bạn đang học mới hoàn toàn và hướng đến tương lai, hãy ưu tiên Quarto. Nếu bạn đã có một luồng làm việc với R Markdown chạy ổn định, chẳng hạn việc kết xuất và xuất bản đã quen tay, thì không cần vội chuyển đổi. Điều đáng mừng là hai công cụ có cấu trúc rất giống nhau, nên kỹ năng học được ở công cụ này gần như chuyển thẳng sang công cụ kia.

Về cấu trúc, cả hai loại tài liệu đều gồm ba phần. Phần đầu là khối cấu hình YAML nằm giữa hai dòng ba dấu gạch ngang, khai báo tiêu đề và định dạng đầu ra. Tiếp theo là các đoạn văn bản viết bằng cú pháp Markdown. Cuối cùng là các khối code, gọi là chunk. Điểm khác biệt dễ thấy nhất nằm ở cú pháp khai báo. R Markdown dùng trường output với giá trị như html_document, trong khi Quarto dùng trường format với giá trị như html. Quarto cũng thay cách đặt tùy chọn cho từng chunk bằng cú pháp gắn nhãn rõ ràng hơn.

# YAML của một tài liệu R Markdown:
# ---
# title: "Báo cáo của tôi"
# output: html_document
# ---

# YAML tương đương trong Quarto:
# ---
# title: "Báo cáo của tôi"
# format: html
# ---

8 Các định dạng đầu ra

Một sức mạnh lớn của tài liệu tái lập là cùng một nội dung nguồn có thể được kết xuất ra nhiều định dạng khác nhau, tùy mục đích sử dụng. Định dạng HTML cho ra một trang web có mục lục động, hiển thị đẹp, hỗ trợ yếu tố tương tác và rất dễ chia sẻ qua đường liên kết; đây là lựa chọn mặc định nên dùng trong hầu hết trường hợp. Định dạng Word phù hợp khi người nhận cần chỉnh sửa tiếp hoặc khi quy định nộp bài yêu cầu tệp Word. Định dạng PDF thích hợp cho bản in trang trọng, nhưng đòi hỏi cài đặt thêm một hệ thống soạn thảo nên thường phức tạp hơn với người mới.

Để đổi định dạng, với R Markdown bạn sửa trường output trong YAML, còn với Quarto bạn sửa trường format. Một thực hành hữu ích là khai báo nhiều định dạng cùng lúc, khi đó công cụ sẽ tạo ra đường dẫn tải các định dạng khác ngay trong bản HTML.

9 Xuất bản tác phẩm lên mạng

Sau khi kết xuất, bước cuối cùng là đưa tác phẩm lên mạng để chia sẻ. Có vài kênh phổ biến, mỗi kênh phục vụ một nhu cầu khác nhau.

Kênh đơn giản nhất cho người mới là RPubs, một dịch vụ miễn phí của Posit. Quy trình đúng diễn ra như sau: trước hết bạn kết xuất tài liệu thành công ra HTML; trên khung xem trước, ở góc trên bên phải xuất hiện nút Publish; khi nhấn vào, bạn chọn RPubs; trình duyệt sẽ mở để bạn đăng nhập hoặc tạo tài khoản miễn phí, rồi điền tiêu đề và xác nhận để nhận đường liên kết chia sẻ. Có hai điều cần lưu ý để tránh lỗi thường gặp. Thứ nhất, tệp nguồn phải nằm trong một thư mục con cụ thể chứ không đặt ngay tại gốc ổ đĩa, vì khi xuất bản phần mềm cần tạo thư mục phụ cạnh tệp. Thứ hai, cần phân biệt RPubs với các dịch vụ doanh nghiệp như Posit Connect; cửa sổ kết nối tài khoản với các dịch vụ đó không phải là nơi dùng để publish lên RPubs.

Ngoài RPubs còn có những kênh khác đáng biết. Quarto đi kèm dịch vụ Quarto Pub với quy trình tương tự, dành riêng cho tài liệu Quarto. Với người muốn lưu trữ miễn phí và kiểm soát nhiều hơn, GitHub Pages cho phép đăng tải tài liệu như một trang web tĩnh. Đối với các ứng dụng tương tác cần máy chủ, sẽ được nói đến ở phần dashboard, bạn cần đến những nền tảng chuyên dụng hơn.

Khuyến nghị cho tài liệu này. Nếu bạn đang viết bằng R Markdown và muốn xuất bản nhanh, RPubs là con đường ít trở ngại nhất. Nếu bạn chuyển sang Quarto cho các dự án sau, Quarto Pub là lựa chọn tự nhiên đi kèm.

10 Lĩnh vực một: Nghiên cứu định lượng học thuật

Đây là lĩnh vực truyền thống và mạnh mẽ nhất của R, nơi nó được dùng để kiểm định giả thuyết và xây dựng mô hình thống kê trong nghiên cứu khoa học xã hội, y học, kinh tế và nhiều ngành khác. Quy trình tiêu biểu của một nghiên cứu khảo sát gồm việc kiểm định độ tin cậy thang đo bằng hệ số Cronbach’s Alpha, phân tích nhân tố khám phá và khẳng định để kiểm tra cấu trúc đo lường, rồi kiểm định các quan hệ giả thuyết bằng hồi quy hoặc mô hình cấu trúc tuyến tính. Các gói chủ lực gồm psych cho thống kê mô tả và phân tích nhân tố, lavaan cho phân tích nhân tố khẳng định và mô hình cấu trúc, cùng car cho chẩn đoán hồi quy.

Để thấy tinh thần của lĩnh vực này, hãy xét một câu hỏi nghiên cứu cụ thể trên dữ liệu mtcars: sau khi đã tính đến công suất động cơ, liệu trọng lượng xe có còn ảnh hưởng đến mức tiêu hao nhiên liệu không? Đây đúng là dạng câu hỏi mà hồi quy bội được sinh ra để trả lời.

mo_hinh <- lm(mpg ~ wt + hp, data = mtcars)   # mpg phụ thuộc trọng lượng và mã lực
summary(mo_hinh)                              # hệ số, p-value, R-squared

Call:
lm(formula = mpg ~ wt + hp, data = mtcars)

Residuals:
   Min     1Q Median     3Q    Max 
-3.941 -1.600 -0.182  1.050  5.854 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 37.22727    1.59879  23.285  < 2e-16 ***
wt          -3.87783    0.63273  -6.129 1.12e-06 ***
hp          -0.03177    0.00903  -3.519  0.00145 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.593 on 29 degrees of freedom
Multiple R-squared:  0.8268,    Adjusted R-squared:  0.8148 
F-statistic: 69.21 on 2 and 29 DF,  p-value: 9.109e-12

Bảng kết quả cho biết mỗi hệ số, sai số chuẩn, giá trị p và mức độ giải thích của mô hình. Cách đọc có ý nghĩa nghiên cứu là: nếu hệ số của trọng lượng vẫn âm và có ý nghĩa thống kê ngay cả khi đã có công suất trong mô hình, ta kết luận trọng lượng có tác động độc lập đến mức tiêu hao nhiên liệu. Phần phân tích định lượng chuyên sâu, bao gồm toàn bộ chuỗi Cronbach, EFA, CFA và mô hình cấu trúc với biến trung gian, được trình bày trong bộ tài liệu nghiên cứu riêng của bạn.

11 Lĩnh vực hai: Phân tích kinh doanh và dữ liệu

Trong bối cảnh kinh doanh, R được dùng để khám phá dữ liệu và biến nó thành hiểu biết hỗ trợ quyết định. Công việc tiêu biểu là phân tích khám phá, trong đó nhà phân tích đặt câu hỏi, cắt lát dữ liệu theo nhiều chiều, và trực quan hóa để phát hiện quy luật. Công cụ trung tâm là ggplot2, được xây trên một triết lý gọi là grammar of graphics, theo đó mọi biểu đồ được tạo bằng cách xếp chồng các lớp: dữ liệu, ánh xạ thẩm mỹ, và hình học biểu diễn.

Hãy xét một tình huống thực tế. Giả sử bạn phụ trách một đội xe và muốn hiểu yếu tố nào liên quan đến hiệu quả nhiên liệu, đồng thời trình bày phát hiện một cách trực quan cho ban lãnh đạo. Biểu đồ dưới đây thể hiện quan hệ giữa trọng lượng và mức tiêu hao, phân biệt theo số xi-lanh.

ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point(size = 2.5, alpha = 0.8) +              # mỗi điểm là một mẫu xe
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.8) +  # đường xu hướng
  labs(
    title = "Xe càng nặng càng tốn nhiên liệu, theo từng nhóm xi-lanh",
    x = "Trọng lượng (1000 lbs)", y = "Mức tiêu hao (dặm/gallon)",
    color = "Số xi-lanh"
  ) +
  theme_minimal()

Biểu đồ này có giá trị thực tiễn rõ rệt: nó không chỉ khẳng định xu hướng giảm của hiệu quả nhiên liệu theo trọng lượng, mà còn cho thấy quan hệ đó đúng trong từng nhóm xi-lanh. Bên cạnh ggplot2, hệ sinh thái phân tích kinh doanh còn có dplyr để tổng hợp số liệu, gói gt hoặc gtsummary để tạo bảng trình bày đẹp, và plotly để biến biểu đồ tĩnh thành biểu đồ tương tác cho phép rê chuột xem giá trị.

12 Lĩnh vực ba: Dashboard tương tác

Đôi khi một báo cáo tĩnh là chưa đủ; người dùng muốn tự chọn bộ lọc, tự khám phá dữ liệu theo nhu cầu của họ. Khi đó R cho phép xây dựng dashboard tương tác mà không cần biết phát triển web. Có hai cấp độ. Gói flexdashboard cho phép sắp xếp nhiều biểu đồ và chỉ số thành một bố cục bảng điều khiển chỉ bằng cú pháp R Markdown. Khi cần tương tác thực sự, framework shiny bổ sung khả năng phản ứng, cho phép người dùng thay đổi tham số và thấy kết quả cập nhật ngay lập tức.

Theo R Markdown: The Definitive Guide, việc thêm Shiny vào một dashboard biến một báo cáo tĩnh thành một tài liệu tương tác; điểm cần lưu ý là tài liệu tương tác phải được triển khai lên một máy chủ Shiny để chia sẻ rộng rãi, trong khi báo cáo tĩnh là một trang web độc lập có thể gửi kèm email. Hãy hình dung một tình huống kinh doanh: đội bán hàng muốn một bảng điều khiển cho phép chọn vùng và xem ngay doanh thu của vùng đó. Khung xương của một dashboard như vậy trông như sau.

# Tệp .Rmd với phần YAML khai báo dashboard tương tác:
# ---
# title: "Bảng điều khiển doanh thu"
# output: flexdashboard::flex_dashboard
# runtime: shiny
# ---

# Cột bên trái chứa bộ lọc cho người dùng chọn:
selectInput("vung", "Chọn vùng:",
            choices = c("Miền Bắc", "Miền Trung", "Miền Nam"))

# Cột bên phải hiển thị biểu đồ phản ứng theo lựa chọn:
renderPlot({
  du_lieu |>
    filter(vung == input$vung) |>          # lọc theo vùng người dùng chọn
    ggplot(aes(x = thang, y = doanh_thu)) +
    geom_col()
})

Điểm cốt lõi cần nắm là cơ chế phản ứng: một ô nhập liệu như selectInput tạo ra giá trị mà các hàm render theo dõi; mỗi khi người dùng thay đổi lựa chọn, phần hiển thị tự động vẽ lại. Đây là nền tảng của mọi ứng dụng Shiny, từ bảng KPI nội bộ đến công cụ khám phá dữ liệu công khai.

13 Lĩnh vực bốn: Data engineering

Một hiểu lầm phổ biến là R chỉ làm việc được với dữ liệu nhỏ nằm gọn trong bộ nhớ. Thực tế R có một hệ sinh thái data engineering trưởng thành, cho phép kết nối cơ sở dữ liệu, xử lý dữ liệu vượt quá bộ nhớ, và xây dựng quy trình tự động. Khi dữ liệu nằm trong một cơ sở dữ liệu, gói DBI cung cấp kết nối chuẩn, còn dbplyr cho phép bạn viết câu lệnh bằng cú pháp dplyr quen thuộc rồi tự động dịch sang SQL. Theo tài liệu R for Data Science, điều này có nghĩa là bạn thao tác trên một bảng trong cơ sở dữ liệu y như thao tác trên một bảng trong R, mà phần lớn việc tính toán diễn ra ngay trong cơ sở dữ liệu.

Hãy xét tình huống thực tế: bảng giao dịch của công ty có hàng chục triệu dòng, quá lớn để tải hết vào R. Bạn chỉ muốn lấy về phần tổng hợp.

library(DBI); library(dbplyr)

con <- dbConnect(RSQLite::SQLite(), "duong_dan/giao_dich.sqlite")  # kết nối CSDL

# Viết bằng cú pháp dplyr, nhưng phép tính chạy TRONG cơ sở dữ liệu:
tong_hop <- tbl(con, "giao_dich") |>
  filter(nam == 2025) |>
  group_by(vung) |>
  summarise(tong_doanh_thu = sum(gia_tri, na.rm = TRUE))

tong_hop |> show_query()   # xem câu SQL mà dplyr tự sinh ra
ket_qua <- tong_hop |> collect()   # chỉ đến đây mới kéo KẾT QUẢ về R

Điểm tinh tế và quan trọng nằm ở hàm collect: mọi bước phía trên chỉ xây dựng câu truy vấn chứ chưa kéo dữ liệu về; chỉ khi gọi collect, phần kết quả đã được tổng hợp gọn nhẹ mới được đưa vào R. Nhờ đó bạn xử lý được dữ liệu lớn hơn nhiều so với bộ nhớ máy. Khi dữ liệu nằm trong các tệp lớn thay vì cơ sở dữ liệu, các gói hiện đại như arrowduckdb đóng vai trò tương tự với hiệu năng cao. Cuối cùng, để tự động hóa và đảm bảo tính tái lập của cả một quy trình nhiều bước, gói targets cho phép định nghĩa các bước phụ thuộc lẫn nhau và chỉ chạy lại những bước có thay đổi, một ý tưởng rất giá trị khi quy trình phân tích trở nên phức tạp.

14 Lĩnh vực năm: Khoa học dữ liệu và máy học

Khi mục tiêu không còn là giải thích mà là dự báo, R bước vào địa hạt máy học. Hệ sinh thái hiện đại cho việc này là tidymodels, một bộ gói áp dụng cùng triết lý nhất quán của tidyverse vào quy trình mô hình hóa. Quy trình điển hình gồm việc chia dữ liệu thành tập huấn luyện và tập kiểm tra, định nghĩa các bước tiền xử lý, huấn luyện mô hình, rồi đánh giá hiệu năng trên dữ liệu mà mô hình chưa từng thấy.

Hãy xét một bài toán phân loại thực tế: dựa trên các đặc điểm hình thể, liệu ta có thể dự đoán loài của một con chim cánh cụt hay không? Đây là dạng câu hỏi mà mô hình phân loại giải quyết.

library(tidymodels)

# Chia dữ liệu: 75% để huấn luyện, 25% để kiểm tra
phan_chia <- initial_split(penguins, prop = 0.75, strata = species)
train <- training(phan_chia)
test  <- testing(phan_chia)

# Định nghĩa một mô hình phân loại (random forest)
mo_hinh <- rand_forest() |>
  set_engine("ranger") |>
  set_mode("classification")

# Huấn luyện rồi đánh giá trên tập kiểm tra
fit_mh <- mo_hinh |> fit(species ~ bill_length_mm + flipper_length_mm, data = train)
predict(fit_mh, test) |> bind_cols(test) |> accuracy(truth = species, .pred_class)

Ý tưởng cốt lõi cần nắm là việc tách tập huấn luyện và kiểm tra: ta dạy mô hình trên một phần dữ liệu, rồi kiểm tra khả năng tổng quát hóa của nó trên phần còn lại mà nó chưa từng thấy. Đây là điểm phân biệt căn bản giữa mô hình hóa để dự báo và mô hình hóa để giải thích trong nghiên cứu hàn lâm.

15 Lĩnh vực sáu: Trình chiếu bằng R

Cuối cùng, R cho phép tạo cả bài trình chiếu trực tiếp từ code, nghĩa là biểu đồ và bảng trên slide luôn khớp với phân tích mới nhất mà không phải sao chép thủ công. Theo tài liệu chính thức của Quarto, định dạng trình chiếu mạnh nhất là revealjs, cho ra slide dạng web có thể trình bày trực tiếp hoặc in ra PDF, và nó được tích hợp sẵn trong Quarto mà không cần cài thêm gói. Trong slide, mỗi tiêu đề cấp hai tạo ra một slide mới, nên việc soạn slide gần như giống hệt việc viết một tài liệu thông thường.

# Một bài trình chiếu Quarto tối giản (.qmd):
# ---
# title: "Kết quả phân tích"
# format: revealjs
# ---
#
# ## Slide đầu tiên
# - Mỗi tiêu đề cấp hai là một slide mới
# - Gạch đầu dòng cho nội dung
#
# ## Slide có biểu đồ
# ```{r}
# ggplot(mtcars, aes(wt, mpg)) + geom_point()
# ```

Với người vẫn dùng R Markdown, slide phổ biến nhất được tạo bằng gói xaringan. Tuy nhiên, vì Quarto tích hợp sẵn revealjs và đang là hướng phát triển chính, người mới bắt đầu nên ưu tiên học làm slide bằng Quarto. Một mẹo thực dụng từ kinh nghiệm cộng đồng là nên hiểu kích thước mặc định của một slide để căn chỉnh biểu đồ và khối code cho vừa khung hình.

16 Lộ trình học theo vai trò

Vì hệ sinh thái R rất rộng, bạn không nên cố học mọi thứ cùng lúc. Tùy mục tiêu nghề nghiệp, trình tự ưu tiên sẽ khác nhau, dù tất cả đều chia sẻ chung phần nền tảng ở các mục đầu tài liệu này.

Nếu hướng đến nghiên cứu học thuật, sau phần nền bạn nên đi sâu vào thống kê và mô hình cấu trúc với psychlavaan, đồng thời thành thạo việc viết báo cáo tái lập bằng R Markdown hoặc Quarto. Nếu hướng đến vai trò nhà phân tích kinh doanh, hãy ưu tiên dplyrggplot2 cho khám phá và trực quan hóa, rồi học flexdashboardshiny để xây bảng điều khiển. Nếu hướng đến data engineering, trọng tâm là kết nối cơ sở dữ liệu với DBIdbplyr, xử lý dữ liệu lớn với arrowduckdb, và tự động hóa quy trình với targets. Nếu hướng đến khoa học dữ liệu, sau phần nền hãy tập trung vào tidymodels cùng các kỹ thuật mô hình hóa và đánh giá.

Dù theo hướng nào, kỹ năng giao tiếp kết quả, tức là viết tài liệu và trình chiếu, đều có giá trị xuyên suốt. Một phân tích xuất sắc nhưng không truyền đạt được sẽ không tạo ra tác động.

17 Tài nguyên uy tín để học tiếp

Để đào sâu từng lĩnh vực, dưới đây là những nguồn nền tảng và đáng tin cậy nhất, đều miễn phí trên mạng.

Về kiến thức tổng quát và quy trình khoa học dữ liệu, cuốn R for Data Science phiên bản thứ hai của Hadley Wickham, Mine Çetinkaya-Rundel và Garrett Grolemund là điểm khởi đầu tốt nhất, có tại địa chỉ r4ds.hadley.nz. Về viết tài liệu, trang chính thức của Quarto tại quarto.org và cuốn R Markdown: The Definitive Guide của Yihui Xie là hai nguồn tham chiếu đầy đủ. Về mô hình hóa và máy học, cuốn Tidy Modeling with R của Max Kuhn và Julia Silge là tài liệu chính thức cho tidymodels. Về trực quan hóa, cuốn ggplot2: Elegant Graphics for Data Analysis trình bày sâu triết lý grammar of graphics. Ngoài ra, trang opensource.posit.co tập hợp tài liệu chính thức của các gói trong hệ sinh thái.

18 Phụ lục: Chọn công cụ theo nhu cầu

Bảng dưới đây tóm tắt mối liên hệ giữa nhu cầu công việc và công cụ tương ứng, dùng làm tra cứu nhanh.

Bạn muốn làm gì Công cụ / gói chính
Biến đổi, làm sạch dữ liệu dplyr, tidyr
Nhập dữ liệu từ Excel, CSV readxl, readr
Vẽ biểu đồ tĩnh ggplot2
Vẽ biểu đồ tương tác plotly
Bảng trình bày đẹp gt, gtsummary, DT
Viết báo cáo tái lập R Markdown, Quarto
Phân tích thống kê, nhân tố psych
Mô hình cấu trúc, CFA, SEM lavaan
Chẩn đoán hồi quy car
Dashboard tĩnh flexdashboard
Ứng dụng tương tác shiny
Kết nối cơ sở dữ liệu DBI, dbplyr
Dữ liệu lớn hơn bộ nhớ arrow, duckdb
Quy trình tự động, tái lập targets
Máy học, dự báo tidymodels
Trình chiếu Quarto revealjs, xaringan

19 Kết luận

Tài liệu này đã phác họa toàn cảnh những gì R có thể làm, từ nền tảng ngôn ngữ và quy trình khoa học dữ liệu, qua việc viết và xuất bản tài liệu tái lập, đến năm lĩnh vực ứng dụng lớn là nghiên cứu học thuật, phân tích kinh doanh, dashboard tương tác, data engineering, khoa học dữ liệu và trình chiếu. Điều quan trọng nhất cần mang theo không phải là chi tiết của từng gói, mà là tấm bản đồ tổng thể: hiểu rằng mọi lĩnh vực đều dựng trên một nền chung, và việc đầu tư vào nền tảng cùng kỹ năng giao tiếp kết quả sẽ sinh lợi ở mọi hướng đi. Từ bản đồ này, bạn có thể chọn một nhánh phù hợp với mục tiêu của mình và tìm đến các tài liệu chuyên sâu để đi xa hơn.