Dữ liệu này được trích xuất từ cơ sở dữ liệu của Cục điều tra dân số năm 1994 (Khai thác và trực quan hóa dữ liệu, Silicon Graphics). Bộ dữ liệu này được trích xuất từ điều tra dân số của Mỹ, dùng để dự đoán liệu thu nhập của một người có vượt mức $50K/năm hay không.
Biến phụ thuộc (target): income (<=50K hoặc >50K) → biến định tính
library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
data <- read.xlsx("C:/Users/HP/Downloads/adult_categorical_.xlsx", sheetIndex = 1, header = T)
str(data)
## 'data.frame': 32561 obs. of 9 variables:
## $ workclass : chr "State-gov" "Self-emp-not-inc" "Private" "Private" ...
## $ education : chr "Bachelors" "Bachelors" "HS-grad" "11th" ...
## $ marital.status: chr "Never-married" "Married-civ-spouse" "Divorced" "Married-civ-spouse" ...
## $ occupation : chr "Adm-clerical" "Exec-managerial" "Handlers-cleaners" "Handlers-cleaners" ...
## $ relationship : chr "Not-in-family" "Husband" "Not-in-family" "Husband" ...
## $ race : chr "White" "White" "White" "Black" ...
## $ sex : chr "Male" "Male" "Male" "Male" ...
## $ native.country: chr "United-States" "United-States" "United-States" "United-States" ...
## $ income : chr "<=50K" "<=50K" "<=50K" "<=50K" ...
head(data,4)
## workclass education marital.status occupation relationship
## 1 State-gov Bachelors Never-married Adm-clerical Not-in-family
## 2 Self-emp-not-inc Bachelors Married-civ-spouse Exec-managerial Husband
## 3 Private HS-grad Divorced Handlers-cleaners Not-in-family
## 4 Private 11th Married-civ-spouse Handlers-cleaners Husband
## race sex native.country income
## 1 White Male United-States <=50K
## 2 White Male United-States <=50K
## 3 White Male United-States <=50K
## 4 Black Male United-States <=50K
Giải thích:
# Chọn các biến định tính
dldt <- c("workclass", "education", "marital.status",
"occupation", "relationship", "race",
"sex", "native.country", "income")
for (col in dldt) {
if (!is.factor(data[[col]])) {
data[[col]] <- as.factor(data[[col]])
}
}
sapply(data[dldt], is.factor)
## workclass education marital.status occupation relationship
## TRUE TRUE TRUE TRUE TRUE
## race sex native.country income
## TRUE TRUE TRUE TRUE
-Sau đó, bằng cách dùng vòng lặp for, từng biến trong danh sách qdt được kiểm tra và chuyển đổi sang kiểu factor nếu chưa phải. Khi kiểm tra lại bằng sapply, kết quả cho thấy tất cả các biến trong qdt đều đã được chuyển thành kiểu factor. Việc chuyển đổi này giúp chuẩn hóa dữ liệu, tăng hiệu suất xử lý và đảm bảo tính tương thích với các hàm phân tích thống kê trong R như table(), prop.table(), glm(), hay các biểu đồ ggplot2. Đây là bước tiền xử lý quan trọng trước khi thực hiện các phân tích định tính trong R.
Cấu trúc bộ dữ liệu
| Tên cột gốc | Mô tả |
|---|---|
| workclass | Loại công việc - định tính danh mục (categorical) |
| education | Trình độ học vấn - định tính danh mục (categorical) |
| marital-status | Tình trạng hôn nhân - định tính danh mục (categorical) |
| occupation | Nghề nghiệp - định tính danh mục (categorical) |
| relationship | Quan hệ trong hộ gia đình - định tính danh mục (categorical) |
| race | Chủng tộc - định tính danh mục (categorical) |
| sex | Giới tính - định tính danh mục (categorical) |
| native-country | Quốc gia - định tính danh mục (categorical) |
| income | Mức thu nhập (<=50K hoặc >50K) - Nhị phân |
Kiểm tra số lượng NA trong cột định tính*
Giải thích:
sapply(dat, …): áp dụng hàm cho từng cột trong dữ liệu dat.
sum(is.na(x)): đếm số lượng NA trong từng cột.
# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(data, function(x) sum(is.na(x)))
na_counts
## workclass education marital.status occupation relationship
## 0 0 0 0 0
## race sex native.country income
## 0 0 0 0
Nhận xét
qq <- data[,dldt]
table(qq$education)
##
## 10th 11th 12th 1st-4th 5th-6th 7th-8th
## 933 1175 433 168 333 646
## 9th Assoc-acdm Assoc-voc Bachelors Doctorate HS-grad
## 514 1067 1382 5355 413 10501
## Masters Preschool Prof-school Some-college
## 1723 51 576 7291
q5 <- table(qq$education)/sum(nrow(qq))
table(qq$education)/sum(nrow(qq))
##
## 10th 11th 12th 1st-4th 5th-6th 7th-8th
## 0.028653911 0.036086115 0.013298117 0.005159547 0.010226959 0.019839686
## 9th Assoc-acdm Assoc-voc Bachelors Doctorate HS-grad
## 0.015785756 0.032769264 0.042443414 0.164460551 0.012683886 0.322502380
## Masters Preschool Prof-school Some-college
## 0.052916065 0.001566291 0.017689874 0.223918184
Kết quả phân tích tỷ lệ biến education cho thấy sự phân bố khá rõ ràng giữa các bậc học. Nhóm chiếm tỷ lệ cao nhất là HS-grad (tốt nghiệp trung học phổ thông) với khoảng 32.25%, tiếp theo là Some-college (đã học đại học nhưng chưa tốt nghiệp) chiếm 22.39%, và Bachelors (tốt nghiệp đại học) chiếm 16.45%.
Các nhóm có tỷ lệ thấp hơn gồm Masters (cao học) chiếm 5.29%, Assoc-voc và Assoc-acdm (trình độ cao đẳng nghề hoặc học thuật) lần lượt chiếm 4.24% và 3.28%. Các bậc học thấp như 9th, 10th, 11th, và 7th-8th đều có tỷ lệ dưới 4%. Đặc biệt, các nhóm như Preschool (mẫu giáo – 0.16%) và 1st-4th (lớp 1 đến lớp 4 – 0.52%) chiếm tỷ lệ rất nhỏ, gần như không đáng kể.
Tóm lại, phần lớn người trong bộ dữ liệu có trình độ học vấn từ trung học trở lên, trong đó gần 3/4 đã hoàn tất ít nhất chương trình phổ thông hoặc từng học đại học. Khi mô hình hóa biến education, có thể cân nhắc gộp các nhóm có tỷ lệ rất thấp để giảm nhiễu và tăng hiệu quả dự đoán.
library(ggplot2)
ggplot(qq, aes(x = education)) +
geom_bar(fill = "white", color = "black") +
labs(x = "Trình độ học vấn ", y = "Tần suất", title = "Biểu đồ tần số trình độ học vấn") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
coord_flip()
Biểu đồ tần suất giáo dục cho thấy sự phân bố trình độ học vấn trong bộ dữ liệu có xu hướng tập trung mạnh vào một số bậc phổ biến. Trong đó, HS-grad (tốt nghiệp trung học) là nhóm chiếm tỷ lệ cao nhất với hơn 10.000 người, theo sau là Some-college (đã học đại học nhưng chưa tốt nghiệp) với khoảng 7.000 người, và Bachelors (tốt nghiệp đại học) với khoảng 5.000 người.
Các bậc học sau đại học như Masters, Doctorate, và Prof-school chiếm tỷ lệ nhỏ hơn đáng kể. Ngoài ra, một số bậc học dưới trung học như 9th, 7th-8th, hay 5th-6th cũng xuất hiện nhưng số lượng rất thấp. Nhóm có trình độ học vấn thấp nhất – Preschool – gần như không đáng kể.
Phân bố này phản ánh xu hướng học vấn phổ biến trong dân số lao động Mỹ thời điểm khảo sát, với phần lớn dân cư đạt trình độ từ trung học trở lên. Khi đưa biến education vào phân tích hoặc mô hình hóa, có thể cân nhắc gộp các nhóm có tần suất rất thấp để đảm bảo tính ổn định và giảm nhiễu trong mô hình.
qq <- data[,dldt]
table(qq$relationship)
##
## Husband Not-in-family Other-relative Own-child Unmarried
## 13193 8305 981 5068 3446
## Wife
## 1568
q2 <- table(qq$relationship)/sum(nrow(qq))
table(qq$relationship)/sum(nrow(qq))
##
## Husband Not-in-family Other-relative Own-child Unmarried
## 0.40517797 0.25505973 0.03012807 0.15564633 0.10583213
## Wife
## 0.04815577
Kết quả phân tích tỷ lệ của biến relationship cho thấy nhóm Husband (người chồng trong hộ gia đình) chiếm tỷ lệ cao nhất, với khoảng 40.52% tổng số quan sát. Tiếp theo là nhóm Not-in-family (không thuộc gia đình hạt nhân) chiếm 25.51%, và nhóm Own-child (con ruột hoặc con nuôi trong hộ gia đình) chiếm khoảng 15.56%. Các nhóm còn lại có tỷ lệ thấp hơn: Unmarried (chưa kết hôn hoặc độc thân) chiếm 10.58%, Wife (người vợ) chiếm 4.82%, và thấp nhất là nhóm Other-relative (thành viên gia đình khác như anh chị em, ông bà…) với chỉ 3.01%. Phân bố này phản ánh rõ vai trò phổ biến của người chồng trong hộ gia đình thời điểm khảo sát, đồng thời cho thấy tỷ lệ nữ giới giữ vai trò “vợ” thấp hơn đáng kể, có thể do định nghĩa phân loại trong dữ liệu hoặc xu hướng nhân khẩu học đặc thù.
ggplot(qq, aes(x = relationship)) +
geom_bar(fill = "darkred", color = "white") +
coord_flip() +
labs(x = "Mối quan hệ", y = "Tần số", title = "Biểu đồ tần số của biến relationship") +
theme_minimal()
Biểu đồ tần số của biến relationship thể hiện rõ sự phân bố vai trò trong hộ gia đình của các cá nhân trong bộ dữ liệu. Nhóm chiếm tỷ lệ cao nhất là Husband (người chồng), với hơn 12.000 quan sát, cho thấy số lượng lớn người lao động trong mẫu khảo sát đóng vai trò trụ cột nam trong gia đình. Theo sau là nhóm Not-in-family (không thuộc gia đình hạt nhân), với gần 9.000 trường hợp – đây có thể là những người sống độc thân, ở trọ hoặc sống ngoài hộ gia đình truyền thống.
Các nhóm Own-child (con ruột hoặc con nuôi) và Unmarried (chưa kết hôn) chiếm tỷ lệ trung bình, lần lượt khoảng 5.000 và 4.000 quan sát. Ngược lại, nhóm Wife (người vợ) có số lượng thấp hơn đáng kể so với “Husband”, và nhóm Other-relative (thành viên gia đình khác) là nhóm ít xuất hiện nhất.
Phân bố này cho thấy một đặc điểm đáng chú ý về cấu trúc hộ gia đình trong dữ liệu – trong đó nam giới trong vai trò “chồng” được ghi nhận nhiều hơn so với nữ giới trong vai trò “vợ”, và có một tỷ lệ lớn cá nhân không sống trong hộ gia đình truyền thống. Đây là cơ sở quan trọng để phân tích sâu hơn về nhân khẩu học và xây dựng các mô hình liên quan đến thu nhập, nghề nghiệp hoặc cấu trúc hộ gia đình.
qq <- data[,dldt]
table(qq$sex)
##
## Female Male
## 10771 21790
q4 <- table(qq$sex)/sum(nrow(qq))
table(qq$sex)/sum(nrow(qq))
##
## Female Male
## 0.3307945 0.6692055
Phân tích biến sex cho thấy sự chênh lệch đáng kể giữa hai giới tính trong bộ dữ liệu. Cụ thể, nam giới chiếm khoảng 66.92%, trong khi nữ giới chỉ chiếm khoảng 33.08% tổng số quan sát. Tỷ lệ này cho thấy nam giới chiếm ưu thế rõ rệt trong tập dữ liệu, gần gấp đôi so với nữ giới. Điều này có thể phản ánh đặc điểm của mẫu điều tra dân số tại thời điểm thu thập dữ liệu hoặc có thể do cách chọn mẫu nghiêng về nhóm lao động nam. Sự mất cân đối này cũng là yếu tố cần lưu ý trong các phân tích tiếp theo để tránh sai lệch trong đánh giá và mô hình hóa.
q4_df <- as.data.frame(q4)
names(q4_df) <- c("sex", "Tansuat")
ggplot(q4_df, aes(x = sex, y = Tansuat, fill = sex)) +
geom_col(width = 0.6) +
geom_text(aes(label = round(Tansuat, 3)), vjust = -0.2, size = 5) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
scale_fill_manual(values = c("Female" = "lightblue", "Male" = "lightyellow")) +
labs(
title = "Biểu đồ tỷ lệ giới tính ",
x = "Giới tính",
y = "Tần suất (%)"
) +
theme_minimal(base_size = 14)
qq <- data[,dldt]
table(qq$marital.status)
##
## Divorced Married-AF-spouse Married-civ-spouse
## 4443 23 14976
## Married-spouse-absent Never-married Separated
## 418 10683 1025
## Widowed
## 993
Việc tạo bảng tần suất cho biến marital.status bằng lệnh table(qq$marital.status) giúp nhanh chóng thống kê số lượng quan sát cho từng nhóm tình trạng hôn nhân trong bộ dữ liệu. Kết quả cho thấy phần lớn cá nhân thuộc nhóm “Married-civ-spouse” (14.976 người) và “Never-married” (10.683 người), trong khi các nhóm như “Married-AF-spouse” (23 người) và “Married-spouse-absent” (418 người) có số lượng rất ít. Đây là cách đơn giản nhưng hiệu quả để có cái nhìn ban đầu về phân bố của một biến định tính.
q1 <- table(qq$marital.status)/sum(nrow(qq))
table(qq$marital.status)/sum(nrow(qq))
##
## Divorced Married-AF-spouse Married-civ-spouse
## 0.1364515832 0.0007063665 0.4599367341
## Married-spouse-absent Never-married Separated
## 0.0128374436 0.3280918891 0.0314793772
## Widowed
## 0.0304966064
Kết quả phân tích tỷ lệ các nhóm trong biến marital.status cho thấy rằng phần lớn cá nhân trong bộ dữ liệu thuộc nhóm đã kết hôn với vợ/chồng đang sống cùng (Married-civ-spouse), chiếm khoảng 45.99%. Nhóm chưa từng kết hôn (Never-married) cũng chiếm tỷ lệ khá lớn, đạt khoảng 32.81%. Trong khi đó, các nhóm còn lại có tỷ lệ thấp hơn đáng kể: nhóm ly hôn (Divorced) chiếm khoảng 13.65%, ly thân (Separated) chiếm 3.15%, góa (Widowed) chiếm 3.05%, và kết hôn nhưng vắng mặt vợ/chồng (Married-spouse-absent) chiếm 1.28%. Đặc biệt, nhóm Married-AF-spouse xuất hiện rất hiếm trong dữ liệu, chỉ chiếm 0.07%. Nhìn chung, phân bố tình trạng hôn nhân trong tập dữ liệu này cho thấy đa số người dân đã từng hoặc đang trong một mối quan hệ hôn nhân chính thức, trong khi các nhóm đặc biệt chỉ chiếm một phần rất nhỏ.
library(ggplot2)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
q1_df <- as.data.frame(q1)
names(q1_df) <- c("marital.status", "Tansuat")
ggplot(q1_df, aes(x = "", y = Tansuat, fill = marital.status)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
scale_fill_manual(values = c("Divorced" = "#00C49A", "Married-AF-spouse" = "#1F77B4", "Married-spouse-absent" = "yellow", "Married-civ-spouse" = "red" ,"Never-married" = "#FF6384", "Separated" = "black", "Widowed" = "green")) +
labs(title = "Biểu đồ tần suất của marital.status") +
theme_void() +
geom_text(aes(label = paste0(round(Tansuat,3), "%")),
position = position_stack(vjust = 0.5),
color = "white", size = 4)
Biểu đồ tần suất của biến marital.status cho thấy sự phân bố không đồng đều rõ rệt giữa các nhóm tình trạng hôn nhân trong bộ dữ liệu. Cụ thể, nhóm “Married-civ-spouse” (đã kết hôn, sống cùng vợ/chồng) chiếm tỷ lệ cao nhất với khoảng 45.99%, tiếp theo là nhóm “Never-married” (chưa từng kết hôn) với 32.81%. Hai nhóm này cộng lại đã chiếm gần 79% tổng số quan sát, cho thấy đây là hai tình trạng phổ biến áp đảo trong dữ liệu. Các nhóm còn lại có tỷ lệ thấp hơn đáng kể, như “Divorced” (ly hôn) chiếm 13.65%, “Separated” (ly thân) chiếm 3.15%, “Widowed” (góa) chiếm 3.05%, và “Married-spouse-absent” chỉ chiếm 1.28%. Đặc biệt, nhóm “Married-AF-spouse” hầu như không xuất hiện, chỉ chiếm 0.07%. Sự mất cân đối này có ý nghĩa quan trọng trong quá trình mô hình hóa, vì các nhóm có tỷ lệ quá nhỏ có thể gây sai lệch hoặc giảm hiệu quả dự báo nếu không được xử lý thích hợp, chẳng hạn như gộp nhóm, tái phân loại hoặc áp dụng kỹ thuật cân bằng mẫu.
Trong phần này, ta tiến hành phân tích tỷ lệ của một hạng mục cụ thể thuộc 5 biến định tính trong bộ dữ liệu: tình trạng hôn nhân (marital.status), quan hệ gia đình (relationship), chủng tộc (race), giới tính (sex), và trình độ học vấn (education). Mỗi biến sẽ được phân tích qua 2 bước: (1) ước lượng khoảng tin cậy 95% cho tỷ lệ của hạng mục quan tâm trong tổng thể, và (2) kiểm định giả thuyết thống kê cho một giả định cụ thể về tỷ lệ đó. Mức ý nghĩa là α = 0.05.
“Asian-Pac-Islander” của biến race
“Own-child” của biến relationship
prop.test(sum(data$relationship == "Own-child"), nrow(data), conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: sum(data$relationship == "Own-child") out of nrow(data), null probability 0.5
## X-squared = 15443, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1517342 0.1596400
## sample estimates:
## p
## 0.1556463
Ước lượng khoảng tin cậy:
Tỷ lệ mẫu các cá nhân được ghi nhận là “Own-child” trong tập dữ liệu được ước lượng là 15.56%. Dựa trên phân tích thống kê, khoảng tin cậy 95% cho tỷ lệ này được tính từ 15.17% đến 15.96%. Điều này có nghĩa là, với độ tin cậy 95%, chúng ta có thể khẳng định rằng tỷ lệ thực sự các cá nhân là “Own-child” trong tổng thể dân số nằm trong khoảng trên. Khoảng này hoàn toàn nằm dưới mức 50%, cho thấy tỷ lệ này nhỏ hơn đáng kể so với một nửa tổng số quan sát.
Kiểm định Giả thuyết - H₀ (Giả thuyết không): 50% số cá nhân trong tổng thể là “Own-child”
p=0.5 Kết quả kiểm định cho thấy thống kê chi bình phương đạt giá trị rất lớn (X² = 15,443), với 1 bậc tự do, và p-value < 2.2e-16. Do giá trị p nhỏ hơn rất nhiều so với ngưỡng ý nghĩa 0.05, chúng ta bác bỏ giả thuyết gốc. Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng tỷ lệ thực sự các cá nhân là “Own-child” khác 0.5, và cụ thể là thấp hơn đáng kể. Ta đặt giả thuyết như sau:
prop.test(sum(data$race == "Asian-Pac-Islander"), nrow(data), conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: sum(data$race == "Asian-Pac-Islander") out of nrow(data), null probability 0.5
## X-squared = 28536, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.03003992 0.03389009
## sample estimates:
## p
## 0.03190934
Ước lượng khoảng tin cậy:
Tỷ lệ người thuộc nhóm “Asian-Pac-Islander” trong tập dữ liệu được ước lượng là 3.19%. Dựa trên phép ước lượng khoảng, khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 3.00% đến 3.39%. Điều này có nghĩa là, với độ tin cậy 95%, chúng ta có thể khẳng định rằng tỷ lệ thực sự người “Asian-Pac-Islander” trong tổng thể dân số nằm trong khoảng rất nhỏ, thấp hơn đáng kể so với giả định 50%. Khoảng tin cậy này hoàn toàn nằm dưới mức 0.5, phản ánh rõ sự chênh lệch đáng kể.
Ta đặt giả thuyết như sau:
H₀ (Giả thuyết không):Tỷ lệ người châu Á = 0.5
H₁ (Giả thuyết đối):Tỷ lệ người châu Á ≠ 0.5
Phép kiểm định tỷ lệ một mẫu được thực hiện với giả thuyết gốc
P = 0.5, tức giả định rằng 50% dân số thuộc nhóm “Asian-Pac-Islander”. Kết quả kiểm định cho thấy thống kê chi bình phương có giá trị rất lớn (X² = 28,536), với 1 bậc tự do, và p-value < 2.2e-16. Với p-value nhỏ hơn nhiều so với mức ý nghĩa 0.05, chúng ta bác bỏ giả thuyết gốc. Điều này cho thấy có bằng chứng thống kê mạnh mẽ rằng tỷ lệ người “Asian-Pac-Islander” trong tổng thể khác 50%, và cụ thể là thấp hơn rất nhiều so với mức giả định.
Để tiếp tục phân tích mối quan hệ giữa các biến định tính, ta lựa chọn hai cặp biến có ý nghĩa thực tiễn cao để tính Relative Risk (nguy cơ tương đối) và Odds Ratio (tỷ số chênh). Hai cặp biến được chọn gồm:
Cặp 1: sex (giới tính: Male/Female) và income (thu nhập: >50K / <=50K) → nhằm so sánh khả năng đạt thu nhập cao giữa nam và nữ.
Cặp 2: marital.status (được rút gọn thành: Married-civ-spouse / Other) và income → để xem liệu tình trạng hôn nhân có ảnh hưởng đến xác suất có thu nhập trên 50.000 đô/năm.
Với mỗi cặp biến, ta tiến hành lập bảng tần suất chéo 2×2, sau đó tính tỷ số chênh (Odds Ratio) bằng hàm oddsratio() từ gói epitools, đồng thời tính nguy cơ tương đối (Relative Risk) thủ công hoặc từ cùng kết quả trả về của hàm. Kết quả sẽ giúp đánh giá xem một nhóm có khả năng (risk) hoặc cơ hội (odds) có thu nhập cao nhiều hơn nhóm còn lại hay không, và mức độ khác biệt đó có ý nghĩa thống kê hay không.
library(epitools)
tab1 <- table(data$race, data$sex)
riskratio(tab1)
## $data
##
## Female Male Total
## Amer-Indian-Eskimo 119 192 311
## Asian-Pac-Islander 346 693 1039
## Black 1555 1569 3124
## Other 109 162 271
## White 8642 19174 27816
## Total 10771 21790 32561
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Amer-Indian-Eskimo 1.0000000 NA NA
## Asian-Pac-Islander 1.0803808 0.9800393 1.1909958
## Black 0.8135253 0.7403873 0.8938882
## Other 0.9682887 0.8492957 1.1039537
## White 1.1165475 1.0226424 1.2190756
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Amer-Indian-Eskimo NA NA NA
## Asian-Pac-Islander 0.1081675333 0.1176692618 0.1061680084
## Black 0.0001024734 0.0001070805 0.0001072881
## Other 0.6304160655 0.6705639149 0.6293606615
## White 0.0074039380 0.0079961760 0.0064338458
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Bảng số liệu trình bày phân tích về tỷ lệ giới tính (nữ và nam) theo từng nhóm chủng tộc trong tổng số 32.561 người. Mục tiêu là so sánh xác suất xuất hiện giới tính nữ giữa các nhóm chủng tộc khác nhau, với nhóm “Amer-Indian-Eskimo” được chọn làm nhóm tham chiếu (tỷ lệ rủi ro – risk ratio – bằng 1). Các nhóm còn lại được đánh giá dựa trên tỷ lệ rủi ro tương đối, khoảng tin cậy 95% và kiểm định ý nghĩa thống kê thông qua ba phương pháp: midp.exact, fisher.exact và chi-square.
Cụ thể, nhóm Asian-Pac-Islander có tỷ lệ nữ cao hơn nhóm tham chiếu khoảng 8% (risk ratio ≈ 1.08), tuy nhiên sự khác biệt này không có ý nghĩa thống kê vì khoảng tin cậy chứa giá trị 1 (95% CI: 0.98 – 1.19) và p-value > 0.1. Ngược lại, nhóm Black có tỷ lệ nữ thấp hơn rõ rệt với risk ratio khoảng 0.81, tức thấp hơn gần 19% so với nhóm tham chiếu. Đây là một kết quả có ý nghĩa thống kê cao, vì cả ba kiểm định đều cho p-value < 0.001 và khoảng tin cậy (0.74 – 0.89) không chứa giá trị 1. Nhóm Other có risk ratio gần 1 (≈ 0.97), cho thấy không có sự khác biệt đáng kể so với nhóm tham chiếu (p-value ≈ 0.63).
Đáng chú ý, nhóm White có tỷ lệ nữ cao hơn nhóm tham chiếu khoảng 12% (risk ratio ≈ 1.12), và sự khác biệt này có ý nghĩa thống kê (p-value ≈ 0.007), với khoảng tin cậy 95% là từ 1.02 đến 1.22. Như vậy, trong năm nhóm chủng tộc được so sánh, chỉ có nhóm Black và White cho thấy sự khác biệt giới tính có ý nghĩa thống kê, trong đó nhóm Black ít nữ hơn đáng kể, còn nhóm White có tỷ lệ nữ cao hơn. Các phân tích sử dụng phương pháp ước lượng MLE không điều kiện kết hợp với xấp xỉ chuẩn (Wald) để xác định khoảng tin cậy.
oddsratio(tab1)
## $data
##
## Female Male Total
## Amer-Indian-Eskimo 119 192 311
## Asian-Pac-Islander 346 693 1039
## Black 1555 1569 3124
## Other 109 162 271
## White 8642 19174 27816
## Total 10771 21790 32561
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Amer-Indian-Eskimo 1.0000000 NA NA
## Asian-Pac-Islander 1.2416026 0.9532016 1.6129609
## Black 0.6257675 0.4915141 0.7936976
## Other 0.9212766 0.6596053 1.2869642
## White 1.3758378 1.0903719 1.7290110
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Amer-Indian-Eskimo NA NA NA
## Asian-Pac-Islander 0.1081675333 0.1176692618 0.1061680084
## Black 0.0001024734 0.0001070805 0.0001072881
## Other 0.6304160655 0.6705639149 0.6293606615
## White 0.0074039380 0.0079961760 0.0064338458
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Bảng số liệu trên trình bày phân tích tỷ số odds (odds ratio) giữa giới tính nữ và nam trong các nhóm chủng tộc khác nhau, với nhóm “Amer-Indian-Eskimo” được chọn làm nhóm tham chiếu (odds ratio = 1). Tỷ số odds cho biết xác suất là nữ so với nam trong từng nhóm chủng tộc, và so sánh tương đối với nhóm tham chiếu. Phân tích được thực hiện bằng phương pháp ước lượng trung vị không thiên lệch (median-unbiased) kết hợp với khoảng tin cậy mid-p chính xác.
Kết quả cho thấy, nhóm Asian-Pac-Islander có odds ratio xấp xỉ 1.24, tức là xác suất là nữ cao hơn khoảng 24% so với nhóm tham chiếu. Tuy nhiên, sự khác biệt này không có ý nghĩa thống kê vì khoảng tin cậy 95% (0.95 – 1.61) bao gồm 1 và p-value lớn hơn 0.1. Trong khi đó, nhóm Black có odds ratio khoảng 0.63, nghĩa là tỷ lệ nữ trong nhóm này thấp hơn đáng kể (giảm khoảng 37%) so với nhóm tham chiếu. Sự khác biệt này có ý nghĩa thống kê rõ ràng với p-value < 0.001 và khoảng tin cậy (0.49 – 0.79) không chứa 1.
Nhóm Other có odds ratio gần 1 (≈ 0.92), cho thấy không có sự khác biệt đáng kể về giới tính so với nhóm tham chiếu, và kết quả này cũng không có ý nghĩa thống kê (p ≈ 0.63). Ngược lại, nhóm White có odds ratio khoảng 1.38, tức là khả năng là nữ cao hơn khoảng 38% so với nhóm Amer-Indian-Eskimo, và đây là sự khác biệt có ý nghĩa thống kê (p ≈ 0.007; khoảng tin cậy 95% từ 1.09 đến 1.73).
Tóm lại, trong số các nhóm chủng tộc được phân tích, chỉ có hai nhóm – Black và White – thể hiện sự khác biệt giới tính có ý nghĩa thống kê. Nhóm Black có tỷ lệ nữ thấp hơn đáng kể, trong khi nhóm White có tỷ lệ nữ cao hơn so với nhóm tham chiếu. Các nhóm còn lại không cho thấy sự chênh lệch giới tính đáng tin cậy về mặt thống kê.
Ta chọn cặp biến định tính như sau:
tab22 <- table(data$race, data$marital.status)
tab22
##
## Divorced Married-AF-spouse Married-civ-spouse
## Amer-Indian-Eskimo 60 0 116
## Asian-Pac-Islander 75 0 508
## Black 485 1 837
## Other 26 0 105
## White 3797 22 13410
##
## Married-spouse-absent Never-married Separated Widowed
## Amer-Indian-Eskimo 9 103 11 12
## Asian-Pac-Islander 41 372 19 24
## Black 62 1346 265 128
## Other 15 105 13 7
## White 291 8757 717 822
prop2 <- prop.table(tab22, margin = 1) * 100
round(prop2, 2)
##
## Divorced Married-AF-spouse Married-civ-spouse
## Amer-Indian-Eskimo 19.29 0.00 37.30
## Asian-Pac-Islander 7.22 0.00 48.89
## Black 15.52 0.03 26.79
## Other 9.59 0.00 38.75
## White 13.65 0.08 48.21
##
## Married-spouse-absent Never-married Separated Widowed
## Amer-Indian-Eskimo 2.89 33.12 3.54 3.86
## Asian-Pac-Islander 3.95 35.80 1.83 2.31
## Black 1.98 43.09 8.48 4.10
## Other 5.54 38.75 4.80 2.58
## White 1.05 31.48 2.58 2.96
df_tab22 <- as.data.frame(tab22)
colnames(df_tab22) <- c("race", "marital.status", "Freq")
ggplot(df_tab22, aes(x = race, y = Freq, fill = marital.status)) +
geom_bar(stat = "identity", position = "fill") +
labs(title = "Tỷ lệ thu nhập theo vai trò trong hộ gia đình",
y = "Tỷ lệ", x = "Mối quan hệ") +
scale_y_continuous(labels = scales::percent)
chisq.test(tab22)
## Warning in chisq.test(tab22): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test
##
## data: tab22
## X-squared = 923.81, df = 24, p-value < 2.2e-16