Tìm hiểu cách đo lường biến thiên trong dữ liệu bằng hàm sd() của R. Khám phá các ví dụ thực tiễn và kỹ thuật thiết yếu để xử lý giá trị khuyết và dữ liệu theo nhóm.
Độ lệch chuẩn là một trong những cách phổ biến nhất để tóm tắt mức độ phân tán của dữ liệu. Trong R, hàm sd() cung cấp cho bạn cách nhanh chóng để tính toán thước đo biến thiên này, dù bạn đang làm việc với vector, data frame hay dữ liệu theo nhóm.
Trong bài viết này, tôi sẽ hướng dẫn những điều cơ bản khi dùng sd() trong R, cách xử lý giá trị khuyết, và cách tính độ lệch chuẩn theo nhóm bằng các hàm như tapply() và các gói như dplyr.
sd() làm gì trong R?
Trong R, hàm sd() từ base R tính độ lệch chuẩn của một vector số hoặc một cột trong data frame. Nó đo lường mức độ các giá trị trong dữ liệu lệch so với trung bình, cho bạn cảm nhận về độ biến thiên hay phân tán.
Nếu bạn quen với khái niệm phương sai, thì độ lệch chuẩn đơn giản là căn bậc hai của nó và, do cách tính (lấy căn bậc hai của trung bình bình phương độ lệch), độ lệch chuẩn vẫn giữ cùng đơn vị với dữ liệu gốc. Điều này giúp việc diễn giải trở nên dễ dàng hơn trong thực tế.
Ví dụ đơn giản về sd()
Giả sử bạn có một tập số và muốn biết chúng khác biệt bao nhiêu so với giá trị trung bình.
Bạn có thể làm như sau trong R:
exam_scores <- c(75,80,85,90,95)
sd(exam_scores)Được hỗ trợ bởi
Kết quả cho bạn độ lệch chuẩn, định lượng khoảng cách trung bình của mỗi điểm số so với giá trị trung bình.
Bạn có thể dùng sd() với bất kỳ vector số nào, gồm số nguyên, số thực, hoặc kết quả tính toán. Bạn có thể biết rằng R coi vector logic là số (TRUE là 1, FALSE là 0), nên về mặt kỹ thuật sd() cũng hoạt động với vector logic (bạn có thể thử), nhưng khái niệm độ lệch chuẩn có ý nghĩa nhất với dữ liệu số liên tục.
Xử lý giá trị khuyết với sd()
Bộ dữ liệu thực tế thường có giá trị khuyết, nên điều này đáng lưu ý: Nếu dữ liệu của bạn có bất kỳ giá trị NA nào, sd() sẽ trả về NA theo mặc định.
Để bỏ qua các giá trị khuyết và tính độ lệch chuẩn của những số hiện có, hãy dùng đối số na.rm = TRUE. Hoặc bạn có thể loại bỏ giá trị NA khỏi bộ dữ liệu, nhưng tôi chỉ khuyên làm vậy nếu hợp lý.
Lệnh này cho bạn độ lệch chuẩn của cột weight. Hãy nhớ, sd() được thiết kế cho các vector số, không phải toàn bộ data frame. Luôn chọn đúng cột cần tính.
sd() và độ lệch chuẩn theo nhóm
Bạn thường sẽ muốn đo mức độ biến thiên trong từng nhóm, như theo danh mục, khu vực, hoặc một yếu tố nào đó. R cung cấp nhiều cách để tính độ lệch chuẩn theo nhóm. Tôi sẽ minh họa ba cách:
Dùng tapply() để tính độ lệch chuẩn theo nhóm
Giả sử bạn có dữ liệu doanh số theo khu vực và muốn tính độ lệch chuẩn cho từng khu vực:
sales_amount <- c(200,220,210,250,240,230)
region <- c("North","North","South","South","North","South")
tapply(sales_amount, region, sd)Được hỗ trợ bởi
tapply() áp dụng sd() cho từng nhóm được xác định bởi khu vực.
Dùng aggregate() để tính độ lệch chuẩn theo nhóm
Nếu bạn muốn kết quả ở dạng data frame gọn gàng, aggregate() sẽ hữu ích:
sales_data <- data.frame( region = c("North","North","South","South","North","South"), amount = c(200,220,210,250,240,230))
aggregate(amount ~ region, data = sales_data, sd)Được hỗ trợ bởi
Điều này tạo ra một data frame tóm tắt với độ lệch chuẩn cho từng khu vực.
Dùng dplyr để tính độ lệch chuẩn theo nhóm
Với gói dplyr, phép tính theo nhóm thậm chí còn dễ đọc hơn. Dùng summarize() sau khi nhóm:
library(dplyr)
sales_data %>%
group_by(region)%>%
summarize(sd_amount = sd(amount))Được hỗ trợ bởi
Cách làm này đặc biệt hữu ích với bộ dữ liệu lớn hoặc khi bạn xâu chuỗi nhiều bước biến đổi dữ liệu. (Hoặc đơn giản là bạn thích dùng toán tử pipe như tôi.)
Lỗi thường gặp và mẹo
Ngay cả một hàm đơn giản như sd() cũng có thể gây rắc rối nếu bạn không cẩn thận. Dưới đây là một số lỗi thường gặp:
Dữ liệu không phải số: sd() chỉ hoạt động với vector số. Nếu dữ liệu có ký tự hoặc factor, bạn sẽ gặp lỗi. Dùng is.numeric() để kiểm tra dữ liệu.
Giá trị khuyết: Chỉ một NA cũng khiến sd() trả về NA. Luôn dùng na.rm = TRUE nếu bạn muốn bỏ qua giá trị khuyết.
Kích thước mẫu nhỏ: sd() dùng n-1 ở mẫu số (độ lệch chuẩn mẫu). Với vector độ dài 1, sd() trả về NA, không phải 0.
Đặc biệt lỗi cuối cùng theo tôi là thú vị. Đây là khác biệt ít người biết, và có thể khiến bạn bối rối khi chuyển từ Python sang R, vì Python chia theo độ lệch chuẩn tổng thể, không phải mẫu.
Biến thể hữu ích và các hàm liên quan trong R
R cung cấp một số hàm liên quan để đo biến thiên và tóm tắt dữ liệu:
var(): Tính phương sai, là bình phương của độ lệch chuẩn.
apply(), sapply(), lapply(): Hữu ích để áp dụng sd() theo hàng hoặc cột của ma trận và data frame.
mad(): Tính độ lệch tuyệt đối theo trung vị (median absolute deviation), một thước đo biến thiên thú vị và bền vững hơn.
Để minh họa sd() cùng với apply() như đã đề cập: Đây là cách dùng apply() để lấy độ lệch chuẩn của mỗi cột trong một ma trận. Như trước, tôi sẽ tạo ma trận này ngay.
measurement_matrix <- matrix(1:9, nrow =3)
apply(measurement_matrix,2, sd)Được hỗ trợ bởi
Lệnh này trả về độ lệch chuẩn cho mỗi cột, cho bạn cái nhìn nhanh về mức độ biến thiên trên nhiều biến.
Kết luận
Hàm sd() trong R tương đối đơn giản (chỉ một dòng lệnh). Nhưng nếu bạn dùng nó cho báo cáo hay thuyết trình và còn hơi mơ hồ về chi tiết, hãy đăng ký lộ trình nghề nghiệp Statistician in R của chúng tôi. Thống kê và phân tích dữ liệu có nhiều sắc thái, nên hãy bảo đảm bạn nắm vững.
Tác giả
Josef Waples
Tôi là một cây bút và biên tập viên về khoa học dữ liệu, đã có bài đóng góp cho các nghiên cứu đăng trên tạp chí khoa học. Tôi đặc biệt quan tâm đến đại số tuyến tính, thống kê, R và các chủ đề tương tự. Tôi cũng chơi cờ vua khá thường xuyên!
Độ lệch chuẩn là một trong những cách phổ biến nhất để tóm tắt mức độ phân tán của dữ liệu. Trong R, hàm
sd()cung cấp cho bạn cách nhanh chóng để tính toán thước đo biến thiên này, dù bạn đang làm việc với vector, data frame hay dữ liệu theo nhóm.Trong bài viết này, tôi sẽ hướng dẫn những điều cơ bản khi dùng
sd()trong R, cách xử lý giá trị khuyết, và cách tính độ lệch chuẩn theo nhóm bằng các hàm nhưtapply()và các gói nhưdplyr.sd() làm gì trong R?
Trong R, hàm
sd()từ base R tính độ lệch chuẩn của một vector số hoặc một cột trong data frame. Nó đo lường mức độ các giá trị trong dữ liệu lệch so với trung bình, cho bạn cảm nhận về độ biến thiên hay phân tán.Nếu bạn quen với khái niệm phương sai, thì độ lệch chuẩn đơn giản là căn bậc hai của nó và, do cách tính (lấy căn bậc hai của trung bình bình phương độ lệch), độ lệch chuẩn vẫn giữ cùng đơn vị với dữ liệu gốc. Điều này giúp việc diễn giải trở nên dễ dàng hơn trong thực tế.
Ví dụ đơn giản về sd()
Giả sử bạn có một tập số và muốn biết chúng khác biệt bao nhiêu so với giá trị trung bình.
Bạn có thể làm như sau trong R:
Kết quả cho bạn độ lệch chuẩn, định lượng khoảng cách trung bình của mỗi điểm số so với giá trị trung bình.
Bạn có thể dùng
sd()với bất kỳ vector số nào, gồm số nguyên, số thực, hoặc kết quả tính toán. Bạn có thể biết rằng R coi vector logic là số (TRUElà1,FALSElà0), nên về mặt kỹ thuậtsd()cũng hoạt động với vector logic (bạn có thể thử), nhưng khái niệm độ lệch chuẩn có ý nghĩa nhất với dữ liệu số liên tục.Xử lý giá trị khuyết với sd()
Bộ dữ liệu thực tế thường có giá trị khuyết, nên điều này đáng lưu ý: Nếu dữ liệu của bạn có bất kỳ giá trị
NAnào,sd()sẽ trả vềNAtheo mặc định.Xem ví dụ sau:
Kết quả là
NA.Để bỏ qua các giá trị khuyết và tính độ lệch chuẩn của những số hiện có, hãy dùng đối số
na.rm = TRUE. Hoặc bạn có thể loại bỏ giá trịNAkhỏi bộ dữ liệu, nhưng tôi chỉ khuyên làm vậy nếu hợp lý.Giờ bạn sẽ nhận được độ lệch chuẩn cho 170, 175, 180 và 185.
Tính độ lệch chuẩn cho Data Frame trong R
Bạn có thể dễ dàng tính độ lệch chuẩn của một cột cụ thể trong data frame bằng toán tử
$. Giả sử bạn có một data frame về khối lượng sản phẩm:Lệnh này cho bạn độ lệch chuẩn của cột
weight. Hãy nhớ,sd()được thiết kế cho các vector số, không phải toàn bộ data frame. Luôn chọn đúng cột cần tính.sd() và độ lệch chuẩn theo nhóm
Bạn thường sẽ muốn đo mức độ biến thiên trong từng nhóm, như theo danh mục, khu vực, hoặc một yếu tố nào đó. R cung cấp nhiều cách để tính độ lệch chuẩn theo nhóm. Tôi sẽ minh họa ba cách:
Dùng tapply() để tính độ lệch chuẩn theo nhóm
Giả sử bạn có dữ liệu doanh số theo khu vực và muốn tính độ lệch chuẩn cho từng khu vực:
tapply()áp dụngsd()cho từng nhóm được xác định bởi khu vực.Dùng aggregate() để tính độ lệch chuẩn theo nhóm
Nếu bạn muốn kết quả ở dạng data frame gọn gàng,
aggregate()sẽ hữu ích:Điều này tạo ra một data frame tóm tắt với độ lệch chuẩn cho từng khu vực.
Dùng dplyr để tính độ lệch chuẩn theo nhóm
Với gói
dplyr, phép tính theo nhóm thậm chí còn dễ đọc hơn. Dùngsummarize()sau khi nhóm:Cách làm này đặc biệt hữu ích với bộ dữ liệu lớn hoặc khi bạn xâu chuỗi nhiều bước biến đổi dữ liệu. (Hoặc đơn giản là bạn thích dùng toán tử pipe như tôi.)
Lỗi thường gặp và mẹo
Ngay cả một hàm đơn giản như sd() cũng có thể gây rắc rối nếu bạn không cẩn thận. Dưới đây là một số lỗi thường gặp:
Dữ liệu không phải số:
sd()chỉ hoạt động với vector số. Nếu dữ liệu có ký tự hoặc factor, bạn sẽ gặp lỗi. Dùngis.numeric()để kiểm tra dữ liệu.Giá trị khuyết: Chỉ một
NAcũng khiếnsd()trả vềNA. Luôn dùngna.rm = TRUEnếu bạn muốn bỏ qua giá trị khuyết.Kích thước mẫu nhỏ:
sd()dùng n-1 ở mẫu số (độ lệch chuẩn mẫu). Với vector độ dài 1,sd()trả vềNA, không phải0.Đặc biệt lỗi cuối cùng theo tôi là thú vị. Đây là khác biệt ít người biết, và có thể khiến bạn bối rối khi chuyển từ Python sang R, vì Python chia theo độ lệch chuẩn tổng thể, không phải mẫu.
Biến thể hữu ích và các hàm liên quan trong R
R cung cấp một số hàm liên quan để đo biến thiên và tóm tắt dữ liệu:
var(): Tính phương sai, là bình phương của độ lệch chuẩn.apply(),sapply(),lapply(): Hữu ích để áp dụngsd()theo hàng hoặc cột của ma trận và data frame.mad(): Tính độ lệch tuyệt đối theo trung vị (median absolute deviation), một thước đo biến thiên thú vị và bền vững hơn.Để minh họa
sd()cùng vớiapply()như đã đề cập: Đây là cách dùngapply()để lấy độ lệch chuẩn của mỗi cột trong một ma trận. Như trước, tôi sẽ tạo ma trận này ngay.Lệnh này trả về độ lệch chuẩn cho mỗi cột, cho bạn cái nhìn nhanh về mức độ biến thiên trên nhiều biến.
Kết luận
Hàm
sd()trong R tương đối đơn giản (chỉ một dòng lệnh). Nhưng nếu bạn dùng nó cho báo cáo hay thuyết trình và còn hơi mơ hồ về chi tiết, hãy đăng ký lộ trình nghề nghiệp Statistician in R của chúng tôi. Thống kê và phân tích dữ liệu có nhiều sắc thái, nên hãy bảo đảm bạn nắm vững.