hoangtinhdulieu là bộ dữ liệu chứa thông tin tổng hợp về nhân khẩu học và đặc điểm kinh tế xã hội của khoảng 25.000 người đang sinh sống và làm việc tại Mỹ. Dữ liệu được xây dựng dựa trên nguồn gốc từ Current Population Survey (CPS) – một chương trình khảo sát dân số uy tín được thực hiện hàng năm bởi Cục điều tra dân số Hoa Kỳ (U.S. Census Bureau) phối hợp với Bureau of Labor Statistics.
Bộ dữ liệu đã được trích lọc, xử lý và tái cấu trúc nhằm phục vụ cho mục tiêu phân tích và huấn luyện mô hình học máy trong các nghiên cứu liên quan đến kinh tế học, hành vi lao động và bất bình đẳng thu nhập.
d <-read.csv(file.choose(), header=T)
Dòng lệnh d <- read.csv(file.choose(), header = TRUE)
dùng để đọc dữ liệu từ một file CSV chọn trên máy tính.
file.choose() mở hộp thoại chọn file.read.csv(...) đọc file CSV và trả về dạng bảng dữ liệu
(data frame).header = TRUE nghĩa là dòng đầu tiên của file là tên
các cột.d để sử dụng cho các phân
tích tiếp theo.str(d)
## 'data.frame': 25998 obs. of 12 variables:
## $ age : int 21 33 19 41 52 49 32 28 54 43 ...
## $ CensusWeight : int 433330 278514 236940 112507 89041 189498 323055 31935 88019 69758 ...
## $ learningLevel : chr "Some-college" "HS-grad" "HS-grad" "10th" ...
## $ learningLevel.num : int 10 9 9 6 9 9 9 10 10 12 ...
## $ PartneringState : chr "Never-married" "Divorced" "Never-married" "Married-civ-spouse" ...
## $ FamilyRole : chr "Unmarried" "Own-child" "Own-child" "Husband" ...
## $ Ethnicity : chr "White" "White" "White" "White" ...
## $ Gender : chr "Male" "Female" "Male" "Male" ...
## $ NegativeCapitalFlow: int 0 0 0 0 0 0 0 0 0 0 ...
## $ WeeklyHours : int 40 42 40 60 40 50 40 40 55 40 ...
## $ Nationality : chr "United-States" "United-States" "United-States" "United-States" ...
## $ EarningClass : chr "<=50K" "<=50K" "<=50K" "<=50K" ...
str(...) là viết tắt của structure – dùng để kiểm
tra nhanh thông tin về số dòng, số cột, tên biến và kiểu dữ liệu của
từng biến.
Khi dùng str(d), bạn sẽ biết được:
d có bao nhiêu quan sát (rows) và biến (columns)
Tên của các biến
Kiểu dữ liệu của từng biến (vd: int, chr, factor, num…)
=> Dữ liệu bao gồm: 25998 quan sát và 12 biến, trong đó có 7 biến định tính
variable_explain <- data.frame(
Ten_Bien = c("age", "CensusWeight", "learningLevel", "learningLevel.num", "PartneringState",
"FamilyRole", "Ethnicity", "Gender", "NegativeCapitalFlow", "WeeklyHours",
"Nationality", "EarningClass"),
Y_Nghia = c(
"Độ tuổi của người được khảo sát",
"Đại diện của cá nhân trong mẫu điều tra dân số",
"Trình độ học vấn chính thức (ví dụ: Tốt nghiệp cấp 3, Đại học chưa hoàn thành)",
"Số năm học tập chính quy tương đương với trình độ học vấn",
"Tình trạng hôn nhân hiện tại (Đã kết hôn, Ly thân, Góa vợ/chồng...)",
"Vai trò trong hộ gia đình (ví dụ: Con cái, Không thuộc hộ gia đình)",
"Chủng tộc hoặc nhóm dân tộc (Người da trắng, Châu Á, v.v.)",
"Giới tính của cá nhân (Nam hoặc Nữ)",
"Mức lỗ tài sản phát sinh từ hoạt động đầu tư vốn",
"Số giờ làm việc trung bình trong một tuần",
"Quốc gia nơi cá nhân sinh sống hoặc khai báo là nơi sinh",
"Thu nhập cá nhân mỗi năm"
)
)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
kable(variable_explain, caption = "Giải thích các biến trong bộ dữ liệu")
| Ten_Bien | Y_Nghia |
|---|---|
| age | Độ tuổi của người được khảo sát |
| CensusWeight | Đại diện của cá nhân trong mẫu điều tra dân số |
| learningLevel | Trình độ học vấn chính thức (ví dụ: Tốt nghiệp cấp 3, Đại học chưa hoàn thành) |
| learningLevel.num | Số năm học tập chính quy tương đương với trình độ học vấn |
| PartneringState | Tình trạng hôn nhân hiện tại (Đã kết hôn, Ly thân, Góa vợ/chồng…) |
| FamilyRole | Vai trò trong hộ gia đình (ví dụ: Con cái, Không thuộc hộ gia đình) |
| Ethnicity | Chủng tộc hoặc nhóm dân tộc (Người da trắng, Châu Á, v.v.) |
| Gender | Giới tính của cá nhân (Nam hoặc Nữ) |
| NegativeCapitalFlow | Mức lỗ tài sản phát sinh từ hoạt động đầu tư vốn |
| WeeklyHours | Số giờ làm việc trung bình trong một tuần |
| Nationality | Quốc gia nơi cá nhân sinh sống hoặc khai báo là nơi sinh |
| EarningClass | Thu nhập cá nhân mỗi năm |
variable_explain <- data.frame(...) : Tạo một
bảng dữ liệu (data frame) gồm 2 cột
Ten_Bien: Tên biến trong bộ dữ liệu.
Y_Nghia: Ý nghĩa mô tả của từng biến đó.
kable(variable_explain, caption = "Giải thích các biến"):
Hàm kable() dùng để hiển thị bảng mô tả trên dưới dạng trình bày rõ
ràng, dễ đọc.
caption = "Giải thích các biến" đặt tiêu đề cho bảng
là “Giải thích các biến”.
head(d): Hiển thị 6 dòng đầu của bộ dữ liệu# Hiển thị 6 dòng đầu của bộ dữ liệu
head(d)
## age CensusWeight learningLevel learningLevel.num PartneringState
## 1 21 433330 Some-college 10 Never-married
## 2 33 278514 HS-grad 9 Divorced
## 3 19 236940 HS-grad 9 Never-married
## 4 41 112507 10th 6 Married-civ-spouse
## 5 52 89041 HS-grad 9 Married-civ-spouse
## 6 49 189498 HS-grad 9 Married-civ-spouse
## FamilyRole Ethnicity Gender NegativeCapitalFlow WeeklyHours Nationality
## 1 Unmarried White Male 0 40 United-States
## 2 Own-child White Female 0 42 United-States
## 3 Own-child White Male 0 40 United-States
## 4 Husband White Male 0 60 United-States
## 5 Husband White Male 0 40 United-States
## 6 Husband White Male 0 50 United-States
## EarningClass
## 1 <=50K
## 2 <=50K
## 3 <=50K
## 4 <=50K
## 5 <=50K
## 6 >50K
tail(d): Hiển thị 6 dòng cuối của bộ dữ liệu# Hiển thị 6 dòng cuối của bộ dữ liệu
tail(d)
## age CensusWeight learningLevel learningLevel.num PartneringState
## 25993 34 216864 HS-grad 9 Divorced
## 25994 41 264663 Some-college 10 Separated
## 25995 54 140359 7th-8th 4 Divorced
## 25996 66 186061 Some-college 10 Widowed
## 25997 82 132870 HS-grad 9 Widowed
## 25998 90 77053 HS-grad 9 Widowed
## FamilyRole Ethnicity Gender NegativeCapitalFlow WeeklyHours
## 25993 Unmarried White Female 3770 45
## 25994 Own-child White Female 3900 40
## 25995 Unmarried White Female 3900 40
## 25996 Unmarried Black Female 4356 40
## 25997 Not-in-family White Female 4356 18
## 25998 Not-in-family White Female 4356 40
## Nationality EarningClass
## 25993 United-States <=50K
## 25994 United-States <=50K
## 25995 United-States <=50K
## 25996 United-States <=50K
## 25997 United-States <=50K
## 25998 United-States <=50K
sum(is.na(d))
## [1] 0
sum(is.na(d)): Kiểm tra tổng số giá trị NA trong toàn
bộ bảng.=> Kết quả: Trong bộ dữ liệu không có giá trị thiếu (NA).
# Đọc dữ liệu
d <- read.csv("hoangtinhdulieu.csv")
# Danh sách các biến định tính (categorical variables)
cols_to_factor <- c("learningLevel", "PartneringState", "FamilyRole",
"Ethnicity", "Gender", "Nationality", "EarningClass")
# Chuyển các cột đó sang factor
d[cols_to_factor] <- lapply(d[cols_to_factor], as.factor)
# Kiểm tra lại cấu trúc dữ liệu
str(d)
## 'data.frame': 25998 obs. of 12 variables:
## $ age : int 21 33 19 41 52 49 32 28 54 43 ...
## $ CensusWeight : int 433330 278514 236940 112507 89041 189498 323055 31935 88019 69758 ...
## $ learningLevel : Factor w/ 16 levels "10th","11th",..: 16 12 12 1 12 12 12 16 16 8 ...
## $ learningLevel.num : int 10 9 9 6 9 9 9 10 10 12 ...
## $ PartneringState : Factor w/ 7 levels "Divorced","Married-AF-spouse",..: 5 1 5 3 3 3 3 1 1 3 ...
## $ FamilyRole : Factor w/ 6 levels "Husband","Not-in-family",..: 5 4 4 1 1 1 1 2 2 1 ...
## $ Ethnicity : Factor w/ 5 levels "Amer-Indian-Eskimo",..: 5 5 5 5 5 5 5 5 5 2 ...
## $ Gender : Factor w/ 2 levels "Female","Male": 2 1 2 2 2 2 2 1 2 2 ...
## $ NegativeCapitalFlow: int 0 0 0 0 0 0 0 0 0 0 ...
## $ WeeklyHours : int 40 42 40 60 40 50 40 40 55 40 ...
## $ Nationality : Factor w/ 42 levels "?","Cambodia",..: 40 40 40 40 40 40 40 40 40 40 ...
## $ EarningClass : Factor w/ 2 levels "<=50K",">50K": 1 1 1 1 1 2 1 1 1 1 ...
Đầu tiên, cần xác định các biến có giá trị rời rạc và mang tính phân loại, thường dùng để biểu diễn thông tin định tính như giới tính, học vấn, tình trạng hôn nhân, v.v. Danh sách này sẽ được sử dụng để chuyển sang kiểu dữ liệu factor.
Sau đó, áp dụng hàm lapply(…, as.factor) để chuyển đổi từng biến trong danh sách thành kiểu factor.
Cuối cùng, cập nhật bảng dữ liệu d với các cột đã được chuyển đổi sang dạng phân loại.
Các biến định tính bao gồm:
learningLevel: biểu thị trình độ học vấn với 16 cấp độ khác nhau (ví dụ: HS-grad, Bachelors, Some-college…)
PartneringState: thể hiện tình trạng quan hệ như Married, Divorced, Widowed, Separated, Never-married
FamilyRole: mô tả vị trí của cá nhân trong hộ gia đình, như Own-child, Not-in-family, Husband, Wife…
Ethnicity: gồm 5 nhóm chủng tộc chính trong dữ liệu
Gender: 2 giá trị (Male, Female)
Nationality: quốc gia xuất xứ, với hơn 30 quốc gia (phần lớn là United-States)
EarningClass: phân loại thu nhập cá nhân thành 2 nhóm (<=50K, >50K)
# Danh sách biến định tính thực tế trong file
tbdt <- c("learningLevel", "PartneringState", "FamilyRole",
"Ethnicity", "Gender", "Nationality", "EarningClass")
# Tạo bảng con chỉ gồm các biến định tính
dq <- d[, tbdt]
# Kiểm tra
str(dq)
## 'data.frame': 25998 obs. of 7 variables:
## $ learningLevel : Factor w/ 16 levels "10th","11th",..: 16 12 12 1 12 12 12 16 16 8 ...
## $ PartneringState: Factor w/ 7 levels "Divorced","Married-AF-spouse",..: 5 1 5 3 3 3 3 1 1 3 ...
## $ FamilyRole : Factor w/ 6 levels "Husband","Not-in-family",..: 5 4 4 1 1 1 1 2 2 1 ...
## $ Ethnicity : Factor w/ 5 levels "Amer-Indian-Eskimo",..: 5 5 5 5 5 5 5 5 5 2 ...
## $ Gender : Factor w/ 2 levels "Female","Male": 2 1 2 2 2 2 2 1 2 2 ...
## $ Nationality : Factor w/ 42 levels "?","Cambodia",..: 40 40 40 40 40 40 40 40 40 40 ...
## $ EarningClass : Factor w/ 2 levels "<=50K",">50K": 1 1 1 1 1 2 1 1 1 1 ...
Đây là danh sách (vector) chứa tên các cột – đều là biến định tính.
Lấy toàn bộ các cột trong danh sách tbdt từ bảng dữ liệu d, và tạo ra một bảng mới tên là dq.
=> Kết quả là bảng dq chỉ chứa các biến định tính.
# Tạo bảng giải thích các mức của biến learningLevel
learningLevel_levels <- data.frame(
Gia_tri = c("Preschool", "1st-4th", "5th-6th", "7th-8th", "9th", "10th",
"11th", "12th", "HS-grad", "Some-college", "Assoc-acdm",
"Assoc-voc", "Bachelors", "Masters", "Prof-school", "Doctorate"),
Y_nghia = c(
"Trình độ mầm non",
"Học hết lớp 1 đến lớp 4",
"Học hết lớp 5 hoặc lớp 6",
"Học hết lớp 7 hoặc lớp 8",
"Học hết lớp 9",
"Học hết lớp 10",
"Học hết lớp 11",
"Học hết lớp 12 nhưng không tốt nghiệp",
"Tốt nghiệp trung học phổ thông (HS-grad)",
"Học đại học/cao đẳng nhưng chưa có bằng",
"Bằng cao đẳng học thuật (Associate in Academic Program)",
"Bằng cao đẳng nghề (Associate in Vocational Program)",
"Bằng cử nhân (Đại học)",
"Bằng thạc sĩ",
"Bằng chuyên ngành sau đại học (luật, y khoa…)",
"Bằng tiến sĩ"
)
)
# Hiển thị bảng
knitr::kable(learningLevel_levels, caption = "Giải thích các mức độ trong biến learningLevel")
| Gia_tri | Y_nghia |
|---|---|
| Preschool | Trình độ mầm non |
| 1st-4th | Học hết lớp 1 đến lớp 4 |
| 5th-6th | Học hết lớp 5 hoặc lớp 6 |
| 7th-8th | Học hết lớp 7 hoặc lớp 8 |
| 9th | Học hết lớp 9 |
| 10th | Học hết lớp 10 |
| 11th | Học hết lớp 11 |
| 12th | Học hết lớp 12 nhưng không tốt nghiệp |
| HS-grad | Tốt nghiệp trung học phổ thông (HS-grad) |
| Some-college | Học đại học/cao đẳng nhưng chưa có bằng |
| Assoc-acdm | Bằng cao đẳng học thuật (Associate in Academic Program) |
| Assoc-voc | Bằng cao đẳng nghề (Associate in Vocational Program) |
| Bachelors | Bằng cử nhân (Đại học) |
| Masters | Bằng thạc sĩ |
| Prof-school | Bằng chuyên ngành sau đại học (luật, y khoa…) |
| Doctorate | Bằng tiến sĩ |
learningLevel_levels <- data.frame(…): Tạo một bảng dữ liệu có hai cột: Gia_tri (giá trị gốc trong biến learningLevel) và Y_nghia (ý nghĩa tiếng Việt tương ứng).
Gia_tri = c(…): Tập hợp 16 mức trình độ học vấn được mã hoá trong dữ liệu, ví dụ “Preschool”, “Bachelors”, “Doctorate”…
Y_nghia = c(…): Cung cấp giải thích tiếng Việt cho từng mức trong Gia_tri. Ví dụ “Preschool” tương ứng với “Trình độ mầm non”, “Bachelors” là “Bằng cử nhân”…
knitr::kable(learningLevel_levels, caption = “Giải thích các mức độ trong biến learningLevel”): Dùng hàm kable() để in bảng ra đẹp hơn khi tạo báo cáo R Markdown. caption là tiêu đề hiển thị trên bảng.
# Tạo bảng tần suất cho learningLevel
ts_edu <- table(d$learningLevel)
# Tạo bảng dữ liệu
ts_edu_df <- data.frame(
Gia_tri = names(ts_edu),
Tan_so = as.vector(ts_edu),
Ty_le = round((as.vector(ts_edu) / sum(ts_edu)) * 100, 2)
)
# Hiển thị kết quả
ts_edu_df
## Gia_tri Tan_so Ty_le
## 1 10th 734 2.82
## 2 11th 926 3.56
## 3 12th 328 1.26
## 4 1st-4th 125 0.48
## 5 5th-6th 251 0.97
## 6 7th-8th 506 1.95
## 7 9th 401 1.54
## 8 Assoc-acdm 831 3.20
## 9 Assoc-voc 1104 4.25
## 10 Bachelors 4377 16.84
## 11 Doctorate 342 1.32
## 12 HS-grad 8360 32.16
## 13 Masters 1406 5.41
## 14 Preschool 37 0.14
## 15 Prof-school 482 1.85
## 16 Some-college 5788 22.26
Gia_tri = names(ts_edu): Lấy tên các mức giá trị (mức học vấn) từ bảng tần suất ts_edu, ví dụ: “Preschool”, “Bachelors”, “Doctorate”…
Tan_so = as.vector(ts_edu): Chuyển bảng tần suất thành vector để lưu số lượng xuất hiện của từng mức học vấn.
Ty_le = round((as.vector(ts_edu) / sum(ts_edu)) * 100, 2): Tính tỷ lệ phần trăm của mỗi mức học vấn so với tổng toàn bộ (dựa trên tần suất), rồi làm tròn đến 2 chữ số thập phân.
ts_edu_df: Hiển thị bảng kết quả ts_edu_df, gồm tên mức học vấn, tần suất và tỷ lệ phần trăm tương ứng.
Bộ dữ liệu này ghi nhận nhiều mức trình độ học vấn khác nhau của người tham gia. Trong đó:
3 mức đầu tiên gồm:
10th: 734 người (chiếm 2.82%),
11th: 926 người (chiếm 3.56%),
12th: 328 người (chiếm 1.26%).
3 mức cuối cùng gồm:
Some-college: 5788 người (chiếm 22.26%),
Preschool: 37 người (chiếm 0.14%),
Prof-school: 482 người (chiếm 1.85%).
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Vẽ biểu đồ cột cho biến learningLevel
ggplot(ts_edu_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(color = "white", width = 0.7) +
geom_text(aes(label = Tan_so),
vjust = -0.5, size = 4, fontface = "bold", color = "lightblue") +
labs(
title = "Biểu đồ cột: Phân bố trình độ học vấn (learningLevel)",
x = "Trình độ học vấn",
y = "Tần số"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1)
)
```{r fig.width=12, fig.height=6}: Đây là phần mở đầu của một khối mã R trong R Markdown, thiết lập kích thước hình ảnh đầu ra: chiều rộng 12 đơn vị, chiều cao 6 đơn vị.
library(ggplot2): Nạp thư viện ggplot2 để sử dụng các hàm vẽ biểu đồ trong hệ thống đồ họa ggplot.
ggplot(ts_edu_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) : Khởi tạo biểu đồ cột từ bảng ts_edu_df. Trục x là biến Gia_tri (tên mức học vấn), được sắp xếp theo Tan_so giảm dần. Trục y là Tan_so. Màu sắc của từng cột được phân biệt theo Gia_tri.
geom_col(color = “white”, width = 0.7) : Vẽ các cột biểu đồ với viền trắng và độ rộng 0.7.
geom_text(aes(label = Tan_so), vjust = -0.5, size = 4, fontface = “bold”, color = “black”) : Thêm nhãn số liệu (giá trị tần số) trên đầu mỗi cột, canh chỉnh nhãn hơi cao hơn cột (vjust = -0.5), chữ đậm màu đen và cỡ 4.
labs(…) : Đặt tiêu đề biểu đồ là “Biểu đồ cột: Phân bố trình độ học vấn (learningLevel)”, trục x là “Trình độ học vấn” và trục y là “Tần số”.
theme_minimal(base_size = 12) : Áp dụng giao diện tối giản cho biểu đồ với cỡ chữ cơ bản là 12.
theme(…): Tuỳ chỉnh thêm cho biểu đồ:
plot.title = element_text(hjust = 0.5, face = “bold”): Căn giữa tiêu đề và in đậm.
axis.text.x = element_text(angle = 45, hjust = 1): Xoay nhãn trục x 45 độ, canh lề cho dễ đọc.
library(ggplot2)
# Vẽ biểu đồ cột cho tỷ lệ phần trăm trình độ học vấn
ggplot(ts_edu_df, aes(x = reorder(Gia_tri, -Ty_le), y = Ty_le, fill = Gia_tri)) +
geom_col(color = "white", width = 0.7) +
geom_text(aes(label = paste0(Ty_le, "%")),
vjust = -0.5, size = 4, fontface = "bold", color = "lightblue") +
labs(
title = "Biểu đồ cột: Tỷ lệ trình độ học vấn (learningLevel)",
x = "Trình độ học vấn",
y = "Tỷ lệ (%)"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1)
)
### Nhận xét
HS-grad (tốt nghiệp phổ thông) là trình độ học vấn phổ biến nhất với 10.501 người, chiếm ~32.3% tổng mẫu. Điều này cho thấy phần lớn người tham gia khảo sát chỉ dừng lại ở trình độ trung học.
Some-college (đã học đại học nhưng chưa tốt nghiệp) đứng thứ hai với 7.291 người, tương đương ~22.4%, phản ánh xu hướng khá nhiều người từng tiếp cận bậc học đại học nhưng không hoàn tất.
Bachelors (cử nhân) là trình độ học vấn đầy đủ cấp đại học phổ biến nhất với 5.355 người (~16.5%), cao hơn hẳn so với các trình độ sau đại học.
Các trình độ học vấn thấp như:
11th (lớp 11) – 1.175 người
10th (lớp 10) – 1.067 người
7th-8th – 933 người
→ Những mức này cho thấy còn có một bộ phận dân số không hoàn thành bậc phổ thông.
Các cấp độ sau đại học như:
Masters (thạc sĩ) – 576 người (~1.8%)
Doctorate (tiến sĩ) – 413 người (~1.3%)
Prof-school (chuyên khoa như y, luật) – 514 người (~1.6%)
→ Tổng lại chỉ khoảng 1.500 người (~4.6%), chứng tỏ số người học cao học vẫn là thiểu số.
Các trình độ rất thấp như:
1st-4th (lớp 1–4) – 168 người
Preschool (mẫu giáo) – 51 người
→ Cực kỳ hiếm gặp trong mẫu khảo sát (chưa đến 0.7% tổng số), thường thuộc nhóm người di cư hoặc cao tuổi.
Các trình độ ngắn hạn hoặc liên kết như:
Assoc-voc – 1.382 người
Assoc-acdm – 1.723 người
→ Chiếm khoảng 3.2% và 5.3% tương ứng, thể hiện mô hình giáo dục nghề/ngắn hạn có mặt nhưng không chiếm ưu thế.
# Giải thích các mức của biến PartneringState
marital_levels <- data.frame(
Gia_tri = c("Divorced", "Married-AF-spouse", "Married-civ-spouse",
"Married-spouse-absent", "Never-married", "Separated", "Widowed"),
Y_nghia = c(
"Ly dị",
"Kết hôn với người trong lực lượng vũ trang",
"Đã kết hôn hợp pháp",
"Kết hôn nhưng sống ly thân",
"Chưa từng kết hôn",
"Ly thân có pháp lý",
"Góa"
)
)
knitr::kable(marital_levels, caption = "Giải thích các mức trong biến PartneringState")
| Gia_tri | Y_nghia |
|---|---|
| Divorced | Ly dị |
| Married-AF-spouse | Kết hôn với người trong lực lượng vũ trang |
| Married-civ-spouse | Đã kết hôn hợp pháp |
| Married-spouse-absent | Kết hôn nhưng sống ly thân |
| Never-married | Chưa từng kết hôn |
| Separated | Ly thân có pháp lý |
| Widowed | Góa |
# Tạo bảng tần suất cho PartneringState
ts_marital <- table(d$PartneringState)
# Tạo bảng dữ liệu
ts_marital_df <- data.frame(
Gia_tri = names(ts_marital),
Tan_so = as.vector(ts_marital),
Ty_le = round((as.vector(ts_marital) / sum(ts_marital)) * 100, 2)
)
# Hiển thị kết quả
ts_marital_df
## Gia_tri Tan_so Ty_le
## 1 Divorced 3526 13.56
## 2 Married-AF-spouse 17 0.07
## 3 Married-civ-spouse 12115 46.60
## 4 Married-spouse-absent 334 1.28
## 5 Never-married 8398 32.30
## 6 Separated 812 3.12
## 7 Widowed 796 3.06
Đã ly dị (Divorced): có 3526 người (chiếm 13.56%).
Kết hôn với người trong quân đội (Married-AF-spouse): có 17 người (chiếm 0.07%).
Đã kết hôn hợp pháp (Married-civ-spouse): có 12115 người (chiếm 46.6%).
Ly thân (Married-spouse-absent): có 334 người (chiếm 1.28%).
Chưa từng kết hôn (Never-married): có 8398 người (chiếm 32.3%).
Ly thân có pháp lý (Separated): có 812 người (chiếm 3.12%).
Góa (Widowed): có 796 người (chiếm 3.06%).
ggplot(ts_marital_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "pink") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Tình trạng hôn nhân (PartneringState)",
x = "Tình trạng hôn nhân",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
)
ggplot(ts_marital_df, aes(x = reorder(Gia_tri, Ty_le), y = Ty_le, fill = Gia_tri)) +
geom_col(width = 0.6, color = "lightpink") +
geom_text(aes(label = paste0(Ty_le, "%")),
hjust = -0.1, size = 4, fontface = "bold", color = "lightyellow") +
coord_flip() +
labs(
title = "Biểu đồ cột ngang: Tỷ lệ tình trạng hôn nhân (PartneringState)",
x = "Tình trạng hôn nhân",
y = "Tỷ lệ (%)"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
ggplot(ts_marital_df, aes(x = reorder(Gia_tri, Tan_so), y = Tan_so, fill = Gia_tri)) : Tạo biểu đồ cột từ bảng ts_marital_df. Trục hoành (x) là biến Gia_tri – các mức của tình trạng hôn nhân – được sắp xếp tăng dần theo Tan_so. Trục tung (y) là tần số tương ứng. Mỗi cột có màu khác nhau theo giá trị của Gia_tri.
geom_col(width = 0.6, color = “white”): Vẽ các cột với chiều rộng là 0.6 và viền màu trắng, giúp cột tách biệt rõ ràng.
geom_text(aes(label = Tan_so), hjust = -0.1, size = 4, fontface = “bold”, color = “black”) : Thêm nhãn số liệu (Tan_so) cho từng cột. Nhãn được đặt hơi lệch trái (hjust = -0.1), cỡ chữ 4, in đậm và màu đen.
coord_flip() : Lật hệ trục tọa độ để biểu đồ hiển thị theo chiều ngang – tức là các cột sẽ nằm ngang thay vì dọc.
labs(…) : Đặt tiêu đề biểu đồ là “Biểu đồ cột ngang: Tình trạng hôn nhân (PartneringState)”, trục x là “Tình trạng hôn nhân”, trục y là “Tần số”.
theme_minimal(base_size = 13) : Áp dụng giao diện tối giản (minimal) cho biểu đồ với cỡ chữ mặc định là 13.
theme(plot.title = element_text(hjust = 0.5, face = “bold”), …) Tuỳ chỉnh tiêu đề biểu đồ để căn giữa (hjust = 0.5) và in đậm (face = “bold”).
“Married-civ-spouse” (kết hôn hợp pháp) chiếm 43.94%, cao nhất trong toàn bộ dữ liệu – cho thấy cấu trúc gia đình truyền thống vẫn chiếm ưu thế.
“Never-married” đạt 32.81%, là nhóm lớn thứ hai, phản ánh sự hiện diện mạnh mẽ của người độc thân.
Các nhóm còn lại như “Divorced” (12.29%), “Married-spouse-absent” (4.79%), “Separated” (3.13%), và “Widowed” (3.05%) góp phần tạo nên tính đa dạng trong tình trạng hôn nhân, nhưng đều chiếm tỷ lệ thấp hơn
# Giải thích các mức của biến FamilyRole
FamilyRole_levels <- data.frame(
Gia_tri = c("Husband", "Not-in-family", "Other-relative",
"Own-child", "Unmarried", "Wife"),
Y_nghia = c(
"Chồng",
"Không cùng gia đình (bạn trọ, bạn bè)",
"Họ hàng khác (cháu, cô, chú...)",
"Con ruột",
"Không kết hôn (độc thân, ly dị...)",
"Vợ"
)
)
knitr::kable(FamilyRole_levels, caption = "Giải thích các mức trong biến FamilyRole")
| Gia_tri | Y_nghia |
|---|---|
| Husband | Chồng |
| Not-in-family | Không cùng gia đình (bạn trọ, bạn bè) |
| Other-relative | Họ hàng khác (cháu, cô, chú…) |
| Own-child | Con ruột |
| Unmarried | Không kết hôn (độc thân, ly dị…) |
| Wife | Vợ |
# Tạo bảng tần suất cho FamilyRole
ts_FamilyRole <- table(d$FamilyRole)
# Tạo bảng dữ liệu
ts_FamilyRole_df <- data.frame(
Gia_tri = names(ts_FamilyRole),
Tan_so = as.vector(ts_FamilyRole),
Ty_le = round((as.vector(ts_FamilyRole) / sum(ts_FamilyRole)) * 100, 2)
)
# Hiển thị kết quả
ts_FamilyRole_df
## Gia_tri Tan_so Ty_le
## 1 Husband 10660 41.00
## 2 Not-in-family 6628 25.49
## 3 Other-relative 747 2.87
## 4 Own-child 3979 15.31
## 5 Unmarried 2702 10.39
## 6 Wife 1282 4.93
Biến FamilyRole (mối quan hệ trong hộ gia đình) bao
gồm 6 mức như sau:
Not-in-family):
có 6628 người (chiếm 25.49%).Họ hàng khác (Other-relative): có
747 người (chiếm 2.87%).
Con ruột (Own-child): có 3979 người
(chiếm 15.31%).
Độc thân (Unmarried): có 2702 người
(chiếm 10.39%).
Vợ (Wife): có 1282 người (chiếm
4.93%).
ggplot(ts_FamilyRole_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "skyblue") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Mối quan hệ trong hộ (FamilyRole)",
x = "Mối quan hệ",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
)
ggplot(ts_FamilyRole_df, aes(x = "", y = Ty_le, fill = Gia_tri)) +
geom_col(width = 1, color = "skyblue") +
coord_polar(theta = "y") +
scale_fill_brewer(palette = "Set2") +
labs(title = "Biểu đồ tròn: Mối quan hệ trong hộ") +
geom_text(aes(label = paste0(Ty_le, "%")),
position = position_stack(vjust = 0.5),
size = 4, color = "pink") +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.title = element_blank()
)
coord_polar(theta = “y”) : Chuyển biểu đồ cột thành biểu đồ tròn bằng cách sử dụng hệ tọa độ cực (polar coordinate system), trong đó phần trăm (Ty_le) được xoay theo trục y để tạo ra các phần hình quạt.
scale_fill_brewer(palette = “Set2”) : Áp dụng bảng màu “Set2” từ thư viện RColorBrewer để phân biệt trực quan các phần khác nhau của biểu đồ tròn bằng các màu sắc hài hòa.
theme_void() : Xóa tất cả thành phần nền của biểu đồ (trục, lưới, nhãn trục…), giúp biểu đồ tròn trông gọn gàng và nổi bật hơn.
legend.title = element_blank(): Ẩn tiêu đề của phần chú giải (legend) để giao diện biểu đồ trở nên đơn giản và dễ đọc hơn.
Nhóm “Husband” chiếm tỷ lệ cao nhất với 38.1%, phản ánh vai trò trụ cột của nam giới trong hộ gia đình vẫn còn phổ biến. Điều này có thể liên quan đến thói quen khai báo người đứng đầu hộ là nam giới.
“Not-in-family” xếp thứ hai với 26.4%, cho thấy có nhiều cá nhân sống độc lập hoặc không thuộc hộ truyền thống – phản ánh xu hướng sống đơn thân trong xã hội hiện đại.
“Own-child” chiếm 15.7%, cho thấy tỷ lệ người phụ thuộc đáng kể trong hộ, trong khi “Wife” chỉ đạt 7.2%, có thể do nam giới là người được khảo sát nhiều hơn.
Các nhóm “Unmarried” (11.2%) và “Other-relative” (1.4%) có tỷ lệ thấp, nhưng góp phần làm rõ tính đa dạng trong cấu trúc hộ gia đình hiện nay. ## Biến Ethnicity
# Giải thích các mức của biến Ethnicity
Ethnicity_levels <- data.frame(
Gia_tri = c("Amer-Indian-Eskimo", "Asian-Pac-Islander", "Black", "Other", "White"),
Y_nghia = c(
"Người da đỏ/Thổ dân Bắc Mỹ",
"Người châu Á hoặc dân đảo Thái Bình Dương",
"Người da đen",
"Khác",
"Người da trắng"
)
)
knitr::kable(Ethnicity_levels, caption = "Giải thích các mức trong biến Ethnicity")
| Gia_tri | Y_nghia |
|---|---|
| Amer-Indian-Eskimo | Người da đỏ/Thổ dân Bắc Mỹ |
| Asian-Pac-Islander | Người châu Á hoặc dân đảo Thái Bình Dương |
| Black | Người da đen |
| Other | Khác |
| White | Người da trắng |
# Tạo bảng tần suất cho Ethnicity
ts_Ethnicity <- table(d$Ethnicity)
# Tạo bảng dữ liệu
ts_Ethnicity_df <- data.frame(
Gia_tri = names(ts_Ethnicity),
Tan_so = as.vector(ts_Ethnicity),
Ty_le = round((as.vector(ts_Ethnicity) / sum(ts_Ethnicity)) * 100, 2)
)
# Hiển thị kết quả
ts_Ethnicity_df
## Gia_tri Tan_so Ty_le
## 1 Amer-Indian-Eskimo 245 0.94
## 2 Asian-Pac-Islander 805 3.10
## 3 Black 2451 9.43
## 4 Other 221 0.85
## 5 White 22276 85.68
Biến Ethnicity (chủng tộc) có 5 nhóm như sau:
Amer-Indian-Eskimo): 245 người (chiếm 0.94%).Người châu Á/Thái Bình Dương
(Asian-Pac-Islander): 805 người (chiếm 3.1%).
Người da đen (Black): 2451 người
(chiếm 9.43%).
Khác (Other): 221 người (chiếm
0.85%).
Người da trắng (White): 22276 người
(chiếm 85.68%).
ggplot(ts_Ethnicity_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "lightgreen") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Chủng tộc (Ethnicity)",
x = "Chủng tộc",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
)
ggplot(ts_Ethnicity_df, aes(x = reorder(Gia_tri, Ty_le), y = Ty_le, fill = Gia_tri)) +
geom_col(width = 0.6, color = "white") +
geom_text(aes(label = paste0(Ty_le, "%")),
hjust = -0.1, size = 4, fontface = "bold", color = "purple") +
coord_flip() +
scale_fill_brewer(palette = "Dark2") +
labs(
title = "Biểu đồ cột ngang: Tỷ lệ chủng tộc (Ethnicity)",
x = "Chủng tộc",
y = "Tỷ lệ (%)"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
)
“White” là nhóm chiếm đa số áp đảo với 27.191 người (83.54%), thể hiện sự thống trị về số lượng trong mẫu khảo sát.
“Black” chiếm 2.830 người (8.69%), là nhóm thiểu số lớn nhất sau người da trắng.
Các nhóm “Asian-Pac-Islander”, “Amer-Indian-Eskimo”, và “Other” lần lượt có tỷ lệ thấp hơn nhiều, mỗi nhóm dưới 3%, cho thấy tính đa dạng chủng tộc có nhưng chưa thật sự cân bằng.
# Giải thích một số mức phổ biến trong biến Nationality
# (Nếu cần giải thích toàn bộ có thể mở rộng thêm)
country_levels <- data.frame(
Gia_tri = c("United-States", "Mexico", "Philippines", "Vietnam", "Germany"),
Y_nghia = c(
"Hoa Kỳ",
"Mexico",
"Philippines",
"Việt Nam",
"Đức"
)
)
knitr::kable(country_levels, caption = "Giải thích một số mức phổ biến trong biến Nationality")
| Gia_tri | Y_nghia |
|---|---|
| United-States | Hoa Kỳ |
| Mexico | Mexico |
| Philippines | Philippines |
| Vietnam | Việt Nam |
| Germany | Đức |
# Tạo bảng tần suất cho Nationality
ts_country <- table(d$Nationality)
# Tạo bảng dữ liệu
ts_country_df <- data.frame(
Gia_tri = names(ts_country),
Tan_so = as.vector(ts_country),
Ty_le = round((as.vector(ts_country) / sum(ts_country)) * 100, 2)
)
# Hiển thị kết quả
ts_country_df
## Gia_tri Tan_so Ty_le
## 1 ? 466 1.79
## 2 Cambodia 16 0.06
## 3 Canada 101 0.39
## 4 China 61 0.23
## 5 Columbia 48 0.18
## 6 Cuba 75 0.29
## 7 Dominican-Republic 54 0.21
## 8 Ecuador 19 0.07
## 9 El-Salvador 77 0.30
## 10 England 75 0.29
## 11 France 22 0.08
## 12 Germany 109 0.42
## 13 Greece 24 0.09
## 14 Guatemala 52 0.20
## 15 Haiti 39 0.15
## 16 Holand-Netherlands 1 0.00
## 17 Honduras 8 0.03
## 18 Hong 12 0.05
## 19 Hungary 11 0.04
## 20 India 76 0.29
## 21 Iran 36 0.14
## 22 Ireland 19 0.07
## 23 Italy 57 0.22
## 24 Jamaica 61 0.23
## 25 Japan 50 0.19
## 26 Laos 8 0.03
## 27 Mexico 499 1.92
## 28 Nicaragua 25 0.10
## 29 Outlying-US(Guam-USVI-etc) 8 0.03
## 30 Peru 23 0.09
## 31 Philippines 157 0.60
## 32 Poland 53 0.20
## 33 Portugal 28 0.11
## 34 Puerto-Rico 97 0.37
## 35 Scotland 10 0.04
## 36 South 65 0.25
## 37 Taiwan 43 0.17
## 38 Thailand 15 0.06
## 39 Trinadad&Tobago 12 0.05
## 40 United-States 23322 89.71
## 41 Vietnam 53 0.20
## 42 Yugoslavia 11 0.04
Biến Nationality (quốc gia xuất thân) có nhiều mức,
dưới đây là một số mức phổ biến:
Hoa Kỳ (United-States): 23322 người
(chiếm 89.71%).
Mexico: 499 người (chiếm 1.92%).
Philippines: 157 người (chiếm 0.6%).
Việt Nam: 53 người (chiếm 0.2%).
Đức (Germany): 109 người (chiếm
0.42%).
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
top_country <- ts_country_df %>%
arrange(desc(Tan_so)) %>%
slice(1:10)
ggplot(top_country, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "lightblue") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: 10 quốc gia phổ biến (Nationality)",
x = "Quốc gia",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
)
library(dplyr)
library(ggplot2)
# Lấy top 10 quốc gia có tỷ lệ cao nhất
top_country <- ts_country_df %>%
arrange(desc(Ty_le)) %>%
slice(1:10)
# Vẽ biểu đồ
ggplot(top_country, aes(x = reorder(Gia_tri, Ty_le), y = Ty_le, fill = Gia_tri)) +
geom_col(width = 0.6, color = "lightpink") +
geom_text(aes(label = paste0(Ty_le, "%")), hjust = -0.1, size = 4, fontface = "bold") +
coord_flip() +
labs(
title = "Biểu đồ cột ngang: Tỷ lệ 10 quốc gia phổ biến nhất (Nationality)",
x = "Quốc gia",
y = "Tỷ lệ (%)"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold")
)
“United-States” chiếm áp đảo với 89.59%, cho thấy phần lớn đối tượng khảo sát sống tại hoặc xuất thân từ Hoa Kỳ – phù hợp với việc dữ liệu này được thu thập từ hệ thống thống kê dân số Mỹ.
“Mexico” đứng thứ hai với 1.97%, là quốc gia gốc phổ biến tiếp theo, phản ánh sự hiện diện đáng kể của người nhập cư từ Mexico.
“Philippines” và “Germany” lần lượt chiếm 0.61% và 0.42%, là các quốc gia gốc ít phổ biến hơn.
Đặc biệt, có tới 1.79% giá trị là dấu hỏi “?” – nhiều khả năng là dữ liệu thiếu hoặc không xác định.
# Giải thích các mức của biến Gender
Gender_levels <- data.frame(
Gia_tri = c("Female", "Male"),
Y_nghia = c("Nữ", "Nam")
)
knitr::kable(Gender_levels, caption = "Giải thích các mức trong biến Gender")
| Gia_tri | Y_nghia |
|---|---|
| Female | Nữ |
| Male | Nam |
# Tạo bảng tần suất cho Gender
ts_Gender <- table(d$Gender)
# Tạo bảng dữ liệu
ts_Gender_df <- data.frame(
Gia_tri = names(ts_Gender),
Y_nghia = c("Nam", "Nữ"), # Male, Female
Tan_so = as.vector(ts_Gender),
Ty_le = round((as.vector(ts_Gender) / sum(ts_Gender)) * 100, 2)
)
# Hiển thị kết quả
ts_Gender_df
## Gia_tri Y_nghia Tan_so Ty_le
## 1 Female Nam 8515 32.75
## 2 Male Nữ 17483 67.25
Biến Gender (giới tính) bao gồm 2 mức:
Female): 8515 người (chiếm
32.75%).Nam (Male): 17483 người (chiếm
67.25%).
ggplot(ts_Gender_df, aes(x = Gia_tri, y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Giới tính (Gender)",
x = "Giới tính",
y = "Tần số"
) +
scale_fill_manual(values = c("red", "skyblue")) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
)
Gender_colors <- c("Female" = "#FFB6C1", "Male" = "#87CEFA") # màu tuỳ chỉnh
ggplot(ts_Gender_df, aes(x = "", y = Ty_le, fill = Gia_tri)) +
geom_col(width = 1, color = "red") +
coord_polar(theta = "y") +
scale_fill_manual(values = Gender_colors) +
labs(title = "Biểu đồ tròn: Giới tính") +
geom_text(aes(label = paste0(Ty_le, "%")),
position = position_stack(vjust = 0.5),
size = 5, color = "blue") +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.title = element_blank()
)
# Giải thích các mức của biến EarningClass
EarningClass_levels <- data.frame(
Gia_tri = c("<=50K", ">50K"),
Y_nghia = c("Thu nhập dưới hoặc bằng 50.000 USD/năm", "Thu nhập trên 50.000 USD/năm")
)
knitr::kable(EarningClass_levels, caption = "Giải thích các mức trong biến EarningClass")
| Gia_tri | Y_nghia |
|---|---|
| <=50K | Thu nhập dưới hoặc bằng 50.000 USD/năm |
| >50K | Thu nhập trên 50.000 USD/năm |
# Tạo bảng tần suất cho EarningClass
ts_EarningClass <- table(d$EarningClass)
# Tạo bảng dữ liệu
ts_EarningClass_df <- data.frame(
Gia_tri = names(ts_EarningClass),
Y_nghia = c("≤50K", ">50K"),
Tan_so = as.vector(ts_EarningClass),
Ty_le = round((as.vector(ts_EarningClass) / sum(ts_EarningClass)) * 100, 2)
)
# Hiển thị kết quả
ts_EarningClass_df
## Gia_tri Y_nghia Tan_so Ty_le
## 1 <=50K ≤50K 19415 74.68
## 2 >50K >50K 6583 25.32
Biến EarningClass (thu nhập) có 2 mức:
<=50K): 19415 người (chiếm 74.68%).Thu nhập trên 50K (>50K): 6583
người (chiếm 25.32%).
ggplot(ts_EarningClass_df, aes(x = Gia_tri, y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Thu nhập (EarningClass)",
x = "Nhóm thu nhập",
y = "Tần số"
) +
scale_fill_manual(values = c("#6D597A", "#FFB703")) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
)
EarningClass_colors <- c("<=50K" = "#FDB863", ">50K" = "#5E3C99")
ggplot(ts_EarningClass_df, aes(x = "", y = Ty_le, fill = Gia_tri)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
scale_fill_manual(values = EarningClass_colors) +
labs(title = "Biểu đồ tròn: Thu nhập") +
geom_text(aes(label = paste0(Ty_le, "%")),
position = position_stack(vjust = 0.5),
size = 5, color = "black") +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.title = element_blank()
)
Ta chọn 3 hạng mục từ 3 biến trong danh sách các biến định tính, bao gồm:
Hạng mục “Never-married” của biến PartneringState – Tình trạng hôn nhân
Hạng mục “Male” của biến Gender – Giới tính
Hạng mục “Bachelors” của biến learningLevel – Trình độ học vấn
Ước lượng tỷ lệ (Proportion Estimation)
Ước lượng tỷ lệ là quá trình sử dụng dữ liệu từ một mẫu để suy luận về tỷ lệ tương ứng trong tổng thể. Trong thống kê mô tả, tỷ lệ mẫu (ký hiệu thường là p̂) được tính bằng số lượng các phần tử thỏa điều kiện chia cho tổng số phần tử trong mẫu. Đây được gọi là ước lượng điểm (point estimate) cho tỷ lệ tổng thể p. Tuy nhiên, do tính ngẫu nhiên của việc chọn mẫu, ước lượng điểm không thể đảm bảo phản ánh chính xác tỷ lệ thực sự trong tổng thể, do đó cần đi kèm với một khoảng tin cậy để đo lường độ bất định.
Khoảng tin cậy
Khoảng tin cậy là một khoảng giá trị cho ta biết giá trị thật của một tỷ lệ hay trung bình trong tổng thể có khả năng nằm trong khoảng đó. Nó được tính từ dữ liệu mẫu, và đi kèm với một mức độ tin tưởng – thường là 95%.
Mức ý nghĩa (Significance Level – α)
Mức ý nghĩa, ký hiệu là α (alpha), là xác suất chấp nhận sai lầm loại I – tức là xác suất bác bỏ giả thuyết không (H₀) khi nó thực sự đúng. Trong kiểm định giả thuyết thống kê, mức ý nghĩa thể hiện ngưỡng mà tại đó ta quyết định có bác bỏ H₀ hay không. Mức ý nghĩa phổ biến nhất là α = 0.05, nghĩa là ta chấp nhận 5% rủi ro cho việc kết luận sai. Kết quả kiểm định thường được đánh giá thông qua p-value, và so sánh với α để đưa ra quyết định:
Nếu p-value < α → bác bỏ H₀ (có bằng chứng thống kê).
Nếu p-value ≥ α → không bác bỏ H₀ (không đủ bằng chứng thống kê).
Ta thực hiện khoảng ước lượng với độ tin cậy 95% cho tỷ lệ người có bằng cử nhân (Bachelors), ta thực hiện như sau:
# Số người có trình độ Bachelors
n_bachelors <- sum(d$learningLevel == "Bachelors")
# Tổng số quan sát
n_total <- nrow(d)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người có trình độ Bachelors
prop.test(n_bachelors, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_bachelors out of n_total, null probability 0.5
## X-squared = 11436, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1638407 0.1729759
## sample estimates:
## p
## 0.1683591
n_bachelors <- sum(d$learningLevel == “Bachelors”): Tính tổng số người có trình độ học vấn là “Bachelors” (cử nhân) trong dữ liệu d, bằng cách đếm số dòng có giá trị “Bachelors” trong biến learningLevel.
n_total <- nrow(d): Lấy tổng số quan sát trong bộ dữ liệu d, tức là số hàng của bảng dữ liệu – dùng để làm mẫu số trong tính toán tỷ lệ.
prop.test(n_bachelors, n_total, conf.level = 0.95): Thực hiện phép ước lượng khoảng tin cậy cho tỷ lệ người có trình độ cử nhân, với độ tin cậy 95%. Hàm prop.test() trả về khoảng tin cậy và kiểm định giả thuyết tỷ lệ (nếu cần).
Phân tích kết quả
Phép kiểm định được thực hiện là kiểm định tỷ lệ một mẫu (1-sample proportion test) với chỉnh liên tục (continuity correction) – giúp cải thiện độ chính xác khi sử dụng phân phối xấp xỉ khi kích thước mẫu không hoàn toàn lớn.
Dữ liệu đầu vào gồm số người có trình độ học vấn là “Bachelors” (n_bachelors) trong tổng số quan sát (n_total). Giả thuyết không (H₀) đặt ra rằng tỷ lệ thực sự p = 0.5, tức là 50% dân số có bằng cử nhân.
Giá trị thống kê kiểm định là X-squared = 11436, với 1 bậc tự do (df = 1). Giá trị này rất lớn, cho thấy tỷ lệ mẫu quan sát được khác biệt đáng kể so với tỷ lệ giả định 50%.
Giá trị p-value < 2.2e-16, nghĩa là xác suất xảy ra chênh lệch lớn như vậy nếu H₀ đúng là gần như bằng 0. Do đó, kết quả kiểm định có ý nghĩa thống kê rất mạnh.
Giả thuyết đối H₁ là: tỷ lệ thực tế p ≠ 0.5, tức là đây là một kiểm định hai phía nhằm kiểm tra xem tỷ lệ có khác biệt rõ rệt so với 50% (có thể cao hơn hoặc thấp hơn).
Khoảng tin cậy 95% cho tỷ lệ người có trình độ học vấn Bachelors là từ [0.1638; 0.1730] – tức khoảng 16.38% đến 17.30%. Điều này cho thấy ta có thể tin tưởng rằng tỷ lệ thực sự trong tổng thể nằm trong khoảng này.
Tỷ lệ mẫu ước lượng được là khoảng 16.84%, tương đương với gần 17 người có bằng cử nhân trên mỗi 100 người, thấp hơn rất nhiều so với mức giả định 50%.
Bài toán kiểm định:
Giả thuyết kiểm định:
Giả thuyết không H₀: p = 0.5 (tỷ lệ người có bằng cử nhân bằng 50%)
Giả thuyết đối H₁: p ≠ 0.5 (tỷ lệ người có bằng cử nhân khác 50%)
Mức ý nghĩa: α = 0.05
Kết luận:
Với p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H₀. → Có bằng chứng thống kê cho thấy tỷ lệ người có bằng cử nhân khác 50%, với độ tin cậy 95%.
Tỷ lệ mẫu là 16.84%, với khoảng tin cậy nằm trong [16.38%; 17.30%]. → Mức chênh lệch hơn 33 điểm phần trăm so với giả định 50% cho thấy sự khác biệt là rõ ràng và có ý nghĩa thống kê.
# Số người chưa từng kết hôn
n_never_married <- sum(d$PartneringState == "Never-married")
# Tổng số quan sát
n_total <- nrow(d)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người chưa từng kết hôn
prop.test(n_never_married, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_never_married out of n_total, null probability 0.5
## X-squared = 3256.3, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3173478 0.3287543
## sample estimates:
## p
## 0.3230248
Phép kiểm định được sử dụng là kiểm định tỷ lệ một mẫu (1-sample proportions test) với chỉnh liên tục (continuity correction) – nhằm cải thiện độ chính xác khi sử dụng phân phối xấp xỉ trong thống kê.
Dữ liệu đầu vào: đang kiểm định tỷ lệ người có tình trạng “Never-married” (n_never_married) trong tổng số quan sát (n_total), với giả thuyết gốc H₀: p = 0.5 (tức 50% dân số chưa từng kết hôn).
Giá trị thống kê kiểm định là X-squared = 3256.3, với 1 bậc tự do (df = 1), cho thấy mức độ chênh lệch rất lớn giữa tỷ lệ quan sát được và tỷ lệ giả định.
Giá trị p-value < 2.2e-16, nghĩa là khả năng xảy ra sai lầm khi bác bỏ H₀ là cực kỳ nhỏ, gần như bằng 0. → Kết quả có ý nghĩa thống kê rất mạnh.
Giả thuyết đối (H₁): tỷ lệ thực tế khác 0.5 (kiểm định hai phía – kiểm tra xem có khác biệt rõ ràng hay không, dù là thấp hơn hay cao hơn).
Khoảng tin cậy 95% cho tỷ lệ người chưa kết hôn nằm trong khoảng [31.73%; 32.88%], phản ánh một mức tỷ lệ ổn định quanh mức ~32%.
Tỷ lệ mẫu ước lượng được là 32.30%, tức là khoảng 1/3 dân số trong mẫu khảo sát chưa từng kết hôn – con số này thấp hơn đáng kể so với giả định 50%.
📌 Bài toán kiểm định: Giả thuyết không H₀: p = 0.5 (tỷ lệ người chưa từng kết hôn bằng 50%)
Giả thuyết đối H₁: p ≠ 0.5 (tỷ lệ người chưa từng kết hôn khác 50%)
Mức ý nghĩa: α = 0.05
✅ Kết luận: Với p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H₀.
→ Có bằng chứng thống kê mạnh cho thấy tỷ lệ người chưa từng kết hôn khác 50%, với độ tin cậy 95%.
Tỷ lệ mẫu là 32.30%, nằm trong khoảng [31.73%; 32.88%]. → Mức chênh lệch gần 18 điểm phần trăm so với 50% cho thấy sự khác biệt là rõ ràng và có ý nghĩa thống kê.
# Số người là nam giới
n_male <- sum(d$Gender == "Male")
# Tổng số quan sát
n_total <- nrow(d)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ nam giới
prop.test(n_male, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_male out of n_total, null probability 0.5
## X-squared = 3092.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.6667256 0.6781729
## sample estimates:
## p
## 0.6724748
Phân tích kết quả
Phân tích kết quả Phép kiểm định được sử dụng là kiểm định tỷ lệ một mẫu (1-sample proportions test) với chỉnh liên tục (continuity correction) nhằm đảm bảo kết quả chính xác hơn khi xử lý dữ liệu rời rạc.
Dữ liệu đầu vào: đang xét tỷ lệ người là “Male” trong tổng số quan sát, với giả thuyết gốc H₀: p = 0.5 (tức tỷ lệ nam giới là 50%).
Giá trị thống kê kiểm định là X-squared = 3092.8, với 1 bậc tự do (df = 1), cho thấy có sự chênh lệch lớn giữa tỷ lệ quan sát và tỷ lệ giả định.
p-value < 2.2e-16, cực kỳ nhỏ, cho thấy có bằng chứng thống kê rất mạnh để bác bỏ giả thuyết H₀.
Giả thuyết đối (H₁): tỷ lệ thực tế khác 0.5 – đây là kiểm định hai phía.
Khoảng tin cậy 95% cho tỷ lệ nam giới nằm trong khoảng [66.68%; 67.81%], cho thấy tỷ lệ này ổn định và cao hơn đáng kể so với mức giả định ban đầu.
Tỷ lệ mẫu ước lượng là 67.25%, tức là gần 2/3 người trong mẫu khảo sát là nam giới.
Bài toán kiểm định: Giả thuyết không H₀: p = 0.5 (tỷ lệ nam giới bằng 50%)
Giả thuyết đối H₁: p ≠ 0.5 (tỷ lệ nam giới khác 50%)
Mức ý nghĩa: α = 0.05
Kết luận: Với p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H₀.
→ Có bằng chứng thống kê rõ ràng cho thấy tỷ lệ nam giới khác 50%, với độ tin cậy 95%.
Tỷ lệ nam giới ước lượng là 67.25%, với khoảng tin cậy nằm trong [66.68%; 67.81%]. → Mức chênh lệch hơn 17 điểm phần trăm so với tỷ lệ giả định là đủ lớn để tạo ra ý nghĩa thống kê mạnh mẽ.
Gender – EarningClass → Phân tích mối liên hệ giữa giới tính và mức thu nhập.
Câu hỏi đặt ra: Giới tính có ảnh hưởng đến khả năng thuộc nhóm thu nhập >50K không?
→ Tìm hiểu xem giới tính có liên quan đến thu nhập không.
Câu hỏi đặt ra: Tỷ lệ thu nhập >50K có chênh lệch rõ rệt giữa các nhóm giới tính không?
# Bảng tần số chéo: giới tính và thu nhập
table_Gender_EarningClass <- table(d$Gender, d$EarningClass)
table_Gender_EarningClass
##
## <=50K >50K
## Female 7526 989
## Male 11889 5594
# Tỷ lệ theo hàng (từng giới tính)
prop.table(table_Gender_EarningClass, margin = 1)
##
## <=50K >50K
## Female 0.883852 0.116148
## Male 0.680032 0.319968
🔍 Trong số nam giới (Male): Có 11,889 người thu nhập ≤50K và 5,594 người thu nhập >50K → tỷ lệ >50K là khoảng 31.0%.
🔍 Trong số nữ giới (Female): Có 7,526 người thu nhập ≤50K và 989 người thu nhập >50K → tỷ lệ >50K là khoảng 11.6%.
📌 Kết luận: Nam giới có tỷ lệ thu nhập >50K cao gần gấp 3 lần nữ giới (31.0% so với 11.6%), cho thấy sự chênh lệch thu nhập rõ rệt giữa hai giới trong tập dữ liệu này.
library(ggplot2)
# Tạo bảng dữ liệu từ bảng tần suất chéo
table_Gender_EarningClass <- table(d$Gender, d$EarningClass)
df_group <- as.data.frame(as.table(table_Gender_EarningClass))
colnames(df_group) <- c("Gender", "EarningClass", "Freq") # Đổi tên cột
# Vẽ biểu đồ cột nhóm
ggplot(df_group, aes(x = EarningClass, y = Freq, fill = Gender)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.6) +
geom_text(aes(label = Freq),
position = position_dodge(width = 0.8),
vjust = -0.4, size = 4, color = "white", fontface = "bold") +
labs(title = "Biểu đồ cột nhóm: Gender vs EarningClass",
x = "Mức thu nhập",
y = "Tần số") +
scale_fill_manual(
values = c("Female" = "#FF9999", "Male" = "#6699CC"),
name = "Giới tính",
labels = c("Nữ", "Nam")
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "right"
)
library(ggplot2): Nạp thư viện ggplot2 để sử dụng các chức năng vẽ biểu đồ.
table_Gender_EarningClass <- table(d\(Gender, d\)EarningClass): Tạo bảng tần suất chéo giữa hai biến định tính là giới tính (Gender) và thu nhập (EarningClass), cho biết số lượng từng tổ hợp.
df_group <- as.data.frame(as.table(table_Gender_EarningClass)): Chuyển bảng tần suất vừa tạo sang dạng bảng dữ liệu (data.frame) gồm ba cột.
colnames(df_group) <- c(“Gender”, “EarningClass”, “Freq”): Đặt tên cho ba cột là: giới tính (Gender), mức thu nhập (EarningClass) và tần số (Freq).
ggplot(df_group, aes(x = EarningClass, y = Freq, fill = Gender)): Khởi tạo biểu đồ cột, trục hoành là thu nhập, trục tung là tần số, các cột được tô màu theo giới tính.
geom_bar(stat = “identity”, position = position_dodge(width = 0.8), width = 0.6): Vẽ biểu đồ cột nhóm, đặt các cột nam và nữ cạnh nhau để dễ so sánh.
geom_text(…): Thêm nhãn số lượng lên mỗi cột để hiển thị giá trị Freq, đặt ở trên đầu cột.
labs(…): Thêm tiêu đề biểu đồ và nhãn cho các trục.
scale_fill_manual(…): Tùy chỉnh màu sắc của từng giới tính và thiết lập chú thích (legend).
theme_minimal(…) + theme(…): Áp dụng phong cách tối giản cho biểu đồ, căn giữa tiêu đề và đặt chú giải bên phải.
# Tạo bảng dữ liệu từ bảng tần suất chéo
table_Gender_EarningClass <- table(d$Gender, d$EarningClass)
df_stack <- as.data.frame(as.table(table_Gender_EarningClass))
colnames(df_stack) <- c("Gender", "EarningClass", "Freq") # Đổi tên cột
# Vẽ biểu đồ cột chồng
ggplot(df_stack, aes(x = EarningClass, y = Freq, fill = Gender)) +
geom_bar(stat = "identity", width = 0.6) +
geom_text(aes(label = Freq),
position = position_stack(vjust = 0.5),
color = "green", size = 4, fontface = "bold") +
scale_fill_manual(
values = c("Female" = "red", "Male" = "lightblue"),
name = "Giới tính",
labels = c("Nữ", "Nam")
) +
labs(title = "Biểu đồ cột chồng: Gender vs EarningClass",
x = "Mức thu nhập",
y = "Tần số") +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "right"
)
geom_bar(stat = “identity”, width = 0.6): Vẽ biểu đồ cột chồng (stacked bar chart), trong đó mỗi nhóm thu nhập hiển thị một cột có phần chồng theo giới tính.
geom_text(position = position_stack(vjust = 0.5), …): Hiển thị nhãn số lượng (tần số) bên trong từng phần chồng của cột, tức là ở giữa mỗi khối màu.
Kết luận trực quan: Hai biểu đồ cho thấy sự chênh lệch thu nhập rõ rệt giữa hai giới:
Nam giới có xu hướng đạt thu nhập cao (>50K) nhiều hơn nữ giới.
Nữ giới chủ yếu tập trung ở nhóm thu nhập thấp, và gần như vắng mặt ở nhóm thu nhập cao.
Giới tính là yếu tố ảnh hưởng đáng kể đến phân phối thu nhập trong tập dữ liệu này. Biểu đồ trực quan phản ánh sự bất bình đẳng rõ nét về thu nhập giữa nam và nữ.
Giả thuyết kiểm định:
H₀ (Giả thuyết không): Giới tính và mức thu nhập độc lập nhau.
H₁ (Giả thuyết đối):Giới tính và mức thu nhập có liên hệ..
# Thực hiện kiểm định Chi-bình phương
chisq.test(table_Gender_EarningClass)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_Gender_EarningClass
## X-squared = 1256.9, df = 1, p-value < 2.2e-16
Kết quả kiểm định Chi-bình phương: Kết quả kiểm định Chi-bình phương:
Chi-squared = 1256.9 Bậc tự do (df) = 1 Giá trị p-value = < 2.2e-16
Kết luận thống kê: Với p-value gần như bằng 0, nhỏ hơn rất nhiều so với ngưỡng ý nghĩa 0.05, ta bác bỏ giả thuyết H₀. ⇒ Có bằng chứng thống kê mạnh mẽ cho thấy giới tính và mức thu nhập có liên hệ với nhau.
Thảo luận thêm về bản chất mối quan hệ:
Kết quả kiểm định cho thấy mối quan hệ giữa giới tính và thu nhập không phải ngẫu nhiên. Nói cách khác, giới tính có thể đóng vai trò như một yếu tố dự báo mức thu nhập, khi mà sự phân bố giữa nam và nữ ở hai nhóm thu nhập có sự khác biệt rõ rệt.
Quan sát biểu đồ cho thấy:
Tỷ lệ nam giới tăng mạnh ở nhóm thu nhập >50K, cho thấy họ có cơ hội cao hơn để đạt thu nhập cao. Trong khi đó, nữ giới tập trung nhiều ở nhóm thu nhập thấp, với số lượng giảm mạnh khi chuyển sang nhóm thu nhập cao.
Gợi ý bản chất sâu xa của mối liên hệ:
Sự khác biệt này có thể phản ánh các yếu tố xã hội như định kiến giới trong việc lựa chọn ngành nghề, khả năng tiếp cận các vị trí lương cao, hoặc thời gian tích lũy kinh nghiệm. Ngoài ra, còn có thể liên quan đến mức độ tham gia thị trường lao động hoặc sự phân chia vai trò trong gia đình.
→ Tóm lại: Không chỉ có sự liên hệ về mặt thống kê, mà kết quả còn phản ánh một bất bình đẳng mang tính hệ thống, trong đó nam giới có xu hướng được đại diện nhiều hơn trong nhóm thu nhập cao so với nữ giới.
# Lập bảng tần số chéo giữa Gender và EarningClass
table_Gender_EarningClass <- table(d$Gender, d$EarningClass)
# Thêm tổng hàng và tổng cột
table_Gender_EarningClass_margins <- addmargins(table_Gender_EarningClass)
# Hiển thị bảng
table_Gender_EarningClass_margins
##
## <=50K >50K Sum
## Female 7526 989 8515
## Male 11889 5594 17483
## Sum 19415 6583 25998
Tỷ lệ thu nhập cao theo giới tính được ký hiệu như sau:
Giả thuyết kiểm định:
# Tạo bảng tần số chéo giữa Gender và EarningClass
table_Gender_EarningClass <- table(d$Gender, d$EarningClass)
# Số người có thu nhập >50K trong từng giới
counts_EarningClass_high <- c(table_Gender_EarningClass["Female", ">50K"], table_Gender_EarningClass["Male", ">50K"])
# Tổng số người theo từng giới
totals_EarningClass <- c(sum(table_Gender_EarningClass["Female", ]), sum(table_Gender_EarningClass["Male", ]))
# Kiểm định tỉ lệ một phía: p1 < p2
test_EarningClass_less <- prop.test(counts_EarningClass_high, totals_EarningClass, alternative = "less", correct = FALSE)
# Hiển thị kết quả
test_EarningClass_less
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_EarningClass_high out of totals_EarningClass
## X-squared = 1258, df = 1, p-value < 2.2e-16
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.0000000 -0.1956781
## sample estimates:
## prop 1 prop 2
## 0.116148 0.319968
Mục tiêu kiểm định: So sánh tỷ lệ người có thu nhập cao (biến EarningClass có giá trị “>50K”) giữa hai giới tính (Gender là “Female” và “Male”).
Định nghĩa:
p1 = P(EarningClass == “>50K” | Gender == “Female”): tỷ lệ nữ giới có thu nhập cao.
p2 = P(EarningClass == “>50K” | Gender == “Male”): tỷ lệ nam giới có thu nhập cao.
GĐịnh nghĩa:
p₁ = P(EarningClass == “>50K” | Gender == “Female”) → Tỷ lệ nữ giới có thu nhập cao
p₂ = P(EarningClass == “>50K” | Gender == “Male”) → Tỷ lệ nam giới có thu nhập cao
Giả thuyết kiểm định:
H₀: p₁ − p₂ = 0 → Không có sự khác biệt về tỷ lệ thu nhập cao giữa nam và nữ
H₁: p₁ − p₂ < 0 → Tỷ lệ thu nhập cao ở nữ thấp hơn ở nam
Tính toán dựa trên bảng dữ liệu:
Số nữ thu nhập >50K: 989 / Tổng số nữ: 8,515 → p₁ ≈ 11.61%
Số nam thu nhập >50K: 5,594 / Tổng số nam: 17,483 → p₂ ≈ 31.99%`
X-squared = 1518.9, df = 1, p-value < 2.2e-16.
Khoảng tin cậy 95% cho p1 - p2: từ -1.0000000 đến -0.1891457.
Kết luận: Có bằng chứng thống kê mạnh để bác bỏ giả thuyết H0. Tỷ lệ nữ có thu nhập cao thấp hơn nam một cách có ý nghĩa thống kê.
Liệu giới tính (nam/nữ) có ảnh hưởng đến thu nhập cao không (>50K)?
→ Mục tiêu: So sánh tỉ lệ có thu nhập cao ở nam giới so với nữ giới.
install.packages("epitools", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Tuyet Nhi\AppData\Local\Temp\RtmpGEP2hj\downloaded_packages
library(epitools)
Tính Relative Risk
riskratio(table_Gender_EarningClass)
## $data
##
## <=50K >50K Total
## Female 7526 989 8515
## Male 11889 5594 17483
## Total 19415 6583 25998
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.00000 NA NA
## Male 2.75483 2.588052 2.932356
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 3.875868e-303 1.532559e-275
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét kết quả
$data: bảng dữ liệu chéo 2x2 Nữ: 8.515 người, trong đó 989 người (11.62%) có thu nhập >50K
Nam: 17.483 người, trong đó 5.594 người (32.00%) có thu nhập >50K
$measure: Tỷ số nguy cơ (Relative Risk – RR) RR = 2.75 → nam giới có nguy cơ đạt thu nhập >50K cao hơn 2.75 lần so với nữ giới
Khoảng tin cậy 95%: [2.59; 2.93] → không chứa 1 → kết quả có ý nghĩa thống kê
$p.value: P-value ≈ 0 → có đủ bằng chứng bác bỏ H₀ → Giới tính có ảnh hưởng rõ rệt đến khả năng đạt thu nhập cao
$p.value
# Cài gói nếu cần
install.packages("knitr") # chỉ cần 1 lần nếu chưa cài
## Warning: package 'knitr' is in use and will not be installed
# Nạp thư viện
library(knitr)
# Tạo bảng dữ liệu
explanation <- data.frame(
Cột = c("two-sided", "midp.exact", "fisher.exact", "chi.square"),
Ý_nghĩa = c(
"Kiểm định hai phía – kiểm tra xem RR có khác 1. Đây là loại kiểm định phổ biến nhất.",
"Kiểm định chính xác – cho p-value chính xác dựa trên phân phối chính xác.",
"Fisher’s exact test – dùng trong bảng 2x2 với cỡ mẫu nhỏ.",
"Chi-squared test – kiểm định xấp xỉ phân phối chuẩn, dùng khi mẫu đủ lớn."
)
)
# In bảng
kable(explanation, align = "l")
| Cột | Ý_nghĩa |
|---|---|
| two-sided | Kiểm định hai phía – kiểm tra xem RR có khác 1. Đây là loại kiểm định phổ biến nhất. |
| midp.exact | Kiểm định chính xác – cho p-value chính xác dựa trên phân phối chính xác. |
| fisher.exact | Fisher’s exact test – dùng trong bảng 2x2 với cỡ mẫu nhỏ. |
| chi.square | Chi-squared test – kiểm định xấp xỉ phân phối chuẩn, dùng khi mẫu đủ lớn. |
Kết quả
Tỷ số nguy cơ (RR) = 2.75 → Nam giới có nguy cơ đạt thu nhập trên 50K cao gấp 2.75 lần so với nữ giới.
Khoảng tin cậy 95% = [2.59, 2.93] → Không bao gồm 1 → → sự khác biệt có ý nghĩa thống kê.
P-value ≈ 0 ở tất cả các phương pháp kiểm định (midp.exact, Fisher, chi-square) → Rất nhỏ hơn 0.05 → có bằng chứng thống kê mạnh về sự khác biệt giữa nam và nữ.
Kết luận Dựa trên kết quả phân tích, nam giới có xác suất đạt mức thu nhập cao (>50K) cao hơn đáng kể so với nữ giới trong bộ dữ liệu này. Tỷ số nguy cơ là 2.75 với khoảng tin cậy hẹp và giá trị p gần bằng 0 cho thấy sự khác biệt là rõ ràng và có ý nghĩa thống kê. Điều này cho thấy giới tính là một yếu tố có ảnh hưởng đáng kể đến khả năng đạt được mức thu nhập cao, ít nhất là trong phạm vi mẫu khảo sát được sử dụng.
or_result2 <- oddsratio(table_Gender_EarningClass)
print(or_result2)
## $data
##
## <=50K >50K Total
## Female 7526 989 8515
## Male 11889 5594 17483
## Total 19415 6583 25998
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.00000 NA NA
## Male 3.57994 3.327669 3.854999
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 3.875868e-303 1.532559e-275
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Kết quả phân tích Odds Ratio (tỷ số chênh) trong ảnh cho thấy mối liên hệ giữa giới tính (nam/nữ) và khả năng đạt mức thu nhập cao hơn 50K trong bộ dữ liệu. Dựa vào bảng tần số chéo, ta thấy trong tổng số 25.998 người được khảo sát, có 8.515 là nữ và 17.483 là nam. Trong đó, chỉ có 989 nữ giới có thu nhập trên 50K (chiếm khoảng 11.6%), trong khi 5.594 nam giới đạt được mức thu nhập này (chiếm khoảng 32%).
Dựa trên các con số này, phân tích Odds Ratio được thực hiện nhằm đo lường mức độ chênh lệch về khả năng có thu nhập cao giữa hai nhóm giới tính. Tỷ số chênh OR cho nam giới là 3.57994, với khoảng tin cậy 95% nằm trong khoảng [3.327669; 3.854999]. Điều này có nghĩa là nam giới có khả năng đạt mức thu nhập trên 50K cao gấp khoảng 3.58 lần so với nữ giới, sau khi so sánh tỷ lệ odds (xác suất xảy ra so với không xảy ra) trong từng nhóm. Trong khi đó, OR của nữ giới được cố định là 1 để làm mốc tham chiếu, do đây là nhóm cơ sở.
Khoảng tin cậy 95% cho OR của nam không bao gồm giá trị 1, cho thấy sự khác biệt giữa hai giới là có ý nghĩa thống kê. Bằng chứng cho điều này càng rõ ràng khi ta xét đến các giá trị p-value rất nhỏ: phương pháp midp.exact cho ra giá trị 3.875868e-303 và kiểm định chi bình phương (chi-square) cũng cho kết quả p-value 1.532559e-275 – đều nhỏ hơn rất nhiều so với mức ý nghĩa phổ biến là 0.05. Điều đó cho phép ta bác bỏ giả thuyết H₀ (rằng không có sự khác biệt về khả năng có thu nhập cao giữa nam và nữ) và chấp nhận giả thuyết H₁: giới tính thực sự có ảnh hưởng đến mức thu nhập cao trong mẫu khảo sát.
Một điểm quan trọng khác là kết quả này không áp dụng phương pháp hiệu chỉnh (correction = FALSE), đồng nghĩa với việc chưa điều chỉnh cho các yếu tố gây nhiễu hoặc sai số thiết kế. Tuy nhiên, với một p-value rất nhỏ như vậy và khoảng tin cậy khá hẹp, có thể nói rằng sự khác biệt này là mạnh mẽ và đáng tin cậy.
Từ kết quả trên, ta có thể rút ra nhận định rằng nam giới có nhiều khả năng đạt được mức thu nhập cao hơn nữ giới, xét trên dữ liệu hiện tại. Tuy nhiên, đây mới chỉ là phân tích đơn biến giữa giới tính và thu nhập. Trong bối cảnh nghiên cứu thực tế, để đi đến kết luận chính xác và khách quan hơn, ta nên thực hiện thêm các phân tích kiểm soát các biến nhiễu khác như trình độ học vấn, ngành nghề, giờ làm việc, và khu vực địa lý. Khi giảng dạy, giảng viên có thể dùng ví dụ này để giới thiệu cho sinh viên khái niệm odds, odds ratio, khoảng tin cậy và kiểm định giả thuyết, đồng thời nhấn mạnh tầm quan trọng của việc giải thích kết quả thống kê trong ngữ cảnh xã hội học và chính sách. Tóm tắt nhận xét Dữ liệu tóm tắt:
Nữ: 7526 người có thu nhập ≤50K, 989 người >50K.
Nam: 11.889 người ≤50K, 5.594 người >50K.
Tỷ số chênh (Odds Ratio – OR):
OR của nam so với nữ = 3.58, nghĩa là:
Nam giới có khả năng đạt thu nhập >50K cao gấp 3.58 lần so với nữ giới.
Khoảng tin cậy 95% (CI):
OR nằm trong khoảng [3.33; 3.85] → chắc chắn có sự chênh lệch thực sự giữa hai giới.
P-value rất nhỏ (≈ 0):
Có bằng chứng mạnh để bác bỏ giả thuyết H₀, khẳng định giới tính có ảnh hưởng đến thu nhập cao.
Giả sử ta có bảng dữ liệu như sau:
50K (Thu nhập cao) ≤50K (Thu nhập thấp) Nữ (Female) a = 989 b = 7526 Nam (Male) c = 5594 d = 11889