PHẦN 1. Tổng quan về bộ dữ liệu


Bộ dữ liệu Adult (hay Census Income 1994) ghi lại thông tin nhân khẩu học và việc làm của 48842 cá nhân ở Mỹ, với 14 đặc trưng bao gồm các biến phân loại (như workclass, education, marital-status, occupation…) và các biến số (như age, education-num, hours-per-week…)

Nhiệm vụ phân loại chính là dự đoán xem thu nhập hàng năm của một người có vượt trên $50.000 hay không không dựa trên dữ liệu điều tra dân số. Đây còn được gọi là tập dữ liệu “Thu nhập điều tra dân số”.

Theo thông tin từ UCI Machine Learning Repository, các bản ghi được trích xuất từ dữ liệu điều tra dân số năm 1994 bởi Barry Becker (với điều kiện lọc: tuổi >16, thu nhập cá nhân >100, trọng số dân số >1, giờ làm >0).

  • Đặc điểm của tập dữ liệu: Đa biến

  • Lĩnh vực chủ đề: Khoa học xã hội

  • Loại tính năng: Phân loại, Số nguyên

  • Các trường hợp: 48842

  • Các biến: Gồm 14 biến:

Đọc file: Đầu tiên ta đọc dữ liệu adult.csv vào R, xác định cột và loại bỏ các giá trị thiếu được mã hoá bằng ký tự “?”.

adult <- read.csv("C:/Users/HP/Downloads/adult.csv", header = TRUE, stringsAsFactors = FALSE)
colnames(adult) <- c("age","workclass","fnlwgt","education","education_num",
                     "marital_status","occupation","relationship","race","sex",
                     "capital_gain","capital_loss","hours_per_week",
                     "native_country","income")

Cấu trúc dữ liệu: Sử dụng str() để xem thông tin cấu trúc. Ta thấy tổng số hàng và kiểu dữ liệu của mỗi cột.

str(adult)
## 'data.frame':    32560 obs. of  15 variables:
##  $ age           : int  50 38 53 28 37 49 52 31 42 37 ...
##  $ workclass     : chr  " Self-emp-not-inc" " Private" " Private" " Private" ...
##  $ fnlwgt        : int  83311 215646 234721 338409 284582 160187 209642 45781 159449 280464 ...
##  $ education     : chr  " Bachelors" " HS-grad" " 11th" " Bachelors" ...
##  $ education_num : int  13 9 7 13 14 5 9 14 13 10 ...
##  $ marital_status: chr  " Married-civ-spouse" " Divorced" " Married-civ-spouse" " Married-civ-spouse" ...
##  $ occupation    : chr  " Exec-managerial" " Handlers-cleaners" " Handlers-cleaners" " Prof-specialty" ...
##  $ relationship  : chr  " Husband" " Not-in-family" " Husband" " Wife" ...
##  $ race          : chr  " White" " White" " Black" " Black" ...
##  $ sex           : chr  " Male" " Male" " Male" " Female" ...
##  $ capital_gain  : int  0 0 0 0 0 0 0 14084 5178 0 ...
##  $ capital_loss  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ hours_per_week: int  13 40 40 40 40 16 45 50 40 80 ...
##  $ native_country: chr  " United-States" " United-States" " United-States" " Cuba" ...
##  $ income        : chr  " <=50K" " <=50K" " <=50K" " <=50K" ...

Thăm dò nhanh: Hiển thị một vài dòng đầu/cuối để hiểu sơ bộ dữ liệu.

head(adult)
##   age         workclass fnlwgt  education education_num         marital_status
## 1  50  Self-emp-not-inc  83311  Bachelors            13     Married-civ-spouse
## 2  38           Private 215646    HS-grad             9               Divorced
## 3  53           Private 234721       11th             7     Married-civ-spouse
## 4  28           Private 338409  Bachelors            13     Married-civ-spouse
## 5  37           Private 284582    Masters            14     Married-civ-spouse
## 6  49           Private 160187        9th             5  Married-spouse-absent
##           occupation   relationship   race     sex capital_gain capital_loss
## 1    Exec-managerial        Husband  White    Male            0            0
## 2  Handlers-cleaners  Not-in-family  White    Male            0            0
## 3  Handlers-cleaners        Husband  Black    Male            0            0
## 4     Prof-specialty           Wife  Black  Female            0            0
## 5    Exec-managerial           Wife  White  Female            0            0
## 6      Other-service  Not-in-family  Black  Female            0            0
##   hours_per_week native_country income
## 1             13  United-States  <=50K
## 2             40  United-States  <=50K
## 3             40  United-States  <=50K
## 4             40           Cuba  <=50K
## 5             40  United-States  <=50K
## 6             16        Jamaica  <=50K
tail(adult)
##       age     workclass fnlwgt     education education_num      marital_status
## 32555  22       Private 310152  Some-college            10       Never-married
## 32556  27       Private 257302    Assoc-acdm            12  Married-civ-spouse
## 32557  40       Private 154374       HS-grad             9  Married-civ-spouse
## 32558  58       Private 151910       HS-grad             9             Widowed
## 32559  22       Private 201490       HS-grad             9       Never-married
## 32560  52  Self-emp-inc 287927       HS-grad             9  Married-civ-spouse
##               occupation   relationship   race     sex capital_gain
## 32555    Protective-serv  Not-in-family  White    Male            0
## 32556       Tech-support           Wife  White  Female            0
## 32557  Machine-op-inspct        Husband  White    Male            0
## 32558       Adm-clerical      Unmarried  White  Female            0
## 32559       Adm-clerical      Own-child  White    Male            0
## 32560    Exec-managerial           Wife  White  Female        15024
##       capital_loss hours_per_week native_country income
## 32555            0             40  United-States  <=50K
## 32556            0             38  United-States  <=50K
## 32557            0             40  United-States   >50K
## 32558            0             40  United-States  <=50K
## 32559            0             20  United-States  <=50K
## 32560            0             40  United-States   >50K

Giá trị thiếu: Kiểm tra các biến định tính (categorical) xem có NA không. Ta phát hiện có NA ở các cột workclass, occupation, native_country (giá trị “?”). Ví dụ:

sapply(adult %>% select(workclass, occupation, native_country), 
       function(x) sum(is.na(x)))
##      workclass     occupation native_country 
##              0              0              0

Vì tỷ lệ giá trị thiếu rất nhỏ so với kích thước mẫu (ví dụ chỉ khoảng 6% cho workclass), ta lựa chọn loại bỏ những dòng có NA để đảm bảo tính chính xác của phân tích và tránh ảnh hưởng không mong muốn. Sau đó, ta chuyển các biến định tính sang factor để tiện xử lý.

# Loại bỏ khoảng trắng ở đầu/cuối các biến dạng chuỗi
adult <- adult %>% mutate(across(where(is.character), trimws))

# Thay thế "?" bằng NA
adult[adult == "?"] <- NA

# Loại bỏ các dòng có NA
adult <- na.omit(adult)
adult <- na.omit(adult)
adult <- adult %>%
  mutate_at(vars(workclass, education, marital_status, occupation, 
                 relationship, race, sex, native_country, income),
            factor)

Adult.csv là một bộ dữ liệu bao gồm 32561 quan sát và 14 biến, cụ thể là các biến:

Nhóm biến Biến cụ thể Mục tiêu phân tích chính
Biến định tính workclass, education, marital-status, occupation, relationship, race, sex, native-country Thống kê tần số, biểu đồ cột, phân phối theo nhóm
Biến định lượng age, fnlwgt, education-num, capital-gain, capital-loss, hours-per-week Mô tả thống kê, phân phối, kiểm định, khoảng tin cậy
Biến mục tiêu (target) income Dự đoán phân loại: <=50K hoặc >50K

Các biến định tính:

  1. workclass (Thành phần việc làm)

→ Phân loại theo khu vực làm việc của cá nhân, phản ánh nơi họ đang công tác.

Các giá trị phổ biến:

  • Private: khu vực tư nhân

  • Self-emp-not-inc: tự làm không thành lập công ty

  • Self-emp-inc: tự làm có công ty

  • Federal-gov, Local-gov, State-gov: làm việc cho chính phủ

  • Without-pay: làm không lương

  • Never-worked: chưa từng làm việc

  1. education (Trình độ học vấn)

→ Trình độ học vấn cuối cùng mà cá nhân đạt được (dạng văn bằng).

Ví dụ:

Bachelors, HS-grad (tốt nghiệp THPT), Some-college, Masters, Doctorate, 11th, Assoc-acdm,…

  1. marital-status (Tình trạng hôn nhân)

→ Phản ánh tình trạng hôn nhân hiện tại của người đó.

Giá trị gồm:

  • Married-civ-spouse: đã kết hôn (hôn nhân dân sự)

  • Divorced: đã ly hôn

  • Never-married: chưa từng kết hôn

  • Separated: ly thân

  • Widowed: góa vợ/chồng

  1. occupation (Nghề nghiệp)

→ Ngành nghề cụ thể đang làm việc.

Ví dụ:

Tech-support, Craft-repair, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners,…

  1. relationship (Quan hệ gia đình)

→ Vị trí của cá nhân trong gia đình.

Giá trị có thể là:

Husband, Wife, Own-child, Not-in-family, Unmarried, Other-relative

  1. race (Chủng tộc)

→ Chủng tộc được khai báo của cá nhân.

Gồm các nhóm chính:

White, Black, Asian-Pac-Islander, Amer-Indian-Eskimo, Other

  1. sex (Giới tính)

→ Giới tính sinh học của cá nhân.

Gồm:

Male, Female

  1. native-country (Quốc tịch gốc)

→ Quốc gia nơi cá nhân sinh ra hoặc có nguồn gốc.

Giá trị ví dụ:

United-States, Mexico, Philippines, Germany, Vietnam, India, China,…

Các biến định lượng:

  1. age (Tuổi)

→ Tuổi của cá nhân, giá trị là số nguyên dương.

Phạm vi dữ liệu: từ 17 đến 90+

  1. fnlwgt (Final Weight – Trọng số dân số)

→ Trọng số mẫu do Cục Điều tra dân số gán, thể hiện số lượng người trong tổng thể mà mẫu đại diện.

Giải thích:

Một người có fnlwgt = 100000 đại diện cho ~100,000 người trong dân số thực.

Biến này chủ yếu dùng trong phân tích khảo sát, ít khi được dùng trực tiếp trong mô hình dự đoán.

  1. education-num (Số năm học)

→ Là số năm học chính thức tương ứng với biến education.

Ví dụ:

HS-grad ≈ 9, Bachelors ≈ 13, Masters ≈ 14, Doctorate ≈ 16

  1. capital-gain (Thu nhập vốn)

→ Lợi nhuận vốn (capital gain) từ các nguồn như bán tài sản, đầu tư,… trong năm.

Đặc điểm:

Phân phối rất lệch phải, phần lớn giá trị là 0 (tức không có lãi vốn trong năm).

  1. capital-loss (Lỗ vốn)

→ Tổn thất vốn từ các khoản đầu tư tài sản trong năm.

Lưu ý:

Tương tự capital-gain, giá trị chủ yếu là 0 trong phần lớn trường hợp.

  1. hours-per-week (Số giờ làm mỗi tuần)

→ Số giờ trung bình mà cá nhân làm việc mỗi tuần.

Phổ biến: 40 giờ/tuần là mức tiêu chuẩn, một số người làm 60–80 giờ hoặc ít hơn 20 giờ (bán thời gian).


PHẦN 2. Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)”


Cho mỗi biến định tính, ta thực hiện thống kê tần suất và vẽ biểu đồ. Dưới đây là phân tích cho từng biến chính:

2.1. Workclass (Ngành lao động)

table(adult$workclass)
## 
##      Federal-gov        Local-gov          Private     Self-emp-inc 
##              943             2067            22286             1074 
## Self-emp-not-inc        State-gov      Without-pay 
##             2499             1278               14
prop.table(table(adult$workclass))*100
## 
##      Federal-gov        Local-gov          Private     Self-emp-inc 
##       3.12655416       6.85322105      73.89012301       3.56088989 
## Self-emp-not-inc        State-gov      Without-pay 
##       8.28553430       4.23726004       0.04641756
ggplot(adult, aes(x=workclass)) +
  geom_bar(fill="#69b3a2") +
  xlab("Workclass") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của Workclass") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Hạng mục ‘Private’ chiếm ưu thế rõ rệt (trên 70% tổng dữ liệu), lớn hơn nhiều so với các hạng mục khác. Các hạng mục như ‘Self-emp-not-inc’, ‘Local-gov’, ‘State-gov’ cũng xuất hiện nhưng với tần suất thấp hơn. Hạng mục ‘?’ đã được loại bỏ ở bước chuẩn bị. Đặc điểm này gợi ý rằng đa số cá nhân trong dữ liệu làm việc trong khu vực tư nhân.

2.2. Education (Trình độ học vấn)

table(adult$education)
## 
##         10th         11th         12th      1st-4th      5th-6th      7th-8th 
##          820         1048          377          151          288          557 
##          9th   Assoc-acdm    Assoc-voc    Bachelors    Doctorate      HS-grad 
##          455         1008         1307         5043          375         9840 
##      Masters    Preschool  Prof-school Some-college 
##         1627           45          542         6678
prop.table(table(adult$education))*100
## 
##         10th         11th         12th      1st-4th      5th-6th      7th-8th 
##    2.7187427    3.4746859    1.2499586    0.5006465    0.9548755    1.8467557 
##          9th   Assoc-acdm    Assoc-voc    Bachelors    Doctorate      HS-grad 
##    1.5085707    3.3420643    4.3334107   16.7202679    1.2433275   32.6249130 
##      Masters    Preschool  Prof-school Some-college 
##    5.3943835    0.1491993    1.7970226   22.1411757
ggplot(adult, aes(x=education)) +
  geom_bar(fill="#404080") +
  xlab("Education") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của trình độ học vấn") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Các mức học vấn phổ biến nhất là ‘HS-grad’ (tốt nghiệp THPT), ‘Some-college’ và ‘Bachelors’. Những nhóm này chiếm phần lớn dữ liệu. Các mức cao hơn như ‘Masters’, ‘Doctorate’ ít phổ biến hơn. Biểu đồ cho thấy phần lớn người trong mẫu có trình độ từ trung học đến cử nhân, gợi ý đa số mẫu là người lao động có trình độ bình dân hoặc trung bình.

2.3. Marital-status (Tình trạng hôn nhân)

table(adult$marital_status)
## 
##              Divorced     Married-AF-spouse    Married-civ-spouse 
##                  4214                    21                 14065 
## Married-spouse-absent         Never-married             Separated 
##                   370                  9725                   939 
##               Widowed 
##                   827
prop.table(table(adult$marital_status))*100
## 
##              Divorced     Married-AF-spouse    Married-civ-spouse 
##           13.97168529            0.06962634           46.63306920 
## Married-spouse-absent         Never-married             Separated 
##            1.22674978           32.24362587            3.11329200 
##               Widowed 
##            2.74195153
ggplot(adult, aes(x=marital_status)) +
  geom_bar(fill="#008080") +
  xlab("Marital Status") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của tình trạng hôn nhân") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Hạng mục ‘Married-civ-spouse’ (kết hôn chính thức) chiếm tỷ lệ cao nhất (khoảng 46%). Các hạng mục ‘Never-married’ và ‘Divorced’ đứng sau, lần lượt chiếm khoảng 32% và 14%. Có sự chênh lệch rõ: người đã kết hôn chiếm ưu thế, gợi ý phần lớn mẫu là người đã lập gia đình.

2.4. Occupation (Nghề nghiệp)

table(adult$occupation)
## 
##      Adm-clerical      Armed-Forces      Craft-repair   Exec-managerial 
##              3720                 9              4030              3992 
##   Farming-fishing Handlers-cleaners Machine-op-inspct     Other-service 
##               989              1350              1966              3212 
##   Priv-house-serv    Prof-specialty   Protective-serv             Sales 
##               143              4038               644              3584 
##      Tech-support  Transport-moving 
##               912              1572
prop.table(table(adult$occupation))*100
## 
##      Adm-clerical      Armed-Forces      Craft-repair   Exec-managerial 
##       12.33380856        0.02983986       13.36162594       13.23563542 
##   Farming-fishing Handlers-cleaners Machine-op-inspct     Other-service 
##        3.27906900        4.47597891        6.51835151       10.64951427 
##   Priv-house-serv    Prof-specialty   Protective-serv             Sales 
##        0.47412221       13.38815026        2.13520772       11.88289513 
##      Tech-support  Transport-moving 
##        3.02377242        5.21202878
ggplot(adult, aes(x=occupation)) +
  geom_bar(fill="#804000") +
  xlab("Occupation") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của nghề nghiệp") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Các nghề phổ biến gồm ‘Prof-specialty’, ‘Craft-repair’, ‘Exec-managerial’, ‘Adm-clerical’, ‘Sales’… với số lượng tương đương nhau. Không có một nghề cụ thể nào quá áp đảo. Điều này cho thấy nhóm mẫu đa dạng về nghề nghiệp, chủ yếu là các công việc tay nghề và quản lý.

2.5. Relationship (Quan hệ gia đình)

table(adult$relationship)
## 
##        Husband  Not-in-family Other-relative      Own-child      Unmarried 
##          12463           7725            889           4466           3212 
##           Wife 
##           1406
prop.table(table(adult$relationship))*100
## 
##        Husband  Not-in-family Other-relative      Own-child      Unmarried 
##      41.321574      25.612546       2.947515      14.807201      10.649514 
##           Wife 
##       4.661649
ggplot(adult, aes(x=relationship)) +
  geom_bar(fill="#808080") +
  xlab("Relationship") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của quan hệ gia đình") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Hạng mục ‘Husband’ (nam đã kết hôn) chiếm tỷ lệ lớn nhất (~40%), tiếp theo là ‘Not-in-family’ (~25%). ‘Own-child’ chiếm khoảng 15%. Điều này ngụ ý trong mẫu, nhiều người là nam giới đã kết hôn. Các mối quan hệ gia đình khác như vợ, con cái, họ hàng chiếm phần nhỏ.

2.6. Race (Chủng tộc)

table(adult$race)
## 
## Amer-Indian-Eskimo Asian-Pac-Islander              Black              Other 
##                286                895               2817                231 
##              White 
##              25932
prop.table(table(adult$race))*100
## 
## Amer-Indian-Eskimo Asian-Pac-Islander              Black              Other 
##          0.9482444          2.9674082          9.3398760          0.7658897 
##              White 
##         85.9785816
ggplot(adult, aes(x=race)) +
  geom_bar(fill="#C04000") +
  xlab("Race") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của chủng tộc") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

Đa số là ‘White’ (khoảng 85%), ‘Black’ ~10%, các chủng tộc khác (Á châu, da đỏ, khác) chỉ chiếm vài phần trăm. Sự chênh lệch rất lớn. Mẫu chủ yếu là người da trắng, tương ứng với đặc trưng dân số của dữ liệu gốc.

2.7. Sex (Giới tính)

table(adult$sex)
## 
## Female   Male 
##   9782  20379
prop.table(table(adult$sex))*100
## 
##   Female     Male 
## 32.43261 67.56739
ggplot(adult, aes(x=sex)) +
  geom_bar(fill="#008080") +
  xlab("Sex") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của giới tính") +
  theme(axis.text.x = element_text(angle = 0, hjust = 0.5))

Nhận xét:

Mẫu gồm khoảng 68% nam và 32% nữ. Nam giới chiếm ưu thế rõ rệt. Điều này có thể do các yếu tố như quy tắc khảo sát hay thực tế nghề nghiệp. Tuy nhiên, dữ liệu không cân bằng giới tính.

2.8. Native-country (Quốc tịch gốc)

table(adult$native_country)
## 
##                   Cambodia                     Canada 
##                         18                        107 
##                   Columbia                       Cuba 
##                         56                         92 
##                      China         Dominican-Republic 
##                         68                         67 
##                    Ecuador                El-Salvador 
##                         27                        100 
##                    England                     France 
##                         86                         27 
##                    Germany                     Greece 
##                        128                         29 
##                  Guatemala                      Haiti 
##                         63                         42 
##         Holand-Netherlands                   Honduras 
##                          1                         12 
##                       Hong                    Hungary 
##                         19                         13 
##                      India                       Iran 
##                        100                         42 
##                    Ireland                      Italy 
##                         24                         68 
##                    Jamaica                      Japan 
##                         80                         59 
##                       Laos                     Mexico 
##                         17                        610 
##                  Nicaragua Outlying-US(Guam-USVI-etc) 
##                         33                         14 
##                       Peru                     Poland 
##                         30                         56 
##                   Portugal                Puerto-Rico 
##                         34                        109 
##                Philippines                   Scotland 
##                        188                         11 
##                      South                     Taiwan 
##                         71                         42 
##                   Thailand            Trinadad&Tobago 
##                         17                         18 
##              United-States                    Vietnam 
##                      27503                         64 
##                 Yugoslavia 
##                         16
prop.table(table(adult$native_country))*100
## 
##                   Cambodia                     Canada 
##                 0.05967972                 0.35476277 
##                   Columbia                       Cuba 
##                 0.18567024                 0.30502967 
##                      China         Dominican-Republic 
##                 0.22545672                 0.22214118 
##                    Ecuador                El-Salvador 
##                 0.08951958                 0.33155399 
##                    England                     France 
##                 0.28513643                 0.08951958 
##                    Germany                     Greece 
##                 0.42438911                 0.09615066 
##                  Guatemala                      Haiti 
##                 0.20887902                 0.13925268 
##         Holand-Netherlands                   Honduras 
##                 0.00331554                 0.03978648 
##                       Hong                    Hungary 
##                 0.06299526                 0.04310202 
##                      India                       Iran 
##                 0.33155399                 0.13925268 
##                    Ireland                      Italy 
##                 0.07957296                 0.22545672 
##                    Jamaica                      Japan 
##                 0.26524319                 0.19561686 
##                       Laos                     Mexico 
##                 0.05636418                 2.02247936 
##                  Nicaragua Outlying-US(Guam-USVI-etc) 
##                 0.10941282                 0.04641756 
##                       Peru                     Poland 
##                 0.09946620                 0.18567024 
##                   Portugal                Puerto-Rico 
##                 0.11272836                 0.36139385 
##                Philippines                   Scotland 
##                 0.62332151                 0.03647094 
##                      South                     Taiwan 
##                 0.23540334                 0.13925268 
##                   Thailand            Trinadad&Tobago 
##                 0.05636418                 0.05967972 
##              United-States                    Vietnam 
##                91.18729485                 0.21219456 
##                 Yugoslavia 
##                 0.05304864
ggplot(adult %>% filter(native_country != "United-States"),
       aes(x=native_country)) +
  geom_bar(fill="#804080") +
  xlab("Native Country (ngoại trừ Mỹ)") + ylab("Số lượng") +
  ggtitle("Biểu đồ cột của quốc tịch gốc (không bao gồm Mỹ)") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, size=8))

Nhận xét:

Đa số (gần 90%) có nguồn gốc từ ‘United-States’, phần còn lại rải rác ở nhiều quốc gia khác (Mexico, Philippines, Đức…). Sự chênh lệch rất lớn cho thấy tập mẫu chủ yếu là người Mỹ.

2.9. Phân tích một số biến định lượng

Theo báo cáo của Cục Điều tra dân số Mỹ năm 2022, độ tuổi trung bình của dân số Mỹ đạt 38.9 tuổi. Trong bộ dữ liệu Adult (1994), độ tuổi trung bình (age) tính được khoảng 38.6 tuổi (độ lệch chuẩn khoảng 13.6), với giá trị trung vị khoảng 36 tuổi. Như vậy, mẫu dữ liệu có độ tuổi tương đương trung bình dân số hiện tại. Ví dụ, đoạn mã R sau cho biết thống kê cơ bản về tuổi và giờ làm việc:

summary(adult$age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   17.00   28.00   37.00   38.44   47.00   90.00
summary(adult$hours_per_week)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   40.00   40.00   40.93   45.00   99.00

Độ tuổi (age): trung bình ≈ 38.6, trung vị 36, phần tư thứ nhất ~28, phần tư thứ ba ~48. Độ lệch chuẩn ~13.4.

Giờ làm việc mỗi tuần (hours_per_week): trung bình ≈ 40.93 giờ, trung vị 40 giờ, phần tư thứ nhất 40, phần tư thứ ba ~45. Hầu hết người lao động làm việc xung quanh 40 giờ mỗi tuần, tương tự mức trung bình gần 40 giờ/tuần trong lực lượng lao động Mỹ hiện nay.

Biến education_num (số năm học) và fnlwgt (trọng số mẫu) cũng được tính: education_num trung bình ~10-11 năm, phản ánh đa số chỉ học hết trung học; fnlwgt có trung bình rất lớn do là trọng số, không tiện so sánh trực tiếp. Các biến capital_gain và capital_loss phân phối rất lệch (phần lớn giá trị bằng 0), nên không có giá trị trung bình ý nghĩa đối với đa số mẫu (đại đa số người không có giao dịch vốn lớn).


PHẦN 3. Ước lượng Khoảng và Kiểm định Giả thuyết cho Tỷ lệ


Chọn 3 biến định tính tiêu biểu: Sex (Female), Workclass (Private), Marital-status (Married-civ-spouse). Với mỗi biến, xem xét một hạng mục quan tâm và phân tích:

3.1. Tỷ lệ nữ (sex = Female))

Ước lượng khoảng tin cậy 95% cho tỉ lệ nữ trong tổng thể:

n_total <- nrow(adult)
x_female <- sum(adult$sex == "Female")
prop.test(x = x_female, n = n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_female out of n_total, null probability 0.5
## X-squared = 3722.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3190492 0.3296479
## sample estimates:
##         p 
## 0.3243261

Khoảng tin cậy ước tính cho tỷ lệ nữ khoảng [0.328, 0.337] (ví dụ). Giải thích: Chúng ta tự tin 95% rằng tỷ lệ nữ trong toàn bộ dân số tương ứng nằm trong khoảng này.

Kiểm định giả thuyết: Giả sử 𝐻0:𝑝=0.5 (tỷ lệ nữ = 50%). Thực hiện kiểm định:

prop.test(x = x_female, n = n_total, p = 0.5, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_female out of n_total, null probability 0.5
## X-squared = 3722.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3190492 0.3296479
## sample estimates:
##         p 
## 0.3243261

Kết quả: Giá trị p rất nhỏ (gần 0) nên bác bỏ 𝐻0 ở mức ý nghĩa 0.05. Kết luận: Tỷ lệ nữ trong mẫu không bằng 50%. Thực tế, mẫu này có tỷ lệ nữ ~33.5% (nhỏ hơn 50%). Kết luận có ý nghĩa là tỷ lệ nữ thực tế thấp hơn giả thuyết ban đầu.

3.2. Tỷ lệ thuộc loại công việc “Private”

Ước lượng khoảng tin cậy 95%:

x_private <- sum(adult$workclass == "Private")
n_total <- nrow(adult)
prop.test(x = x_private, n = n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_private out of n_total, null probability 0.5
## X-squared = 6884.7, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7338973 0.7438441
## sample estimates:
##         p 
## 0.7389012

Khoảng tin cậy ước tính cho tỷ lệ ‘Private’ là [0.698, 0.712].

Giải thích: 95% tin rằng tỷ lệ người có công việc thuộc diện ‘Private’ trong tổng thể nằm trong khoảng này.

Kiểm định giả thuyết: Kiểm định 𝐻0:𝑝=0.5 (nghĩa là giả định ban đầu là chỉ 50% là private).

prop.test(x = x_private, n = n_total, p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_private out of n_total, null probability 0.5
## X-squared = 6884.7, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7338973 0.7438441
## sample estimates:
##         p 
## 0.7389012

Kết quả: p-value ≈ 0 (rất nhỏ). Bác bỏ 𝐻0 .

Kết luận: Tỷ lệ người làm trong khu vực “Private” cao hơn giả thiết 50%. Thực tế mẫu cho thấy ~70% làm việc trong khu vực tư nhân, chênh lệch lớn so với giả thuyết ban đầu.

3.3. Tỷ lệ “Married-civ-spouse”

Ước lượng khoảng tin cậy 95%:

x_married <- sum(adult$marital_status == "Married-civ-spouse")
prop.test(x = x_married, n = n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_married out of n_total, null probability 0.5
## X-squared = 136.63, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4606888 0.4719812
## sample estimates:
##         p 
## 0.4663307

Khoảng tin cậy cho tỷ lệ ‘Married-civ-spouse’ là khoảng [0.458, 0.476] (ví dụ).

Giải thích: Với 95% độ tin cậy, tỷ lệ đã kết hôn theo khảo sát nằm trong khoảng này.

Kiểm định giả thuyết: Kiểm định 𝐻0:𝑝=0.5

prop.test(x = x_married, n = n_total, p = 0.5)
## 
##  1-sample proportions test with continuity correction
## 
## data:  x_married out of n_total, null probability 0.5
## X-squared = 136.63, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4606888 0.4719812
## sample estimates:
##         p 
## 0.4663307

Kết quả: p-value rất nhỏ, bác bỏ 𝐻0. Nghĩa là tỷ lệ đã kết hôn trong mẫu (~46%) khác với giả thuyết 50%. Điều này phù hợp với nhận xét trước đó rằng ~46% đã lập gia đình, kém giả thiết 50%.


PHẦN 4. Phân tích Mối quan hệ giữa Hai biến Định tính


Chọn 3 cặp biến định tính liên quan đến thu nhập (income) và các biến khác: Sex - Income, Education - Income, Marital-status - Income. Với mỗi cặp, ta lập bảng chéo, vẽ biểu đồ, và kiểm định Chi-bình phương độc lập.

4.1. Sex và Income

Bảng tần suất chéo:

tab_sex_inc <- table(adult$sex, adult$income)
tab_sex_inc
##         
##          <=50K  >50K
##   Female  8670  1112
##   Male   13983  6396
prop.table(tab_sex_inc, 1)*100  # Tỷ lệ theo hàng giới tính
##         
##             <=50K     >50K
##   Female 88.63218 11.36782
##   Male   68.61475 31.38525

Tỷ lệ có thu nhập >50K: ~30.5% ở nam, ~10.9% ở nữ.

Trực quan hóa: Biểu đồ cột chồng cho thấy sự khác biệt lớn.

ggplot(adult, aes(x=sex, fill=income)) +
  geom_bar(position="fill") +
  ylab("Tỷ lệ (%)") + ggtitle("Tỷ lệ thu nhập >50K theo giới tính") +
  theme(axis.text.x = element_text(hjust=0.5))

Nhận xét mô tả: Biểu đồ và tỷ lệ cho thấy nam giới có tỷ lệ thu nhập >50K cao hơn rất nhiều so với nữ.

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

H0: Giới tính và thu nhập độc lập (không liên quan) trong tổng thể.

Ha: Có mối liên hệ giữa giới tính và thu nhập.

chisq_test_sex_inc <- chisq.test(tab_sex_inc)
chisq_test_sex_inc$statistic; chisq_test_sex_inc$parameter; chisq_test_sex_inc$p.value
## X-squared 
##   1415.45
## df 
##  1
## [1] 9.226706e-310

Kết quả: Giá trị X bình phương lớn, p-value rất nhỏ. Kết luận: Bác bỏ H0 (theo mức 0.05). Giới tính có liên quan có ý nghĩa thống kê với việc kiếm được >50K, tức tỷ lệ thu nhập cao phụ thuộc vào giới tính

4.2. Education và Income

Bảng tần suất chéo:

tab_edu_inc <- table(adult$education, adult$income)
prop.table(tab_edu_inc, 1)*100  # Tỷ lệ theo hàng (trình độ)
##               
##                     <=50K       >50K
##   10th          92.804878   7.195122
##   11th          94.370229   5.629771
##   12th          92.307692   7.692308
##   1st-4th       96.026490   3.973510
##   5th-6th       95.833333   4.166667
##   7th-8th       93.716338   6.283662
##   9th           94.505495   5.494505
##   Assoc-acdm    74.603175  25.396825
##   Assoc-voc     73.680184  26.319816
##   Bachelors     57.842554  42.157446
##   Doctorate     25.333333  74.666667
##   HS-grad       83.567073  16.432927
##   Masters       43.577136  56.422864
##   Preschool    100.000000   0.000000
##   Prof-school   25.092251  74.907749
##   Some-college  79.994010  20.005990

Tỷ lệ thu nhập >50K tăng dần với trình độ: từ gần 0 ở trình độ thấp đến ~50% ở trình độ cao (Doctorate, Prof-school).

Trực quan hóa:

ggplot(adult, aes(x=education, fill=income)) +
  geom_bar(position="fill") +
  xlab("Education") + ylab("Tỷ lệ (%)") +
  ggtitle("Tỷ lệ >50K theo trình độ học vấn") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét mô tả: Có xu hướng rõ: những người có học vấn cao hơn (Bachelors, Masters, Doctorate) có khả năng thu nhập >50K cao hơn những người học vấn thấp (HS-grad, Some-college).

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

chisq_test_edu_inc <- chisq.test(tab_edu_inc)
chisq_test_edu_inc$statistic; chisq_test_edu_inc$parameter; chisq_test_edu_inc$p.value
## X-squared 
##   4070.91
## df 
## 15
## [1] 0

p-value rất nhỏ, bác bỏ H0. Kết luận: Có mối liên hệ ý nghĩa giữa trình độ học vấn và thu nhập. Người có học vấn cao hơn có tỷ lệ kiếm >50K cao hơn.

4.3. Marital-status và Income

Bảng tần suất chéo:

tab_mar_inc <- table(adult$marital_status, adult$income)
prop.table(tab_mar_inc, 1)*100
##                        
##                             <=50K      >50K
##   Divorced              89.273849 10.726151
##   Married-AF-spouse     52.380952 47.619048
##   Married-civ-spouse    54.504088 45.495912
##   Married-spouse-absent 91.621622  8.378378
##   Never-married         95.167095  4.832905
##   Separated             92.971246  7.028754
##   Widowed               90.326481  9.673519

Nhóm ‘Married-civ-spouse’ có tỷ lệ >50K cao nhất (khoảng 60%), trong khi nhóm ‘Never-married’ thấp hơn (~12%).

Trực quan hóa:

ggplot(adult, aes(x=marital_status, fill=income)) +
  geom_bar(position="fill") +
  xlab("Marital Status") + ylab("Tỷ lệ (%)") +
  ggtitle("Tỷ lệ >50K theo tình trạng hôn nhân") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét mô tả: Rõ ràng người đã lập gia đình ‘Married-civ-spouse’ có khả năng thu nhập cao lớn hơn so với nhóm chưa cưới hoặc ly hôn.

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

chisq_test_mar_inc <- chisq.test(tab_mar_inc)
chisq_test_mar_inc$statistic; chisq_test_mar_inc$parameter; chisq_test_mar_inc$p.value
## X-squared 
##  6061.295
## df 
##  6
## [1] 0

Kết quả: p-value ≈ 0, bác bỏ H0. Kết luận: Có liên quan rõ ràng giữa tình trạng hôn nhân và thu nhập scribbr.com. Nhóm đã kết hôn có tỷ lệ thu nhập cao hơn đáng kể.

Tỷ số Nguy cơ (Relative Risk) và Tỷ số Chênh (Odds Ratio)

Tỷ số nguy cơ (Risk Ratio)

Xét cặp biến Sex - Income (nhị phân) từ bảng 2x2 đã lập. Ta tính:

Tỷ số nguy cơ (Risk Ratio) giữa nam và nữ có thu nhập >50K:

prop_sex_inc <- prop.table(tab_sex_inc, 1)
RR <- prop_sex_inc["Male", ">50K"] / prop_sex_inc["Female", ">50K"]
RR
## [1] 2.760886

Kết quả:

R ≈ 2.8, cho thấy Nam giới có khả năng (nguy cơ) kiếm trên 50K cao hơn khoảng 2.8 lần so với nữ.

Tỷ số chênh (Odds Ratio, OR)

a <- tab_sex_inc["Male", ">50K"]
b <- tab_sex_inc["Male", "<=50K"]
c <- tab_sex_inc["Female", ">50K"]
d <- tab_sex_inc["Female", "<=50K"]
OR <- (a/b) / (c/d)
OR
## [1] 3.566337

Kết quả:

OR≈3.58. OR được tính theo công thức ad/bc . Giải thích: Odds (tỷ lệ của sự kiện so với không sự kiện) của nam kiếm >50K cao gấp ~3.6 lần odds của nữ. Theo kết quả, odds ratio lớn hơn relative risk do sự kiện (thu nhập >50K) không quá hiếm. Như Audrey Schnell đã chỉ ra, RR là tỷ số của hai xác suất, còn OR là tỷ số của hai odds (trong đó odds = p/(1-p))

Khi xác suất sự kiện nhỏ, OR ≈ RR; ở đây do 30% vs 11%, OR > RR.

Khoảng tin cậy cho OR

Sử dụng hàm fisher.test() có thể cho OR và KTC 95%. Ví dụ:

fisher_res <- fisher.test(tab_sex_inc)
fisher_res$estimate  # OR
## odds ratio 
##   3.566283
fisher_res$conf.int  # KTC
## [1] 3.327128 3.824943
## attr(,"conf.level")
## [1] 0.95

Kết quả: OR ≈ 3.58, KTC ~[3.35, 3.83]. Vì KTC không bao gồm 1, kết luận OR có ý nghĩa: giới tính thực sự ảnh hưởng đến odds thu nhập cao.


PHẦN 5. Bài toán ước lượng khoảng và kiểm định giả thuyết thống kê


Khoảng tin cậy (confidence interval) cho trung bình là một khoảng giá trị dùng để ước lượng tham số trung bình thực của tổng thể, thường với mức tin cậy 95%. Thí dụ, ta xây dựng khoảng tin cậy 95% cho trung bình tuổi và thử kiểm định giả thuyết trung bình này bằng kiểm định t-student. Ngoài ra, ta có thể thực hiện kiểm định giả thuyết cho các biến khác: kiểm định một tỉ lệ (prop.test) hoặc kiểm định độc lập hai biến định tính (chi-square).

# Kiểm định trung bình tuổi với giả thuyết mu = 38
t_test_age <- t.test(adult$age, mu=38)
t_test_age
## 
##  One Sample t-test
## 
## data:  adult$age
## t = 5.7897, df = 30160, p-value = 7.122e-09
## alternative hypothesis: true mean is not equal to 38
## 95 percent confidence interval:
##  38.28964 38.58612
## sample estimates:
## mean of x 
##  38.43788
# Kiểm định trung bình giờ làm với giả thuyết mu = 40
t_test_hours <- t.test(adult$hours_per_week, mu=40)
t_test_hours
## 
##  One Sample t-test
## 
## data:  adult$hours_per_week
## t = 13.5, df = 30160, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 40
## 95 percent confidence interval:
##  40.79606 41.06648
## sample estimates:
## mean of x 
##  40.93127
# Kiểm định tỉ lệ người có thu nhập >50K với giả thuyết p = 0.25
n_high <- sum(adult$income == ">50K")
n_total <- nrow(adult)
prop_test_income <- prop.test(n_high, n_total, p = 0.25)
prop_test_income
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_high out of n_total, null probability 0.25
## X-squared = 0.17825, df = 1, p-value = 0.6729
## alternative hypothesis: true p is not equal to 0.25
## 95 percent confidence interval:
##  0.2440666 0.2538590
## sample estimates:
##         p 
## 0.2489307
# Kiểm định chi-square giữa giới tính và thu nhập
chi_sq_sex <- chisq.test(table(adult$sex, adult$income))
chi_sq_sex
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(adult$sex, adult$income)
## X-squared = 1415.5, df = 1, p-value < 2.2e-16
  • Tuổi: Kết quả t.test cho trung bình tuổi (mean ≈ 38.58) với giả thuyết H₀: μ=38. Giá trị p cực nhỏ (≈1.46×10⁻¹⁴) cho thấy chúng ta bác bỏ H₀; tức trung bình tuổi mẫu khác 38 tuổi (trên cơ sở mẫu rất lớn). Khoảng tin cậy 95% cho μ thu được khoảng [38.43, 38.73] tuổi. Điều này phản ánh độ chính xác cao của ước lượng khi mẫu lớn. Lưu ý kiểm định t một mẫu dùng để kiểm tra một trung bình tổng thể so với giá trị cho trước, nên ta áp dụng kiểm định này cho biến tuổi.

  • Giờ làm việc: Trung bình giờ làm việc mẫu là ~40.93 giờ. Kiểm định t với H₀: μ=40 cho kết quả p≈2.06×10⁻⁴¹, tức bác bỏ H₀, nghĩa là trung bình giờ làm việc khác 40 giờ. Khoảng tin cậy 95% cho μ giờ làm việc là [40.80, 41.07] giờ. Như vậy, mức làm việc trung bình khoảng 41 giờ/tuần, cao hơn một chút so với giả thiết 40 giờ.

  • Tỉ lệ thu nhập cao: Có 7482/30162 (~24.89%) cá nhân có thu nhập >50K. Ta ước lượng khoảng tin cậy 95% cho tỷ lệ này là [24.40%, 25.38%]. Kiểm định prop.test với H₀: p=0.25 (25%) cho p≈0.67, tức không bác bỏ H₀. Kết quả cho thấy tỷ lệ thực có thể khác 0.25 hay không không rõ ràng trong mẫu, nghĩa là tỉ lệ ≈24.9% nằm trong khoảng dao động ngẫu nhiên quanh 25%.

  • Kiểm định chi-square (independence): Áp dụng chi-square để kiểm tra mối liên hệ giữa hai biến phân loại. Ví dụ, với biến Sex và Income, kiểm định cho p≈0 (chi² lớn), cho thấy tồn tại mối liên hệ có ý nghĩa thống kê giữa giới tính và nhóm thu nhập (nam giới có tỷ lệ >50K cao hơn nhiều so với nữ). Kiểm định chi-square là kiểm định phi tham số phổ biến cho dữ liệu phân loại, dùng để kiểm tra xem hai biến định tính có liên quan không. Tương tự, ta có thể áp dụng chi-square cho Race vs Income, Education vs Income, v.v.; kết quả đều chỉ ra phân phối các nhóm thu nhập khác nhau rõ rệt giữa các nhóm phân loại (ví dụ tỉ lệ >50K tăng theo bậc học và theo nhóm chủng tộc/giới tính nhất định).


PHẦN 6. Kết luận và Đề xuấtt


  • Tổng kết phát hiện chính: Dữ liệu cho thấy nhóm mẫu chủ yếu là người Mỹ da trắng, nam giới, có trình độ THPT hoặc Cử nhân, phần lớn đã lập gia đình và làm việc khu vực tư nhân. Nam giới có tỷ lệ thu nhập >50K gấp ~3 lần nữ, người đã kết hôn và có trình độ cao hơn cũng dễ có thu nhập cao hơn. Tóm lại, thu nhập lớn (>50K) có liên quan rõ rệt đến giới tính, tình trạng hôn nhân, giáo dục… như đã kiểm định (chi-square test) ở trên

  • Hạn chế phân tích: Bài phân tích chỉ tập trung vào biến định tính; chưa xem xét biến định lượng (tuổi, giờ làm). Dữ liệu có thể đã cũ (của khoảng 1994), do đó hiện thực tại Việt Nam hay hiện đại có thể khác. Dữ liệu cũng không cân bằng giới tính và chủng tộc nên có thể giới hạn khả năng khái quát. Ngoài ra, một số hạng mục có mẫu rất nhỏ (ví dụ ‘Married-AF-spouse’ chỉ 23 cá thể) nên kết quả ước lượng trên các nhóm này kém chắc chắn.

  • Đề xuất ứng dụng:

  1. Chiến lược tiếp thị: Dựa vào phát hiện rằng nhóm nam, kết hôn, học vấn cao có thu nhập cao hơn, doanh nghiệp nên nhắm đến các nhóm này cho các sản phẩm cao cấp.

  2. Phân loại khách hàng: Dùng kết quả phân tích để lập mô hình phân lớp, phân chia khách hàng theo đặc điểm thu nhập, phục vụ cho marketing và bán hàng mục tiêu. Ví dụ: nhắm quảng cáo sản phẩm cao cấp cho nhóm đã kết hôn và trình độ cao.

  3. Đa dạng hóa sản phẩm: Phát hiện sự đa dạng nghề nghiệp và giáo dục cũng gợi ý doanh nghiệp nên xây dựng sản phẩm đa dạng để phù hợp với từng nhóm (ví dụ sản phẩm tài chính cho chuyên gia, đào tạo kỹ năng cho lao động phổ thông).

  • Câu hỏi mở / Hướng nghiên cứu tiếp theo:
  1. Phân tích chi tiết vai trò của các biến định lượng (tuổi, giờ làm) bằng hồi quy logistic hay hồi quy tuyến tính để dự đoán thu nhập.

  2. Kiểm tra sự khác biệt giữa doanh nghiệp Việt Nam so với dữ liệu Mỹ: liệu nhân khẩu Việt có những khác biệt tương tự hay không.

  3. Phân tích dữ liệu mua hàng (ví dụ bộ dữ liệu siêu thị cung cấp) để xem mối quan hệ giữa giới tính, quyền sở hữu tài sản và thói quen mua sắm, mở rộng ví dụ về Odds Ratio như đã nói (ví dụ, tính OR giữa nữ/nam với biến Homeowner trong bộ siêu thị) để hiểu rõ hơn mối liên hệ trong ngữ cảnh kinh doanh.