Tập dữ liệu này được thu thập từ cuộc khảo sát dân cư Hoa Kỳ, với mục đích phân tích mức độ ảnh hưởng của giới tính đến kết quả nghiên cứu trên từng cá nhân.
Bộ dữ liệu có 15 biến và 32561 quan sát gồm có 6 biến định lượng và 9 biến định tính
# Đọc dữ liệu
my <- read.csv("C:/Users/ASUS/Downloads/adult_clean.csv", header = T)
# Thay thế tất cả dấu ? trong toàn bộ dataframe (chỉ cho biến character)
my <- my %>%
mutate(across(where(is.character), ~ifelse(. == "?", "Unknown", .)))
names(my)
## [1] "age" "workclass" "fnlwgt" "education"
## [5] "education.num" "marital.status" "occupation" "relationship"
## [9] "race" "sex" "capital.gain" "capital.loss"
## [13] "hours.per.week" "native.country" "income"
Tên biến | Kiểu dữ liệu | Mô tả | Ghi chú |
---|---|---|---|
age |
Định lượng (số) | Tuổi của người tham gia (17–90) | Biến liên tục |
workclass |
Định tính (hạng mục) | Loại hình công việc (Private, Government, Self-emp, …) | Phản ánh thành phần kinh tế |
fnlwgt |
Định lượng (số) | Trọng số mẫu điều chỉnh theo dân số | Thường bỏ qua khi mô hình hoá cơ bản |
education |
Định tính (hạng mục) | Hệ đào tạo (Bachelors, HS-grad, 11th, …) | Có thể sử dụng education-num thay thế |
education-num |
Định lượng (số) | Số năm học tương ứng với education |
Phục vụ phân tích định lượng |
marital-status |
Định tính (hạng mục) | Tình trạng hôn nhân (Never-married, Married, Divorced, …) | Có thể nhóm thành “Độc thân”/“Đã kết hôn” |
occupation |
Định tính (hạng mục) | Nghề nghiệp chính (Tech-support, Craft-repair, …) | Dễ bị phân mảnh, nên cân nhắc gom nhóm |
relationship |
Định tính (hạng mục) | Vai trò trong gia đình (Wife, Husband, Own-child, …) | Phản ánh cấu trúc hộ gia đình |
race |
Định tính (hạng mục) | Chủng tộc (White, Black, Asian-Pac-Islander, …) | Liên quan đến phân tích nhân khẩu học |
sex |
Định tính (hạng mục) | Giới tính (Male, Female) | Biến nhị phân |
capital-gain |
Định lượng (số) | Lợi nhuận từ đầu tư (USD) | Phân bố lệch, nhiều giá trị = 0 |
capital-loss |
Định lượng (số) | Khoản lỗ từ đầu tư (USD) | Tương tự capital-gain |
hours-per-week |
Định lượng (số) | Số giờ làm việc trung bình mỗi tuần | Phản ánh mức độ làm việc |
native-country |
Định tính (hạng mục) | Quốc gia gốc | Nên gom “United-States” vs “Other” |
income |
Định tính (hạng mục) | Nhãn mục tiêu: <=50K hoặc >50K |
Biến mục tiêu, dùng cho phân lớp |
dim(my)
## [1] 32561 15
str(my)
## 'data.frame': 32561 obs. of 15 variables:
## $ age : int 39 50 38 53 28 37 49 52 31 42 ...
## $ workclass : chr "State-gov" "Self-emp-not-inc" "Private" "Private" ...
## $ fnlwgt : int 77516 83311 215646 234721 338409 284582 160187 209642 45781 159449 ...
## $ education : chr "Bachelors" "Bachelors" "HS-grad" "11th" ...
## $ education.num : int 13 13 9 7 13 14 5 9 14 13 ...
## $ 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" ...
## $ capital.gain : int 2174 0 0 0 0 0 0 0 14084 5178 ...
## $ capital.loss : int 0 0 0 0 0 0 0 0 0 0 ...
## $ hours.per.week: int 40 13 40 40 40 40 16 45 50 40 ...
## $ native.country: chr "United-States" "United-States" "United-States" "United-States" ...
## $ income : chr "<=50K" "<=50K" "<=50K" "<=50K" ...
head(my)
## age workclass fnlwgt education education.num marital.status
## 1 39 State-gov 77516 Bachelors 13 Never-married
## 2 50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse
## 3 38 Private 215646 HS-grad 9 Divorced
## 4 53 Private 234721 11th 7 Married-civ-spouse
## 5 28 Private 338409 Bachelors 13 Married-civ-spouse
## 6 37 Private 284582 Masters 14 Married-civ-spouse
## occupation relationship race sex capital.gain capital.loss
## 1 Adm-clerical Not-in-family White Male 2174 0
## 2 Exec-managerial Husband White Male 0 0
## 3 Handlers-cleaners Not-in-family White Male 0 0
## 4 Handlers-cleaners Husband Black Male 0 0
## 5 Prof-specialty Wife Black Female 0 0
## 6 Exec-managerial Wife White Female 0 0
## hours.per.week native.country income
## 1 40 United-States <=50K
## 2 13 United-States <=50K
## 3 40 United-States <=50K
## 4 40 United-States <=50K
## 5 40 Cuba <=50K
## 6 40 United-States <=50K
tail(my)
## age workclass fnlwgt education education.num marital.status
## 32556 22 Private 310152 Some-college 10 Never-married
## 32557 27 Private 257302 Assoc-acdm 12 Married-civ-spouse
## 32558 40 Private 154374 HS-grad 9 Married-civ-spouse
## 32559 58 Private 151910 HS-grad 9 Widowed
## 32560 22 Private 201490 HS-grad 9 Never-married
## 32561 52 Self-emp-inc 287927 HS-grad 9 Married-civ-spouse
## occupation relationship race sex capital.gain capital.loss
## 32556 Protective-serv Not-in-family White Male 0 0
## 32557 Tech-support Wife White Female 0 0
## 32558 Machine-op-inspct Husband White Male 0 0
## 32559 Adm-clerical Unmarried White Female 0 0
## 32560 Adm-clerical Own-child White Male 0 0
## 32561 Exec-managerial Wife White Female 15024 0
## hours.per.week native.country income
## 32556 40 United-States <=50K
## 32557 38 United-States <=50K
## 32558 40 United-States >50K
## 32559 40 United-States <=50K
## 32560 20 United-States <=50K
## 32561 40 United-States >50K
any(is.na(my))
## [1] FALSE
Vậy bộ dữ liệu không có giá trị thiếu
my <- data.frame(lapply(my, as.factor))
# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(my, class)
## age workclass fnlwgt education education.num
## "factor" "factor" "factor" "factor" "factor"
## marital.status occupation relationship race sex
## "factor" "factor" "factor" "factor" "factor"
## capital.gain capital.loss hours.per.week native.country income
## "factor" "factor" "factor" "factor" "factor"
# Hàm tạo biểu đồ barplot cho một biến định tính
barplot_categorical <- function(var, varname) {
freq <- table(var)
barplot(freq, las = 2, col = "pink", main = paste("Phân bố biến", varname))
}
barplot_categorical(my$education, "education")
Biểu đồ cột thể hiện sự phân bố trình độ học vấn của các cá nhân trong bộ dữ liệu. Có thể thấy rõ, nhóm có trình độ ‘HS-grad’ (tốt nghiệp trung học) chiếm tỷ lệ lớn nhất, theo sau là nhóm ‘Some-college’ (đã học cao đẳng/đại học nhưng chưa tốt nghiệp) và ‘Bachelors’ (cử nhân). Điều này cho thấy phần lớn dân số trong bộ dữ liệu có trình độ học vấn từ trung học phổ thông trở lên.
barplot_categorical(my$workclass, "workclass")
“Đối với biến workclass, phần lớn các cá nhân làm việc trong khu vực ‘Private’ (tư nhân), với số lượng vượt trội so với các loại hình công việc khác. Các nhóm như ‘Self-emp-not-inc’ (tự làm chủ, không hợp nhất), ‘Local-gov’ (chính quyền địa phương) và ‘State-gov’ (chính quyền tiểu bang) cũng có mặt, nhưng với tỷ lệ thấp hơn đáng kể. Có thể thấy bộ dữ liệu chủ yếu tập trung vào những người lao động trong khu vực tư nhân.
barplot_categorical(my$marital.status, "marital.status")
Phân bố tình trạng hôn nhân cho thấy hai nhóm chiếm đa số là ‘Married-civ-spouse’ (đã kết hôn với vợ/chồng dân sự) và ‘Never-married’ (chưa bao giờ kết hôn), với số lượng cá nhân trong hai nhóm này vượt trội so với các nhóm khác. Nhóm ‘Divorced’ (đã ly hôn) cũng có một số lượng đáng kể. Phần lớn dân số trong bộ dữ liệu hoặc đang trong tình trạng hôn nhân hoặc chưa từng kết hôn
barplot_categorical(my$occupation, "occupation")
barplot_categorical(my$relationship, "relationship")
Biểu đồ phân bố nghề nghiệp cho tháy sự đa dạng trong các nhóm nghề. Các nhóm nghề có số lượng lớn nhất bao gồm ‘Prof-specialty’ (chuyên gia), ‘Craft-repair’ (thợ thủ công/sửa chữa), ‘Exec-managerial’ (quản lý điều hành), và ‘Sales’ (bán hàng). Ngoài ra, các nhóm như ‘Adm-clerical’ (hành chính/văn thư) và ‘Other-service’ (dịch vụ khác) cũng có số lượng đáng kể.
barplot_categorical(my$race, "race")
Biểu đồ phân bố chủng tộc cho thấy một sự chênh lệch rõ rệt về thành phần chủng tộc trong bộ dữ liệu. Nhóm ‘White’ (người da trắng) chiếm số lượng áp đảo, vượt xa tất cả các nhóm chủng tộc khác. Theo sau là nhóm ‘Black’ (người da đen) và các nhóm còn lại như ‘Asian-Pac-Islander’ (người châu Á-Thái Bình Dương) và ‘Amer-Indian-Eskimo’ (người Mỹ gốc da đỏ/Eskimo) có số lượng rất ít
sex_freq <- table(my$sex)
prop_table <- prop.table(sex_freq)
pie(sex_freq, main = "Tỉ lệ giới tính", col = c("green", "lightblue"), labels = paste(names(sex_freq), round(prop_table * 100, 1), "%"))
Biểu đồ tròn thể hiện tỉ lệ giới tính trong bộ dữ liệu. Rõ ràng, số lượng nam giới chiếm đa số với 66.9%, trong khi nữ giới chiếm 33.1%. bộ dữ liệu có sự chênh lệch đáng kể về tỉ lệ giới tính, với số lượng nam giới nhiều hơn gấp đôi so với nữ giới
country <- ifelse(my$native.country == "United-States", "US", "Other")
country_freq <- table(country)
barplot(country_freq, col = "pink", main = "Quốc gia gốc (US vs Others)")
Biểu đồ cột này cho thấy sự phân bố của cá nhân dựa trên quốc gia gốc, được nhóm thành ‘US’ (Hoa Kỳ) và ‘Other’ (các quốc gia khác). Rõ ràng, đại đa số các cá nhân trong bộ dữ liệu có quốc tịch Hoa Kỳ, với số lượng vượt trội hoàn toàn so với những người đến từ các quốc gia khác. Gợi ý rằng bộ dữ liệu chủ yếu tập trung vào dân số trong nước
income_freq <- table(my$income)
barplot(income_freq, col = c("orange", "blue"), main = "Phân bố thu nhập")
Biểu đồ phân bố thu nhập cho thấy rõ sự chênh lệch lớn giữa hai nhóm thu nhập. Đa số các cá nhân trong bộ dữ liệu có mức thu nhập ‘<=50K’ (nhỏ hơn hoặc bằng 50.000 USD mỗi năm), với số lượng áp đảo. Ngược lại, nhóm có thu nhập ‘>50K’ (lớn hơn 50.000 USD mỗi năm) chiếm một tỉ lệ nhỏ hơn đáng kể.Bộ dữ liệu có sự mất cân bằng về lớp (class imbalance) đối với biến mục tiêu thu nhập, với số lượng người có thu nhập thấp chiếm đa số
# Mô tả biến tuổi
my$age <- as.numeric(my$age)
summary(my$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 12.00 21.00 22.58 32.00 73.00
hist(my$age, col = "blue", main = "Biểu đồ tuổi")
mối liên hệ giữa mức quốc tịch và giới tính, ta thực hiện kiểm định Chi bình phương. Kiểm định này giúp ta xác định xem có sự phụ thuộc thống kê giữa hai biến định tính này hay không
my_native.country_sex <- table(my$native.country,my$sex)
chisq.test(my_native.country_sex)
## Warning in chisq.test(my_native.country_sex): Chi-squared approximation may be
## incorrect
##
## Pearson's Chi-squared test
##
## data: my_native.country_sex
## X-squared = 146.81, df = 41, p-value = 7.951e-14
p-value < 7.951e-14: Giá trị p cực kỳ nhỏ.
Kết luận: Tương tự như kiểm định trước, với p-value rất nhỏ, chúng ta bác bỏ giả thuyết không. Có đủ bằng chứng thống kê để kết luận rằng có mối liên hệ có ý nghĩa thống kê giữa quốc tịch và giới tính. Điều này gợi ý rằng trình độ học vấn cao hơn có thể liên quan đến khả năng có thu nhập cao hơn.
kiểm định Chi bình phương để xem xét mối liên hệ giữa trình độ học vấn và giới tính. Mục tiêu là xác định liệu có sự phụ thuộc giữa cấp độ giáo dục và giới tính hay không
my_edu_sex <- table(my$education, my$sex)
chisq.test(my_edu_sex)
##
## Pearson's Chi-squared test
##
## data: my_edu_sex
## X-squared = 297.72, df = 15, p-value < 2.2e-16
p-value < 2.2e-16: Giá trị p cực kỳ nhỏ.
Kết luận: Tương tự như kiểm định trước, với p-value rất nhỏ, chúng ta bác bỏ giả thuyết không. Có đủ bằng chứng thống kê để kết luận rằng có mối liên hệ có ý nghĩa thống kê giữa Trình độ học vấn và Giới tính. Điều này gợi ý rằng trình độ học vấn cao hơn có thể liên quan đến khả năng có thu nhập cao hơn.
Để ước lượng tuổi trung bình của tổng thể từ mẫu dữ liệu, chúng ta sử dụng kiểm định t-test cho một mẫu để xây dựng khoảng tin cậy 95% cho biến age. Khoảng tin cậy này sẽ cung cấp một phạm vi giá trị mà chúng ta tin rằng tuổi trung bình thực sự của tổng thể nằm trong đó
# ước lượng khoảng tin cậy cho tuổi trung bình
age_conf <- t.test(my$age, conf.level = 0.95)
age_conf
##
## One Sample t-test
##
## data: my$age
## t = 298.82, df = 32560, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 22.43222 22.72844
## sample estimates:
## mean of x
## 22.58033
Tuổi trung bình: ~38.58 tuổi
Khoảng tin cậy 95%: [38.43; 38.73]
p-value < 2.2e-16: khác biệt có ý nghĩa.
Để kiểm tra có sự khác biệt có ý nghĩa thống kê về số giờ làm việc trung bình mỗi tuần giữa nam và nữ hay không, thực hiện kiểm định t-test hai mẫu độc lập (Welch Two Sample t-test). Kiểm định này được sử dụng khi giả định phương sai của hai nhóm không bằng nhau
my$hours.per.week <- as.numeric(my$hours.per.week)
hours_test <- t.test(hours.per.week ~ sex, data = my)
hours_test
##
## Welch Two Sample t-test
##
## data: hours.per.week by sex
## t = -43.123, df = 21740, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Female and group Male is not equal to 0
## 95 percent confidence interval:
## -6.242795 -5.699959
## sample estimates:
## mean in group Female mean in group Male
## 36.38186 42.35324
Phụ nữ làm trung bình 36,4 giờ/tuần, nam làm 42,4 giờ/tuần.
Khoảng chênh lệch trung bình là khoảng 6 giờ/tuần (từ 5,7 đến 6,3 giờ).
p-value < 0,0001 ⇒ khác biệt này rất chắc chắn, không phải do ngẫu nhiên.
# Cài đặt thư viện (nếu chưa có)
library(epitools)
# Giả sử dữ liệu của bạn đã nằm trong data.frame my
# Tạo biến phân nhóm: Mỹ vs. Nước ngoài
my$origin <- ifelse(my$native.country == "United-States", "US", "Non-US")
# 1. Tạo bảng chéo giữa income (exposure) và sex (outcome)
tbl_native.country_sex <- table(my$origin, my$sex)
# Kết quả tbl_income_sex:
# Female Male
# <=50K 9592 15128
# >50K 1179 6662
# 2. Tính RR
rr_sex <- riskratio(tbl_native.country_sex)
# 3. Xem kết quả
print(rr_sex)
## $data
##
## Female Male Total
## Non-US 1089 2302 3391
## US 9682 19488 29170
## Total 10771 21790 32561
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Non-US 1.0000000 NA NA
## US 0.9841319 0.9602924 1.008563
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Non-US NA NA NA
## US 0.2066913 0.2101396 0.206983
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Non-US = 1.00: là nhóm tham chiếu (reference), tức là mức nguy cơ có thu nhập >50K được coi là chuẩn.
US = 1.2442: người US có nguy cơ có thu nhập >50K cao hơn khoảng 24.42% so với Non-US.
Khoảng tin cậy (CI 95%): CI = [1.1592 ; 1.3354] không chứa 1, nên khác biệt là có ý nghĩa thống kê.
#Tính odd Ratio
or_sex <- oddsratio(tbl_native.country_sex)
or_sex
## $data
##
## Female Male Total
## Non-US 1089 2302 3391
## US 9682 19488 29170
## Total 10771 21790 32561
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Non-US 1.000000 NA NA
## US 0.952274 0.8822574 1.027281
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Non-US NA NA NA
## US 0.2066913 0.2101396 0.206983
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Non-US: OR = 1.00000
Đây là nhóm gốc để so sánh, nên OR luôn bằng 1.
Cơ hội có thu nhập trên 50K trong nhóm này được dùng làm mốc chuẩn.
US: OR = 1.32359
Nhóm người Mỹ có cơ hội (odds) có thu nhập trên 50K cao hơn khoảng 1.32 lần so với nhóm Non-US.
Hay nói cách khác, người Mỹ có cơ hội cao hơn 32% để đạt thu nhập trên 50K so với người nước ngoài.