1 1. Phần 1: Tìm hiểu và Chuẩn bị Dữ liệu

1.1 1.1. Đọc bộ dữ liệu

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

1.2 1.2. Hiển thị cấu trúc của dữ liệu

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.

2 2. Phần 2: Tạo Bộ Dữ liệu Mới Chỉ Bao gồm các Biến Định tính

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.

2.1 2.1. Chuẩn hóa và lựa chọn biến

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

2.2 2.2. Kiểm tra cấu trúc của bộ dữ liệu mới

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.

3 3. Phần 3: Thống kê Tần suất và Tỷ lệ Phần trăm

3.1 3.1. Thống kê Tần suất tổng quan cho tất cả các biến

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”).

3.2 3.2. Bảng Tần suất và Tỷ lệ Phần trăm (Minh họa cho SexSurvived)

Chúng ta sẽ tạo bảng chi tiết hơn cho hai biến SexSurvived.

3.2.1 3.2.1. Biến 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

3.2.2 3.2.2. Biến 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

3.3 3.3. Trực quan hóa: Biểu đồ cột (Bar Chart)

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

3.3.1 3.3.1. Biểu đồ cho 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.

3.3.2 3.3.2. Biểu đồ cho 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%).

4 4. Phần 4: Ước lượng Khoảng và Kiểm định Giả thuyết Thống kê

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.

4.1 4.1. Biến Survived: Kiểm định tỷ lệ sống sót

  • Giả thuyết Null (\(H_0\)): Tỷ lệ sống sót trong quần thể là 0.4 (40%).
  • Giả thuyết Đối (\(H_1\)): Tỷ lệ sống sót trong quần thể không phải 0.4.
# 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%.

4.2 4.2. Biến Sex: Kiểm định tỷ lệ nữ giới

  • Giả thuyết Null (\(H_0\)): Tỷ lệ nữ giới trong quần thể là 0.3 (30%).
  • Giả thuyết Đối (\(H_1\)): Tỷ lệ nữ giới trong quần thể không phải 0.3.
# 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.

4.3 4.3. Biến Class: Kiểm định tỷ lệ hành khách hạng 1st

  • Giả thuyết Null (\(H_0\)): Tỷ lệ hành khách hạng “1st” trong quần thể là 0.2 (20%).
  • Giả thuyết Đối (\(H_1\)): Tỷ lệ hành khách hạng “1st” trong quần thể không phải 0.2.
# 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%.

5 5. Phần 5: Tính toán Tỷ số Nguy cơ (Relative Risk - RR) và Tỷ số Chênh (Odds Ratio - OR)

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.

5.1 5.1. Tính Tỷ số Nguy cơ (Relative Risk - RR)

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

  • Biến Phơi nhiễm: Sex với các cấp độ “Male” (nhóm tham chiếu) và “Female”.
  • Biến Kết cục: 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):

  • Giá trị RR ước lượng: 2.94
  • Khoảng tin cậy 95%: Từ 2.53 đến 3.42.
  • Giá trị p: p-value đều nhỏ hơn 0.05

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"

5.2 5.2. Tính Tỷ số Chênh (Odds Ratio - OR)

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

  • Biến Phơi nhiễm: 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).
  • Biến Kết cục: 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.

6 Phần 6: Kiểm định Chi-bình phương về tính độc lập

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ệ).

6.1 Minh họa: Mối liên hệ giữa Giới tính (Sex) và Tình trạng sống sót (Survived)

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.

  • Giả thuyết Null (\(H_0\)): Giới tính và Tình trạng sống sót là độc lập với nhau trong quần thể (không có mối liên hệ thống kê).
  • Giả thuyết Đối (\(H_1\)): Giới tính và Tình trạng sống sót là phụ thuộc vào nhau trong quần thể (có mối liên hệ thống kê).

6.1.1 Tạo bảng tần số liên hợp

Đầ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 SexSurvived.

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

6.1.2 Thực hiện kiểm định Chi-bình phương

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:

  • Giá trị Chi-bình phương (\(\chi^2\)): 454.5. Giá trị này đo lường sự khác biệt giữa tần số quan sát và tần số mong đợi nếu các biến độc lập. Giá trị càng lớn, khả năng độc lập càng thấp.
  • Bậc tự do (df): 1. (df = (số hàng - 1) * (số cột - 1)).
  • Giá trị P (p-value): < 2.2e-16.

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.

6.1.3 Trực quan hóa mối liên hệ (Giới tính vs. Sống sót)

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