library(readr)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
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(skimr)
## Warning: package 'skimr' was built under R version 4.3.3
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(csv)
## Warning: package 'csv' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(pander)
## Warning: package 'pander' was built under R version 4.3.3
library(formattable)
## Warning: package 'formattable' was built under R version 4.3.3
library(htmltools)
##
## Attaching package: 'htmltools'
## The following object is masked from 'package:pander':
##
## p
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
##
## Attaching package: 'DescTools'
## The following objects are masked from 'package:psych':
##
## AUC, ICC, SD
library(epitools)
Bộ dữ liệu này mô phỏng hồ sơ bệnh nhân COVID-19 tại Đan Mạch, tập trung vào các yếu tố như lần nhiễm đầu tiên, tái nhiễm, tiêm vắc-xin, hội chứng hậu COVID (long COVID), cùng các thông tin nhân khẩu học và kết quả lâm sàng quan trọng. Dữ liệu bao gồm 3.000 hồ sơ tổng hợp với 26 đặc trưng liên quan, được thiết kế sát với thực tế nhằm phục vụ cho việc phân tích khám phá, mô hình dịch tễ học và mục đích giáo dục.
Toàn bộ dữ liệu đều là dữ liệu tổng hợp (synthetic), tái hiện các xu hướng thực tế từng ghi nhận trong giai đoạn đại dịch 2020–2024, đảm bảo an toàn khi sử dụng công khai. Bộ dữ liệu này phù hợp cho các ứng dụng như học máy, phân tích sống sót (survival analysis), khám phá yếu tố nguy cơ và nhiều nghiên cứu khác.
d <- read.csv("D:/PTDLDT/covid_related_disease_data.csv")
names(d)
## [1] "Patient_ID" "Age" "Gender"
## [4] "Region" "Preexisting_Condition" "Date_of_Infection"
## [7] "COVID_Strain" "Symptoms" "Severity"
## [10] "Hospitalized" "ICU_Admission" "Ventilator_Support"
## [13] "Recovered" "Reinfection" "Vaccination_Status"
## [16] "Vaccine_Type" "Doses_Received" "Long_COVID_Symptoms"
## [19] "Occupation" "Smoking_Status" "BMI"
str(d)
## 'data.frame': 3000 obs. of 21 variables:
## $ Patient_ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Age : int 69 38 41 81 50 66 76 77 79 72 ...
## $ Gender : chr "Male" "Male" "Female" "Female" ...
## $ Region : chr "Hovedstaden" "Sjælland" "Syddanmark" "Hovedstaden" ...
## $ Preexisting_Condition: chr "Obesity" "Asthma" "Hypertension" "Asthma" ...
## $ Date_of_Infection : chr "21/06/2022" "02/02/2024" "28/05/2023" "13/08/2023" ...
## $ COVID_Strain : chr "Delta" "XBB.1.5" "Beta" "Delta" ...
## $ Symptoms : chr "Mild" "Mild" "Mild" "Severe" ...
## $ Severity : chr "Moderate" "Moderate" "High" "High" ...
## $ Hospitalized : chr "Yes" "No" "Yes" "No" ...
## $ ICU_Admission : chr "No" "No" "Yes" "No" ...
## $ Ventilator_Support : chr "No" "No" "Yes" "No" ...
## $ Recovered : chr "Yes" "No" "No" "Yes" ...
## $ Reinfection : chr "No" "No" "No" "Yes" ...
## $ Vaccination_Status : chr "Yes" "No" "Yes" "Yes" ...
## $ Vaccine_Type : chr "None" "None" "Janssen" "AstraZeneca" ...
## $ Doses_Received : int 1 0 3 1 2 3 0 3 0 1 ...
## $ Long_COVID_Symptoms : chr "None" "None" "None" "None" ...
## $ Occupation : chr "Healthcare" "Healthcare" "Unemployed" "Office Worker" ...
## $ Smoking_Status : chr "Never" "Never" "Never" "Never" ...
## $ BMI : num 27.7 21.9 22.7 27.7 11.9 29.8 22.3 24.4 26.1 21.2 ...
Bộ dữ liệu covid_related_disease_data chứa tổng cộng 3.000 bản ghi với 21 biến đặc trưng mô tả thông tin liên quan đến bệnh nhân nhiễm COVID-19. Việc hiểu rõ cấu trúc và ý nghĩa của các biến là bước đầu quan trọng trong quá trình phân tích và xử lý dữ liệu.
Các biến trong bộ dữ liệu bao gồm:
Tên biến | Mô tả |
---|---|
Patient_ID |
Mã định danh duy nhất cho từng bệnh nhân |
Age |
Tuổi của bệnh nhân |
Gender |
Giới tính bệnh nhân (Male: nam, Female: nữ) |
Region |
Khu vực địa lý sinh sống (ví dụ: Hovedstaden, Sjælland, …) |
Preexisting_Condition |
Bệnh nền trước khi nhiễm (ví dụ: Obesity, Asthma, Hypertension, …) |
Date_of_Infection |
Ngày nhiễm COVID-19 (định dạng “DD/MM/YYYY”) |
COVID_Strain |
Biến thể virus SARS-CoV-2 mà bệnh nhân nhiễm (ví dụ: Delta, Beta, …) |
Symptoms |
Mức độ triệu chứng ban đầu (ví dụ: Mild, Severe) |
Severity |
Mức độ nghiêm trọng tổng thể của bệnh (ví dụ: Moderate, High) |
Hospitalized |
Bệnh nhân có nhập viện hay không (Yes/No) |
ICU_Admission |
Bệnh nhân có nhập ICU hay không (Yes/No) |
Ventilator_Support |
Bệnh nhân có cần hỗ trợ thở máy không (Yes/No) |
Recovered |
Bệnh nhân đã hồi phục hay chưa (Yes/No) |
Reinfection |
Bệnh nhân có tái nhiễm COVID-19 không (Yes/No) |
Vaccination_Status |
Bệnh nhân đã tiêm vắc-xin hay chưa (Yes/No) |
Vaccine_Type |
Loại vắc-xin đã tiêm (nếu có), ví dụ: AstraZeneca, Janssen |
Doses_Received |
Số liều vắc-xin mà bệnh nhân đã tiêm |
Long_COVID_Symptoms |
Triệu chứng COVID kéo dài sau khi khỏi bệnh (nếu có) |
Occupation |
Nghề nghiệp của bệnh nhân |
Smoking_Status |
Tình trạng hút thuốc (Never, Former, Current, …) |
BMI |
Chỉ số khối cơ thể của bệnh nhân (BMI - Body Mass Index) |
dldt <- c("Gender", "Region", "Preexisting_Condition", "COVID_Strain",
"Symptoms", "Severity", "Hospitalized", "ICU_Admission", "Ventilator_Support",
"Recovered", "Reinfection", "Vaccination_Status", "Vaccine_Type",
"Long_COVID_Symptoms", "Occupation", "Smoking_Status")
dldt
## [1] "Gender" "Region" "Preexisting_Condition"
## [4] "COVID_Strain" "Symptoms" "Severity"
## [7] "Hospitalized" "ICU_Admission" "Ventilator_Support"
## [10] "Recovered" "Reinfection" "Vaccination_Status"
## [13] "Vaccine_Type" "Long_COVID_Symptoms" "Occupation"
## [16] "Smoking_Status"
dt <- d[, dldt]
head(dt)
## Gender Region Preexisting_Condition COVID_Strain Symptoms Severity
## 1 Male Hovedstaden Obesity Delta Mild Moderate
## 2 Male Sjælland Asthma XBB.1.5 Mild Moderate
## 3 Female Syddanmark Hypertension Beta Mild High
## 4 Female Hovedstaden Asthma Delta Severe High
## 5 Female Syddanmark Cardiovascular Delta Mild High
## 6 Male Sjælland Cardiovascular Omicron Moderate Moderate
## Hospitalized ICU_Admission Ventilator_Support Recovered Reinfection
## 1 Yes No No Yes No
## 2 No No No No No
## 3 Yes Yes Yes No No
## 4 No No No Yes Yes
## 5 No No No No No
## 6 No No No Yes No
## Vaccination_Status Vaccine_Type Long_COVID_Symptoms Occupation
## 1 Yes None None Healthcare
## 2 No None None Healthcare
## 3 Yes Janssen None Unemployed
## 4 Yes AstraZeneca None Office Worker
## 5 Yes None None Student
## 6 Yes AstraZeneca None Healthcare
## Smoking_Status
## 1 Never
## 2 Never
## 3 Never
## 4 Never
## 5 Never
## 6 Never
tail(dt)
## Gender Region Preexisting_Condition COVID_Strain Symptoms Severity
## 2995 Male Syddanmark None Delta Mild Low
## 2996 Male Nordjylland Hypertension XBB.1.5 Severe Critical
## 2997 Female Syddanmark Obesity Omicron Moderate Low
## 2998 Female Sjælland Cardiovascular Beta Severe Moderate
## 2999 Female Hovedstaden Asthma Delta Severe Moderate
## 3000 Female Midtjylland Obesity XBB.1.5 Moderate Low
## Hospitalized ICU_Admission Ventilator_Support Recovered Reinfection
## 2995 No No No No No
## 2996 No No No No No
## 2997 No No No No No
## 2998 No No No No No
## 2999 No No No No No
## 3000 No No No No No
## Vaccination_Status Vaccine_Type Long_COVID_Symptoms Occupation
## 2995 No None None Student
## 2996 Yes None None Driver
## 2997 Yes Pfizer None Healthcare
## 2998 Yes Moderna None Teacher
## 2999 Yes AstraZeneca None Student
## 3000 No None None Teacher
## Smoking_Status
## 2995 Never
## 2996 Never
## 2997 Never
## 2998 Former
## 2999 Never
## 3000 Former
any(is.na(dt))
## [1] FALSE
Vậy bộ dữ liệu không có giá trị thiếu
# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class)
## Gender Region Preexisting_Condition
## "character" "character" "character"
## COVID_Strain Symptoms Severity
## "character" "character" "character"
## Hospitalized ICU_Admission Ventilator_Support
## "character" "character" "character"
## Recovered Reinfection Vaccination_Status
## "character" "character" "character"
## Vaccine_Type Long_COVID_Symptoms Occupation
## "character" "character" "character"
## Smoking_Status
## "character"
dt <- data.frame(lapply(dt, as.factor))
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Gender)/sum(nrow(dt))
##
## Female Male
## 0.509 0.491
Bảng tần số
#Lập bảng tần số biến
table(dt$Gender)
##
## Female Male
## 1527 1473
Biểu đồ
gender_freq <- table(dt$Gender)
gender_pct <- gender_freq / nrow(dt)
# Bước 1: Chuyển bảng sang data.frame
gender_freq <- table(dt$Gender) # Đếm số lượng từng nhóm giới tính (ví dụ: "M", "F"), trả về đối tượng table
gender_df <- as.data.frame(gender_freq) # Chuyển từ table sang data.frame để xử lý dễ hơn trong ggplot2
colnames(gender_df) <- c("Gender", "Count") # Đặt tên cột rõ ràng: "Gender" là tên nhóm, "Count" là số lượng
# Bước 2: Tính phần trăm
gender_df$Percent <- gender_df$Count / sum(gender_df$Count) * 100
# Bước 3: Tạo nhãn giống như trong pie()
gender_df$Label <- paste0( # Ghép chuỗi để tạo nhãn
gender_df$Gender, " (", # Thêm tên giới tính và dấu mở ngoặc
round(gender_df$Percent, 1), "%)" # Làm tròn phần trăm 1 chữ số và thêm dấu %
)
# Bước 4: Vẽ biểu đồ tròn bằng ggplot2
ggplot(gender_df, aes(x = "", y = Count, fill = Gender)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y") +
theme_void() +
labs(title = "Biểu đồ 1. Phân bố giới tính (Gender)") +
geom_text(aes(label = Label),
position = position_stack(vjust = 0.5),
size = 5) +
scale_fill_manual(values = c("Female" = "lightpink",
"Male" = "lightblue"))
Nhận xét:
Trong bộ dữ liệu, biến định tính Gender (giới tính) gồm hai nhóm chính là Female (nữ) và Male (nam), với số lượng lần lượt là 1.527 và 1.473 người, chiếm tỷ lệ tương ứng khoảng 50,9% và 49,1% trên tổng số 3.000 quan sát.
Phân bố này cho thấy sự cân bằng khá rõ rệt giữa hai giới, không có sự thiên lệch lớn nào về số lượng giữa nam và nữ. Điều này mang lại lợi thế khi phân tích dữ liệu theo giới tính, bởi vì mẫu đại diện tương đối đều giúp tránh sai lệch do mất cân bằng nhóm. Bên cạnh đó, sự đồng đều về giới còn góp phần đảm bảo tính khách quan khi đánh giá các yếu tố như mức độ nghiêm trọng của bệnh, tỷ lệ nhập viện, tình trạng phục hồi hay mức độ ảnh hưởng của các biến thể virus hoặc hiệu quả vắc-xin giữa nam và nữ. Tuy mức chênh lệch chỉ khoảng 1,8%, nếu dữ liệu được mở rộng hơn nữa, việc kiểm định thống kê có thể xác nhận xem đây là sự khác biệt ngẫu nhiên hay phản ánh một đặc điểm có ý nghĩa trong dân số nghiên cứu.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Region)/sum(nrow(dt))
##
## Hovedstaden Midtjylland Nordjylland Sjælland Syddanmark
## 0.2040000 0.2093333 0.1846667 0.2030000 0.1990000
Bảng tần số
#Lập bảng tần số biến
table(dt$Region)
##
## Hovedstaden Midtjylland Nordjylland Sjælland Syddanmark
## 612 628 554 609 597
Biểu đồ
# Bước 1: Tính tần suất theo Region
region_freq <- table(dt$Region) # Đếm số lượng từng vùng
region_df <- as.data.frame(region_freq) # Chuyển sang data.frame
colnames(region_df) <- c("Region", "Count") # Đặt tên cột
# Bước 2: Vẽ biểu đồ cột
ggplot(region_df, aes(x = reorder(Region, -Count), y = Count, fill = Region)) +
geom_bar(stat = "identity") +
geom_text(aes(label = Count), vjust = -0.5, size = 4) + # Hiển thị số ở trên mỗi cột
labs(title = "Biểu đồ 2. Phân bố số lượng theo khu vực (Region)",
x = "Khu vực",
y = "Số lượng") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3") +
guides(fill = guide_none()) # Ẩn chú giải nếu bạn muốn
Nhận xét
Biến Region (khu vực) trong bộ dữ liệu bao gồm 5 vùng địa lý chính: Hovedstaden, Midtjylland, Nordjylland, Sjælland và Syddanmark. Phân bố số lượng bệnh nhân theo khu vực khá đồng đều, không có sự chênh lệch lớn giữa các nhóm. Cụ thể, Midtjylland có số lượng cao nhất với 628 người (chiếm khoảng 20,9%), theo sau là Hovedstaden với 612 người (20,4%), Sjælland với 609 người (20,3%), và Syddanmark với 597 người (19,9%). Nordjylland có số lượng thấp nhất, với 554 người, chiếm khoảng 18,5%.
Mặc dù có sự khác biệt nhỏ về tỷ lệ, nhìn chung, các khu vực đều đóng góp một phần tương đối ngang nhau vào tổng thể dữ liệu. Phân bố cân đối này giúp đảm bảo tính đại diện khi phân tích dữ liệu theo vùng địa lý, đồng thời hạn chế rủi ro thiên lệch do mất cân đối về số lượng mẫu giữa các vùng. Điều này đặc biệt quan trọng trong các phân tích so sánh tác động của COVID-19 theo khu vực cư trú.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Preexisting_Condition)/sum(nrow(dt))
##
## Asthma Cardiovascular Diabetes Hypertension None
## 0.1610000 0.1776667 0.1703333 0.1643333 0.1563333
## Obesity
## 0.1703333
Bảng tần số
#Lập bảng tần số biến
table(dt$Preexisting_Condition)
##
## Asthma Cardiovascular Diabetes Hypertension None
## 483 533 511 493 469
## Obesity
## 511
Biểu đồ
# Chuyển bảng tần số sang data.frame
condition_freq <- as.data.frame(table(dt$Preexisting_Condition))
colnames(condition_freq) <- c("Condition", "Count")
# Vẽ biểu đồ cột ngang với chú thích
ggplot(condition_freq, aes(x = reorder(Condition, Count), y = Count, fill = Condition)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ 3. Phân bố tình trạng bệnh nền (Preexisting Condition)",
x = "Tình trạng bệnh nền",
y = "Số lượng",
fill = "Tình trạng") +
theme_minimal() +
coord_flip() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét
Dữ liệu cho thấy phân bố các bệnh nền trong mẫu nghiên cứu khá đồng đều, với tỷ lệ trung bình từng nhóm bệnh dao động từ 15.6% đến 17.8%. Cụ thể, nhóm bệnh tim mạch (Cardiovascular) chiếm tỷ lệ cao nhất khoảng 17.8%, tiếp theo là các nhóm tiểu đường (Diabetes) và béo phì (Obesity) cùng ở mức 17.0%, tăng huyết áp (Hypertension) 16.4%, hen suyễn (Asthma) 16.1%, và nhóm không có bệnh nền (None) chiếm tỷ lệ thấp nhất khoảng 15.6%.
Về số lượng mẫu, sự cân bằng cũng được duy trì khá tốt, với số ca bệnh ở mỗi nhóm dao động từ 469 đến 533 trường hợp, trong đó nhóm bệnh tim mạch có số lượng lớn nhất (533 ca), còn nhóm không có bệnh nền là 469 ca. Sự cân bằng này rất quan trọng trong nghiên cứu y học vì giúp giảm thiểu sai số do sự chênh lệch về kích thước mẫu giữa các nhóm và tăng tính đại diện, từ đó nâng cao độ tin cậy của các kết quả phân tích liên quan đến ảnh hưởng của từng bệnh nền đối với diễn biến và mức độ nghiêm trọng của COVID-19.
Ngoài ra, việc các nhóm bệnh nền có tỷ lệ và số lượng gần tương đương cũng cho phép so sánh trực tiếp tác động của từng loại bệnh lên sức khỏe người bệnh mà không bị lệch về mặt mẫu số. Điều này đặc biệt hữu ích trong việc xác định các yếu tố nguy cơ chính, hỗ trợ xây dựng chiến lược điều trị và phòng ngừa phù hợp hơn cho các nhóm bệnh nhân khác nhau.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$COVID_Strain)/sum(nrow(dt))
##
## Alpha Beta Delta Omicron XBB.1.5
## 0.1930000 0.2073333 0.2000000 0.2053333 0.1943333
Bảng tần số
#Lập bảng tần số biến
table(dt$COVID_Strain)
##
## Alpha Beta Delta Omicron XBB.1.5
## 579 622 600 616 583
Biểu đồ
# Lập bảng tần số biến COVID_Strain
strain_freq <- as.data.frame(table(dt$COVID_Strain))
colnames(strain_freq) <- c("COVID_Strain", "Count")
# Vẽ biểu đồ cột ngang với chú thích
ggplot(strain_freq, aes(x = reorder(COVID_Strain, Count), y = Count, fill = COVID_Strain)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ 4. Phân bố biến thể COVID-19 (COVID_Strain)",
x = "Biến thể COVID-19",
y = "Số lượng ca",
fill = "Biến thể") +
theme_minimal() +
coord_flip() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét
Dữ liệu cho thấy sự phân bố tương đối đồng đều giữa các biến thể COVID-19 trong mẫu nghiên cứu. Biến thể Beta chiếm tỷ lệ cao nhất với khoảng 20.7% (622 ca), tiếp theo là Omicron (20.5% – 616 ca), Delta (20.0% – 600 ca), XBB.1.5 (19.4% – 583 ca) và Alpha (19.3% – 579 ca). Chênh lệch giữa các nhóm là không lớn, chỉ khoảng 1–2%, cho thấy không có biến thể nào chiếm ưu thế vượt trội trong tổng thể mẫu.
Sự phân bố đồng đều này là điều kiện thuận lợi để tiến hành các phân tích so sánh mức độ ảnh hưởng của từng biến thể đến diễn biến bệnh, giúp đảm bảo tính công bằng và độ tin cậy trong các kết luận nghiên cứu.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Symptoms)/sum(nrow(dt))
##
## Mild Moderate Severe
## 0.3366667 0.3260000 0.3373333
Bảng tần số
#Lập bảng tần số biến
table(dt$Symptoms)
##
## Mild Moderate Severe
## 1010 978 1012
Biểu đồ
# Tạo bảng tần số và phần trăm
symptom_freq <- as.data.frame(table(dt$Symptoms))
colnames(symptom_freq) <- c("Symptoms", "Count")
symptom_freq$Percent <- round(100 * symptom_freq$Count / sum(symptom_freq$Count), 1)
# Tạo nhãn hiển thị
symptom_freq$Label <- paste0(symptom_freq$Percent, "%")
# Tính vị trí trung tâm từng phần (cho vị trí nhãn)
symptom_freq$ypos <- cumsum(symptom_freq$Count) - 0.5 * symptom_freq$Count
# Vẽ biểu đồ tròn với nhãn phần trăm
ggplot(symptom_freq, aes(x = "", y = Count, fill = Symptoms)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(y = ypos, label = Label), color = "black", size = 4) +
labs(title = "Biểu đồ 5. Phân bố mức độ triệu chứng ban đầu (Symptoms)",
fill = "Triệu chứng") +
theme_void() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Severity)/sum(nrow(dt))
##
## Critical High Low Moderate
## 0.2370000 0.2553333 0.2440000 0.2636667
Bảng tần số
#Lập bảng tần số biến
table(dt$Severity)
##
## Critical High Low Moderate
## 711 766 732 791
Biểu đồ
# Bảng tần suất theo phần trăm
severity_freq <- as.data.frame(prop.table(table(dt$Severity)))
colnames(severity_freq) <- c("Severity", "Percent")
# Đổi thành phần trăm (từ 0–1 sang 0–100)
severity_freq$Percent <- round(100 * severity_freq$Percent, 1)
ggplot(severity_freq, aes(x = Severity, y = Percent, fill = Severity)) +
geom_bar(stat = "identity", width = 0.6) +
geom_text(aes(label = paste0(Percent, "%")), vjust = -0.5, size = 4) +
labs(
title = "Biểu đồ tần suất mức độ nghiêm trọng (Severity)",
x = "Mức độ",
y = "Tỷ lệ (%)"
) +
scale_fill_brewer(palette = "Pastel1") +
theme_minimal()
Nhận xét:
Dữ liệu cho thấy mức độ nghiêm trọng tổng thể (Severity) của các ca bệnh được phân bổ khá đồng đều giữa bốn nhóm: Low (nhẹ), Moderate (trung bình), High (nặng) và Critical (nguy kịch). Cụ thể, nhóm Moderate chiếm tỷ lệ cao nhất với 26.4% (791 ca), tiếp theo là High với 25.5% (766 ca), Low chiếm 24.4% (732 ca), và Critical thấp nhất với 23.7% (711 ca). Sự phân bố cân bằng này phản ánh mẫu dữ liệu đa dạng về mức độ bệnh, từ nhẹ đến rất nặng, giúp đảm bảo tính khách quan khi phân tích các yếu tố liên quan đến mức độ nghiêm trọng. Điều này cũng tạo thuận lợi để đánh giá chính xác ảnh hưởng của mức độ bệnh đến các kết quả như nhập viện, hồi phục hay biến chứng, đồng thời giảm thiểu nguy cơ sai lệch do mất cân bằng trong dữ liệu.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Hospitalized)/sum(nrow(dt))
##
## No Yes
## 0.708 0.292
Bảng tần số
#Lập bảng tần số biến
table(dt$Hospitalized)
##
## No Yes
## 2124 876
Biểu đồ
# Lập bảng tần số và chuyển thành data.frame
hospital_freq <- as.data.frame(table(dt$Hospitalized))
colnames(hospital_freq) <- c("Hospitalized", "Count")
# Tính phần trăm và tạo nhãn hiển thị
hospital_freq$Percent <- round(100 * hospital_freq$Count / sum(hospital_freq$Count), 1)
hospital_freq$Label <- paste0(hospital_freq$Percent, "%")
# Tính vị trí đặt nhãn trên biểu đồ
hospital_freq$ypos <- cumsum(hospital_freq$Count) - 0.5 * hospital_freq$Count
# Vẽ biểu đồ tròn
ggplot(hospital_freq, aes(x = "", y = Count, fill = Hospitalized)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label), position = position_stack(vjust = 0.5), color = "black", size = 5) +
labs(title = "Biểu đồ 7. Tình trạng nhập viện (Hospitalized)",
fill = "Nhập viện") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét:
Dữ liệu cho thấy trong tổng số các trường hợp được khảo sát, có 876 người (29.2%) đã nhập viện do COVID-19, trong khi 2.124 người (70.8%) không nhập viện. Tỷ lệ bệnh nhân không cần nhập viện cao hơn đáng kể, phản ánh rằng phần lớn các ca nhiễm có thể được theo dõi và điều trị tại nhà hoặc chỉ biểu hiện triệu chứng nhẹ đến trung bình. Tuy nhiên, gần 30% trường hợp nhập viện cũng là một con số đáng chú ý, cho thấy vẫn tồn tại một tỷ lệ không nhỏ bệnh nhân gặp diễn tiến nặng cần được can thiệp y tế tại cơ sở điều trị. Điều này nhấn mạnh vai trò của việc tầm soát yếu tố nguy cơ và theo dõi sát sao các triệu chứng để giảm thiểu tỷ lệ nhập viện.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$ICU_Admission)/sum(nrow(dt))
##
## No Yes
## 0.946 0.054
Bảng tần số
#Lập bảng tần số biến
table(dt$ICU_Admission)
##
## No Yes
## 2838 162
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
icu_freq <- as.data.frame(table(dt$ICU_Admission))
colnames(icu_freq) <- c("ICU_Admission", "Count")
# Tính phần trăm và tạo nhãn
icu_freq$Percent <- round(100 * icu_freq$Count / sum(icu_freq$Count), 1)
icu_freq$Label <- paste0(icu_freq$Percent, "%")
# Vẽ biểu đồ tròn với nhãn nằm chính giữa từng phần
ggplot(icu_freq, aes(x = "", y = Count, fill = ICU_Admission)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
labs(title = "Biểu đồ 8. Tình trạng nhập ICU (ICU Admission)",
fill = "Nhập ICU") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét
Trong tổng số 3.000 bệnh nhân, chỉ có 162 người (5,4%) được nhập khoa hồi sức tích cực (ICU), trong khi có đến 2.838 người (94,6%) không nhập ICU. Sự chênh lệch lớn này cho thấy biến ICU_Admission là một biến phân loại mất cân bằng mạnh, với nhóm “No” chiếm ưu thế tuyệt đối. Điều này cho thấy việc nhập ICU là một sự kiện tương đối hiếm, có thể gắn liền với các yếu tố nguy cơ nghiêm trọng hơn về sức khỏe.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Ventilator_Support)/sum(nrow(dt))
##
## No Yes
## 0.97066667 0.02933333
Bảng tần số
#Lập bảng tần số biến
table(dt$Ventilator_Support)
##
## No Yes
## 2912 88
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
vent_freq <- as.data.frame(table(dt$Ventilator_Support))
colnames(vent_freq) <- c("Ventilator_Support", "Count")
# Tính phần trăm và tạo nhãn
vent_freq$Percent <- round(100 * vent_freq$Count / sum(vent_freq$Count), 1)
vent_freq$Label <- paste0(vent_freq$Percent, "%")
# Vẽ biểu đồ tròn theo mẫu ICU_Admission
ggplot(vent_freq, aes(x = "", y = Count, fill = Ventilator_Support)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
labs(title = "Biểu đồ 9. Hỗ trợ thở máy (Ventilator Support)",
fill = "Thở máy") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Recovered)/sum(nrow(dt))
##
## No Yes
## 0.4973333 0.5026667
Bảng tần số
#Lập bảng tần số biến
table(dt$Recovered)
##
## No Yes
## 1492 1508
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
recovered_freq <- as.data.frame(table(dt$Recovered))
colnames(recovered_freq) <- c("Recovered", "Count")
# Tính phần trăm và tạo nhãn
recovered_freq$Percent <- round(100 * recovered_freq$Count / sum(recovered_freq$Count), 1)
recovered_freq$Label <- paste0(recovered_freq$Percent, "%")
# Vẽ biểu đồ tròn theo mẫu
ggplot(recovered_freq, aes(x = "", y = Count, fill = Recovered)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label),
position = position_stack(vjust = 0.5),
size = 5) +
labs(title = "Biểu đồ 10. Tình trạng hồi phục (Recovered)",
fill = "Recovered") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét:
Dữ liệu cho thấy tỷ lệ bệnh nhân COVID-19 đã hồi phục (Yes) và chưa hồi phục (No) gần như tương đương, với 1.508 ca (50.3%) đã hồi phục và 1.492 ca (49.7%) chưa hồi phục. Sự chênh lệch chỉ ở mức 0.6%, phản ánh rằng quần thể khảo sát được phân bố khá cân bằng giữa hai trạng thái phục hồi. Điều này cho thấy bộ dữ liệu có tính đại diện tốt và có thể phục vụ hiệu quả cho việc phân tích các yếu tố liên quan đến khả năng hồi phục, chẳng hạn như tình trạng bệnh nền, mức độ nghiêm trọng hoặc tình trạng tiêm chủng.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Reinfection)/sum(nrow(dt))
##
## No Yes
## 0.905 0.095
Bảng tần số
#Lập bảng tần số biến
table(dt$Reinfection)
##
## No Yes
## 2715 285
Biểu đồ
# Tạo bảng tần số và chuyển sang data.frame
reinfection_freq <- as.data.frame(table(dt$Reinfection))
colnames(reinfection_freq) <- c("Reinfection", "Count")
# Tính phần trăm và nhãn
reinfection_freq$Percent <- round(100 * reinfection_freq$Count / sum(reinfection_freq$Count), 1)
reinfection_freq$Label <- paste0(reinfection_freq$Percent, "%")
# Vẽ biểu đồ tròn với nhãn phần trăm
ggplot(reinfection_freq, aes(x = "", y = Count, fill = Reinfection)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label),
position = position_stack(vjust = 0.5),
color = "black", size = 5) +
labs(title = "Biểu đồ 11. Tình trạng tái nhiễm (Reinfection)",
fill = "Tái nhiễm") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét:
Dữ liệu cho thấy phần lớn bệnh nhân trong mẫu khảo sát không bị tái nhiễm COVID-19, với 2.715 trường hợp (90.5%) ghi nhận không tái nhiễm và chỉ có 285 trường hợp (9.5%) bị tái nhiễm. Tỷ lệ tái nhiễm tương đối thấp cho thấy khả năng miễn dịch tự nhiên hoặc từ vắc-xin có thể vẫn còn hiệu lực trong phần lớn các trường hợp trong khoảng thời gian thu thập dữ liệu. Tuy nhiên, với gần 10% tái nhiễm, điều này cũng nhấn mạnh rằng rủi ro tái mắc vẫn tồn tại, đặc biệt trong bối cảnh các biến thể mới liên tục xuất hiện và có thể né tránh miễn dịch.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Vaccination_Status)/sum(nrow(dt))
##
## No Yes
## 0.5093333 0.4906667
Bảng tần số
#Lập bảng tần số biến
table(dt$Vaccination_Status)
##
## No Yes
## 1528 1472
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
vaccine_freq <- as.data.frame(table(dt$Vaccination_Status))
colnames(vaccine_freq) <- c("Vaccination_Status", "Count")
# Tính phần trăm và gán nhãn
vaccine_freq$Percent <- round(100 * vaccine_freq$Count / sum(vaccine_freq$Count), 1)
vaccine_freq$Label <- paste0(vaccine_freq$Percent, "%")
# Vẽ biểu đồ tròn có phần trăm ở giữa mỗi phần
ggplot(vaccine_freq, aes(x = "", y = Count, fill = Vaccination_Status)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = Label),
position = position_stack(vjust = 0.5),
size = 5, color = "black") +
labs(title = "Biểu đồ 12. Tình trạng tiêm vắc-xin (Vaccination Status)",
fill = "Đã tiêm vắc-xin") +
theme_void() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét:
Dữ liệu cho thấy tỷ lệ bệnh nhân đã tiêm vắc-xin và chưa tiêm vắc-xin gần như tương đương. Cụ thể, có 1.528 người (50.9%) chưa tiêm và 1.472 người (49.1%) đã tiêm vắc-xin phòng COVID-19. Sự chênh lệch chỉ khoảng 1.8% cho thấy quần thể khảo sát có phân bố khá cân bằng về tình trạng tiêm chủng. Điều này giúp tạo điều kiện thuận lợi cho việc phân tích mối liên hệ giữa tiêm vắc-xin và các yếu tố khác như mức độ nghiêm trọng, khả năng hồi phục hay nguy cơ tái nhiễm, từ đó đánh giá hiệu quả của chương trình tiêm chủng một cách khách quan hơn.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Vaccine_Type)/sum(nrow(dt))
##
## AstraZeneca Janssen Moderna None Pfizer
## 0.09833333 0.09766667 0.09733333 0.60300000 0.10366667
Bảng tần số
#Lập bảng tần số biến
table(dt$Vaccine_Type)
##
## AstraZeneca Janssen Moderna None Pfizer
## 295 293 292 1809 311
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
vaccine_type_freq <- as.data.frame(table(dt$Vaccine_Type))
colnames(vaccine_type_freq) <- c("Vaccine_Type", "Count")
# Vẽ biểu đồ cột đứng
ggplot(vaccine_type_freq, aes(x = reorder(Vaccine_Type, -Count), y = Count, fill = Vaccine_Type)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ 13. Loại vắc-xin đã tiêm (Vaccine Type)",
x = "Loại vắc-xin",
y = "Số lượng",
fill = "Loại vắc-xin") +
theme_minimal() +
scale_fill_brewer(palette = "Set2")
Nhận xét:
Dữ liệu cho thấy phần lớn người trong mẫu khảo sát không tiêm vắc-xin, với 1.809 trường hợp (60.3%) thuộc nhóm “None”. Trong khi đó, các loại vắc-xin còn lại được phân bố tương đối đồng đều với tỷ lệ thấp hơn nhiều: Pfizer chiếm 10.4% (311 người), tiếp theo là AstraZeneca (9.8%), Janssen (9.8%), và Moderna (9.7%). Sự chênh lệch lớn giữa nhóm không tiêm và các nhóm có tiêm cho thấy rằng tỷ lệ bao phủ vắc-xin trong dữ liệu này còn hạn chế, hoặc thời điểm thu thập có thể rơi vào giai đoạn đầu của chiến dịch tiêm chủng.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Long_COVID_Symptoms)/sum(nrow(dt))
##
## Brain Fog Chest Pain Fatigue None
## 0.01966667 0.01733333 0.02066667 0.92666667
## Shortness of Breath
## 0.01566667
Bảng tần số
#Lập bảng tần số biến
table(dt$Long_COVID_Symptoms)
##
## Brain Fog Chest Pain Fatigue None
## 59 52 62 2780
## Shortness of Breath
## 47
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
long_covid_freq <- as.data.frame(table(dt$Long_COVID_Symptoms))
colnames(long_covid_freq) <- c("Symptom", "Count")
# Vẽ biểu đồ cột đứng
ggplot(long_covid_freq, aes(x = reorder(Symptom, -Count), y = Count, fill = Symptom)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ 14. Triệu chứng COVID kéo dài (Long COVID Symptoms)",
x = "Triệu chứng",
y = "Số lượng",
fill = "Triệu chứng") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3")
Nhận xét:
Dữ liệu cho thấy phần lớn bệnh nhân không gặp phải triệu chứng COVID kéo dài, với 2.780 trường hợp (92.7%) báo cáo không có triệu chứng kéo dài (None). Trong số các triệu chứng kéo dài, mệt mỏi (Fatigue) là phổ biến nhất với 62 trường hợp (2.1%), tiếp theo là suy giảm trí nhớ (Brain Fog) với 59 trường hợp (2.0%), đau ngực (Chest Pain) với 52 trường hợp (1.7%), và khó thở (Shortness of Breath) với 47 trường hợp (1.6%). Mặc dù tỷ lệ mắc các triệu chứng kéo dài tương đối thấp, nhưng chúng vẫn là vấn đề đáng chú ý bởi ảnh hưởng lâu dài đến chất lượng cuộc sống của người bệnh.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Occupation)/sum(nrow(dt))
##
## Driver Healthcare Office Worker Student Teacher
## 0.1640000 0.1613333 0.1676667 0.1776667 0.1636667
## Unemployed
## 0.1656667
Bảng tần số
#Lập bảng tần số biến
table(dt$Occupation)
##
## Driver Healthcare Office Worker Student Teacher
## 492 484 503 533 491
## Unemployed
## 497
Biểu đồ
# Lập bảng tần số và chuyển sang data.frame
occupation_freq <- as.data.frame(table(dt$Occupation))
colnames(occupation_freq) <- c("Occupation", "Count")
# Vẽ biểu đồ cột đứng không có nhãn số
ggplot(occupation_freq, aes(x = reorder(Occupation, -Count), y = Count, fill = Occupation)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ 15. Phân bố nghề nghiệp (Occupation)",
x = "Nghề nghiệp",
y = "Số lượng",
fill = "Nghề nghiệp") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set2")
Nhận xét:
Dữ liệu phân bố nghề nghiệp của mẫu khảo sát cho thấy sự cân bằng tương đối giữa các nhóm với tỷ lệ khá đồng đều, giúp phản ánh đa dạng nghề nghiệp trong cộng đồng nghiên cứu. Cụ thể, nhóm sinh viên chiếm tỷ lệ cao nhất với 17.8% (533 người), thể hiện sự tham gia đông đảo của đối tượng trẻ tuổi và có thể đang trong môi trường học tập, vốn là nhóm có nhiều tương tác xã hội. Nhóm nhân viên văn phòng cũng chiếm tỷ lệ đáng kể với 16.8% (503 người), phản ánh mức độ phổ biến của nghề nghiệp này trong xã hội và khả năng tiếp xúc tại nơi làm việc. Nhóm thất nghiệp chiếm khoảng 16.6% (497 người), đây là một tỷ lệ không nhỏ, có thể ảnh hưởng đến khả năng tiếp cận dịch vụ y tế và thông tin về phòng chống dịch.
Các nhóm nghề lái xe, chăm sóc sức khỏe và giáo viên cũng có tỷ lệ gần tương tự, lần lượt là 16.4% (492 người), 16.1% (484 người) và 16.4% (491 người). Sự phân bố đồng đều giữa các ngành nghề này giúp đảm bảo rằng các phân tích liên quan đến ảnh hưởng của COVID-19 đối với từng nhóm nghề nghiệp có tính đại diện và phản ánh chính xác hơn những đặc điểm đa dạng trong cộng đồng. Điều này cũng tạo điều kiện thuận lợi cho việc xây dựng các chính sách y tế, phòng chống dịch phù hợp với đặc điểm và nhu cầu riêng của từng nhóm nghề nghiệp trong xã hội.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$Smoking_Status)/sum(nrow(dt))
##
## Current Former Never
## 0.3333333 0.3270000 0.3396667
Bảng tần số
#Lập bảng tần số biến
table(dt$Smoking_Status)
##
## Current Former Never
## 1000 981 1019
Biểu đồ
# Tạo bảng tần số và chuyển sang data.frame
smoking_freq <- as.data.frame(table(dt$Smoking_Status))
colnames(smoking_freq) <- c("Smoking_Status", "Count")
# Tính tỷ lệ phần trăm
smoking_freq <- smoking_freq %>%
mutate(Percent = Count / sum(Count) * 100,
Label = paste0(Smoking_Status, "\n", round(Percent, 1), "%"))
# Vẽ biểu đồ tròn
ggplot(smoking_freq, aes(x = "", y = Count, fill = Smoking_Status)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 4) +
labs(title = "Biểu đồ 16. Phân bố tình trạng hút thuốc") +
theme_void() +
scale_fill_brewer(palette = "Set2")
Nhận xét:
Dữ liệu về tình trạng hút thuốc của mẫu khảo sát cho thấy sự phân bố khá đều giữa ba nhóm. Cụ thể, nhóm những người đang hút thuốc (Current) chiếm khoảng 33.3% (1000 người), nhóm từng hút thuốc nhưng đã bỏ (Former) chiếm khoảng 32.7% (981 người), và nhóm chưa từng hút thuốc (Never) chiếm tỷ lệ cao nhất với 33.9% (1019 người). Sự cân bằng này phản ánh sự đa dạng trong thói quen hút thuốc của cộng đồng được khảo sát, cho thấy cả ba nhóm đều chiếm tỷ trọng tương đối lớn, điều này có thể ảnh hưởng đến các phân tích liên quan đến tác động của hút thuốc đến sức khỏe, đặc biệt trong bối cảnh dịch COVID-19.
Ước lượng khoảng tin cậy
# Số người đã phục hồi
n_recovered <- sum(dt$Recovered == "Yes")
# Tổng số quan sát
n_total <- nrow(dt)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ phục hồi (p = 0.5 là tỷ lệ kỳ vọng để kiểm định)
test_recovered <- prop.test(n_recovered, n_total, p = 0.5, correct = FALSE)
# In kết quả
test_recovered
##
## 1-sample proportions test without continuity correction
##
## data: n_recovered out of n_total, null probability 0.5
## X-squared = 0.085333, df = 1, p-value = 0.7702
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4847830 0.5205435
## sample estimates:
## p
## 0.5026667
Tỷ lệ phục hồi trong dữ liệu là 0.5027.
Khoảng tin cậy 95% cho tỷ lệ này là từ 0.4848 đến 0.5205.
Giả thuyết kiểm định:
H₀: Tỷ lệ phục hồi thực tế là 50% (\(p = 0.5\))
H₁: Tỷ lệ phục hồi thực tế khác 50% (\(p \ne 0.5\))
Với p-value = 0.7702 > 0.05, ta không có đủ bằng chứng để bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%. Điều này nghĩa là: Tỷ lệ phục hồi trong quần thể không khác biệt có ý nghĩa thống kê so với mức giả định 50%.
Ước lượng khoảng tin cậy
# Số người có triệu chứng Mild
n_mild <- sum(dt$Symptoms == "Mild")
n_total <- nrow(dt)
# Kiểm định một phía với p = 0.33
test_mild <- prop.test(n_mild, n_total, p = 0.33,
alternative = "less",
correct = FALSE)
test_mild
##
## 1-sample proportions test without continuity correction
##
## data: n_mild out of n_total, null probability 0.33
## X-squared = 0.60305, df = 1, p-value = 0.7813
## alternative hypothesis: true p is less than 0.33
## 95 percent confidence interval:
## 0.0000000 0.3509998
## sample estimates:
## p
## 0.3366667
Tỷ lệ người có triệu chứng ban đầu nhẹ (Mild) là 0.3367.
Khoảng tin cậy một phía dưới 95% cho tỷ lệ này là từ 0 đến 0.35.
Giả thuyết kiểm định:
H₀: Tỷ lệ người có triệu chứng ban đầu là Mild lớn hơn 33% (p ≥ 0.33)
H₁: Tỷ lệ người có triệu chứng ban đầu là Mild không lớn hơn 33% (p < 0.33)
Với mức ý nghĩa α = 0.05, p-value của kiểm định là r round(test_mild$p.value, 4), lớn hơn 0.05, do đó không có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa tỷ lệ người có triệu chứng ban đầu nhẹ (Mild) lớn hơn 33%.
Ước lượng khoảng tin cậy
# Số người ở mức Critical
n_critical <- sum(dt$Severity == "Critical")
n_total <- nrow(dt)
# Kiểm định tỉ lệ một phía với p = 0.23 (26%)
test_critical <- prop.test(n_critical, n_total, p = 0.23,
alternative = "less",
correct = FALSE)
test_critical
##
## 1-sample proportions test without continuity correction
##
## data: n_critical out of n_total, null probability 0.23
## X-squared = 0.83004, df = 1, p-value = 0.8189
## alternative hypothesis: true p is less than 0.23
## 95 percent confidence interval:
## 0.0000000 0.2500038
## sample estimates:
## p
## 0.237
Tỷ lệ bệnh nhân ở mức độ nghiêm trọng nguy kịch (Critical) là 0.237.
Khoảng tin cậy một phía dưới 95% cho tỷ lệ này là từ 0 đến 0.25 (giá trị dưới của khoảng tin cậy là 0 do đặc trưng của kiểm định một phía nhỏ hơn).
Giả thuyết kiểm định:
H₀: Tỷ lệ bệnh nhân nguy kịch (Critical) ≥ 23% (p ≥ 0.23)
H₁: Tỷ lệ bệnh nhân nguy kịch (Critical) < 23% (p < 0.23)
Kiểm định cho kết quả p-value = 0.8189.
Với mức ý nghĩa α = 0.05, ta thấy rằng p-value lớn hơn α, do đó không đủ bằng chứng để bác bỏ giả thuyết H₀.
Điều này có nghĩa là chưa thể kết luận rằng tỷ lệ bệnh nhân ở mức độ Critical nhỏ hơn 23% trong quần thể.
Ước lượng khoảng tin cậy
n_current <- sum(dt$Smoking_Status == "Current")
n_total <- nrow(dt)
test_current <- prop.test(n_current, n_total, p = 0.33, alternative = "greater", correct = FALSE)
test_current
##
## 1-sample proportions test without continuity correction
##
## data: n_current out of n_total, null probability 0.33
## X-squared = 0.15076, df = 1, p-value = 0.3489
## alternative hypothesis: true p is greater than 0.33
## 95 percent confidence interval:
## 0.3193324 1.0000000
## sample estimates:
## p
## 0.3333333
Tỷ lệ bệnh nhân ở mức độ nghiêm trọng nguy kịch (Critical) trong mẫu là 0.33.
Khoảng tin cậy 95% một phía dưới cho tỷ lệ bệnh nhân mức độ nguy kịch (Critical) có giá trị trên là 0.319. Điều này có nghĩa rằng với độ tin cậy 95%, tỷ lệ thực tế bệnh nhân nguy kịch lớn hơn hoặc bằng giá trị dưới của khoảng tin cậy và có thể lên đến 1 (100%).
Giả thuyết kiểm định:
H₀: Tỷ lệ người đang hút thuốc nhỏ hơn hoặc bằng 33% (p ≤ 0.33)
H₁: Tỷ lệ người đang hút thuốc lớn hơn 33% (p > 0.33)
Kết quả kiểm định cho thấy p-value = 0.3489, lớn hơn mức ý nghĩa α = 0.05. Do đó, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là với dữ liệu hiện tại, chúng ta không thể kết luận rằng tỷ lệ người đang hút thuốc lớn hơn 33%.
Bảng tần số
# Lập bảng tần số chéo giữa Gender và Hospitalized
gender_hosp <- table(dt$Gender, dt$Hospitalized)
# Thêm tổng hàng và tổng cột
gender_hosp1 <- addmargins(gender_hosp)
# Hiển thị bảng
gender_hosp1
##
## No Yes Sum
## Female 1090 437 1527
## Male 1034 439 1473
## Sum 2124 876 3000
Bảng tần suất
# Tạo bảng tần suất chéo (theo hàng)
gender_hosp_freq <- prop.table(table(dt$Gender, dt$Hospitalized), margin = 1)
# Làm tròn kết quả cho dễ đọc
gender_hosp_freq <- round(gender_hosp_freq, 4)
# Hiển thị bảng
gender_hosp_freq
##
## No Yes
## Female 0.7138 0.2862
## Male 0.7020 0.2980
Biểu đồ
# Chuyển thành data frame để vẽ
gender_hosp_df <- as.data.frame(gender_hosp)
colnames(gender_hosp_df) <- c("Gender", "Hospitalized", "Count")
# Vẽ biểu đồ cột nhóm
ggplot(gender_hosp_df, aes(x = Gender, y = Count, fill = Hospitalized)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Biểu đồ 17. Biểu đồ tần số giữa Giới tính và Nhập viện",
x = "Giới tính",
y = "Số lượng",
fill = "Nhập viện") +
scale_fill_brewer(palette = "Pastel1") + # hoặc "Pastel2"
theme_minimal()
Nhận xét:
Dữ liệu cho thấy có sự khác biệt nhẹ giữa nam và nữ trong tỷ lệ nhập viện. Cụ thể, 71.4% bệnh nhân nữ không nhập viện, so với 70.2% ở nam, trong khi tỷ lệ nhập viện ở nữ là 28.6%, thấp hơn một chút so với 29.8% ở nam.
Mặc dù sự chênh lệch không lớn (khoảng 1.2 điểm phần trăm), nhưng nếu xét trên tổng thể 3.000 bệnh nhân, điều này vẫn có ý nghĩa:
Trong tổng số 1.527 nữ, có 437 người nhập viện.
Trong 1.473 nam, có 439 người nhập viện.
Dù số lượng nữ nhiều hơn nam, nhưng nam lại có số ca nhập viện cao hơn, cho thấy tỷ lệ nhập viện của nam giới thực sự nhỉnh hơn. Điều này có thể gợi ý rằng nam giới dễ có nguy cơ tiến triển nặng hơn khi mắc bệnh, hoặc có khả năng cao hơn cần đến chăm sóc y tế nội trú.
Giả thuyết kiểm định:
H₀: Giới tính và việc nhập viện là hai biến độc lập.
H₁: Giới tính và việc nhập việc có liên quan.
Thực hiện kiểm định Chi-bình phương
# Thực hiện kiểm định Chi bình phương
chi_gender_hosp <- chisq.test(gender_hosp)
# Hiển thị kết quả
chi_gender_hosp
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: gender_hosp
## X-squared = 0.45349, df = 1, p-value = 0.5007
Kết quả kiểm định:
Giá trị thống kê Chi bình phương: X² = 0.45349
Bậc tự do (df) = 1
p-value = 0.5007
Với p-value = 0.5007 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Nói cách khác, không có mối liên hệ có ý nghĩa thống kê giữa giới tính và tình trạng nhập viện
# Lập bảng tần số chéo giữa Gender và Hospitalized
gender_hosp <- table(dt$Gender, dt$Hospitalized)
# Thêm tổng hàng và tổng cột
gender_hosp1 <- addmargins(gender_hosp)
# Hiển thị bảng
gender_hosp1
##
## No Yes Sum
## Female 1090 437 1527
## Male 1034 439 1473
## Sum 2124 876 3000
\[ p_1 = P(\text{Hospitalized} = \text{Yes} \mid \text{Gender} = F) \quad \text{(Tỷ lệ nữ nhập viện)} \]
\[ p_2 = P(\text{Hospitalized} = \text{Yes} \mid \text{Gender} = M) \quad \text{(Tỷ lệ nam nhập viện)} \]
Hiệu hai tỷ lệ:
\[ d = p_1 - p_2 \]
Giả thuyết kiểm định:
\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ nữ nhập viện bằng tỷ lệ nam nhập viện)} \]
\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ nữ nhập viện nhỏ hơn tỷ lệ nam nhập viện)} \]
counts <- c(gender_hosp["Female", "Yes"], gender_hosp["Male", "Yes"])
totals <- c(sum(gender_hosp["Female", ]), sum(gender_hosp["Male", ]))
# Thực hiện kiểm định tỷ lệ
test_hosp <-prop.test(counts, totals, alternative = "less", correct = FALSE)
test_hosp
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts out of totals
## X-squared = 0.50919, df = 1, p-value = 0.2377
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.00000000 0.01546772
## sample estimates:
## prop 1 prop 2
## 0.2861821 0.2980312
Tỷ lệ nữ nhập viện (p₁) = 0.2862 ≈ 28.62%
Tỷ lệ nam nhập viện (p₂) =0.298 ≈ 29.80%
p-value = 0.2377 ≈ 0.2377
Với mức ý nghĩa α=0.05, p-value = 0.2377 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này cho thấy không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ nhập viện của nữ và nam.
Mặc dù tỷ lệ nữ nhập viện có thấp hơn một chút so với nam (0.59%), nhưng sự chênh lệch này là nhỏ và không đủ để kết luận rằng nữ có xu hướng nhập viện ít hơn nam dựa trên mẫu dữ liệu này.
riskratio(gender_hosp, method="wald")
## $data
##
## No Yes Total
## Female 1090 437 1527
## Male 1034 439 1473
## Total 2124 876 3000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.041404 0.9315893 1.164164
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.4758258 0.4948054 0.4754894
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Dữ liệu tổng hợp cho thấy trong số 3.000 bệnh nhân, có 1.527 người là nữ với 437 người nhập viện, và 1.473 người là nam với 439 người nhập viện. Khi so sánh tỷ lệ nhập viện giữa hai nhóm, nữ được chọn làm nhóm tham chiếu với tỷ lệ rủi ro chuẩn là 1.
Kết quả tính toán cho thấy tỷ số rủi ro (Risk Ratio) của nam so với nữ là 1.0414. Điều này có nghĩa là nam giới có nguy cơ nhập viện cao hơn khoảng 4.14% so với nữ giới trong mẫu dữ liệu này.
Tuy nhiên, khoảng tin cậy 95% của tỷ số rủi ro cho nam dao động từ 0.9316 đến 1.1642. Vì khoảng này bao gồm giá trị 1, điều đó cho thấy sự khác biệt về nguy cơ nhập viện giữa nam và nữ không đạt mức ý nghĩa thống kê. Nói cách khác, không thể chắc chắn rằng sự chênh lệch quan sát được là thực sự có ý nghĩa hay chỉ do biến động ngẫu nhiên trong mẫu.
Giả thuyết kiểm định:
H₀: Tỷ lệ nhập viện của nam và nữ là bằng nhau, tức là \(p_{\text{Female}} = p_{\text{Male}}\).
H₁: Tỷ lệ nhập viện của nam và nữ là khác nhau, tức là \(p_{\text{Female}} \neq p_{\text{Male}}\).
Với p-value lớn hơn mức ý nghĩa 0.05 từ các phương pháp kiểm định (mid-p exact test, Fisher’s exact test, và chi-squared test), chúng ta không có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này cho thấy tỷ lệ nhập viện giữa nam và nữ trong mẫu dữ liệu này không có sự khác biệt có ý nghĩa thống kê.
or_result <- oddsratio(gender_hosp)
print(or_result)
## $data
##
## No Yes Total
## Female 1090 437 1527
## Male 1034 439 1473
## Total 2124 876 3000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.058959 0.9046577 1.239627
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.4758258 0.4948054 0.4754894
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỷ số chênh (Odds Ratio - OR) giữa nhóm nam và nhóm nữ là 1.059, với khoảng tin cậy 95% từ 0.905 đến 1.240. Điều này có nghĩa là khả năng nhập viện của nam cao hơn khoảng 5.9% so với nữ. Tuy nhiên, khoảng tin cậy bao gồm giá trị 1, cho thấy sự khác biệt này không có ý nghĩa thống kê và có thể là do biến động ngẫu nhiên trong dữ liệu.
Bên cạnh đó, kết quả kiểm định với các phương pháp phổ biến như mid-p exact test, Fisher’s exact test và chi-squared test đều cho giá trị p-value lần lượt là 0.4758, 0.4948 và 0.4755. Các giá trị này đều lớn hơn mức ý nghĩa α = 0.05, cho thấy không đủ bằng chứng để bác bỏ giả thuyết không, tức là tỷ lệ nhập viện của nam và nữ không khác biệt đáng kể.
Bảng tần số
# Gán nhãn rõ ràng cho các biến
dt$Recovered <- factor(dt$Recovered,
levels = c("No", "Yes"),
labels = c("Không hồi phục", "Hồi phục"))
dt$Vaccination_Status <- factor(dt$Vaccination_Status,
levels = c("No", "Yes"),
labels = c("Chưa tiêm", "Đã tiêm"))
# Lập bảng tần số chéo giữa Recovered và Vaccination_Status
re_vac <- table(dt$Recovered, dt$Vaccination_Status)
# Thêm tổng hàng và tổng cột
re_vac1 <- addmargins(re_vac)
# Hiển thị bảng với nhãn rõ ràng
re_vac1
##
## Chưa tiêm Đã tiêm Sum
## Không hồi phục 743 749 1492
## Hồi phục 785 723 1508
## Sum 1528 1472 3000
Bảng tần suất
# Lập bảng tần suất theo hàng (theo từng trạng thái hồi phục)
re_vac_prop <- prop.table(re_vac, margin = 1)
# Làm tròn để hiển thị đẹp hơn (ví dụ: 4 chữ số thập phân)
re_vac_prop_rounded <- round(re_vac_prop, 4)
# Hiển thị bảng tần suất
re_vac_prop_rounded
##
## Chưa tiêm Đã tiêm
## Không hồi phục 0.4980 0.5020
## Hồi phục 0.5206 0.4794
Biểu đồ
# Chuyển bảng sang dạng data frame
re_vac_df <- as.data.frame(re_vac)
# Đổi tên cột cho rõ ràng
colnames(re_vac_df) <- c("Recovered", "Vaccination_Status", "Count")
# Vẽ biểu đồ cột nhóm
ggplot(re_vac_df, aes(x = Vaccination_Status, y = Count, fill = Recovered)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Biểu đồ 18. Số lượng hồi phục theo tình trạng tiêm vắc xin",
x = "Tình trạng tiêm vắc xin",
y = "Số lượng bệnh nhân",
fill = "Trạng thái hồi phục"
) +
theme_minimal() +
scale_fill_brewer(palette = "Pastel1")
Nhận xét
Dữ liệu cho thấy sự phân bố trạng thái hồi phục giữa hai nhóm bệnh nhân theo tình trạng tiêm vắc xin là tương đối đồng đều, tuy nhiên vẫn có một số khác biệt nhẹ. Trong nhóm chưa tiêm vắc xin, tỷ lệ hồi phục là khoảng 52.06%, trong khi 47.94% không hồi phục. Ngược lại, trong nhóm đã tiêm vắc xin, tỷ lệ không hồi phục lại nhỉnh hơn một chút, ở mức 50.20%, so với 49.80% hồi phục. Mặc dù sự chênh lệch là không lớn, điều này gợi ý rằng nhóm chưa tiêm có tỷ lệ hồi phục cao hơn một chút so với nhóm đã tiêm.
Giả thuyết kiểm định:
H₀: Tình trạng phục hồi và tình trạng tiêm vaccin là hai biến độc lập.
H₁: Tình trạng phục hồi và tình trạng tiêm vaccin có liên quan.
# Thực hiện kiểm định Chi bình phương
chi_re_vac <- chisq.test(re_vac)
print(chi_re_vac)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: re_vac
## X-squared = 1.4394, df = 1, p-value = 0.2302
Kết quả kiểm định:
Giá trị thống kê Chi bình phương: X² = 1.4394
Bậc tự do (df) = 1
p-value = 0.2302
Với p-value = 0.2302 lớn hơn mức ý nghĩa phổ biến α = 0.05, không đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là, trong mẫu dữ liệu hiện tại, không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ hồi phục của nhóm đã tiêm vắc xin và nhóm chưa tiêm.
# Lập bảng tần số chéo giữa Recovered và Vaccination_Status
re_vac <- table(dt$Recovered, dt$Vaccination_Status)
# Thêm tổng hàng và tổng cột
re_vac1 <- addmargins(re_vac)
# Hiển thị bảng với nhãn rõ ràng
re_vac1
##
## Chưa tiêm Đã tiêm Sum
## Không hồi phục 743 749 1492
## Hồi phục 785 723 1508
## Sum 1528 1472 3000
\[ p_1 = P(\text{Recovered} = \text{Yes} \mid \text{Vaccination_Status} = \text{Chưa tiêm}) \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm)} \]
\[ p_2 = P(\text{Recovered} = \text{Yes} \mid \text{Vaccination_Status} = \text{Đã tiêm}) \quad \text{(Tỷ lệ hồi phục ở nhóm đã tiêm)} \]
Giả thuyết kiểm định:
\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm bằng tỷ lệ hồi phục ở nhóm đã tiêm)} \]
\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ hồi phục ở nhóm chưa tiêm nhỏ hơn tỷ lệ hồi phục ở nhóm đã tiêm)} \]
# Số người hồi phục trong từng nhóm tiêm chủng
counts <- c(re_vac["Hồi phục", "Chưa tiêm"], re_vac["Hồi phục", "Đã tiêm"])
# Tổng số người trong từng nhóm tiêm chủng
totals <- c(sum(re_vac[, "Chưa tiêm"]), sum(re_vac[, "Đã tiêm"]))
# Kiểm định tỉ lệ một phía: p1 < p2
test_recovery_less <- prop.test(counts, totals, alternative = "less", correct = FALSE)
test_recovery_less
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts out of totals
## X-squared = 1.5284, df = 1, p-value = 0.8918
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.00000000 0.05260304
## sample estimates:
## prop 1 prop 2
## 0.5137435 0.4911685
Kết quả kiểm định tỷ lệ hai mẫu cho thấy:
Tỷ lệ hồi phục ở nhóm chưa tiêm (prop 1) là khoảng 51.37%
Tỷ lệ hồi phục ở nhóm đã tiêm (prop 2) là khoảng 49.12%
Giá trị thống kê Chi bình phương là 1.5284 với bậc tự do 1 và p-value = 0.8918.
Vì p-value lớn hơn mức ý nghĩa 0.05, chúng ta không đủ bằng chứng để bác bỏ giả thuyết rằng tỷ lệ hồi phục ở nhóm chưa tiêm và nhóm đã tiêm là bằng nhau.
Ngoài ra, khoảng tin cậy 95% cho hiệu hai tỷ lệ bao gồm giá trị 0 (từ -1 đến 0.0526), cũng củng cố nhận định rằng sự khác biệt giữa hai tỷ lệ không có ý nghĩa thống kê.
Tóm lại, theo dữ liệu này, tỷ lệ hồi phục của nhóm chưa tiêm và nhóm đã tiêm không khác biệt đáng kể và không có bằng chứng cho thấy nhóm chưa tiêm có tỷ lệ hồi phục thấp hơn nhóm đã tiêm.
riskratio(re_vac, method="wald")
## $data
##
## Chưa tiêm Đã tiêm Total
## Không hồi phục 743 749 1492
## Hồi phục 785 723 1508
## Total 1528 1472 3000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Không hồi phục 1.0000000 NA NA
## Hồi phục 0.9550453 0.8878662 1.027307
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không hồi phục NA NA NA
## Hồi phục 0.2166526 0.2281207 0.2163528
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Không hồi phục = nhóm tham chiếu (RR = 1)
Hồi phục = nhóm so sánh
Risk Ratio (RR) ước lượng cho nhóm hồi phục là 0.9550, tức là:
Tuy nhiên, khoảng tin cậy 95% cho Risk Ratio nằm trong khoảng từ 0.8879 đến 1.0273:
Sau khi thực hiện kiểm định thống kê để so sánh tỷ lệ hồi phục giữa hai nhóm bệnh nhân (Chưa tiêm và Đã tiêm), ta thu được các kết quả p-value như sau:
Tất cả các giá trị p-value đều lớn hơn mức ý nghĩa phổ biến là \(\\alpha = 0.05\). Điều này đồng nghĩa với việc không đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\).
Nói cách khác, không có sự khác biệt có ý nghĩa thống kê về tỷ lệ hồi phục giữa nhóm chưa tiêm và nhóm đã tiêm vắc xin. Sự chênh lệch nhỏ quan sát được trong mẫu có thể là do biến thiên ngẫu nhiên và không phản ánh sự khác biệt thực sự trong tổng thể.
or_result1 <- oddsratio(re_vac)
print(or_result1)
## $data
##
## Chưa tiêm Đã tiêm Total
## Không hồi phục 743 749 1492
## Hồi phục 785 723 1508
## Total 1528 1472 3000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Không hồi phục 1.0000000 NA NA
## Hồi phục 0.9136808 0.791682 1.054367
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không hồi phục NA NA NA
## Hồi phục 0.2166526 0.2281207 0.2163528
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Kết quả phân tích cho thấy Tỷ số chênh (Odds Ratio) đối với khả năng hồi phục là:
Điều này có nghĩa là khả năng hồi phục ở nhóm đã tiêm thấp hơn khoảng 8.6% so với nhóm chưa tiêm (vì 1 − 0.914 = 0.086), tuy nhiên khoảng tin cậy 95% bao gồm giá trị 1, tức là sự khác biệt có thể không tồn tại trên toàn thể dân số.
Kết quả của ba phương pháp kiểm định thống kê đều cho giá trị p-value lớn hơn mức ý nghĩa thông thường α = 0.05, cụ thể:
Mid-p exact test: p-value = 0.2167
Fisher’s exact test: p-value = 0.2281
Chi-squared test: p-value = 0.2164
Các p-value này đều vượt xa ngưỡng 0.05, đồng nghĩa với việc không đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\). Nói cách khác, dữ liệu hiện tại không cho thấy sự khác biệt có ý nghĩa thống kê về tỷ số odds hồi phục giữa hai nhóm bệnh nhân đã tiêm và chưa tiêm vắc xin.
Bảng tần số
dt$Reinfection <- factor(dt$Reinfection,
levels = c("No", "Yes"),
labels = c("Không tái nhiễm", "Tái nhiễm"))
# Lập bảng tần số chéo
rein_vac <- table(dt$Reinfection, dt$Vaccination_Status)
# Thêm tổng hàng và cột
rein_vac1 <- addmargins(rein_vac)
# Hiển thị bảng
rein_vac1
##
## Chưa tiêm Đã tiêm Sum
## Không tái nhiễm 1398 1317 2715
## Tái nhiễm 130 155 285
## Sum 1528 1472 3000
Bảng tần suất
# Lập bảng tần suất theo hàng (row percentages)
rein_vac_prop <- prop.table(rein_vac, margin = 1)
# Làm tròn 4 chữ số thập phân
rein_vac_prop <- round(rein_vac_prop, 4)
# Hiển thị bảng tần suất
rein_vac_prop
##
## Chưa tiêm Đã tiêm
## Không tái nhiễm 0.5149 0.4851
## Tái nhiễm 0.4561 0.5439
Biểu đồ
# Chuyển thành data frame
rein_vac_df <- as.data.frame(rein_vac)
# Đổi tên cột cho dễ hiểu
colnames(rein_vac_df) <- c("Reinfection", "Vaccination_Status", "Count")
# Vẽ biểu đồ
ggplot(rein_vac_df, aes(x = Vaccination_Status, y = Count, fill = Reinfection)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Biểu đồ 19. Tình trạng tái nhiễm theo tình trạng tiêm vắc xin",
x = "Tình trạng tiêm vắc xin",
y = "Số lượng bệnh nhân",
fill = "Tình trạng tái nhiễm"
) +
theme_minimal() +
scale_fill_brewer(palette = "Set2")
Nhận xét
Dựa trên bảng tần suất, ta thấy rằng trong nhóm không tái nhiễm, tỷ lệ bệnh nhân chưa tiêm vắc xin chiếm khoảng 51.49%, cao hơn so với nhóm đã tiêm là 48.51%, với mức chênh lệch là 2.98%. Ngược lại, ở nhóm tái nhiễm, tỷ lệ bệnh nhân đã tiêm vắc xin lại cao hơn, đạt 54.39%, so với 45.61% ở nhóm chưa tiêm, tức là chênh lệch khoảng 8.78%.
Những con số này cho thấy rằng trong mẫu dữ liệu này, tỷ lệ tái nhiễm ở nhóm đã tiêm có xu hướng cao hơn so với nhóm chưa tiêm.
Giả thuyết kiểm định:
H₀: Tình trạng tái nhiễm và tình trạng tiêm vaccin là hai biến độc lập.
H₁: Tình trạng tái nhiễm và tình trạng tiêm vaccin có liên quan.
# Thực hiện kiểm định Chi bình phương
chi_rein_vac <- chisq.test(rein_vac)
print(chi_rein_vac)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: rein_vac
## X-squared = 3.3342, df = 1, p-value = 0.06786
Kết quả kiểm định:
Giá trị thống kê Chi bình phương: X² = 3.3342
Bậc tự do (df) = 1
p-value = 0.06786
Với mức ý nghĩa thường dùng là α = 0.05, ta thấy p-value = 0.06786 > 0.05, tức là không đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Nói cách khác, chưa thể kết luận rằng tình trạng tái nhiễm và tình trạng tiêm vắc xin có mối liên hệ rõ ràng trong mẫu dữ liệu này.
# Lập bảng tần số chéo
rein_vac <- table(dt$Reinfection, dt$Vaccination_Status)
# Thêm tổng hàng và cột
rein_vac1 <- addmargins(rein_vac)
# Hiển thị bảng
rein_vac1
##
## Chưa tiêm Đã tiêm Sum
## Không tái nhiễm 1398 1317 2715
## Tái nhiễm 130 155 285
## Sum 1528 1472 3000
\[ p_1 = P(\text{Reinfection} = \text{Yes} \mid \text{Vaccination_Status} = \text{Chưa tiêm}) \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm)} \]
\[ p_2 = P(\text{Reinfection} = \text{Yes} \mid \text{Vaccination_Status} = \text{Đã tiêm}) \quad \text{(Tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]
Giả thuyết kiểm định:
\[ H_0: p_1 - p_2 = 0 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm bằng tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]
\[ H_1: p_1 - p_2 < 0 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]
# Số người tái nhiễm trong từng nhóm tiêm chủng
counts_reinfection <- c(rein_vac["Tái nhiễm", "Chưa tiêm"], rein_vac["Tái nhiễm", "Đã tiêm"])
# Tổng số người trong từng nhóm tiêm chủng
totals_reinfection <- c(sum(rein_vac[, "Chưa tiêm"]), sum(rein_vac[, "Đã tiêm"]))
# Kiểm định tỉ lệ một phía: p1 < p2 (tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn nhóm đã tiêm)
test_reinfection_less <- prop.test(counts_reinfection, totals_reinfection, alternative = "less", correct = FALSE)
# Hiển thị kết quả kiểm định
test_reinfection_less
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_reinfection out of totals_reinfection
## X-squared = 3.5655, df = 1, p-value = 0.0295
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.000000000 -0.002585538
## sample estimates:
## prop 1 prop 2
## 0.08507853 0.10529891
Kết quả kiểm định cho thấy:
Tỷ lệ tái nhiễm ở nhóm chưa tiêm (prop 1) là khoảng 8.51%.
Tỷ lệ tái nhiễm ở nhóm đã tiêm (prop 2) là khoảng 10.53%.
Với p-value = 0.0295, nhỏ hơn mức ý nghĩa 0.05, chúng ta có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này có nghĩa là Tỷ lệ tái nhiễm ở nhóm chưa tiêm nhỏ hơn tỷ lệ tái nhiễm ở nhóm đã tiêm.
riskratio(rein_vac, method="wald")
## $data
##
## Chưa tiêm Đã tiêm Total
## Không tái nhiễm 1398 1317 2715
## Tái nhiễm 130 155 285
## Total 1528 1472 3000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Không tái nhiễm 1.000000 NA NA
## Tái nhiễm 1.121169 1.001205 1.255505
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không tái nhiễm NA NA NA
## Tái nhiễm 0.05943728 0.06179783 0.05899318
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Ước lượng Risk Ratio (RR) cho nhóm tái nhiễm là 1.121 với khoảng tin cậy 95% từ 1.001 đến 1.256. Điều này có nghĩa là nhóm đã tiêm có nguy cơ tái nhiễm cao hơn khoảng 12.1% so với nhóm chưa tiêm. Khoảng tin cậy 95% này không bao gồm giá trị 1, cho thấy sự khác biệt này có thể là có ý nghĩa thống kê.
Giả thuyết kiểm định:
\[ H_0: p_1 = p_2 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm bằng tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]
\[ H_1: p_1 \neq p_2 \quad \text{(Tỷ lệ tái nhiễm ở nhóm chưa tiêm khác tỷ lệ tái nhiễm ở nhóm đã tiêm)} \]
Các kiểm định thống kê cho tình trạng tái nhiễm được thực hiện với ba phương pháp phổ biến là Mid-p exact test, Fisher’s exact test và Chi-squared test đều cho kết quả p-value lớn hơn mức ý nghĩa 0.05:
Mid-p exact test: 0.0594
Fisher’s exact test: 0.0618
Chi-squared test: 0.0590
Do đó, ta không đủ cơ sở để bác bỏ giả thuyết H₀. Nói cách khác, không có bằng chứng thống kê mạnh mẽ để khẳng định sự khác biệt có ý nghĩa giữa tỷ lệ tái nhiễm của hai nhóm.
Mặc dù Risk Ratio (RR) ước lượng nguy cơ tái nhiễm ở nhóm đã tiêm cao hơn nhóm chưa tiêm (RR = 1.121), nhưng do p-value chưa đủ nhỏ nên sự khác biệt này có thể do biến thiên ngẫu nhiên trong mẫu dữ liệu.
or_result2 <- oddsratio(rein_vac)
print(or_result2)
## $data
##
## Chưa tiêm Đã tiêm Total
## Không tái nhiễm 1398 1317 2715
## Tái nhiễm 130 155 285
## Total 1528 1472 3000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Không tái nhiễm 1.000000 NA NA
## Tái nhiễm 1.265329 0.9906896 1.618385
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không tái nhiễm NA NA NA
## Tái nhiễm 0.05943728 0.06179783 0.05899318
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Ước lượng Odds Ratio (OR) cho nhóm tái nhiễm là 1.27 (với khoảng tin cậy 95% từ 0.99 đến 1.62), so với nhóm “Không tái nhiễm” làm nhóm tham chiếu (OR = 1). Điều này gợi ý rằng:
Người đã tiêm có khả năng tái nhiễm cao hơn khoảng 27% so với người chưa tiêm.
Tuy nhiên, khoảng tin cậy 95% bao gồm giá trị 1 (0.99 – 1.62), do đó sự khác biệt này chưa thực sự chắc chắn về mặt thống kê.
Các kết quả kiểm định với ba phương pháp phổ biến đều cho giá trị p-value lớn hơn 0.05, cụ thể:
Mid-p exact test: 0.0594
Fisher’s exact test: 0.0618
Chi-squared test: 0.0590
Mặc dù các p-value này khá gần mức ý nghĩa 0.05, nhưng vẫn chưa đủ nhỏ để bác bỏ giả thuyết H₀ – tức là không có sự khác biệt có ý nghĩa thống kê về tỷ lệ tái nhiễm giữa nhóm chưa tiêm và nhóm đã tiêm.
Tóm lại, mặc dù ước lượng Odds Ratio cho thấy người đã tiêm có xu hướng có nguy cơ tái nhiễm cao hơn, kết quả kiểm định thống kê không đủ bằng chứng để kết luận sự khác biệt này là có ý nghĩa thực sự. Do đó, sự khác biệt quan sát được có thể là do biến thiên ngẫu nhiên trong mẫu khảo sát.
Qua quá trình tìm hiểu, mô tả và kiểm định thống kê trên bộ dữ liệu mô phỏng bệnh nhân COVID-19, báo cáo này đã phác họa nên một bức tranh toàn cảnh về đặc điểm dịch tễ và lâm sàng, đồng thời khám phá những mối liên hệ ban đầu giữa các yếu tố nguy cơ và kết quả điều trị. Các kết quả không chỉ cung cấp những con số cụ thể mà còn mở ra nhiều hướng thảo luận quan trọng.
Phân tích mô tả đã cho thấy bộ dữ liệu có chất lượng tốt, không chứa giá trị thiếu và được thiết kế với sự cân bằng đáng kể giữa các nhóm nhân khẩu học. Các biến như Giới tính, Khu vực địa lý, Bệnh nền và Biến thể virus đều có tỷ lệ phân bố khá đồng đều, tạo một nền tảng vững chắc và khách quan cho các phân tích so sánh. Ngược lại, các biến thể hiện mức độ nghiêm trọng như Nhập viện, Nhập ICU, hay Hỗ trợ thở máy lại cho thấy sự mất cân bằng rõ rệt, với phần lớn bệnh nhân (trên 70%) không cần can thiệp y tế chuyên sâu. Điều này phản ánh đúng thực tế của đại dịch, nơi chỉ một bộ phận nhỏ các ca nhiễm tiến triển nặng.
Khi tiến hành kiểm định các giả thuyết thống kê, các kết quả nhìn chung cho thấy tỷ lệ quan sát được trong mẫu không có sự khác biệt đáng kể so với các giá trị giả định trong quần thể. Chẳng hạn, tỷ lệ phục hồi trong mẫu (50.3%) không khác biệt có ý nghĩa so với mức 50%, hay tỷ lệ người có triệu chứng ban đầu là “Nhẹ” (33.7%) cũng không cho thấy sự chênh lệch có ý nghĩa so với mốc 33% giả định. Điều này cho thấy bộ dữ liệu tổng hợp này đã được tạo ra để phản ánh các tham số dân số một cách khá chuẩn xác.
Kết quả đáng suy ngẫm nhất đến từ việc phân tích mối quan hệ giữa các biến. Trong khi không có mối liên kết có ý nghĩa thống kê được tìm thấy giữa Giới tính và tỷ lệ nhập viện, hoặc giữa Tình trạng tiêm chủng và khả năng hồi phục, thì mối quan hệ giữa Tái nhiễm và Tiêm chủng lại cho thấy một kết quả thú vị. Dữ liệu chỉ ra rằng nhóm đã tiêm vắc-xin có tỷ lệ tái nhiễm (10.5%) cao hơn một chút so với nhóm chưa tiêm (8.5%). Mặc dù kiểm định Chi-bình phương (p-value ≈ 0.068) chưa đạt mức ý nghĩa thống kê, nhưng kiểm định hiệu tỷ lệ một phía lại cho thấy sự khác biệt này có ý nghĩa (p-value ≈ 0.0295). Kết quả không nhất quán và có phần trái ngược với kỳ vọng này là một điểm thảo luận quan trọng.
Trước hết, cần nhấn mạnh rằng đây là một bộ dữ liệu tổng hợp (synthetic). Do đó, mọi kết luận rút ra chỉ mang tính tham khảo, minh họa cho phương pháp phân tích và không thể áp dụng trực tiếp cho các quyết định lâm sàng trong thực tế.
Kết quả đáng chú ý nhất về mối liên hệ giữa việc tiêm vắc-xin và nguy cơ tái nhiễm cao hơn cần được diễn giải một cách cẩn trọng. Một số giả thuyết có thể được đưa ra để lý giải hiện tượng này:
Yếu tố nhiễu (Confounding Variables): Nhóm đã tiêm vắc-xin có thể bao gồm những người có nguy cơ phơi nhiễm cao hơn do tính chất công việc (nhân viên y tế, giáo viên) hoặc có bệnh nền, khiến họ được ưu tiên tiêm chủng. Chính các yếu tố này, chứ không phải bản thân vắc-xin, mới là nguyên nhân làm tăng nguy cơ tái nhiễm.
Khác biệt hành vi: Những người đã tiêm chủng có thể có tâm lý chủ quan hơn, giảm bớt các biện pháp phòng ngừa cá nhân, dẫn đến tăng khả năng tiếp xúc với virus.
Yếu tố thời gian và biến thể virus: Dữ liệu kéo dài đến năm 2024, bao gồm cả giai đoạn các biến thể mới có khả năng “né” miễn dịch từ vắc-xin (như Omicron) chiếm ưu thế. Những người đã tiêm từ sớm có thể đã suy giảm miễn dịch theo thời gian, trong khi nhóm chưa tiêm có thể đã có miễn dịch tự nhiên từ lần nhiễm trước đó với một biến thể khác.
Sự ngẫu nhiên của mẫu: Vì giá trị p-value của kiểm định Chi-bình phương rất gần ngưỡng 0.05, không thể loại trừ khả năng sự khác biệt này chỉ là do biến thiên ngẫu nhiên trong mẫu.
Từ các kết quả và thảo luận trên, các nghiên cứu sâu hơn có thể được thực hiện theo các hướng sau:
Phân tích đa biến: Sử dụng các mô hình hồi quy (ví dụ: hồi quy logistic) để đánh giá đồng thời tác động của nhiều yếu tố (tuổi, bệnh nền, nghề nghiệp, tình trạng tiêm chủng) lên các kết quả như nhập viện hoặc tái nhiễm. Cách tiếp cận này sẽ giúp kiểm soát các yếu tố gây nhiễu và làm rõ hơn vai trò của từng biến.
Phân tích theo từng giai đoạn: Chia bộ dữ liệu theo các mốc thời gian quan trọng (ví dụ: trước và sau khi biến thể Omicron xuất hiện) để đánh giá sự thay đổi trong hiệu quả của vắc-xin và nguy cơ tái nhiễm.
Phân tích nhóm nhỏ (Subgroup Analysis): Đi sâu vào so sánh giữa các loại vắc-xin khác nhau, hoặc đánh giá nguy cơ tái nhiễm trong các nhóm nghề nghiệp có mức độ phơi nhiễm khác nhau để có cái nhìn chi tiết hơn.