Bộ dữ liệu Titanic
trong R là một mảng tần số (array)
chứ không phải data.frame
với từng dòng là một quan sát. Để
dễ dàng thao tác với tidyverse
và các hàm khác, chúng ta sẽ
chuyển đổi nó thành một data.frame
“dài” (long format) mà
mỗi dòng đại diện cho một hành khách.
library(tidyverse) # Để thao tác dữ liệu và trực quan hóa (ggplot2)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(epitools) # Để tính toán Relative Risk và Odds Ratio
# Tải bộ dữ liệu Titanic có sẵn
data(Titanic)
# Chuyển đổi mảng Titanic thành data.frame
# Hàm as.data.frame(Titanic) sẽ tạo một data.frame với các biến phân loại và cột Freq (tần suất)
df_titanic_freq <- as.data.frame(Titanic)
#"mở rộng" data.frame này để mỗi hàng là một quan sát duy nhất
#lặp lại mỗi hàng Freq lần, và bỏ cột Freq đi
df_titanic <- df_titanic_freq[rep(row.names(df_titanic_freq), df_titanic_freq$Freq), -ncol(df_titanic_freq)]
# Đặt lại chỉ số dòng để dễ nhìn
row.names(df_titanic) <- NULL
Sau khi đã chuyển đổi, chúng ta sẽ hiển thị cấu trúc của
data.frame
df_titanic
.
str(df_titanic)
## 'data.frame': 2201 obs. of 4 variables:
## $ Class : Factor w/ 4 levels "1st","2nd","3rd",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ Sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
## $ Age : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 1 1 ...
## $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
head(df_titanic)
## Class Sex Age Survived
## 1 3rd Male Child No
## 2 3rd Male Child No
## 3 3rd Male Child No
## 4 3rd Male Child No
## 5 3rd Male Child No
## 6 3rd Male Child No
summary(df_titanic)
## Class Sex Age Survived
## 1st :325 Male :1731 Child: 109 No :1490
## 2nd :285 Female: 470 Adult:2092 Yes: 711
## 3rd :706
## Crew:885
Nhận xét: Dữ liệu đã được chuyển đổi thành một
data.frame
với 2201 quan sát và 4 biến. Các biến này bao
gồm: * Class
: Hạng vé (1st, 2nd, 3rd, Crew). Đây là biến
định tính. * Sex
: Giới tính (Male, Female). Đây là biến
định tính nhị phân. * Age
: Độ tuổi (Child, Adult). Đây là
biến định tính nhị phân. * Survived
: Tình trạng sống sót
(No, Yes). Đây là biến định tính nhị phân, thường là biến kết cục quan
tâm.
Tất cả các biến này đều là định tính và rất phù hợp cho các phân tích tiếp theo.
Chúng ta sẽ sử dụng trực tiếp các biến đã có trong
df_titanic
vì chúng đều là các biến định tính. Chúng ta sẽ
chuẩn hóa các cấp độ của chúng để đảm bảo tính nhất quán trong phân
tích.
Chúng ta sẽ đảm bảo các biến là factor
và đặt thứ tự các
cấp độ một cách hợp lý cho các phân tích sau này (ví dụ: No
trước Yes
cho Survived
, nhóm tham chiếu trước
cho các biến phơi nhiễm).
dt_cat <- df_titanic %>%
mutate(
# Đặt cấp độ cho biến kết cục (Survived)
Survived = factor(Survived, levels = c("No", "Yes")),
# Đặt cấp độ cho biến phơi nhiễm (Sex), Male là nhóm tham chiếu
Sex = factor(Sex, levels = c("Male", "Female")),
# Đặt cấp độ cho biến phơi nhiễm (Age), Adult là nhóm tham chiếu
Age = factor(Age, levels = c("Adult", "Child")),
# Đặt cấp độ cho biến phơi nhiễm (Class), 3rd là nhóm tham chiếu (hạng thấp nhất)
Class = factor(Class, levels = c("3rd", "2nd", "1st", "Crew"))
) %>%
# Chọn ra các biến định tính đã xử lý
select(Class, Sex, Age, Survived)
# Kiểm tra lại cấu trúc và tóm tắt của bộ dữ liệu mới
str(dt_cat)
## 'data.frame': 2201 obs. of 4 variables:
## $ Class : Factor w/ 4 levels "3rd","2nd","1st",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
## $ Age : Factor w/ 2 levels "Adult","Child": 2 2 2 2 2 2 2 2 2 2 ...
## $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
summary(dt_cat)
## Class Sex Age Survived
## 3rd :706 Male :1731 Adult:2092 No :1490
## 2nd :285 Female: 470 Child: 109 Yes: 711
## 1st :325
## Crew:885
Cấu trúc của dt_cat
đã được hiển thị ở trên, xác nhận
rằng tất cả các biến đều là factor
với các cấp độ được sắp
xếp rõ ràng.
Chúng ta sẽ xem xét tần suất (số lượng quan sát) cho mỗi cấp độ của từng biến định tính.
cat("### Tần suất biến Class:\n")
## ### Tần suất biến Class:
print(table(dt_cat$Class))
##
## 3rd 2nd 1st Crew
## 706 285 325 885
cat("\n")
cat("### Tần suất biến Sex:\n")
## ### Tần suất biến Sex:
print(table(dt_cat$Sex))
##
## Male Female
## 1731 470
cat("\n")
cat("### Tần suất biến Age:\n")
## ### Tần suất biến Age:
print(table(dt_cat$Age))
##
## Adult Child
## 2092 109
cat("\n")
cat("### Tần suất biến Survived:\n")
## ### Tần suất biến Survived:
print(table(dt_cat$Survived))
##
## No Yes
## 1490 711
cat("\n")
Nhận xét về phân phối tần suất: *
Class
: Hạng 3rd có số lượng hành khách cao
nhất, tiếp theo là Crew (thủy thủ đoàn), 1st và 2nd. *
Sex
: Nam giới chiếm đa số trong tổng số
hành khách. * Age
: Người lớn (Adult) chiếm
áp đảo so với trẻ em (Child). * Survived
:
Số người không sống sót (“No”) cao hơn đáng kể so với số người sống sót
(“Yes”).
Sex
và
Survived
)Chúng ta sẽ tạo bảng chi tiết hơn cho hai biến Sex
và
Survived
.
Sex
# Bảng tần suất (số lượng) cho 'Sex'
freq_sex <- table(dt_cat$Sex)
cat("### Bảng tần suất (số lượng) cho 'Sex':\n")
## ### Bảng tần suất (số lượng) cho 'Sex':
print(freq_sex)
##
## Male Female
## 1731 470
cat("\n")
# Tính toán tỷ lệ phần trăm cho 'Sex'
percent_sex <- prop.table(freq_sex) * 100
cat("### Tỷ lệ phần trăm cho 'Sex':\n")
## ### Tỷ lệ phần trăm cho 'Sex':
print(percent_sex)
##
## Male Female
## 78.64607 21.35393
Survived
# Bảng tần suất (số lượng) cho 'Survived'
freq_survived <- table(dt_cat$Survived)
cat("### Bảng tần suất (số lượng) cho 'Survived':\n")
## ### Bảng tần suất (số lượng) cho 'Survived':
print(freq_survived)
##
## No Yes
## 1490 711
cat("\n")
# Tính toán tỷ lệ phần trăm cho 'Survived'
percent_survived <- prop.table(freq_survived) * 100
cat("### Tỷ lệ phần trăm cho 'Survived':\n")
## ### Tỷ lệ phần trăm cho 'Survived':
print(percent_survived)
##
## No Yes
## 67.6965 32.3035
Chúng ta sẽ vẽ biểu đồ cột để trực quan hóa tần suất và tỷ lệ phần
trăm cho Class
và Age
.
Class
(Thể hiện tần suất)ggplot(dt_cat, aes(x = Class, fill = Class)) +
geom_bar(color = "black") +
labs(
title = "Phân phối Tần suất Hạng vé hành khách",
x = "hangve",
y = "soluong"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
Nhận xét biểu đồ Class
: Biểu đồ cột này
cho thấy rõ phân phối số lượng hành khách theo từng hạng vé. Hạng 3rd có
số lượng hành khách đông nhất, phản ánh rằng đây là hạng phổ biến nhất
trên tàu. Thủy thủ đoàn (Crew
) cũng chiếm một phần đáng kể,
trong khi hạng 1st và 2nd có số lượng ít hơn.
Age
(Thể hiện tỷ lệ phần trăm)# Tính tỷ lệ phần trăm cho biểu đồ
dt_age_summary <- dt_cat %>%
group_by(Age) %>%
summarise(count = n()) %>%
mutate(percentage = count / sum(count))
ggplot(dt_age_summary, aes(x = Age, y = percentage, fill = Age)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = scales::percent(percentage, accuracy = 0.1)), vjust = -0.5, size = 4, color = "black") +
labs(
title = "Tỷ lệ Phần trăm Hành khách theo Độ tuổi",
x = "Độ tuổi",
y = "Tỷ lệ Phần trăm"
) +
scale_y_continuous(labels = scales::percent) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"), legend.position = "none")
Nhận xét biểu đồ Age
: Biểu đồ này minh
họa tỷ lệ phần trăm hành khách theo độ tuổi. Rõ ràng, người lớn
(Adult
) chiếm phần lớn (khoảng 95.0%), trong khi trẻ em
(Child
) chỉ chiếm một tỷ lệ nhỏ (khoảng 5.0%).
Chúng ta sẽ thực hiện ước lượng khoảng tin cậy cho tỷ lệ của một cấp
độ cụ thể và kiểm định giả thuyết cho 3 biến định tính:
Survived
, Sex
, và Class
. Chúng ta
sẽ sử dụng prop.test()
để thực hiện kiểm định tỷ lệ một
mẫu.
Survived
: Kiểm định tỷ lệ sống sót# Lấy số lượng người sống sót ("Yes") và tổng số quan sát
n_survived <- table(dt_cat$Survived)["Yes"]
total_n_survived <- sum(table(dt_cat$Survived))
cat("Số người sống sót ('Yes'):", n_survived, "\n")
## Số người sống sót ('Yes'): 711
cat("Tổng số quan sát:", total_n_survived, "\n")
## Tổng số quan sát: 2201
# Ước lượng khoảng và kiểm định giả thuyết
prop_test_survived <- prop.test(x = n_survived, n = total_n_survived, p = 0.4, correct = FALSE)
print(prop_test_survived)
##
## 1-sample proportions test without continuity correction
##
## data: n_survived out of total_n_survived, null probability 0.4
## X-squared = 54.324, df = 1, p-value = 1.7e-13
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.3038214 0.3428652
## sample estimates:
## p
## 0.323035
Diễn giải: * Tỷ lệ ước lượng: Tỷ lệ sống sót trong mẫu là khoảng 32.3%. * Khoảng tin cậy 95%: Khoảng tin cậy 95% cho tỷ lệ sống sót thực sự trong quần thể là từ 30.38% đến 34.29%. * Giá trị P: p-value là 0. * Kết luận: Vì p-value (0) nhỏ hơn mức ý nghĩa \(\alpha = 0.05\), chúng ta bác bỏ giả thuyết \(H_0\). Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sống sót trong quần thể không phải là 40%. Thực tế, tỷ lệ này thấp hơn đáng kể so với 40%.
Sex
: Kiểm định tỷ lệ nữ giới# Lấy số lượng nữ giới ("Female") và tổng số quan sát
n_female <- table(dt_cat$Sex)["Female"]
total_n_sex <- sum(table(dt_cat$Sex))
cat("Số lượng nữ giới ('Female'):", n_female, "\n")
## Số lượng nữ giới ('Female'): 470
cat("Tổng số quan sát:", total_n_sex, "\n")
## Tổng số quan sát: 2201
# Ước lượng khoảng và kiểm định giả thuyết
prop_test_sex <- prop.test(x = n_female, n = total_n_sex, p = 0.3, correct = FALSE)
print(prop_test_sex)
##
## 1-sample proportions test without continuity correction
##
## data: n_female out of total_n_sex, null probability 0.3
## X-squared = 78.35, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.3
## 95 percent confidence interval:
## 0.1969256 0.2311512
## sample estimates:
## p
## 0.2135393
Diễn giải: * Tỷ lệ ước lượng: Tỷ lệ nữ giới trong mẫu là khoảng 21.35%. * Khoảng tin cậy 95%: Khoảng tin cậy 95% cho tỷ lệ nữ giới thực sự trong quần thể là từ 19.69% đến 23.12%. * Giá trị P: p-value là 0. * Kết luận: Vì p-value (0) nhỏ hơn mức ý nghĩa \(\alpha = 0.05\), chúng ta bác bỏ giả thuyết \(H_0\). Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ nữ giới trong quần thể không phải là 30%. Tỷ lệ này cao hơn so với giả định ban đầu.
Class
: Kiểm định tỷ lệ hành khách hạng 1st# Lấy số lượng hành khách hạng 1st và tổng số quan sát
n_class_1st <- table(dt_cat$Class)["1st"]
total_n_class <- sum(table(dt_cat$Class))
cat("Số hành khách hạng '1st':", n_class_1st, "\n")
## Số hành khách hạng '1st': 325
cat("Tổng số quan sát:", total_n_class, "\n")
## Tổng số quan sát: 2201
# Ước lượng khoảng và kiểm định giả thuyết
prop_test_class <- prop.test(x = n_class_1st, n = total_n_class, p = 0.2, correct = FALSE)
print(prop_test_class)
##
## 1-sample proportions test without continuity correction
##
## data: n_class_1st out of total_n_class, null probability 0.2
## X-squared = 37.685, df = 1, p-value = 8.315e-10
## alternative hypothesis: true p is not equal to 0.2
## 95 percent confidence interval:
## 0.1334533 0.1630948
## sample estimates:
## p
## 0.1476602
Diễn giải: * Tỷ lệ ước lượng: Tỷ lệ hành khách hạng “1st” trong mẫu là khoảng 14.77%. * Khoảng tin cậy 95%: Khoảng tin cậy 95% cho tỷ lệ hành khách hạng “1st” thực sự trong quần thể là từ 13.35% đến 16.31%. * Giá trị P: p-value là 0. * Kết luận: Vì p-value (0) nhỏ hơn mức ý nghĩa \(\alpha = 0.05\), chúng ta bác bỏ giả thuyết \(H_0\). Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ hành khách hạng “1st” trong quần thể không phải là 20%. Thực tế, tỷ lệ này thấp hơn đáng kể so với 20%.
Chúng ta sẽ tính toán RR và OR để định lượng mối liên hệ giữa các
biến định tính với biến kết cục Survived
.
Chúng ta sẽ minh họa RR bằng cách xem xét mối liên hệ giữa
Giới tính (Sex
) và Tình trạng sống
sót (Survived
).
Sex
với các cấp độ
“Male” (nhóm tham chiếu) và “Female”.Survived
với các cấp độ
“No” (không sống sót) và “Yes” (sống sót).Lưu ý quan trọng về RR: RR thường được sử dụng trong các nghiên cứu tiến cứu (cohort studies) hoặc thử nghiệm lâm sàng nơi chúng ta có thể trực tiếp theo dõi và tính toán nguy cơ mắc bệnh. Với dữ liệu Titanic, chúng ta có thể coi đây là một nghiên cứu đoàn hệ giả định, nơi tất cả hành khách được “phơi nhiễm” và kết cục được quan sát.
# Tạo bảng tần số liên hợp 2x2 cho RR
# Hàng: biến phơi nhiễm (Sex)
# Cột: biến kết cục (Survived: No, Yes)
rr_table <- table(dt_cat$Sex, dt_cat$Survived)
cat("### Bảng tần số liên hợp cho RR (Sex vs. Survived):\n")
## ### Bảng tần số liên hợp cho RR (Sex vs. Survived):
print(rr_table)
##
## No Yes
## Male 1364 367
## Female 126 344
# Trích xuất các giá trị a, b, c, d từ bảng để sử dụng hàm riskratio()
# riskratio(x = c(a, b, c, d))
# a = số người Phơi nhiễm (Female) và có Outcome+ (Yes)
# b = số người Phơi nhiễm (Female) và có Outcome- (No)
# c = số người KHÔNG Phơi nhiễm (Male) và có Outcome+ (Yes)
# d = số người KHÔNG Phơi nhiễm (Male) và có Outcome- (No)
a_rr <- rr_table["Female", "Yes"]
b_rr <- rr_table["Female", "No"]
c_rr <- rr_table["Male", "Yes"]
d_rr <- rr_table["Male", "No"]
# Tính RR bằng gói epitools
rr_result_titanic <- riskratio(x = c(a_rr, b_rr, c_rr, d_rr))
cat("\n### Kết quả Relative Risk:\n")
##
## ### Kết quả Relative Risk:
print(rr_result_titanic)
## $data
## Outcome
## Predictor Disease1 Disease2 Total
## Exposed1 344 126 470
## Exposed2 367 1364 1731
## Total 711 1490 2201
##
## $measure
## risk ratio with 95% C.I.
## Predictor estimate lower upper
## Exposed1 1.000000 NA NA
## Exposed2 2.939305 2.52643 3.419652
##
## $p.value
## two-sided
## Predictor midp.exact fisher.exact chi.square
## Exposed1 NA NA NA
## Exposed2 0 2.690694e-96 2.302151e-101
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Diễn giải Relative Risk (RR):
Kết luận: Dựa trên phân tích này, nữ giới có nguy cơ sống sót cao hơn khoảng 2.94 lần so với nam giới trên tàu Titanic. Khoảng tin cậy 95% cho RR này là từ 2.53 đến 3.42. Vì khoảng tin cậy này không chứa giá trị 1 và p-value = 0 rất nhỏ, chúng ta kết luận rằng mối liên hệ này là có ý nghĩa thống kê. Điều này khẳng định rằng giới tính là một yếu tố quan trọng ảnh hưởng đến khả năng sống sót trong thảm họa Titanic.
# Tạo biến phơi nhiễm nhị phân từ Class
# Nhóm "1st", "2nd", "Crew" thành "Other_Classes"
# Nhóm "3rd" là nhóm tham chiếu
dt_cat <- dt_cat %>%
mutate(
Class_Group = factor(
ifelse(Class == "3rd", "3rd_Class", "Other_Classes"),
levels = c("3rd_Class", "Other_Classes") # Đặt 3rd_Class làm nhóm tham chiếu (unexposed)
)
)
# Tạo bảng tần số liên hợp 2x2 cho OR
# Hàng: biến phơi nhiễm (Class_Group)
# Cột: biến kết cục (Survived: No, Yes)
or_table <- table(dt_cat$Class_Group, dt_cat$Survived)
cat("### Bảng tần số liên hợp cho OR (Class_Group vs. Survived):\n")
## ### Bảng tần số liên hợp cho OR (Class_Group vs. Survived):
print(or_table)
##
## No Yes
## 3rd_Class 528 178
## Other_Classes 962 533
# Trích xuất các giá trị a, b, c, d từ bảng để sử dụng hàm oddsratio()
# oddsratio(x = c(a, b, c, d))
# a = số người Phơi nhiễm (Other_Classes) và có Outcome+ (Yes)
# b = số người Phơi nhiễm (Other_Classes) và có Outcome- (No)
# c = số người KHÔNG Phơi nhiễm (3rd_Class) và có Outcome+ (Yes)
# d = số người KHÔNG Phơi nhiễm (3rd_Class) và có Outcome- (No)
a_or <- or_table["Other_Classes", "Yes"]
b_or <- or_table["Other_Classes", "No"]
c_or <- or_table["3rd_Class", "Yes"]
d_or <- or_table["3rd_Class", "No"]
# Tính OR bằng gói epitools
or_result_titanic <- oddsratio(x = c(a_or, b_or, c_or, d_or))
cat("\n### Kết quả Odds Ratio:\n")
##
## ### Kết quả Odds Ratio:
print(or_result_titanic)
## $data
## Outcome
## Predictor Disease1 Disease2 Total
## Exposed1 533 962 1495
## Exposed2 178 528 706
## Total 711 1490 2201
##
## $measure
## odds ratio with 95% C.I.
## Predictor estimate lower upper
## Exposed1 1.000000 NA NA
## Exposed2 1.642453 1.346388 2.009897
##
## $p.value
## two-sided
## Predictor midp.exact fisher.exact chi.square
## Exposed1 NA NA NA
## Exposed2 7.758819e-07 7.982899e-07 1.015037e-06
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Chúng ta sẽ minh họa OR bằng cách xem xét mối liên hệ giữa
Hạng vé (Class
) và Tình trạng sống
sót (Survived
).
Class
. Để đơn giản
hóa, chúng ta sẽ nhóm Class
thành nhị phân: “Hạng 3rd”
(nhóm tham chiếu) và “Các hạng khác” (gồm 1st, 2nd, Crew).Survived
với các cấp độ
“No” và “Yes”.Lưu ý quan trọng về OR: OR là chỉ số thống kê phù hợp khi nguy cơ cơ bản của kết cục không thể được tính toán trực tiếp, hoặc khi sử dụng hồi quy logistic. Mặc dù RR có thể được tính cho dữ liệu Titanic, OR cũng cung cấp một cái nhìn sâu sắc về tỷ lệ chênh.
Diễn giải Odds Ratio (OR):
Kết luận: Dựa trên phân tích này, những hành khách thuộc “Các hạng khác” (1st, 2nd, Crew) có tỷ số chênh sống sót cao gấp khoảng 1.64 lần so với những hành khách ở “Hạng 3rd”. Khoảng tin cậy 95% cho OR này là từ 1.35 đến 2.01. Vì khoảng tin cậy này không chứa giá trị 1 và p-value đều rất nhỏ (\(< 0.0001\)), chúng ta kết luận rằng mối liên hệ này là có ý nghĩa thống kê. Điều này cho thấy rõ ràng rằng hạng vé có liên quan đáng kể đến khả năng sống sót trong thảm họa Titanic.
Kiểm định Chi-bình phương về tính độc lập là một kiểm định thống kê phi tham số được sử dụng để đánh giá xem có mối quan hệ thống kê có ý nghĩa nào giữa hai biến định tính hay không. Nó giúp chúng ta xác định liệu hai biến có độc lập với nhau (không có mối liên hệ) hay phụ thuộc vào nhau (có mối liên hệ).
Chúng ta sẽ sử dụng kiểm định Chi-bình phương để xem xét liệu có mối liên hệ độc lập hay phụ thuộc giữa giới tính của hành khách và khả năng sống sót của họ trong thảm họa Titanic.
Đầu tiên, chúng ta tạo một bảng tần số liên hợp (contingency table)
giữa hai biến Sex
và Survived
.
chi_sq_table_sex_survived <- table(dt_cat$Sex, dt_cat$Survived)
cat("### Bảng tần số liên hợp (Sex vs. Survived):\n")
## ### Bảng tần số liên hợp (Sex vs. Survived):
print(chi_sq_table_sex_survived)
##
## No Yes
## Male 1364 367
## Female 126 344
Chúng ta sẽ sử dụng hàm chisq.test()
trong R để thực
hiện kiểm định.
chi_sq_result_sex_survived <- chisq.test(chi_sq_table_sex_survived)
cat("### Kết quả Kiểm định Chi-bình phương:\n")
## ### Kết quả Kiểm định Chi-bình phương:
print(chi_sq_result_sex_survived)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: chi_sq_table_sex_survived
## X-squared = 454.5, df = 1, p-value < 2.2e-16
# Xem xét tần số mong đợi (giả định H0 đúng)
cat("\n### Tần số mong đợi (Expected Frequencies):\n")
##
## ### Tần số mong đợi (Expected Frequencies):
print(chi_sq_result_sex_survived$expected)
##
## No Yes
## Male 1171.8264 559.1736
## Female 318.1736 151.8264
Diễn giải Kiểm định Chi-bình phương:
Kết luận thống kê: Với p-value là < 2.2e-16 (rất nhỏ, nhỏ hơn 0.05), chúng ta bác bỏ giả thuyết \(H_0\) về tính độc lập.
Nhận xét: Có đủ bằng chứng thống kê để kết luận rằng giới tính và tình trạng sống sót là phụ thuộc vào nhau trong quần thể hành khách Titanic. Điều này có nghĩa là có một mối liên hệ có ý nghĩa thống kê giữa giới tính của một người và khả năng họ sống sót trong thảm họa. Cụ thể, qua bảng tần suất và các phân tích RR/OR trước đó, chúng ta thấy rằng nữ giới có tỷ lệ sống sót cao hơn đáng kể so với nam giới. Kiểm định Chi-bình phương này xác nhận rằng mối liên hệ này không phải do ngẫu nhiên mà là một mối liên hệ có ý nghĩa thống kê.
Kiểm tra giả định: Chúng ta cũng đã xem xét “Tần số mong đợi”. Tất cả các ô đều có tần số mong đợi lớn hơn 5, điều này cho thấy giả định về tần số mong đợi đủ lớn của kiểm định Chi-bình phương được thỏa mãn, và kết quả kiểm định là đáng tin cậy.
Để trực quan hóa rõ hơn mối liên hệ này, chúng ta sẽ vẽ một biểu đồ cột chồng (stacked bar chart) thể hiện tỷ lệ sống sót theo giới tính.
ggplot(dt_cat, aes(x = Sex, fill = Survived)) +
geom_bar(position = "fill", color = "black") +
labs(
title = "Tỷ lệ Sống sót theo Giới tính trên tàu Titanic",
x = "Giới tính",
y = "Tỷ lệ Phần trăm",
fill = "Sống sót"
) +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(values = c("No" = "tomato", "Yes" = "lightgreen")) + # Màu sắc tùy chỉnh
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))
Nhận xét biểu đồ: Biểu đồ này minh họa rất rõ ràng rằng tỷ lệ sống sót của nữ giới (phần màu xanh lá cây trong cột ‘Female’) cao hơn đáng kể so với nam giới. Tỷ lệ không sống sót của nam giới (phần màu đỏ trong cột ‘Male’) chiếm phần lớn, trong khi ở nữ giới, tỷ lệ sống sót lại vượt trội. Điều này trực quan xác nhận kết luận từ kiểm định Chi-bình phương: Giới tính và khả năng sống sót trên tàu Titanic có mối liên hệ chặt chẽ và không độc lập.