Đọc dữ liệu và tải thư viện

library(ggplot2)
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(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: lattice
# Đọc dữ liệu
df <- read.csv("C:/Users/Student/Downloads/subset_12.csv")

1. Thống kê mô tả

Thống kê mô tả các biến số liên tục

continuous_vars <- df[, sapply(df, is.numeric)]
summary_continuous <- data.frame(
  Variable = names(continuous_vars),
  Mean = sapply(continuous_vars, mean, na.rm = TRUE),
  Std = sapply(continuous_vars, sd, na.rm = TRUE),
  Min = sapply(continuous_vars, min, na.rm = TRUE),
  Median = sapply(continuous_vars, median, na.rm = TRUE),
  Max = sapply(continuous_vars, max, na.rm = TRUE)
)
print(summary_continuous)
##                Variable      Mean      Std Min Median Max
## Age                 Age  54.13813 21.30758  18     55  90
## QoL                 QoL  49.75266 29.13534   0     50 100
## Cholesterol Cholesterol 201.08619 28.98829 150    202 250

Thống kê tần số các biến phân loại

categorical_vars <- df[, sapply(df, is.character) | sapply(df, is.factor)]
frequency_table <- function(var) {
  freq <- table(var, useNA = "ifany")
  percent <- prop.table(freq) * 100
  return(data.frame(Category = names(freq), Frequency = as.vector(freq), Percentage = round(as.vector(percent), 2)))
}
categorical_summary <- lapply(categorical_vars, frequency_table)
categorical_summary
## $Gender
##   Category Frequency Percentage
## 1     Khac       556      32.82
## 2      Nam       569      33.59
## 3       Nu       569      33.59
## 
## $Home
##    Category Frequency Percentage
## 1 Nong thon       845      49.88
## 2 Thanh thi       849      50.12
## 
## $Alco
##       Category Frequency Percentage
## 1 Da tung uong       510      30.11
## 2    Dang uong       565      33.35
## 3   Khong uong       619      36.54
## 
## $Meds
##   Category Frequency Percentage
## 1       Co       841      49.65
## 2    Khong       853      50.35
## 
## $Activity
##     Category Frequency Percentage
## 1        Cao       555      32.76
## 2     Rat it       554      32.70
## 3 Trung binh       585      34.53
## 
## $SES
##     Category Frequency Percentage
## 1        Cao       580      34.24
## 2       Thap       534      31.52
## 3 Trung binh       580      34.24

2. Trực quan hóa dữ liệu

Biểu đồ phân phối Cholesterol

ggplot(df, aes(x = Cholesterol)) +
  geom_histogram(binwidth = 10, fill = "steelblue", color = "black", alpha = 0.7) +
  labs(title = "Phân phối Cholesterol", x = "Cholesterol", y = "Tần số") +
  theme_minimal()

Biểu đồ Boxplot so sánh QoL theo giới tính

ggplot(df, aes(x = Gender, y = QoL, fill = Gender)) +
  geom_boxplot(alpha = 0.7) +
  labs(title = "So sánh Chất lượng cuộc sống theo Giới tính", x = "Giới tính", y = "QoL") +
  theme_minimal()

Biểu đồ tỷ lệ QoL > 50 theo Giới tính

ggplot(df, aes(x = Gender, fill = factor(QoL > 50))) +
  geom_bar(position = "fill") +
  labs(title = "Tỷ lệ QoL > 50 theo Giới tính", x = "Giới tính", y = "Tỷ lệ", fill = "QoL > 50") +
  theme_minimal()

3. Sự khác biệt QoL theo Giới tính

table(df$Gender, useNA = "always")
## 
## Khac  Nam   Nu <NA> 
##  556  569  569    0
df_clean <- df[df$Gender %in% c("Nam", "Nu"), ]
df_clean$Gender <- as.factor(df_clean$Gender)
df_clean$Gender <- droplevels(df_clean$Gender)
t_test_result <- t.test(QoL ~ Gender, data = df_clean, var.equal = TRUE)
print(t_test_result)
## 
##  Two Sample t-test
## 
## data:  QoL by Gender
## t = -0.82372, df = 1136, p-value = 0.4103
## alternative hypothesis: true difference in means between group Nam and group Nu is not equal to 0
## 95 percent confidence interval:
##  -4.802471  1.962401
## sample estimates:
## mean in group Nam  mean in group Nu 
##          48.80141          50.22144

Nhận xét:

Giá trị p-value = 0.4103 (lớn hơn 0.05) → Không có đủ bằng chứng thống kê để kết luận rằng có sự khác biệt về QoL giữa hai nhóm Nam và Nữ.

T-statistic = -0.82372 → Giá trị này thể hiện mức độ khác biệt giữa hai nhóm, nhưng vì p-value cao, khác biệt này không có ý nghĩa thống kê.

Khoảng tin cậy 95% (-4.80 đến 1.96) → Khoảng này chứa giá trị 0, nghĩa là có thể không có sự khác biệt thực sự giữa hai nhóm.

Trung bình QoL theo giới tính: Nam: 48.80 Nữ: 50.22 → Nhóm Nữ có trung bình QoL cao hơn một chút, nhưng sự khác biệt này có thể do ngẫu nhiên.

Kết luận: Không có sự khác biệt có ý nghĩa thống kê giữa QoL của nam và nữ (p-value > 0.05). Có thể cần xem xét thêm các biến khác để giải thích sự biến động của QoL.

4. Xây dựng mô hình hồi quy tuyến tính

model <- lm(QoL ~ Age + Gender + Home + Cholesterol + Alco + Meds + Activity + SES, data = df)
summary(model)
## 
## Call:
## lm(formula = QoL ~ Age + Gender + Home + Cholesterol + Alco + 
##     Meds + Activity + SES, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.070 -25.639   0.153  25.042  54.963 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        54.952775   5.828190   9.429  < 2e-16 ***
## Age                -0.011113   0.033358  -0.333  0.73906    
## GenderNam          -1.839041   1.744345  -1.054  0.29190    
## GenderNu           -0.201776   1.743983  -0.116  0.90791    
## HomeThanh thi       0.993877   1.420392   0.700  0.48420    
## Cholesterol        -0.007683   0.024526  -0.313  0.75411    
## AlcoDang uong      -1.375596   1.786374  -0.770  0.44138    
## AlcoKhong uong     -4.854016   1.749609  -2.774  0.00559 ** 
## MedsKhong          -0.698792   1.420409  -0.492  0.62281    
## ActivityRat it     -0.495002   1.755960  -0.282  0.77806    
## ActivityTrung binh -1.821560   1.736980  -1.049  0.29447    
## SESThap             0.416671   1.755542   0.237  0.81242    
## SESTrung binh       1.103789   1.716243   0.643  0.52022    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.14 on 1681 degrees of freedom
## Multiple R-squared:  0.006739,   Adjusted R-squared:  -0.0003518 
## F-statistic: 0.9504 on 12 and 1681 DF,  p-value: 0.495

Age (-0.0111, p = 0.739): Tuổi không ảnh hưởng đáng kể đến QoL.

Gender (Nam -1.84, p = 0.292): Không có sự khác biệt đáng kể về QoL giữa nam và nữ.

Home (Thành thị 0.99, p = 0.484): Sống ở thành thị hay nông thôn không ảnh hưởng đáng kể đến QoL.

Cholesterol (-0.0077, p = 0.754): Không có tác động đáng kể.

Meds, Activity, SES → Không ảnh hưởng đáng kể đến QoL

Alco (Không uống rượu) (-4.85, p = 0.0056): Những người không uống rượu có QoL giảm trung bình 4.85 đơn vị so với nhóm tham chiếu

5. Kết luận

Thống kê mô tả:

Các biến số liên tục như Cholesterol, QoL được mô tả bằng trung bình, độ lệch chuẩn, min-max.

Các biến phân loại như Giới tính, SES, Alco được tổng hợp tần số và tỷ lệ phần trăm.

Trực quan hóa dữ liệu:

Biểu đồ histogram cho thấy phân phối Cholesterol có xu hướng chuẩn.

Boxplot so sánh QoL theo giới tính cho thấy không có sự khác biệt rõ ràng.

Biểu đồ tỷ lệ QoL > 50 theo giới tính không có sự chênh lệch lớn.

So sánh QoL giữa Nam và Nữ:

T-test cho thấy p-value = 0.4103 → Không có sự khác biệt có ý nghĩa thống kê giữa QoL của Nam và Nữ.

Trung bình QoL:

Nam: 48.80

Nữ: 50.22

Mặc dù nhóm nữ có QoL trung bình cao hơn một chút, nhưng sự khác biệt này có thể do ngẫu nhiên.

Hồi quy tuyến tính:

Mô hình hồi quy tuyến tính không giải thích tốt sự biến thiên của QoL (R² = 0.67%, p-value = 0.495).

Hầu hết các biến độc lập (Age, Gender, Home, Cholesterol, Meds, Activity, SES) đều không có ý nghĩa thống kê.

Biến duy nhất có ý nghĩa thống kê:

Alco (Không uống rượu): QoL giảm 4.85 đơn vị so với nhóm tham chiếu (p = 0.0056).

Kết luận tổng quan:

Không tìm thấy sự khác biệt đáng kể về QoL theo giới tính.

Mô hình hồi quy tuyến tính chưa giải thích tốt QoL, có thể cần thêm biến quan trọng khác.

Cần khám phá thêm các yếu tố khác (chế độ ăn uống, bệnh lý nền, yếu tố xã hội) để có mô hình phù hợp hơn.