1 Phần 1: Tìm hiểu và chuẩn bị dữ liệu

1.1 1. Giới thiệu bộ dữ liệu

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", .)))

1.2 2. Danh sách các biến

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

1.3 3. Số biến và số quan sát

dim(my)
## [1] 32561    15

1.4 4. Xem tổng thể cấu trúc dữ liệu

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" ...

1.5 5. Một vài dòng đầu và dòng cuối

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

1.6 6. Kiểm tra NA

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"

2 Phần 2. Phân tích và mô tả biến định tính

2.1 1. Phân tích mô tả

2.1.1 1.1 Thống kê mô tả biến định tính

# 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))
}

2.2 Biến education

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.

2.3 Biến workclass

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.

2.4 Biến Marital.status

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

2.5 Biến Occupation

barplot_categorical(my$occupation, "occupation")

2.6 Biến Relationship

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ể.

2.7 Biến Race

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

2.8 Biến sex (giới tính)

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

2.9 Biến Native.country (Nhóm lại thành ‘Mỹ và nước ngoà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

2.10 Biến Income

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ố

2.10.1 1.2 Thống kê biến định lượng

# 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")

2.11 Kiểm định Chi bình phương

2.11.1 quốc tịch và giới tính

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.

2.11.2 Trình độ học vấn và Giới tính

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.

2.12 3. ước lượng khoảng tin cậy

Để ướ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.

2.13 4. Kiểm định giả thuyết thống kê

Để 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.

3 Tính RR

# 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ê.

4 Tính OR

#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.