td <- read.csv("C:/Users/Admin/Downloads/titanic.csv", header = T)
str(td)
## 'data.frame': 418 obs. of 8 variables:
## $ Pclass : int 3 3 2 3 3 3 3 2 3 3 ...
## $ Sex : chr "male" "female" "male" "male" ...
## $ Age : num 34.5 47 62 27 22 14 30 26 18 21 ...
## $ SibSp : int 0 1 0 0 1 0 0 1 0 2 ...
## $ Parch : int 0 0 0 0 1 0 0 1 0 0 ...
## $ Ticket : chr "330911" "363272" "240276" "315154" ...
## $ Fare : num 7.83 7 9.69 8.66 12.29 ...
## $ Embarked: chr "Q" "S" "Q" "S" ...
head(td)
## Pclass Sex Age SibSp Parch Ticket Fare Embarked
## 1 3 male 34.5 0 0 330911 7.8292 Q
## 2 3 female 47.0 1 0 363272 7.0000 S
## 3 2 male 62.0 0 0 240276 9.6875 Q
## 4 3 male 27.0 0 0 315154 8.6625 S
## 5 3 female 22.0 1 1 3101298 12.2875 S
## 6 3 male 14.0 0 0 7538 9.2250 S
Mô tả dữ liệu: Bộ dữ liệu gồm 418 quan sát (hành khách) và 8 biến bao gồm: Pclass, Sex, Age, SibSp, Parch, Ticket, Fare, Embarked. Cụ thể trong bộ dữ liệu trên ta có:
Biến định tính:
Pclass: Hạng vé: 1, 2 hoặc 3
Sex: Giới tính (Female/Male)
Ticket: Mã vé tàu
Embarked: Cảng lên tàu (C, Q, S)
Biến định lượng:
Age: Tuổi
SibSp: Số anh/chị/em hoặc vợ/chồng đi cùng
Parch: Số cha/mẹ hoặc con cái đi cùng
Fare: Giá vé
Nội dung dữ liệu ở 5 quan sát đầu và 5 quan sát cuối bảng:
head(td,5)
## Pclass Sex Age SibSp Parch Ticket Fare Embarked
## 1 3 male 34.5 0 0 330911 7.8292 Q
## 2 3 female 47.0 1 0 363272 7.0000 S
## 3 2 male 62.0 0 0 240276 9.6875 Q
## 4 3 male 27.0 0 0 315154 8.6625 S
## 5 3 female 22.0 1 1 3101298 12.2875 S
tail(td, 5)
## Pclass Sex Age SibSp Parch Ticket Fare Embarked
## 414 3 male 57.0 0 0 A.5. 3236 8.0500 S
## 415 1 female 39.0 0 0 PC 17758 108.9000 C
## 416 3 male 38.5 0 0 SOTON/O.Q. 3101262 7.2500 S
## 417 3 male 25.0 0 0 359309 8.0500 S
## 418 3 male 55.0 1 1 2668 22.3583 C
Tiếp theo đó, chúng ta sẽ kiểm tra thêm các giá trị thiếu trong bộ dữ liệu
colSums(is.na(td))
## Pclass Sex Age SibSp Parch Ticket Fare Embarked
## 0 0 0 0 0 0 0 0
Kết quả cho thấy không có giá trị thiếu (N/A) nào trong bộ dữ liệu trên.
Kiểm tra biến định tính có phải dạng factor
dinhtinh <- c('Pclass', 'Sex', 'Ticket', 'Embarked')
data_dinhtinh <- td[,dinhtinh]
#kiểm tra các biến định tính có phải là factor hay chưa
for (i in 1:ncol(data_dinhtinh)) {
a <- is.factor(data_dinhtinh[,i])
cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## Pclass : FALSE
## Sex : FALSE
## Ticket : FALSE
## Embarked : FALSE
Chuyển đổi các biến trên sang kiểu factor
# Chuyển về dạng factor
for (i in 1:ncol(data_dinhtinh)) {
data_dinhtinh[,i] <- as.factor(data_dinhtinh[,i])
}
# Kiểm tra lại
for (i in 1:ncol(data_dinhtinh)) {
a <- is.factor(data_dinhtinh[,i])
cat(colnames(data_dinhtinh)[i],":",a,"\n")
}
## Pclass : TRUE
## Sex : TRUE
## Ticket : TRUE
## Embarked : TRUE
Sau khi kiểm tra kiểu dữ liệu ban đầu, các biến phân loại như Pclass, Sex, Ticket, Embarked đã được chuyển từ kiểu character sang factor. Tổng cộng có 4 biến đã được chuyển đổi thành công.
table(td$Pclass)
##
## 1 2 3
## 107 93 218
Pclass – Hạng vé:
Hạng 1: 107 hành khách
Hạng 2: 93 hành khách
Hạng 3: 218 hành khách
→ Đa số hành khách đi hạng 3
Biểu đồ cho Pclass
install.packages("ggplot2", repos = "https://cran.r-project.org")
##
## There is a binary version available but the source version is later:
## binary source needs_compilation
## ggplot2 3.5.1 3.5.2 FALSE
## installing the source package 'ggplot2'
library(ggplot2)
# Biểu đồ Pclass
ggplot(td, aes(x = Pclass)) +
geom_bar(fill = "steelblue") +
labs(title = "Phân bố hạng vé (Pclass)", x = "Hạng vé", y = "Số lượng") +
theme_minimal()
Kết quả thống kê cho thấy phần lớn hành khách thuộc hạng vé thứ 3 với 218 người, chiếm hơn một nửa tổng số hành khách. Hạng 1 và hạng 2 lần lượt có 107 và 93 người. Điều này cho thấy tầng lớp phổ thông (hạng 3) là nhóm khách chính trên chuyến tàu Titanic.
table(td$Sex)
##
## female male
## 152 266
Sex – Giới tính:
Nam (male): 266 người
Nữ (female): 152 người
→ Nam giới chiếm ưu thế (≈ 64%)
# Biểu đồ Sex
ggplot(td, aes(x = Sex)) +
geom_bar(fill = "tomato") +
labs(title = "Phân bố giới tính", x = "Giới tính", y = "Số lượng") +
theme_minimal()
Giới tính nam chiếm đa số với 266 người (khoảng 64%), trong khi nữ giới có 152 người. Sự chênh lệch này phản ánh rằng hành khách nam nhiều hơn nữ trong tập dữ liệu này.
table(td$Embarked)
##
## C Q S
## 102 46 270
Embarked – Cảng lên tàu:
Cảng S (Southampton): 270 người
Cảng C (Cherbourg): 102 người
Cảng Q (Queenstown): 46 người
→ Phần lớn hành khách lên tàu tại Southampton
# Biểu đồ Embarked
ggplot(td, aes(x = Embarked)) +
geom_bar(fill = "darkgreen") +
labs(title = "Cảng lên tàu", x = "Cảng", y = "Số lượng") +
theme_minimal()
Cảng Southampton (S) là nơi có số lượng hành khách lên tàu nhiều nhất với 270 người, tiếp theo là Cherbourg (C) với 102 người và Queenstown (Q) với 46 người. Như vậy, cảng S là điểm xuất phát chính của hành khách trên tàu Titanic trong bộ dữ liệu này.
table(td$Ticket)
##
## 110469 110489 110813 111163
## 1 1 1 1
## 112051 112058 112377 112378
## 1 1 1 2
## 112901 113038 113044 113054
## 1 1 1 1
## 113059 113503 113509 113773
## 1 4 1 1
## 113778 113780 113781 113790
## 1 1 2 1
## 113791 113795 113796 113801
## 1 1 1 1
## 11753 11765 11767 11769
## 1 1 1 1
## 11770 11778 11813 1222
## 1 2 1 1
## 12749 13050 13236 13508
## 2 2 2 2
## 13567 13695 13905 1601
## 1 2 1 1
## 16966 17463 17464 17475
## 3 1 1 1
## 17765 17770 19877 19924
## 1 1 1 1
## 19928 19950 2003 211535
## 1 2 1 1
## 21228 21332 220844 220845
## 2 1 1 3
## 226875 228414 230136 233478
## 1 1 2 1
## 233734 235509 236853 236854
## 1 1 1 1
## 237216 237249 237393 237670
## 1 1 1 1
## 237734 237735 237789 239059
## 1 1 1 1
## 240261 240276 24065 24160
## 1 1 2 1
## 242963 244346 244358 244360
## 1 1 1 1
## 244368 248659 248726 248734
## 1 1 1 1
## 248738 248744 248746 250650
## 1 1 1 1
## 250651 2543 2621 2622
## 1 1 1 1
## 2625 26360 2650 2652
## 1 1 2 1
## 2653 2654 2655 2656
## 1 1 1 1
## 2657 2658 2660 2661
## 1 1 2 1
## 2662 2668 2670 26707
## 2 1 1 1
## 2673 2675 2676 2678
## 1 1 1 1
## 2679 2680 2681 2682
## 1 1 1 1
## 2684 2688 2689 2692
## 1 1 1 1
## 2696 2698 28004 28034
## 1 1 1 1
## 28133 28220 28221 28404
## 1 2 1 1
## 28664 28666 29103 29105
## 1 1 2 1
## 29107 2926 29750 3101266
## 1 1 1 1
## 3101295 3101297 3101298 315083
## 1 1 1 1
## 315085 315087 315091 315092
## 1 1 1 1
## 315095 315152 315153 315154
## 1 1 2 1
## 32302 329944 330844 330910
## 1 1 1 1
## 330911 330920 330924 330963
## 1 1 1 1
## 330968 330971 330972 334914
## 1 1 1 1
## 334915 335432 33638 3410
## 1 1 2 1
## 342441 342684 342712 343271
## 1 1 1 1
## 345498 345501 345572 345763
## 1 1 1 1
## 345768 345771 345775 3470
## 1 1 1 1
## 347065 347066 347070 347072
## 1 1 1 2
## 347075 347077 347079 347080
## 1 3 1 1
## 347086 347090 347091 347465
## 1 1 1 1
## 347467 347469 347471 348122
## 1 1 1 1
## 348125 349202 349211 349220
## 1 1 1 1
## 349226 349229 349230 349232
## 1 1 1 1
## 349235 349238 349250 349255
## 1 1 1 1
## 349256 349909 349910 349911
## 1 1 1 1
## 350026 350033 350045 350053
## 1 1 1 1
## 350054 350403 350405 350408
## 1 1 2 1
## 350409 350410 350416 359306
## 1 1 1 1
## 359309 363272 363611 364498
## 1 1 1 1
## 364856 364858 364859 365235
## 1 1 1 1
## 365237 36568 366713 367226
## 1 1 1 1
## 367227 368364 368402 368573
## 1 1 1 1
## 368702 368783 36928 3701
## 1 1 2 1
## 370129 370368 370371 370374
## 1 1 1 1
## 371109 371362 376563 376566
## 1 1 1 1
## 382650 382652 382653 383123
## 1 1 1 1
## 383162 386525 392091 392095
## 1 1 1 1
## 4133 65305 680 694
## 1 1 1 1
## 7266 7538 7548 7935
## 1 1 1 1
## 9232 A. 2. 39186 A./5. 3338 A.5. 3236
## 1 1 1 1
## A/4 31416 A/4 48871 A/4 48873 A/5 1478
## 1 1 1 1
## A/5 21175 A/5. 3337 A/5. 851 AQ/3. 30631
## 1 1 2 1
## AQ/4 3130 C 17368 C 4001 C.A. 15185
## 1 1 2 1
## C.A. 2315 C.A. 2673 C.A. 30769 C.A. 31029
## 2 1 1 3
## C.A. 31030 C.A. 33112 C.A. 33595 C.A. 34050
## 1 2 1 1
## C.A. 34644 C.A. 34651 C.A. 37671 C.A. 42795
## 1 1 1 1
## C.A. 49867 C.A. 6212 CA 2144 CA 31352
## 1 1 2 2
## CA. 2343 F.C. 12750 F.C. 12998 F.C.C. 13528
## 4 1 1 1
## F.C.C. 13534 F.C.C. 13540 LP 1588 PC 17483
## 2 1 1 3
## PC 17531 PC 17558 PC 17562 PC 17569
## 1 1 1 1
## PC 17580 PC 17585 PC 17591 PC 17592
## 1 1 1 1
## PC 17594 PC 17597 PC 17598 PC 17599
## 1 1 1 1
## PC 17603 PC 17606 PC 17607 PC 17608
## 1 1 1 5
## PC 17613 PC 17755 PC 17756 PC 17757
## 1 1 2 1
## PC 17758 PC 17759 PC 17760 PC 17761
## 1 1 1 1
## PP 9549 S.C./PARIS 2079 S.O./P.P. 2 S.O./P.P. 251
## 1 1 2 1
## S.O./P.P. 752 S.O.C. 14879 SC 14888 SC/A.3 2861
## 1 2 1 1
## SC/A4 23568 SC/AH 29037 SC/AH 3085 SC/Paris 2123
## 1 1 1 1
## SC/PARIS 2147 SC/PARIS 2148 SC/PARIS 2159 SC/PARIS 2166
## 1 1 1 1
## SC/PARIS 2167 SC/PARIS 2168 SOTON/O.Q. 3101262 SOTON/O.Q. 3101263
## 1 1 1 1
## SOTON/O.Q. 3101308 SOTON/O.Q. 3101309 SOTON/O.Q. 3101314 SOTON/O.Q. 3101315
## 1 1 1 3
## SOTON/O2 3101284 SOTON/OQ 392083 STON/O 2. 3101268 STON/O 2. 3101291
## 1 1 1 1
## STON/O2. 3101270 STON/OQ. 369943 W./C. 14260 W./C. 14266
## 1 1 1 1
## W./C. 6607 W./C. 6608 W.E.P. 5734
## 2 1 1
Biến Ticket có tính chất định danh, mỗi giá trị đại diện cho một mã vé cụ thể được cấp cho hành khách hoặc nhóm hành khách. Trong bộ dữ liệu gồm 418 quan sát, có đến 363 mã vé khác nhau, trong đó phần lớn chỉ xuất hiện đúng 1 lần.
Điều này cho thấy rằng hầu hết hành khách có mã vé riêng biệt. Một số mã vé lặp lại nhiều hơn 1 lần, cho thấy có thể là những hành khách đi cùng nhóm, sử dụng chung vé. Tuy nhiên, do số lượng giá trị duy nhất quá nhiều, biến Ticket không phù hợp để mô tả bằng biểu đồ tần suất hoặc biểu đồ cột.
Câu hỏi giả định: Liệu tuổi trung bình của hành khách có bằng 30 không?
1. Ước lượng khoảng tin cậy 95% cho kỳ vọng tuổi
# Loại bỏ giá trị NA trước khi phân tích
age_data <- na.omit(td$Age)
# Tính khoảng tin cậy 95% cho trung bình
t.test(age_data, conf.level = 0.95)
##
## One Sample t-test
##
## data: age_data
## t = 44.132, df = 417, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 29.95184 32.74434
## sample estimates:
## mean of x
## 31.34809
Dựa trên kết quả kiểm định trên, khoảng tin cậy 95% cho tuổi trung bình của hành khách nằm trong khoảng: [29.9518;32.7443]
→ Nghĩa là với độ tin cậy 95%, tuổi trung bình của hành khách trên tàu Titanic nằm giữa khoảng gần 30 đến gần 33 tuổi.
2. Kiểm định giả thiết
Giả thiết:
H0: μ = 30 (Tuổi trung bình bằng 30)
H1: μ ≠ 30 (Tuổi trung bình khác 30)
t.test(age_data, mu = 30)
##
## One Sample t-test
##
## data: age_data
## t = 1.8979, df = 417, p-value = 0.0584
## alternative hypothesis: true mean is not equal to 30
## 95 percent confidence interval:
## 29.95184 32.74434
## sample estimates:
## mean of x
## 31.34809
Giả thiết gốc (H₀): Tuổi trung bình = 30
Giả thiết đối (H₁): Tuổi trung bình ≠ 30
Kết quả kiểm định t:
t = 1.8979
df = 417
p-value = 0.0584
→ Vì p-value = 0.0584 > 0.05, ta không bác bỏ giả thiết H₀ ở mức ý nghĩa 5%.
install.packages("DT", repos = "https://cran.r-project.org")
## package 'DT' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Admin\AppData\Local\Temp\RtmpWAvFlW\downloaded_packages
library(dplyr)
##
## 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
library(DT)
# Tạo bảng tần suất chéo
tbl <- table(td$Pclass, td$Sex)
# In bảng tần suất
print(tbl)
##
## female male
## 1 50 57
## 2 30 63
## 3 72 146
# Chuyển bảng tần suất thành data frame
df_tbl <- as.data.frame(tbl)
colnames(df_tbl) <- c("Pclass", "Sex", "Frequency")
# Tính tổng số quan sát
total <- sum(df_tbl$Frequency)
# Thêm cột phần trăm trên tổng số
df_tbl <- df_tbl %>%
mutate(Percentage = paste0(round(Frequency / total * 100, 2), "%"))
print(df_tbl)
## Pclass Sex Frequency Percentage
## 1 1 female 50 11.96%
## 2 2 female 30 7.18%
## 3 3 female 72 17.22%
## 4 1 male 57 13.64%
## 5 2 male 63 15.07%
## 6 3 male 146 34.93%
datatable(df_tbl)
barplot(tbl,
beside = TRUE,
col = c("skyblue", "orange", "green"),
legend = rownames(tbl),
main = "Barplot: Phân bố giới tính theo hạng vé",
xlab = "Giới tính", ylab = "Số lượng")
Nhận xét:
Kết quả phân tích cho thấy sự phân bố khác biệt rõ rệt giữa các nhóm hành khách theo hạng vé (Pclass) và giới tính (Sex).
Trong số hành khách nữ, nhóm nhiều nhất thuộc hạng vé 3 với 72 người, chiếm 17.22% tổng số, tiếp theo là hạng vé 1 với 50 người (11.96%) và hạng vé 2 với 30 người (7.18%).
Đối với hành khách nam, nhóm đông nhất cũng là hạng vé 3 với 146 người, chiếm tỷ lệ cao nhất 34.93%, sau đó là hạng vé 2 với 63 người (15.07%) và hạng vé 1 với 57 người (13.64%).
-> Như vậy, cả nam và nữ đều có xu hướng tập trung đông nhất ở hạng vé phổ thông (pclass 3). Tuy nhiên, tỷ lệ nam giới ở hạng vé 3 chiếm phần lớn hơn đáng kể so với nữ giới, cho thấy sự chênh lệch về phân bố giới tính theo hạng vé.
prod <- table(td$Pclass, td$Sex)
chisq.test(prod)
##
## Pearson's Chi-squared test
##
## data: prod
## X-squared = 6.6939, df = 2, p-value = 0.03519
##
Với mức ý nghĩa thông thường α = 0.05:
Do p-value = 0.03519 < 0.05, ta bác bỏ giả thuyết H0.
Nghĩa là: có mối liên hệ có ý nghĩa thống kê giữa giới tính (sex) và hạng vé (pclass).
Nói cách khác, phân bố giới tính không đồng đều giữa các hạng vé.
Kết luận:
Kết quả kiểm định Chi-bình phương cho thấy rằng giới tính và hạng vé có mối quan hệ phụ thuộc. Phân bố nam và nữ thay đổi theo từng hạng vé, phản ánh sự khác biệt về giới tính trong các tầng lớp hành khách.
# Tạo bảng 2x2
tbl_2x2 <- matrix(c(50, 57, 72, 146), nrow = 2, byrow = TRUE)
colnames(tbl_2x2) <- c("female", "male")
rownames(tbl_2x2) <- c("pclass1", "pclass3")
print(tbl_2x2)
## female male
## pclass1 50 57
## pclass3 72 146
# Tính Relative Risk (RR)
a <- tbl_2x2[1, 1] # pclass1 - female
b <- tbl_2x2[1, 2] # pclass1 - male
c <- tbl_2x2[2, 1] # pclass3 - female
d <- tbl_2x2[2, 2] # pclass3 - male
# Tỷ lệ nữ ở mỗi nhóm
risk1 <- a / (a + b)
risk3 <- c / (c + d)
rr <- risk1 / risk3
cat("Relative Risk (RR):", rr, "\n")
## Relative Risk (RR): 1.414849
# Tính Odds Ratio (OR)
or <- (a * d) / (b * c)
cat("Odds Ratio (OR):", or, "\n")
## Odds Ratio (OR): 1.778752
Kết luận:
Dựa trên bảng 2x2 giữa pclass và sex, kết quả cho thấy:
-> Điều này cho thấy hành khách nữ có xu hướng chọn hạng vé cao (pclass 1) nhiều hơn so với hành khách nữ ở hạng vé phổ thông (pclass 3).
-> Nói cách khác, giới tính nữ phổ biến hơn tương đối ở hạng vé cao hơn.
*BẢng tần số chéchéo
tbl_sex_emb <- table(td$Sex, td$Embarked)
tbl_sex_emb
##
## C Q S
## female 40 24 88
## male 62 22 182
prop.table(tbl_sex_emb, margin = 2) * 100
##
## C Q S
## female 39.21569 52.17391 32.59259
## male 60.78431 47.82609 67.40741
Tỷ lệ nữ theo từng bến:
C: 39.2%
Q: 52.2%
S: 32.6%
⟶ Có sự khác biệt rõ ràng trong tỷ lệ giới tính giữa các cảng lên tàu.
*Trực quan hóa
library(ggplot2)
# Sex vs Embarked
ggplot(td, aes(x = Embarked, fill = Sex)) +
geom_bar(position = "fill") +
ylab("Tỷ lệ") +
scale_y_continuous(labels = scales::percent) +
ggtitle("Tỷ lệ giới tính theo nơi lên tàu") +
theme_minimal()
*Kiếm định Chi-bình phương
chisq.test(tbl_sex_emb)
##
## Pearson's Chi-squared test
##
## data: tbl_sex_emb
## X-squared = 6.9867, df = 2, p-value = 0.0304
Kiểm định Chi-bình phương: X² = 6.9867
df = 2
p-value = 0.0304
Kết luận: Có mối quan hệ có ý nghĩa thống kê giữa giới tính và nơi lên tàu (vì p < 0.05). Điều này cho thấy tỷ lệ nam và nữ không phân bố đồng đều giữa các điểm lên tàu.
*Relative Risk (RR) & Odds Ratio (OR)
if (!require(epitools)) install.packages("epitools")
## Loading required package: epitools
library(epitools)
td_bin <- subset(td, Embarked %in% c("S", "C"))
tbl <- table(td_bin$Sex, td_bin$Embarked)
riskratio(tbl)
## $data
##
## C S Total
## female 40 88 128
## male 62 182 244
## Total 102 270 372
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## female 1.000000 NA NA
## male 1.084948 0.945231 1.245317
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## female NA NA NA
## male 0.2345738 0.2708785 0.2303184
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl)
## $data
##
## C S Total
## female 40 88 128
## male 62 182 244
## Total 102 270 372
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## female 1.000000 NA NA
## male 1.334262 0.8278558 2.137469
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## female NA NA NA
## male 0.2345738 0.2708785 0.2303184
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
*Relative Risk (RR) – với Embarked = C và S:
RR (nam so với nữ) = 1.08
Khoảng tin cậy 95%: (0.95 – 1.25)
p = 0.2346 ⟶ không có ý nghĩa thống kê
⟶ Nam có nguy cơ cao hơn một chút đi từ Southampton so với nữ, nhưng không đủ bằng chứng thống kê để khẳng định sự khác biệt.
*Odds Ratio (OR):
OR (nam so với nữ) = 1.33
Khoảng tin cậy 95%: (0.83 – 2.14)
p = 0.2346
⟶ Mặc dù tỷ lệ odds đi từ Southampton cao hơn ở nam, khác biệt không có ý nghĩa thống kê.
Kết luận: Kết quả phân tích cho thấy giới tính có mối liên hệ thống kê với bến lên tàu, nhưng khi so sánh xác suất cụ thể (RR và OR), sự khác biệt giữa nam và nữ khi lên từ cảng C và S không đủ mạnh để khẳng định có khác biệt thật sự về mặt thống kê.
tbl_pclass_sex <- table(td$Pclass, td$Sex)
print(tbl_pclass_sex)
##
## female male
## 1 50 57
## 2 30 63
## 3 72 146
prop.table(tbl_pclass_sex, margin = 2) * 100 # phần trăm theo giới tính
##
## female male
## 1 32.89474 21.42857
## 2 19.73684 23.68421
## 3 47.36842 54.88722
Tỷ lệ nữ ở mỗi hạng vé:
Pclass 1: 46.7%
Pclass 2: 32.3%
Pclass 3: 33.0%
library(ggplot2)
ggplot(td, aes(x = Sex, fill = Pclass)) +
geom_bar(position = "fill") +
ylab("Tỷ lệ") +
ggtitle("Tỷ lệ hạng vé theo giới tính") +
scale_y_continuous(labels = scales::percent_format())
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
chisq.test(tbl_pclass_sex)
##
## Pearson's Chi-squared test
##
## data: tbl_pclass_sex
## X-squared = 6.6939, df = 2, p-value = 0.03519
Giá trị thống kê: χ² = 6.6939
Bậc tự do: df = 2
p-value = 0.0352
Kết luận: Có mối liên hệ có ý nghĩa thống kê giữa giới tính và hạng vé. Giới tính ảnh hưởng đến sự phân bố hành khách theo từng hạng vé.
library(epitools)
td_sub1 <- subset(td, Pclass %in% c("1", "3"))
tbl_rr_or1 <- table(td_sub1$Pclass, td_sub1$Sex)
print(tbl_rr_or1)
##
## female male
## 1 50 57
## 3 72 146
riskratio(tbl_rr_or1)
## $data
##
## female male Total
## 1 50 57 107
## 3 72 146 218
## Total 122 203 325
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## 1 1.000000 NA NA
## 3 1.257203 1.028841 1.536251
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## 1 NA NA NA
## 3 0.01784201 0.02045651 0.01652187
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl_rr_or1)
## $data
##
## female male Total
## 1 50 57 107
## 3 72 146 218
## Total 122 203 325
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## 1 1.000000 NA NA
## 3 1.775235 1.10439 2.85704
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## 1 NA NA NA
## 3 0.01784201 0.02045651 0.01652187
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
RR (female, 1 vs 3) = 1.41 → Nữ có khả năng đi Pclass 1 cao hơn 1.41 lần so với Pclass 3.
OR (female, 1 vs 3) = 1.78 → Tỷ lệ odds để là nữ trong Pclass 1 cao hơn 1.78 lần so với Pclass 3.
Kết luận: Nữ giới có xu hướng đi hạng vé cao hơn nam giới. Kết quả thống kê hỗ trợ giả thuyết rằng giới tính có ảnh hưởng đến phân tầng hành khách theo vé.’
tbl_pclass_emb <- table(td$Pclass, td$Embarked)
print(tbl_pclass_emb)
##
## C Q S
## 1 56 1 50
## 2 11 4 78
## 3 35 41 142
prop.table(tbl_pclass_emb, margin = 2) * 100 # phần trăm theo nơi lên tàu
##
## C Q S
## 1 54.901961 2.173913 18.518519
## 2 10.784314 8.695652 28.888889
## 3 34.313725 89.130435 52.592593
Phân bố hạng vé có sự khác biệt rõ ràng giữa các cảng lên tàu.
ggplot(td, aes(x = Embarked, fill = Pclass)) +
geom_bar(position = "fill") +
ylab("Tỷ lệ") +
ggtitle("Tỷ lệ hạng vé theo nơi lên tàu") +
scale_y_continuous(labels = scales::percent_format())
## Warning: The following aesthetics were dropped during statistical transformation: fill.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
Biểu đồ cột tỷ lệ theo từng bến cho thấy:
Cherbourg (C): phần lớn hành khách đi Pclass 1
Queenstown (Q): gần như toàn bộ là Pclass 3
Southampton (S): chủ yếu là Pclass 3, một phần là Pclass 2
⟶ Biểu đồ củng cố sự khác biệt mạnh giữa các nhóm hành khách theo điểm khởi hành.
chisq.test(tbl_pclass_emb)
##
## Pearson's Chi-squared test
##
## data: tbl_pclass_emb
## X-squared = 82.832, df = 4, p-value < 2.2e-16
Giá trị thống kê: χ² = 82.832
df = 4
p-value < 2.2e-16
Kết luận: Có mối quan hệ rất có ý nghĩa thống kê giữa hạng vé và nơi lên tàu. Phân bố hạng vé không đồng đều giữa các cảng, và sự khác biệt là cực kỳ rõ rệt.
td_sub2 <- subset(td, Pclass %in% c("1", "3") & Embarked %in% c("S", "C"))
tbl_rr_or2 <- table(td_sub2$Pclass, td_sub2$Embarked)
print(tbl_rr_or2)
##
## C S
## 1 56 50
## 3 35 142
riskratio(tbl_rr_or2)
## $data
##
## C S Total
## 1 56 50 106
## 3 35 142 177
## Total 91 192 283
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## 1 1.000000 NA NA
## 3 1.700791 1.372675 2.107339
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## 1 NA NA NA
## 3 1.305133e-08 1.888476e-08 8.285642e-09
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
oddsratio(tbl_rr_or2)
## $data
##
## C S Total
## 1 56 50 106
## 3 35 142 177
## Total 91 192 283
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## 1 1.000000 NA NA
## 3 4.508035 2.663002 7.747982
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## 1 NA NA NA
## 3 1.305133e-08 1.888476e-08 8.285642e-09
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Relative Risk (RR)
RR (Pclass 3 so với Pclass 1) = 1.70
95% CI: (1.37 – 2.11)
p-value = 1.3 × 10⁻⁸
Diễn giải: Hành khách lên từ Southampton có nguy cơ đi Pclass 3 cao hơn 1.7 lần so với hành khách đi từ Cherbourg. Kết quả có ý nghĩa thống kê mạnh.
Odds Ratio (OR):
OR (Pclass 3 vs Pclass 1) = 4.51
95% CI: (2.66 – 7.75)
p-value ≈ 1.3 × 10⁻⁸
Diễn giải: Tỷ số odds để đi Pclass 3 ở người lên từ Southampton cao hơn 4.5 lần so với người lên từ Cherbourg. Mối quan hệ này có độ tin cậy rất cao.
-> Phân tích cho thấy nơi lên tàu (Embarked) có tác động rõ rệt và có ý nghĩa thống kê mạnh đến hạng vé (Pclass) của hành khách. Hành khách từ Cherbourg có xu hướng đi hạng cao (Pclass 1), trong khi hành khách từ Queenstown hoặc Southampton chủ yếu đi hạng phổ thông (Pclass 3).
Kết quả kiểm định Chi-bình phương, cùng với các chỉ số RR và OR, đều khẳng định mối liên hệ mạnh và đáng tin cậy giữa nơi lên tàu và điều kiện kinh tế – xã hội phản ánh qua loại vé.