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

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

Trong phần này, chúng ta sẽ bắt đầu bằng việc nạp bộ dữ liệu “Adult Income” và thực hiện các bước chuẩn bị ban đầu. Mục tiêu là đảm bảo dữ liệu sẵn sàng cho việc phân tích, bao gồm việc xử lý các giá trị bị thiếu (nếu có) và hiểu rõ cấu trúc của từng biến. Việc nắm vững các đặc điểm cơ bản của bộ dữ liệu là nền tảng để chúng ta có thể tiến hành các phân tích sâu hơn một cách chính xác và hiệu quả

Bộ dữ liệu “Adult Income” được thu thập từ cuộc điều tra dân số Hoa Kỳ, với mục tiêu là dự đoán xem một cá nhân có thu nhập cao mỗi năm hay không dựa trên các đặc điểm cá nhân và nghề nghiệp.

Vì vậy trong phạm vi bộ dữ liệu, tôi sẽ phân tích theo 3 nội dung lớn: - Khám phá mối liên hệ giữa các biến định tính và mức thu nhập - Ước lượng khoản tin cậy cho một số biến định lượng - Thực hiện kiểm định giả thuyết thống kê.

# Đọc dữ liệu
dam <- read.csv("C:/Users/damde/Downloads/adult_clean.csv", header = T)
# Thay thế tất cả dấu ? trong toàn bộ dataframe (chỉ cho biến character)
dam <- dam %>% 
  mutate(across(where(is.character), ~ifelse(. == "?", "Unknown", .)))

1.1.1. Danh sách các biến

names(dam)
##  [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ú thêm
age Số nguyên Tuổi người tham gia khảo sát Biến định lượng liên tục
workclass Định tính Loại hình công việc (tư nhân, nhà nước, tự làm…) Phản ánh thành phần kinh tế
fnlwgt Số nguyên Trọng số mẫu Dùng cho phân tích dân số học chuẩn hóa, thường bỏ qua trong phân tích cơ bản
education Định tính Trình độ học vấn (Bachelors, HS-grad, 11th…) Có tính phân loại theo bậc học
education-num Số nguyên Mức học vấn dưới dạng số hóa Biến thay thế cho education, phục vụ phân tích định lượng
marital-status Định tính Tình trạng hôn nhân Có thể nhóm lại thành “độc thân”, “kết hôn”…
occupation Định tính Nghề nghiệp cụ thể Có nhiều nhóm nghề khác nhau, thường dùng cho phân loại
relationship Định tính Quan hệ trong gia đình Phản ánh vai trò cá nhân trong hộ gia đình
race Định tính Chủng tộc (White, Black, Asian-Pac-Islander…) Phân loại xã hội học
sex Định tính Giới tính Gồm hai nhóm: nam và nữ
capital-gain Số nguyên Lợi nhuận từ đầu tư tài chính Có nhiều giá trị bằng 0, phân bố lệch
capital-loss Số nguyên Khoản lỗ từ đầu tư Tương tự như capital-gain, thường phân bố chéo
hours-per-week Số nguyên Số giờ làm việc mỗi tuần Biến định lượng, phục vụ so sánh năng suất lao động
native-country Định tính Quốc gia gốc Có thể nhóm lại thành “Mỹ” và “nước ngoài”
income Định tính Mức thu nhập ( thấphoặccao`) Biến mục tiêu – nhị phân, phục vụ phân loại

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

Để có cái nhìn tổng quan về quy mô của bộ dữ liệu, chúng ta sẽ kiểm tra số lượng quan sát (số dòng) và số lượng biến (số cột).

dim(dam)
## [1] 32561    15

Kết quả cho thấy bộ dữ liệu bao gồm 32,561 quan sát và 15 biến, một kích thước đủ lớn để thực hiện các phân tích thống kê đáng tin cậy.

1.1.3. Xem tổng thể cấu trúc của dữ liệu

Tiếp theo, lệnh str() được sử dụng để khám phá cấu trúc chi tiết của dataframe. Lệnh này cung cấp thông tin về kiểu dữ liệu của từng biến như int cho số nguyên, chr cho chuỗi ký tự) và một vài giá trị mẫu.

str(dam)
## '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  "Low" "Low" "Low" "Low" ...

Qua kết quả, có thể thấy bộ dữ liệu chứa một sự kết hợp đa dạng giữa các biến định lượng (như age, fnlwgt, hours.per.week) và các biến định tính (như workclass, education, sex), phù hợp cho các mô hình phân tích phức tạp.

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

# Tải thư viện knitr nếu chưa có
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
# Hiển thị 6 dòng đầu tiên dưới dạng bảng
dam %>% 
  head() %>% 
  kable(caption = "Bảng 1: Sáu dòng dữ liệu đầu tiên") %>%
  # kable_styling để thêm định dạng và scroll_box để tạo thanh cuộn
  kable_styling(bootstrap_options = "striped", full_width = F) %>%
  scroll_box(width = "100%")
Bảng 1: Sáu dòng dữ liệu đầu tiên
age workclass fnlwgt education education.num marital.status occupation relationship race sex capital.gain capital.loss hours.per.week native.country income
39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States Low
50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States Low
38 Private 215646 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States Low
53 Private 234721 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States Low
28 Private 338409 Bachelors 13 Married-civ-spouse Prof-specialty Wife Black Female 0 0 40 Cuba Low
37 Private 284582 Masters 14 Married-civ-spouse Exec-managerial Wife White Female 0 0 40 United-States Low
# Hiển thị 6 dòng cuối cùng dưới dạng bảng
dam %>% 
  tail() %>% 
  kable(caption = "Bảng 2: Sáu dòng dữ liệu cuối cùng") %>%
  # kable_styling để thêm định dạng và scroll_box để tạo thanh cuộn
  kable_styling(bootstrap_options = "striped", full_width = F) %>%
  scroll_box(width = "100%")
Bảng 2: Sáu dòng dữ liệu cuối cùng
age workclass fnlwgt education education.num marital.status occupation relationship race sex capital.gain capital.loss hours.per.week native.country income
32556 22 Private 310152 Some-college 10 Never-married Protective-serv Not-in-family White Male 0 0 40 United-States Low
32557 27 Private 257302 Assoc-acdm 12 Married-civ-spouse Tech-support Wife White Female 0 0 38 United-States Low
32558 40 Private 154374 HS-grad 9 Married-civ-spouse Machine-op-inspct Husband White Male 0 0 40 United-States High
32559 58 Private 151910 HS-grad 9 Widowed Adm-clerical Unmarried White Female 0 0 40 United-States Low
32560 22 Private 201490 HS-grad 9 Never-married Adm-clerical Own-child White Male 0 0 20 United-States Low
32561 52 Self-emp-inc 287927 HS-grad 9 Married-civ-spouse Exec-managerial Wife White Female 15024 0 40 United-States High

Việc xem xét này giúp xác nhận rằng dữ liệu đã được nạp đúng định dạng và cho phép chúng ta thấy được các giá trị cụ thể trong từng cột, ví dụ như các loại nghề nghiệp, trình độ học vấn và mức thu nhập tương ứng.

1.1.5. Kiểm tra các giá trị NA và xử lý

Một trong những bước quan trọng nhất trong tiền xử lý dữ liệu là kiểm tra sự tồn tại của các giá trị bị thiếu (NA - Not Available). Các giá trị này có thể gây ra lỗi trong quá trình phân tích và cần được xử lý cẩn thận.

any(is.na(dam))
## [1] FALSE

Kết quả FALSE từ lệnh any(is.na(dam)) cho thấy bộ dữ liệu này không chứa bất kỳ giá trị NA nào, đây là một điều kiện thuận lợi cho các bước phân tích tiếp theo.

Sau khi xử lý các giá trị ? và chuyển đổi các biến ký tự thành factor, chúng ta kiểm tra lại kiểu dữ liệu của từng cột để đảm bảo chúng đã sẵn sàng cho mô hình hóa.

dam <- dam %>% 
  mutate(across(where(is.character), as.factor))

Theo đó, kiểm tra lại 1 lần nữa kiểu dữ liệu của từng biến

# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dam, class)
##            age      workclass         fnlwgt      education  education.num 
##      "integer"       "factor"      "integer"       "factor"      "integer" 
## marital.status     occupation   relationship           race            sex 
##       "factor"       "factor"       "factor"       "factor"       "factor" 
##   capital.gain   capital.loss hours.per.week native.country         income 
##      "integer"      "integer"      "integer"       "factor"       "factor"

Kết quả xác nhận các biến định tính đã được chuyển thành kiểu factor và các biến định lượng cũng đã được chuyển đổi (lưu ý: bước này sẽ được điều chỉnh lại sau để giữ các biến số ở dạng integer), chuẩn bị cho các bước phân tích mô tả.

1.2. Phân tích mô tả

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

Để có cái nhìn tổng quan về các đặc điểm của những người tham gia khảo sát, chúng ta sẽ tiến hành phân tích mô tả các biến định tính. Bằng cách sử dụng biểu đồ tần số và biểu đồ tròn, chúng ta có thể dễ dàng hình dung được sự phân bố của các nhóm trong từng biến như trình độ học vấn, loại hình công việc, tình trạng hôn nhân, chủng tộc, giới tính và quốc gia gốc. Những biểu đồ này không chỉ giúp chúng ta hiểu được thành phần của bộ dữ liệu mà còn có thể gợi ý những mối liên hệ tiềm năng với biến mục tiêu là thu nhập

# 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 = "lightblue", main = paste("Phân bố biến", varname))
}

Biến education

barplot_categorical(dam$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.

Biến workclass

barplot_categorical(dam$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.

Biến Marital.status

barplot_categorical(dam$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

Biến Occupation

barplot_categorical(dam$occupation, "occupation")

Có thể thấy rõ sự đa dạng trong cơ cấu nghề nghiệp, tuy nhiên có ba nhóm chiếm số lượng lớn nhất và gần như tương đương nhau là ‘Prof-specialty’ (Chuyên gia), ‘Craft-repair’ (Thợ thủ công/sửa chữa), và ‘Exec-managerial’ (Quản lý/Điều hành). Các nhóm có số lượng đáng kể theo sau bao gồm ‘Adm-clerical’ (Hành chính/văn thư), ‘Sales’ (Bán hàng), và ‘Other-service’ (Dịch vụ khác).

Biến Relationship

barplot_categorical(dam$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ể.

Biến Race

barplot_categorical(dam$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

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

sex_freq <- table(dam$sex)
prop_table <- prop.table(sex_freq)
pie(sex_freq, main = "Tỉ lệ giới tính", col = c("lightpink", "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

Biến Native.country (Nhóm lại thành ‘Mỹ và nước ngoài’)

country <- ifelse(dam$native.country == "United-States", "US", "Other")
country_freq <- table(country)
barplot(country_freq, col = "lightgreen", 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

Biến Income

income_freq <- table(dam$income)
barplot(income_freq, col = c("orange", "darkgreen"), 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 thấp (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 cao (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ố

1.2.2. Thống kê biến định lượng

Phân tích biến tuổi

# Mô tả biến tuổi
dam$age <- as.numeric(dam$age)
summary(dam$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   17.00   28.00   37.00   38.58   48.00   90.00
hist(dam$age, col = "lightgreen", main = "Biểu đồ tuổi")

Phần này trình bày thống kê mô tả cho biến định lượng age (tuổi), bao gồm bảng tóm tắt các giá trị chính và biểu đồ histogram để trực quan hóa sự phân bố.

Bảng tóm tắt cho thấy độ tuổi của những người tham gia khảo sát trải dài từ 17 đến 90 tuổi, với độ tuổi trung bình là 38.6 và trung vị (median) là 37. Biểu đồ histogram minh họa rằng phần lớn dân số tập trung ở độ tuổi lao động chính, với mật độ cao nhất trong khoảng từ 30 đến 40 tuổi.

Sự phân bố của tuổi có xu hướng lệch phải, được thể hiện qua phần đuôi của biểu đồ kéo dài về phía các độ tuổi cao hơn và việc giá trị trung bình (38.6) lớn hơn một chút so với trung vị (37). Điều này cho thấy mẫu khảo sát chủ yếu bao gồm những người trong độ tuổi trưởng thành và lao động, phù hợp với mục tiêu của một cuộc khảo sát về thu nhập.

Phân tích biến năm học vấn

# Mô tả biến tuổi
dam$age <- as.numeric(dam$education.num)
summary(dam$education.num)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    9.00   10.00   10.08   12.00   16.00
hist(dam$education.num, col = "lightyellow", main = "Biểu đồ mức học vấn")

Phần này trình bày thống kê mô tả cho biến education.num (số năm học vấn), bao gồm bảng tóm tắt các giá trị chính và biểu đồ histogram.

Bảng tóm tắt cho thấy mức học vấn của người tham gia dao động từ 1 đến 16, với giá trị trung bình (10.08) và trung vị (10.0) rất gần nhau. Tuy nhiên, biểu đồ histogram cho thấy một bức tranh chi tiết hơn: sự phân bố không đồng đều mà tập trung rõ rệt tại một vài cột mốc học vấn chính. Cụ thể, có ba đỉnh cao nhất tại các giá trị 9 (tương ứng Tốt nghiệp Trung học), 10 (Học Cao đẳng/Đại học), và 13 (Cử nhân).

Điều này phản ánh thực tế rằng mọi người có xu hướng dừng lại sau khi hoàn thành các cấp học quan trọng thay vì trải đều qua từng năm học. Sự tập trung lớn tại các mốc này cho thấy đây là những biến số phân loại quan trọng, có khả năng ảnh hưởng đến các khía cạnh khác như nghề nghiệp và thu nhập.

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

Giới tính và thu nhập

Để khám phá mối liên hệ giữa giới tính và mức thu nhập, chúng ta đã thực hiện kiểm định Chi bình phương. Kiểm định này giúp chúng 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

dam_sex_income <- table(dam$sex, dam$income)
chisq.test(dam_sex_income)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  dam_sex_income
## X-squared = 1517.8, df = 1, p-value < 2.2e-16

X-squared = 1517.8: Đây là giá trị thống kê Chi bình phương. Giá trị này càng lớn thì bằng chứng chống lại giả thuyết không càng mạnh.

df = 1: df là bậc tự do của kiểm định (degrees of freedom). Với kiểm định Chi bình phương cho bảng 2x2, bậc tự do là (số hàng - 1) * (số cột - 1), ở đây là (2-1)*(2-1) = 1.

p-value < 2.2e-16: Đây là giá trị p (p-value).

Giải thích: Giá trị p rất nhỏ (nhỏ hơn 0.05, thậm chí rất rất nhỏ). Khi p-value nhỏ hơn mức ý nghĩa alpha (thường là 0.05), chúng ta bác bỏ giả thuyết không (H0).

Giả thuyết không (H0): Giới tính và thu nhập là độc lập (không có mối liên hệ).

Giả thuyết thay thế (H1): Giới tính và thu nhập là phụ thuộc (có mối liên hệ).

Kết luận: Với p-value cực kỳ nhỏ (< 2.2e-16), chúng ta 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 giới tính và mức thu nhập. Điều này có nghĩa là mức thu nhập của một người có xu hướng khác nhau tùy thuộc vào giới tính của họ.

Trình độ học vấn và thu nhập

Tiếp theo, chúng ta tiến hà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à mức thu nhập. Mục tiêu là xác định liệu có sự phụ thuộc giữa cấp độ giáo dục và khả năng đạt được mức thu nhập cao hơn hay không

dam_edu_income <- table(dam$education, dam$income)
chisq.test(dam_edu_income)
## 
##  Pearson's Chi-squared test
## 
## data:  dam_edu_income
## X-squared = 4429.7, df = 15, p-value < 2.2e-16

X-squared = 4429.7: Giá trị thống kê Chi bình phương rất lớn. df = 15: Bậc tự do. Với 16 cấp độ học vấn và 2 nhóm thu nhập, bậc tự do là (16-1)*(2-1) = 15.

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à mức thu nhập. Đ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.

b) Ướ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(dam$age, conf.level = 0.95)
age_conf
## 
##  One Sample t-test
## 
## data:  dam$age
## t = 707.04, df = 32560, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  10.05273 10.10862
## sample estimates:
## mean of x 
##  10.08068

t = 510.39, df = 32560: Giá trị thống kê t và bậc tự do của kiểm định t-test.

p-value < 2.2e-16: Giá trị p rất nhỏ, cho thấy tuổi trung bình của mẫu khác biệt có ý nghĩa thống kê so với giá trị 0 (giả thuyết thay thế là “true mean is not equal to 0”). Tuy nhiên, trong ngữ cảnh ước lượng khoảng tin cậy cho tuổi, p-value này thường ít quan trọng bằng chính khoảng tin cậy.

95 percent confidence interval: 38.43348 38.72981: Đây là kết quả chính.

Giải thích: Chúng ta tin cậy 95% rằng tuổi trung bình thực sự của tổng thể mà mẫu này được lấy từ đó nằm trong khoảng từ 38.43348 tuổi đến 38.72981 tuổi.

sample estimates: mean of x 38.58165: Đây là tuổi trung bình của mẫu dữ liệu (dam$age) mà ta đang phân tích.

Kết luận: Khoảng tin cậy này cung cấp một ước lượng đáng tin cậy về tuổi trung bình của dân số được khảo sát.

c) Ưóc lượng tỷ lệ

# Lập bảng tần số chéo giữa sex và income
table_sex_income <- table(dam$sex, dam$income)

# Số người có thu nhập cao trong từng nhóm
counts_high_income <- c(table_sex_income["Female", "High"],
                        table_sex_income["Male", "High"])

# Tổng số người trong từng nhóm
totals_by_sex <- c(sum(table_sex_income["Female", ]),
                   sum(table_sex_income["Male", ]))

# Kiểm định hiệu tỷ lệ một phía: p1 < p2
test_sex_income <- prop.test(counts_high_income, totals_by_sex,
                             alternative = "less", correct = FALSE)

# Hiển thị kết quả
test_sex_income
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  counts_high_income out of totals_by_sex
## X-squared = 1518.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: less
## 95 percent confidence interval:
##  -1.0000000 -0.1891457
## sample estimates:
##    prop 1    prop 2 
## 0.1094606 0.3057366

tiến hành kiểm định sự khác biệt về tỷ lệ người có thu nhập trên 50.000 USD giữa hai nhóm giới tính nam và nữ. Cụ thể giả thuyết kiểm định được đặt ra như sau

  • H0: Pnữ = Pnam - không có sự khác biệt về tỷ lệ thu nhập cao giữa nam và nữ.

  • H1: Pnữ < Pnam - Tỷ lệ người nữ có thu nhập cao thấp hơn nam.

Kết quả kiểm định cho thấy:

Tỷ lệ nữ có thu nhập cao (>50.000 USD) khoảng 10.95%, trong khi tỷ lệ này ở nam là khoảng 30.57%.

Gía trị thống kê kiểm định Chi-Squared là 1518.9, với P_value < 2.2e - 16, nhỏ hơn rất nhiều so với mức ý nghĩa 0.05.

Khoảng tin cậy 95% cho hiệu Pnữ - Pnam là từ -100% đến -18.91%, cho thấy hiệu số âm là rõ rệt.

Bằng những kết quả này, bác bỏ giả thuyết H0 và kết luận rằng tỷ lệ nữ có thu nhập cao thấp hơn nam một cách có ý nghĩa thống kê.

d) Kiểm định giả thuyết thống kê

Để kiểm tra xem 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, chúng ta đã 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

dam$hours.per.week <- as.numeric(dam$hours.per.week)
hours_test <- t.test(hours.per.week ~ sex, data = dam)
hours_test
## 
##  Welch Two Sample t-test
## 
## data:  hours.per.week by sex
## t = -42.882, df = 21958, 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.292787 -5.742664
## sample estimates:
## mean in group Female   mean in group Male 
##             36.41036             42.42809

t = -43.123, df = 21740: Giá trị thống kê t và bậc tự do của kiểm định Welch t-test. Giá trị t rất lớn về mặt độ lớn (tức là cách xa 0). p-value < 2.2e-16: Giá trị p cực kỳ nhỏ.

Giải thích: Khi p-value nhỏ hơn 0.05, chúng ta bác bỏ giả thuyết không (H0).

Giả thuyết không (H0): Không có sự khác biệt về số giờ làm việc trung bình mỗi tuần giữa nam và nữ.

Giả thuyết thay thế (H1): Có sự khác biệt về số giờ làm việc trung bình mỗi tuần giữa nam và nữ.

alternative hypothesis: true difference in means between group Female and group Male is not equal to 0: Giả thuyết thay thế mà kiểm định đang kiểm tra.

95 percent confidence interval: -6.242795 -5.699959: Khoảng tin cậy cho sự khác biệt về giá trị trung bình giữa nhóm Nữ và nhóm Nam.

Giải thích: Chúng ta tin cậy 95% rằng sự khác biệt thực sự về số giờ làm việc trung bình mỗi tuần (Trung bình Nữ - Trung bình Nam) nằm trong khoảng từ -6.24 giờ đến -5.70 giờ. Vì khoảng này không chứa 0, điều này củng cố kết luận có sự khác biệt có ý nghĩa thống kê.

sample estimates: mean in group Female 36.38186, mean in group Male 42.35324:

Số giờ làm việc trung bình mỗi tuần của nữ là khoảng 36.38 giờ.

Số giờ làm việc trung bình mỗi tuần của nam là khoảng 42.35 giờ.

Kết luận: Với p-value cực kỳ nhỏ và khoảng tin cậy không chứa 0, chúng ta có đủ bằng chứng thống kê để kết luận rằng 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ữ. Cụ thể, trung bình nam giới làm việc nhiều giờ hơn nữ giới.

e) Tính RR (Relative Risk)

library(epitools)

# Tạo biến phân nhóm: Mỹ vs. Nước ngoài
dam$origin <- ifelse(dam$native.country == "United-States", "US", "Non-US")

# Tạo bảng chéo
tbl_origin_income <- table(dam$origin, dam$income)


# Tính tỷ số nguy cơ
library(epitools)
rr_origin <- riskratio(tbl_origin_income)
rr_origin
## $data
##         
##          High   Low Total
##   Non-US  670  2721  3391
##   US     7171 21999 29170
##   Total  7841 24720 32561
## 
## $measure
##         risk ratio with 95% C.I.
##           estimate     lower     upper
##   Non-US 1.0000000        NA        NA
##   US     0.9398656 0.9231541 0.9568797
## 
## $p.value
##         two-sided
##           midp.exact fisher.exact   chi.square
##   Non-US          NA           NA           NA
##   US     2.30395e-10 2.470941e-10 4.969598e-10
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ số nguy cơ (RR Estimate): Tỷ số nguy cơ của nhóm US là 0.94. Con số này có nghĩa là tỷ lệ người có thu nhập thấp trong nhóm gốc Mỹ chỉ bằng 94% so với nhóm không phải gốc Mỹ. Để dễ hình dung, cứ 100 người không phải gốc Mỹ được xếp vào nhóm thu nhập thấp, thì chỉ có khoảng 94 người gốc Mỹ ở trong tình trạng tương tự. Điều này cho thấy người gốc Mỹ có khả năng thoát khỏi nhóm thu nhập thấp cao hơn một chút so với nhóm còn lại.”

Tính OR (Odd Ratio)

#Tính odd Ratio
or_origin <- oddsratio(tbl_origin_income)
or_origin
## $data
##         
##          High   Low Total
##   Non-US  670  2721  3391
##   US     7171 21999 29170
##   Total  7841 24720 32561
## 
## $measure
##         odds ratio with 95% C.I.
##           estimate     lower     upper
##   Non-US 1.0000000        NA        NA
##   US     0.7555232 0.6909723 0.8250156
## 
## $p.value
##         two-sided
##           midp.exact fisher.exact   chi.square
##   Non-US          NA           NA           NA
##   US     2.30395e-10 2.470941e-10 4.969598e-10
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ số chênh (OR Estimate): Tỷ số chênh của nhóm US là 0.76. Con số này có nghĩa là khả năng để người Mỹ được xếp vào nhóm có thu nhập thấp chỉ bằng 76% so với người không phải là gốc Mỹ. Hay nói cách khác khả năng của người Mỹ được xếp vào nhóm thu nhập thấp ít hơn 24% so với với người không phải là gốc Mỹ.

Phần 2: Cơ sở lý thuyết và phương pháp Hồi quy

2.1. Cơ sở lỷ thuyết

Để mô hình hóa mối quan hệ giữa các biến độc lập và biến mục tiêu nhị phân income, nghiên cứu này sử dụng họ Mô hình Tuyến tính Tổng quát (Generalized Linear Model - GLM).

GLM là một sự mở rộng của mô hình hồi quy tuyến tính cổ điển, cho phép biến mục tiêu tuân theo các phân phối khác ngoài phân phối chuẩn. Một GLM bao gồm ba thành phần chính:

  1. Thành phần Ngẫu nhiên (Random Component): Xác định phân phối xác suất của biến mục tiêu \(Y\). Trong trường hợp này, \(Y\) là biến nhị phân (0 hoặc 1), do đó nó tuân theo phân phối Bernoulli.

  2. Thành phần Hệ thống (Systematic Component): Là một tổ hợp tuyến tính của các biến độc lập \(X\), được gọi là linear predictor (\(\eta\)): \[\eta_i = \beta_0 + \beta_1X_{i1} + \dots + \beta_kX_{ik}\]

  3. Hàm liên kết (Link Function) \(g(\cdot)\): Là một hàm kết nối giá trị kỳ vọng của biến mục tiêu, \(E(Y_i) = p_i\), với linear predictor. \[g(p_i) = \eta_i\]

Tuy nhiên, có một vấn đề, Xác suất p của một sự kiện luôn bị kẹt trong khoảng từ 0 đến 1 (tức từ 0% đến 100%). Trong khi đo, một mô hình hồi quy tuyến tính bình thường \[\eta_i = \beta_0 + \beta_1X_{i1}\] có thể tạo ra kết quả từ âm vô cùng đến dương vô cùng. Ta không để đặt một thứ bị kẹt [0,1] bằng một thử chạy tự do.

Vì vậy chúng ta cần một phép biến đổi để kéo dãn giá trị xác suất p từ khoảng [0,1] ra toàn bộ trục số. Và chính mỗi mô hình như Logit, Probit, Cloglog là một cách kéo dãn khác nhau. Tuy nhiên, bài không sử dụng mô hình hồi quy phân phối Poisson. Bởi lẽ, sự phù hợp của một mô hình thống kê phụ thuộc vào việc giả định về phân phối xác suất của nó có khớp với bản chất của dữ liệu hay không.

1. Phân phối Bernoulli (Dành cho dữ liệu Nhị phân)

  • Bản chất: Mô hình này xét một phép thử duy nhất chỉ có hai kết quả: “Thất bại” hoặc “Thành công”.

  • Toán học hóa: Để mô hình hóa, ta gán giá trị \(Y=0\) cho “Thất bại” và \(Y=1\) cho “Thành công”. Gọi \(p\) là xác suất “Thành công”, \(P(Y=1) = p\), suy ra xác suất “Thất bại” là \(P(Y=0) = 1-p\).

  • Công thức: Hàm khối xác suất (PMF) của phân phối Bernoulli được xây dựng để thể hiện cả hai trường hợp trên:

    \[P(Y=y) = p^y(1-p)^{1-y}, \quad y \in \{0, 1\}\]

    Công thức này chỉ có ý nghĩa khi biến \(y\) chỉ có thể nhận giá trị 0 hoặc 1. Do đó, về mặt cấu trúc, phân phối Bernoulli được sinh ra để mô tả dữ liệu nhị phân (phân loại).


2. Phân phối Poisson (Dành cho dữ liệu Đếm)

  • Bản chất: Mô hình này xét một quá trình đếm số lần một sự kiện xảy ra trong một khoảng (thời gian, không gian) cố định, với giả định các sự kiện xảy ra độc lập và với một tốc độ trung bình không đổi.

  • Toán học hóa: Gọi \(Y\) là số lần sự kiện xảy ra, \(Y\) có thể nhận các giá trị nguyên không âm \(0, 1, 2, 3, ...\). Gọi \(\lambda\) (lambda) là tốc độ hay số lần xảy ra trung bình của sự kiện trong khoảng đó.

  • Công thức: Dựa trên các tiên đề của quá trình Poisson, hàm khối xác suất của nó được chứng minh là:

    \[P(Y=y) = \frac{e^{-\lambda}\lambda^y}{y!}, \quad y \in \{0, 1, 2, ...\}\]

    \(y\) trong công thức có thể là bất kỳ số nguyên không âm nào, cấu trúc của phân phối Poisson về bản chất là để mô tả số lượng hay tần suất xuất hiện của sự kiện, tức là dữ liệu đếm.

2.2.Các hàm liên kết và mô hình cụ thể

2.2.1. Mô hình Logit (Logistic Regression)

Mô hình Logit sử dụng hàm liên kết là hàm logit, tức logarit của tỷ số chênh (log-odds).

  • Hàm liên kết: \[g(p_i) = \ln\left(\frac{p_i}{1-p_i}\right) = \eta_i\]
  • Hàm xác suất (ngược của hàm liên kết): \[p_i = \frac{e^{\eta_i}}{1+e^{\eta_i}} = \frac{1}{1+e^{-\eta_i}}\] Đây chính là hàm phân phối tích lũy (CDF) của phân phối Logistic. Thuộc tính toán học này cho phép diễn giải hệ số \(\beta\) dưới dạng Tỷ số chênh (Odds Ratio), làm cho mô hình trở nên rất trực quan.

2.2.2. Mô hình Probit

Mô hình Probit sử dụng hàm liên kết là hàm ngược của phân phối chuẩn tích lũy (Inverse Standard Normal CDF), ký hiệu là \(\Phi^{-1}\).

  • Hàm liên kết: \[g(p_i) = \Phi^{-1}(p_i) = \eta_i\]

  • Hàm xác suất: \[p_i = \Phi(\eta_i) = \int_{-\infty}^{\eta_i} \frac{1}{\sqrt{2\pi}} e^{-t^2/2} \,dt\] Hệ số của mô hình Probit thể hiện sự thay đổi trên thang đo Z-score, do đó khó diễn giải trực tiếp hơn Logit.

2.2.3. Mô hình Cloglog

Mô hình này sử dụng hàm liên kết là hàm complementary log-log.

  • Hàm liên kết: \[g(p_i) = \ln(-\ln(1-p_i)) = \eta_i\]
  • Hàm xác suất: \[p_i = 1 - e^{-e^{\eta_i}}\] Mô hình này có tính bất đối xứng và thường được sử dụng trong các lĩnh vực đặc thù như phân tích sự sống.

Phần 3: Xây dựng Mô hình Hồi quy Dự báo Thu nhập

3.1. Lựa chọn mô hình và chuẩn bị dữ liệu

Biến mục tiêu income của chúng ta là một biến nhị phân (chỉ nhận hai giá trị thấp hoặc cao). Việc sử dụng mô hình hồi quy tuyến tính thông thường (OLS) trong trường hợp này là không phù hợp vì có thể dẫn đến các vấn đề như xác suất dự đoán nằm ngoài khoảng [0, 1] và phương sai sai số thay đổi (heteroscedasticity).

Vì vậy, chúng tôi sẽ sử dụng các mô hình phù hợp cho biến mục tiêu nhị phân, bao gồm:

  • Mô hình Xác suất Tuyến tính (LPM): Dùng làm mô hình cơ sở để so sánh vì tính đơn giản và dễ diễn giải.

  • Mô hình Logit (Hồi quy Logistic): Mô hình tiêu chuẩn, mô hình hóa log-odds của biến cố.

  • Mô hình Probit: Một lựa chọn thay thế phổ biến cho mô hình Logit.

Thêm vào đó, chúng ta sẽ sử dụng các biến độc lập sau đây cho mô hình đa biến:

  • Biến định lượng: age, education.num, hours.per.week.

  • Biến định tính: sex, workclass

Trước hết, chúng ta cần tạo một biến số income_numeric (với 1 = cao, 0 = thấp) để phục vụ cho việc chạy mô hình.

# Tạo biến mục tiêu dạng số
dam$income_numeric <- ifelse(dam$income == "High", 1, 0)

# Kiểm tra
table(dam$income, dam$income_numeric)
##       
##            0     1
##   High     0  7841
##   Low  24720     0

3.2. Phân tích hồi quy đơn biến

Các phần trước đó kiểm định song biến xác nhận sự tồn tại của mối liên hệ giữa các yếu tố độc lập và biến thu nhập, phần này sẽ tiến hành phân tích hồi quy đơn biến. Mục đích là để lượng hóa mức độ ảnh hưởng “thô” (unadjusted) của từng yếu tố riêng lẻ lên khả năng có thu nhập cao. Mô hình được sử dụng là hồi quy Logit, với kết quả được diễn giải thông qua Tỷ số chênh (Odds Ratio).

3.2.1. Hồi quy đơn biến với trình độ học vấn

Chúng ta sẽ xem xét tác động của biến định lượng education.num (số năm học vấn) lên thu nhập.

# Chạy mô hình hồi quy Logit đơn biến cho education.num
logit_edu_single <- glm(income_numeric ~ education.num, 
                        data = dam, 
                        family = binomial(link = "logit"))

# Xem kết quả tóm tắt
summary(logit_edu_single)
## 
## Call:
## glm(formula = income_numeric ~ education.num, family = binomial(link = "logit"), 
##     data = dam)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -5.019731   0.070762  -70.94   <2e-16 ***
## education.num  0.364295   0.006277   58.03   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 35948  on 32560  degrees of freedom
## Residual deviance: 31901  on 32559  degrees of freedom
## AIC: 31905
## 
## Number of Fisher Scoring iterations: 4
# Tính Odds Ratio
or_edu <- exp(coef(logit_edu_single)[2])
print(paste("Odds Ratio cho education.num:", round(or_edu, 2)))
## [1] "Odds Ratio cho education.num: 1.44"

Nhận xét:

Tập trung vào 2 điểm chính, Đầu tiên là hệ số estimate, khi nhìn vào dòng education.num, bạn sẽ thấy cột Estimate có giá trị là 0.364. Con số này là Log - odds sẽ hơi khó hiểu. Để có ý nghĩa thực tế, chúng ta cần chuyển nó thành Tỷ số chênh (Odds Ratio - OR) bằng cách lấy hàm mũ exp(0.364) ≈ 1.44.

Khi diễn giải thức tế ra có nghĩa là cứ mối năm trình độ học vấn tăng thêm, khả năng mà một người có thu nhập cao sẽ tăng lên khoảng 44%

Theo đó là mức độ tin cậy của kết quả Pr(>|z|) của dòng education.num, ta thấy giá trị <2e-16 *** là cực kỳ có ý nghĩa thống kê, chứ không phải do may rủi

Thêm vào đó chú ý thêm hệ số chặn. Hệ số chặn (Intercept) của mô hình có giá trị là -5.019, cho thấy rằng đối với nhóm cơ sở – những người không có năm học vấn nào (education.num = 0) – thì khả năng có thu nhập cao là cực kỳ thấp. Về mặt kỹ thuật, giá trị này là log-odds, và khi chuyển đổi nó sang xác suất, kết quả cho thấy một người không có học vấn chỉ có khoảng 0.65% cơ hội đạt được mức thu nhập cao. Do đó, hệ số chặn âm này chủ yếu đóng vai trò là điểm xuất phát của mô hình, làm nền tảng để đánh giá tác động của các năm học vấn tăng thêm.

3.2.2. Hồi quy đơn biến với Giới tính

Tiếp theo, ta xem xét tác động của biến định tính sex lên thu nhập.

# Chạy mô hình hồi quy Logit đơn biến cho sex
logit_sex_single <- glm(income_numeric ~ sex, 
                        data = dam, 
                        family = binomial(link = "logit"))

# Xem kết quả tóm tắt
summary(logit_sex_single)
## 
## Call:
## glm(formula = income_numeric ~ sex, family = binomial(link = "logit"), 
##     data = dam)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -2.09626    0.03086  -67.93   <2e-16 ***
## sexMale      1.27614    0.03418   37.33   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 35948  on 32560  degrees of freedom
## Residual deviance: 34270  on 32559  degrees of freedom
## AIC: 34274
## 
## Number of Fisher Scoring iterations: 4
# Tính Odds Ratio
or_sex <- exp(coef(logit_sex_single)[2])
print(paste("Odds Ratio cho sexMale:", round(or_sex, 2)))
## [1] "Odds Ratio cho sexMale: 3.58"

Nhận xét:

Phân tích hồi quy Logit cho thấy giới tính là một yếu tố có tác động rất mạnh và có ý nghĩa thống kê đến khả năng có thu nhập cao.

Cụ thể, hệ số chặn của mô hình cho thấy mức xác suất cơ sở của nhóm tham chiếu là nữ giới để có thu nhập cao là khoảng 11%. Tuy nhiên, kết quả của biến sexMale cho thấy một sự khác biệt rất lớn: Tỷ số chênh (Odds Ratio) là 3.58, có nghĩa là khả năng để một người nam có thu nhập cao cao hơn 258% so với một người nữ.

Với giá trị p cực kỳ nhỏ (p < 0.001), có thể khẳng định sự khác biệt đáng kể này không phải do ngẫu nhiên mà có ý nghĩa thống kê cao.

3.3. Phân tích Hồi quy Đa biến

Sau khi đã kiểm tra các mối quan hệ riêng lẻ, phần này sẽ xây dựng các mô hình hồi quy đa biến. Mục tiêu chính là để đánh giá tác động của nhiều yếu tố độc lập lên thu nhập một cách đồng thời. Cách tiếp cận này cho phép chúng ta cô lập ảnh hưởng của một biến cụ thể sau khi đã kiểm soát (giữ không đổi) các yếu-tố-khác, từ đó mang lại những kết quả sâu sắc và chính xác hơn so với phân tích đơn biến.

3.3.1. Xây dựng các mô hình hồi quy đa biến

Chúng ta sẽ xây dựng 4 mô hình (LPM, Logit, Probit, Cloglog) với bộ biến độc lập bao gồm cả biến định lượng (age, education.num, hours.per.week) và biến định tính (sex, workclass).

# 1. Mô hình Xác suất Tuyến tính (LPM)
lpm_multi <- lm(income_numeric ~ age + education.num + hours.per.week + sex + workclass, data = dam)

# 2. Mô hình Logit
logit_multi <- glm(income_numeric ~ age + education.num + hours.per.week + sex + workclass, 
                     data = dam, family = binomial(link = "logit"))

# 3. Mô hình Probit
probit_multi <- glm(income_numeric ~ age + education.num + hours.per.week + sex + workclass, 
                      data = dam, family = binomial(link = "probit"))

# 4. Mô hình Cloglog (Complementary Log-log)
cloglog_multi <- glm(income_numeric ~ age + education.num + hours.per.week + sex + workclass, 
                       data = dam, family = binomial(link = "cloglog"))

# Xem kết quả tóm tắt của mô hình chính để diễn giải - Mô hình Logit
summary(logit_multi)
## 
## Call:
## glm(formula = income_numeric ~ age + education.num + hours.per.week + 
##     sex + workclass, family = binomial(link = "logit"), data = dam)
## 
## Coefficients: (1 not defined because of singularities)
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -6.507622   0.120803 -53.870  < 2e-16 ***
## age                         0.351748   0.006671  52.729  < 2e-16 ***
## education.num                     NA         NA      NA       NA    
## hours.per.week              0.030613   0.001291  23.719  < 2e-16 ***
## sexMale                     1.196887   0.037159  32.210  < 2e-16 ***
## workclassLocal-gov         -0.456516   0.090724  -5.032 4.86e-07 ***
## workclassNever-worked     -11.654633 188.096079  -0.062  0.95059    
## workclassPrivate           -0.594716   0.075827  -7.843 4.40e-15 ***
## workclassSelf-emp-inc       0.311675   0.100735   3.094  0.00197 ** 
## workclassSelf-emp-not-inc  -0.651811   0.088905  -7.332 2.27e-13 ***
## workclassState-gov         -0.717569   0.102270  -7.016 2.28e-12 ***
## workclassUnknown           -1.038719   0.110790  -9.376  < 2e-16 ***
## workclassWithout-pay      -12.400688 129.361059  -0.096  0.92363    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 35948  on 32560  degrees of freedom
## Residual deviance: 29197  on 32549  degrees of freedom
## AIC: 29221
## 
## Number of Fisher Scoring iterations: 12

Nhận xét

Bàn về cách đọc các biến này, tác giả sẽ chia làm 2 phần chính để chú ý.

1. Đối với biến định lượng và nhị phân

Đầu tiên có thể thấy education.num có hệ số = 0.353. Tính OR (exp(0.353) ≈ 1.42) và nhận thấy rằng khi giữ nguyên tuổi, giờ làm việc, giới tính và loại công việc thì cứ mỗi năm học vấn tăng thêm, khả năng có thu nhập cao sẽ tăng lên 42%. Tương tự với Hours.per.week có hệ số = 0.0338, ta tính OR được 1.03, nghĩa là khi giữ nguyên tuổi, giới tính, số năm học và loại công việc thì cứ mỗi giờ làm việc tăng thêm, khả năng có thu nhập cao sẽ tăng thêm khoảng 3.43%.

Theo đó với biến định tính nhị phân, chú ý ở sexMale có hệ số = 1.164, khi tính OR đật xấp xỉ 3.20. Lúc này diễn giải sẽ là khi so sánh một người nam và một người nữ có cùng tuổi, học vấn, giờ làm và loại công việc thì người nam có khả năng đạt thu nhập cao hơn 220% (tức gấp 3.2) so với người nữ. Con số này có vẽ thực tế hơn con số 3.58 ở mô hình đơn biến vì nó đã loại bỏ ảnh hưởng của các yếu tố khác.

*2. Diễn giải biến định tính có nhiều mức

Tác giả tập trung vào biến workclass, làm theo 2 bước để có thể diễn giải và nhận xét nó.

  • Bước 1: Xác định nhóm tham chiếu. Nhìn vào hệ số Workclass,… Bạn sẽ thấy một mức của biến worlclass bị thiếu. Trong trường hợp này, đó là workclassFederal-gov (làm cho chính phủ liên bang). Đây chính là nhóm tham chiếu.

  • Bước 2: Diễn giải các nhóm khác xoay quanh nhóm tham chiếu Ví dụ với biến WorkclassPrivate có hệ số = -0.385, khi tính OR ta đạt xấp xỉ 0.68. Lúc này hiểu là “So với người làm cho chính phủ liên ban, người làm trong khu vực tư nhân có khả năng đạt thu nhập cao chỉ bằng 68% khi các yếu tố khác là như nhau. Tương tự với biến workclassSelf-emp-inc có hệ số = 0.176, khi tính OR ta đạt giá trị xấp xỉ 1.19. Khi này ta diễn giải là:”So với người trong chính phủ liên bang thì người tự kinh doanh có đăng ký có khả năng đạt thu nhập cao hơn 19%. Tuy nhiên hãy nhìn vào cột Pr(>|z|). Giá trị p là 0.086, lớn hơn 0.05. Điều này có nghĩa là sự khác biệt này không có ý nghĩa thống kê.

3.3.2. Diễn giải Kết quả Mô hình Logit Đa biến

Mô hình Logit được chọn để diễn giải sâu vì tính phổ biến và khả năng diễn giải trực quan thông qua Tỷ số chênh (Odds Ratios).

# Tính Odds Ratios để diễn giải
multi_odds_ratios <- exp(coef(logit_multi))
print(multi_odds_ratios)
##               (Intercept)                       age             education.num 
##              1.492024e-03              1.421550e+00                        NA 
##            hours.per.week                   sexMale        workclassLocal-gov 
##              1.031087e+00              3.309796e+00              6.334866e-01 
##     workclassNever-worked          workclassPrivate     workclassSelf-emp-inc 
##              8.678752e-06              5.517194e-01              1.365710e+00 
## workclassSelf-emp-not-inc        workclassState-gov          workclassUnknown 
##              5.211013e-01              4.879372e-01              3.539078e-01 
##      workclassWithout-pay 
##              4.115758e-06

3.3.3. Đánh giá và lựa chọn mô hình

# So sánh các mô hình bằng AIC (giá trị thấp hơn là tốt hơn)
aic_multi_values <- data.frame(
  Model = c("LPM", "Logit", "Probit", "Cloglog"),
  AIC = c(AIC(lpm_multi), AIC(logit_multi), AIC(probit_multi), AIC(cloglog_multi))
)
print("AIC của các mô hình đa biến:")
## [1] "AIC của các mô hình đa biến:"
print(aic_multi_values)
##     Model      AIC
## 1     LPM 30435.37
## 2   Logit 29220.74
## 3  Probit 29256.66
## 4 Cloglog 29306.02
# Đánh giá độ chính xác của mô hình tốt nhất (Logit) qua ma trận nhầm lẫn
predicted_probs_multi <- predict(logit_multi, type = "response")
predicted_class_multi <- ifelse(predicted_probs_multi > 0.5, 1, 0)
confusionMatrix_multi <- table(Actual = dam$income_numeric, Predicted = predicted_class_multi)
accuracy_multi <- sum(diag(confusionMatrix_multi)) / sum(confusionMatrix_multi)

print("Ma trận nhầm lẫn cho mô hình Logit đa biến:")
## [1] "Ma trận nhầm lẫn cho mô hình Logit đa biến:"
print(confusionMatrix_multi)
##       Predicted
## Actual     0     1
##      0 23219  1501
##      1  5062  2779
print(paste("Độ chính xác (Accuracy):", round(accuracy_multi, 4)))
## [1] "Độ chính xác (Accuracy): 0.7984"

Về AIC, Các mô hình Logit, Probit và Cloglog đều có chỉ số AIC thấp hơn đáng kể so với mô hình LPM, chứng tỏ chúng phù hợp với dữ liệu hơn. Giữa ba mô hình này, sự khác biệt là không lớn.

Ma trận nhầm lẫn bảo rằng

  • Ô trên-trái (True Negative - TN = 23,151):

Ý nghĩa: Có 23,151 người thực tế có thu nhập thấp (Actual = 0) và mô hình đã dự đoán đúng là họ có thu nhập thấp (Predicted = 0).

Cách nói đơn giản: Đoán đúng 23,151 người thu nhập thấp.

  • Ô dưới-phải (True Positive - TP = 3,085):

Ý nghĩa: Có 3,085 người thực tế có thu nhập cao (Actual = 1) và mô hình đã dự đoán đúng là họ có thu nhập cao (Predicted = 1).

Cách nói đơn giản: Đoán đúng 3,085 người thu nhập cao.

  • Ô trên-phải (False Positive - FP = 1,569):

Ý nghĩa: Đây là lỗi sai loại 1. Có 1,569 người thực tế có thu nhập thấp (Actual = 0), nhưng mô hình lại dự đoán nhầm là họ có thu nhập cao (Predicted = 1).

Cách nói đơn giản: Nhầm 1,569 người thu nhập thấp thành người thu nhập cao.

  • Ô dưới-trái (False Negative - FN = 4,756):

Ý nghĩa: Đây là lỗi sai loại 2. Có 4,756 người thực tế có thu nhập cao (Actual = 1), nhưng mô hình lại dự đoán nhầm là họ có thu nhập thấp (Predicted = 0).

Cách nói đơn giản: Bỏ sót 4,756 người thu nhập cao

Phần 4: Kết luận

4.1. Kết luận

Qua quá trình phân tích dữ liệu bộ “Adult Income”, bài tiểu luận đã rút ra được nhiều kết luận quan trọng. Phân tích mô tả cho thấy sự mất cân bằng trong dữ liệu về giới tính, chủng tộc và đặc biệt là biến thu nhập. Các kiểm định thống kê song biến ban đầu đã khẳng định sự tồn tại của mối liên hệ có ý nghĩa giữa các yếu tố như học vấn, giới tính, số giờ làm việc với mức thu nhập.

Phần phân tích hồi quy đã lượng hóa các mối quan hệ này một cách rõ ràng hơn. Mô hình Logit, được xác định là mô hình phù hợp nhất, cho thấy trình độ học vấn (education.num), tuổi (age), số giờ làm việc hàng tuần (hours.per.week) và giới tính (sex) đều là những yếu tố dự báo quan trọng cho khả năng có thu nhập cao (High). Đáng chú ý, ngay cả khi kiểm soát các yếu tố khác, nam giới vẫn có odds đạt thu nhập cao cao hơn đáng kể so với nữ giới.

4.2. Hạn chế của đề tài

Dữ liệu cắt ngang: Dữ liệu được thu thập tại một thời điểm duy nhất, do đó không thể khẳng định mối quan hệ nhân quả mà chỉ có thể nói về sự liên quan.

Thiếu biến tiềm ẩn (Omitted Variable Bias): Mô hình có thể thiếu các biến quan trọng khác ảnh hưởng đến thu nhập như ngành nghề đào tạo, kinh nghiệm làm việc cụ thể, kỹ năng mềm, hoặc nơi sinh sống.

Vấn đề mất cân bằng dữ liệu: Biến mục tiêu income bị mất cân bằng có thể ảnh hưởng đến hiệu quả của mô hình đối với lớp thiểu số (thu nhập cao).

4.3. Hướng phát triển của đề tài

Áp dụng các mô hình Machine Learning: Sử dụng các thuật toán phức tạp hơn như Random Forest, Gradient Boosting để có thể cải thiện độ chính xác dự báo và khám phá các mối quan hệ phi tuyến.

Kỹ thuật xử lý mất cân bằng: Áp dụng các kỹ thuật như SMOTE (Synthetic Minority Over-sampling Technique) để cải thiện hiệu suất của mô hình trên lớp thiểu số.

Phân tích sâu hơn: Phân tích tác động tương tác giữa các biến (ví dụ: liệu tác động của học vấn lên thu nhập có khác nhau giữa nam và nữ hay không).