#viec1
#1.1 Đọc dữ liệu vào R
ob = read.csv ("D:/2025_TAP HUAN_THONG KE DL NCKH/Obesity data.csv")

#1.2 Mô tả dữ liệu
library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
table1(~ age + gender + weight + height + pcfat + hypertension + diabetes, data = ob)
Overall
(N=1217)
age
Mean (SD) 47.2 (17.3)
Median [Min, Max] 48.0 [13.0, 88.0]
gender
F 862 (70.8%)
M 355 (29.2%)
weight
Mean (SD) 55.1 (9.40)
Median [Min, Max] 54.0 [34.0, 95.0]
height
Mean (SD) 157 (7.98)
Median [Min, Max] 155 [136, 185]
pcfat
Mean (SD) 31.6 (7.18)
Median [Min, Max] 32.4 [9.20, 48.4]
hypertension
Mean (SD) 0.507 (0.500)
Median [Min, Max] 1.00 [0, 1.00]
diabetes
Mean (SD) 0.111 (0.314)
Median [Min, Max] 0 [0, 1.00]
#1.3. Nhận xét kq
ob$hyper = as.factor(ob$hypertension)
ob$diab = as.factor(ob$diabetes)

table1(~ age + gender + weight + height + pcfat + hypertension + hyper + diabetes + diab, data = ob)
Overall
(N=1217)
age
Mean (SD) 47.2 (17.3)
Median [Min, Max] 48.0 [13.0, 88.0]
gender
F 862 (70.8%)
M 355 (29.2%)
weight
Mean (SD) 55.1 (9.40)
Median [Min, Max] 54.0 [34.0, 95.0]
height
Mean (SD) 157 (7.98)
Median [Min, Max] 155 [136, 185]
pcfat
Mean (SD) 31.6 (7.18)
Median [Min, Max] 32.4 [9.20, 48.4]
hypertension
Mean (SD) 0.507 (0.500)
Median [Min, Max] 1.00 [0, 1.00]
hyper
0 600 (49.3%)
1 617 (50.7%)
diabetes
Mean (SD) 0.111 (0.314)
Median [Min, Max] 0 [0, 1.00]
diab
0 1082 (88.9%)
1 135 (11.1%)
#1.4. Trung vị (Q1, Q3)
table1(~ age + weight + height + pcfat, data = ob, render.continuous = c(. = "Mean (SD)", . = "Median [Q1, Q3]"))
Overall
(N=1217)
age
Mean (SD) 47.2 (17.3)
Median [Q1, Q3] 48.0 [35.0, 58.0]
weight
Mean (SD) 55.1 (9.40)
Median [Q1, Q3] 54.0 [49.0, 61.0]
height
Mean (SD) 157 (7.98)
Median [Q1, Q3] 155 [151, 162]
pcfat
Mean (SD) 31.6 (7.18)
Median [Q1, Q3] 32.4 [27.0, 36.8]
#1.5. Mô tả tuổi, cân nặng, chiều cao, tỉ trọng mỡ, tiền bệnh cao huyết áp theo giới tính
table1(~ age + weight + height + pcfat + hyper + diab | gender, data = ob)
F
(N=862)
M
(N=355)
Overall
(N=1217)
age
Mean (SD) 48.6 (16.4) 43.7 (18.8) 47.2 (17.3)
Median [Min, Max] 49.0 [14.0, 85.0] 44.0 [13.0, 88.0] 48.0 [13.0, 88.0]
weight
Mean (SD) 52.3 (7.72) 62.0 (9.59) 55.1 (9.40)
Median [Min, Max] 51.0 [34.0, 95.0] 62.0 [38.0, 95.0] 54.0 [34.0, 95.0]
height
Mean (SD) 153 (5.55) 165 (6.73) 157 (7.98)
Median [Min, Max] 153 [136, 170] 165 [146, 185] 155 [136, 185]
pcfat
Mean (SD) 34.7 (5.19) 24.2 (5.76) 31.6 (7.18)
Median [Min, Max] 34.7 [14.6, 48.4] 24.6 [9.20, 39.0] 32.4 [9.20, 48.4]
hyper
0 430 (49.9%) 170 (47.9%) 600 (49.3%)
1 432 (50.1%) 185 (52.1%) 617 (50.7%)
diab
0 760 (88.2%) 322 (90.7%) 1082 (88.9%)
1 102 (11.8%) 33 (9.3%) 135 (11.1%)
#1.6. Đánh giá khác biệt giữa nam và nữ
library(compareGroups)
createTable(compareGroups(gender ~ age + weight + height + pcfat + hyper + diab, data = ob))
## 
## --------Summary descriptives table by 'gender'---------
## 
## ________________________________________ 
##             F           M      p.overall 
##           N=862       N=355              
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 
## age    48.6 (16.4) 43.7 (18.8)  <0.001   
## weight 52.3 (7.72) 62.0 (9.59)  <0.001   
## height 153 (5.55)  165 (6.73)   <0.001   
## pcfat  34.7 (5.19) 24.2 (5.76)  <0.001   
## hyper:                           0.569   
##     0  430 (49.9%) 170 (47.9%)           
##     1  432 (50.1%) 185 (52.1%)           
## diab:                            0.238   
##     0  760 (88.2%) 322 (90.7%)           
##     1  102 (11.8%) 33 (9.30%)            
## ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#Việc 2. 
#2.1 Có dữ liệu về tải trọng của 2 nhóm A và B:
#Nhóm A (n= 7): 14, 4, 10, 6, 3, 11, 12
#Nhóm B (n= 9): 16, 17, 13, 12, 7, 16, 11, 8, 7
#Nhập dữ liệu trên vào R.
#2.1 Nhập dữ liệu nhóm A và B
# Nhập dữ liệu nhóm A và nhóm B
group_A <- c(14, 4, 10, 6, 3, 11, 12)
group_B <- c(16, 17, 13, 12, 7, 16, 11, 8, 7)

#2.2 Xem xét tính phân bổ chuẩn (normal distribution)?
#Bước 1: Kiểm định Shapiro-Wilk
# Kiểm tra nhóm A
shapiro.test(group_A)
## 
##  Shapiro-Wilk normality test
## 
## data:  group_A
## W = 0.92541, p-value = 0.5126
# Kiểm tra nhóm B
shapiro.test(group_B)
## 
##  Shapiro-Wilk normality test
## 
## data:  group_B
## W = 0.89641, p-value = 0.2319
#Bước 2: Vẽ biểu đồ trực quan
# Histogram
hist(group_A, main = "Histogram - Group A", xlab = "Tải trọng", col = "lightblue")

hist(group_B, main = "Histogram - Group B", xlab = "Tải trọng", col = "lightgreen")

# Q-Q plot
qqnorm(group_A); qqline(group_A, col = "red", lwd = 2)

qqnorm(group_B); qqline(group_B, col = "blue", lwd = 2)

#2.3. Mô tả về tải trọng 2 nhóm
summary(group_A)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.000   5.000  10.000   8.571  11.500  14.000
summary(group_B)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    7.00    8.00   12.00   11.89   16.00   17.00
mean(group_A); sd(group_A)
## [1] 8.571429
## [1] 4.237025
mean(group_B); sd(group_B)
## [1] 11.88889
## [1] 3.95109
# Tạo bảng mô tả 
data.frame(
  Group = c("A", "B"),
  N = c(length(group_A), length(group_B)),
  Mean = c(mean(group_A), mean(group_B)),
  SD = c(sd(group_A), sd(group_B)),
  Median = c(median(group_A), median(group_B)),
  Min = c(min(group_A), min(group_B)),
  Max = c(max(group_A), max(group_B))
)
##   Group N      Mean       SD Median Min Max
## 1     A 7  8.571429 4.237025     10   3  14
## 2     B 9 11.888889 3.951090     12   7  17
#2.4 Thực hiện phép kiểm t để đánh giá khác biệt về tải trọng của 2 nhóm. Bạn nhận xét gì về kết quả này.
t.test(group_A, group_B)
## 
##  Welch Two Sample t-test
## 
## data:  group_A and group_B
## t = -1.6, df = 12.554, p-value = 0.1345
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -7.813114  1.178194
## sample estimates:
## mean of x mean of y 
##  8.571429 11.888889
#2.5 Thực hiện bootstrap để đánh giá khác biệt trung bình tải trọng giữa 2 nhóm. Bạn nhận xét gì về kết quả này.
library(boot)
# Gộp dữ liệu và tạo nhãn nhóm
values <- c(group_A, group_B)
group <- c(rep("A", length(group_A)), rep("B", length(group_B)))
data <- data.frame(group, values)

# Hàm bootstrap: lấy hiệu số trung bình giữa nhóm B và A
boot_diff_mean <- function(data, indices) {
  d <- data[indices, ]
  mean(d$values[d$group == "B"]) - mean(d$values[d$group == "A"])
}

# Thực hiện bootstrap
set.seed(123)  # để kết quả tái lập được
boot_result <- boot(data = data, statistic = boot_diff_mean, R = 1000)

# Xem kết quả
boot_result
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = data, statistic = boot_diff_mean, R = 1000)
## 
## 
## Bootstrap Statistics :
##     original      bias    std. error
## t1*  3.31746 -0.02297878    2.025754
# Tính khoảng tin cậy 95%
boot.ci(boot_result, type = "perc")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_result, type = "perc")
## 
## Intervals : 
## Level     Percentile     
## 95%   (-0.498,  7.460 )  
## Calculations and Intervals on Original Scale
plot(boot_result)
abline(v = 0, col = "red", lty = 2)  # vẽ đường tại 0 để trực quan khoảng CI