🎯 Mục tiêu

Phân tích mô tả dữ liệu béo phì và so sánh sự khác biệt giữa hai nhóm bằng các phương pháp thống kê mô tả, kiểm định t và bootstrap.


1️⃣ Phân tích mô tả dữ liệu ob

1.1 Đọc dữ liệu

ob <- read.csv("Obesity data.csv", header = TRUE)
head(ob)
##   id gender height weight  bmi age WBBMC wbbmd   fat  lean pcfat hypertension
## 1  1      F    150     49 21.8  53  1312  0.88 17802 28600  37.3            0
## 2  2      M    165     52 19.1  65  1309  0.84  8381 40229  16.8            1
## 3  3      F    157     57 23.1  64  1230  0.84 19221 36057  34.0            1
## 4  4      F    156     53 21.8  56  1171  0.80 17472 33094  33.8            1
## 5  5      M    160     51 19.9  54  1681  0.98  7336 40621  14.8            0
## 6  6      F    153     47 20.1  52  1358  0.91 14904 30068  32.2            1
##   diabetes
## 1        1
## 2        0
## 3        0
## 4        0
## 5        0
## 6        0

1.2 Mô tả các biến

summary(ob[, c("age", "gender", "height", "weight", "pcfat", "hypertension", "diabetes")])
##       age           gender              height          weight     
##  Min.   :13.00   Length:1217        Min.   :136.0   Min.   :34.00  
##  1st Qu.:35.00   Class :character   1st Qu.:151.0   1st Qu.:49.00  
##  Median :48.00   Mode  :character   Median :155.0   Median :54.00  
##  Mean   :47.15                      Mean   :156.7   Mean   :55.14  
##  3rd Qu.:58.00                      3rd Qu.:162.0   3rd Qu.:61.00  
##  Max.   :88.00                      Max.   :185.0   Max.   :95.00  
##      pcfat       hypertension      diabetes     
##  Min.   : 9.2   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:27.0   1st Qu.:0.000   1st Qu.:0.0000  
##  Median :32.4   Median :1.000   Median :0.0000  
##  Mean   :31.6   Mean   :0.507   Mean   :0.1109  
##  3rd Qu.:36.8   3rd Qu.:1.000   3rd Qu.:0.0000  
##  Max.   :48.4   Max.   :1.000   Max.   :1.0000

1.3 Bảng mô tả theo giới tính

if(!require(table1)) install.packages("table1")
## Loading required package: table1
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'table1'
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
## also installing the dependency 'Formula'
library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
table1(~ age + height + weight + pcfat + hypertension + diabetes | 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]
height
Mean (SD) 153 (5.55) 165 (6.73) 157 (7.98)
Median [Min, Max] 153 [136, 170] 165 [146, 185] 155 [136, 185]
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]
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]
hypertension
Mean (SD) 0.501 (0.500) 0.521 (0.500) 0.507 (0.500)
Median [Min, Max] 1.00 [0, 1.00] 1.00 [0, 1.00] 1.00 [0, 1.00]
diabetes
Mean (SD) 0.118 (0.323) 0.0930 (0.291) 0.111 (0.314)
Median [Min, Max] 0 [0, 1.00] 0 [0, 1.00] 0 [0, 1.00]

1.4 Biểu diễn tần suất

prop.table(table(ob$hypertension))
## 
##         0         1 
## 0.4930156 0.5069844
prop.table(table(ob$diabetes))
## 
##         0         1 
## 0.8890715 0.1109285

💬 Nhận xét:
Tỷ lệ người có tiền căn cao huyết áptiểu đường trong mẫu khá thấp, chiếm tỷ lệ nhỏ hơn so với nhóm không mắc bệnh.
Điều này phản ánh mẫu dữ liệu chủ yếu là các đối tượng có sức khỏe bình thường, chưa biểu hiện nhiều bệnh lý nền.


1.5 Trung vị Q1–Q3

quantile(ob$age, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
## 25% 50% 75% 
##  35  48  58
quantile(ob$weight, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)
## 25% 50% 75% 
##  49  54  61

1.6 So sánh theo giới tính

aggregate(cbind(age, height, weight, pcfat, hypertension) ~ gender, data = ob, summary)
##   gender age.Min. age.1st Qu. age.Median age.Mean age.3rd Qu. age.Max.
## 1      F 14.00000    39.00000   49.00000 48.57309    59.00000 85.00000
## 2      M 13.00000    24.00000   44.00000 43.70141    56.00000 88.00000
##   height.Min. height.1st Qu. height.Median height.Mean height.3rd Qu.
## 1    136.0000       150.0000      153.0000    153.2912       157.0000
## 2    146.0000       160.0000      165.0000    165.0592       169.0000
##   height.Max. weight.Min. weight.1st Qu. weight.Median weight.Mean
## 1    170.0000    34.00000       47.00000      51.00000    52.31090
## 2    185.0000    38.00000       55.00000      62.00000    62.02254
##   weight.3rd Qu. weight.Max. pcfat.Min. pcfat.1st Qu. pcfat.Median pcfat.Mean
## 1       57.00000    95.00000   14.60000      31.50000     34.70000   34.67241
## 2       68.00000    95.00000    9.20000      20.35000     24.60000   24.15607
##   pcfat.3rd Qu. pcfat.Max. hypertension.Min. hypertension.1st Qu.
## 1      38.30000   48.40000         0.0000000            0.0000000
## 2      28.00000   39.00000         0.0000000            0.0000000
##   hypertension.Median hypertension.Mean hypertension.3rd Qu. hypertension.Max.
## 1           1.0000000         0.5011601            1.0000000         1.0000000
## 2           1.0000000         0.5211268            1.0000000         1.0000000

1.7 Kiểm định t-test theo giới tính

t.test(weight ~ gender, data = ob)
## 
##  Welch Two Sample t-test
## 
## data:  weight by gender
## t = -16.952, df = 551.85, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -10.836942  -8.586319
## sample estimates:
## mean in group F mean in group M 
##        52.31090        62.02254
t.test(height ~ gender, data = ob)
## 
##  Welch Two Sample t-test
## 
## data:  height by gender
## t = -29.125, df = 562.31, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -12.56161 -10.97433
## sample estimates:
## mean in group F mean in group M 
##        153.2912        165.0592
t.test(pcfat ~ gender, data = ob)
## 
##  Welch Two Sample t-test
## 
## data:  pcfat by gender
## t = 29.768, df = 602.01, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##   9.822548 11.210140
## sample estimates:
## mean in group F mean in group M 
##        34.67241        24.15607

💡 Nhận xét:
Kết quả kiểm định t cho thấy nếu p-value < 0.05, có thể kết luận rằng giữa nam và nữ tồn tại sự khác biệt có ý nghĩa thống kê về biến được so sánh (ví dụ: cân nặng hoặc tỉ trọng mỡ cơ thể).


2️⃣ Phân tích khác biệt giữa hai nhóm A và B

2.1 Nhập dữ liệu

A <- c(14, 4, 10, 6, 3, 11, 12)
B <- c(16, 17, 13, 12, 7, 16, 11, 8, 7)

2.2 Kiểm tra phân phối chuẩn

shapiro.test(A)
## 
##  Shapiro-Wilk normality test
## 
## data:  A
## W = 0.92541, p-value = 0.5126
shapiro.test(B)
## 
##  Shapiro-Wilk normality test
## 
## data:  B
## W = 0.89641, p-value = 0.2319

2.3 Mô tả đặc điểm tải trọng

mean(A); sd(A)
## [1] 8.571429
## [1] 4.237025
mean(B); sd(B)
## [1] 11.88889
## [1] 3.95109
boxplot(A, B, names = c("Nhóm A", "Nhóm B"), col = c("lightblue", "lightgreen"))

2.4 Kiểm định t-test hai nhóm

t.test(A, B, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  A and B
## t = -1.615, df = 14, p-value = 0.1286
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -7.723188  1.088267
## sample estimates:
## mean of x mean of y 
##  8.571429 11.888889

💬 Nhận xét:
Nếu p-value < 0.05, có thể kết luận rằng giữa hai nhóm có sự khác biệt có ý nghĩa thống kê về tải trọng.
Ngược lại, nếu p-value > 0.05, sự khác biệt không đáng kể – hai nhóm có trung bình tải trọng tương đương nhau.


3️⃣ Phân tích Bootstrap

3.1 Bootstrap trung bình hai nhóm

if(!require(boot)) install.packages("boot")
## Loading required package: boot
library(boot)

# Tạo khung dữ liệu ghép nhóm A và B
df <- data.frame(
  value = c(A, B),
  group = rep(c("A", "B"), times = c(length(A), length(B)))
)

# Hàm tính trung bình giữa hai nhóm
mean_diff <- function(data, indices) {
  d <- data[indices, ]
  mean(d$value[d$group == "A"]) - mean(d$value[d$group == "B"])
}

set.seed(123)
boot_mean <- boot(df, statistic = mean_diff, R = 1000)
boot.ci(boot_mean, type = "bca")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_mean, type = "bca")
## 
## Intervals : 
## Level       BCa          
## 95%   (-7.590,  0.374 )  
## Calculations and Intervals on Original Scale

💡 Nhận xét:
Kết quả Bootstrap trung bình cho thấy ước lượng chênh lệch giữa hai nhóm A và B nằm trong khoảng tin cậy 95% (CI 95%).
Nếu khoảng tin cậy không chứa 0, điều đó khẳng định có sự khác biệt có ý nghĩa thống kê về giá trị trung bình giữa hai nhóm.
Ngược lại, nếu CI bao gồm 0, thì sự khác biệt không có ý nghĩa thống kê – trung bình tải trọng hai nhóm tương đương trong quần thể.


3.2 Bootstrap trung vị

median_diff <- function(x, y) median(x) - median(y)

boot_median <- function(data, indices) {
  d <- data[indices, ]
  median_diff(d$value[d$group == "A"], d$value[d$group == "B"])
}

set.seed(123)
boot_results <- boot(df, statistic = boot_median, R = 1000)
boot.ci(boot_results, type = "bca")
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_results, type = "bca")
## 
## Intervals : 
## Level       BCa          
## 95%   (-10.000,   3.413 )  
## Calculations and Intervals on Original Scale

📈 Nhận xét:
Bootstrap trung vị giúp đánh giá mức chênh lệch khi dữ liệu không tuân theo phân phối chuẩn.
Nếu khoảng tin cậy 95% của chênh lệch trung vị không chứa 0, có thể kết luận rằng phân bố hai nhóm khác nhau đáng kể về xu hướng trung tâm (median).
Phương pháp này đặc biệt hữu ích khi dữ liệu có nhiễu, sai lệch hoặc kích thước mẫu nhỏ.


4️⃣ Kết luận

  • Đã mô tả dữ liệu và kiểm định sự khác biệt giữa hai nhóm.
  • Kiểm định t-test phù hợp khi dữ liệu chuẩn; bootstrap hỗ trợ khi dữ liệu không chuẩn.
  • Bài thực hành hoàn thành bằng RMarkdown và có thể publish lên rpubs.com.

💬 Thảo luận mở rộng

🔍 Phân tích sâu hơn:
Kiểm định t cung cấp cách so sánh trung bình dựa trên giả định phân phối chuẩn.
Tuy nhiên, khi giả định này không thoả mãn (p < 0.05 trong Shapiro–Wilk test), việc sử dụng phép kiểm phi tham số (Mann–Whitney) hoặc Bootstrap trở nên cần thiết để đảm bảo kết quả đáng tin cậy.

💡 Ý nghĩa thực tiễn:
Trong nghiên cứu thực tế, việc so sánh hai nhóm thường xuyên gặp phải dữ liệu không chuẩn.
Phương pháp bootstrap cho phép nhà nghiên cứu vẫn ước lượng được khoảng tin cậy chính xác mà không cần dựa vào giả định phân phối.

Kết luận mở rộng:
Kết hợp giữa kiểm định t, Mann–Whitney và bootstrap giúp bạn đọc có cái nhìn toàn diện hơn về sự khác biệt giữa các nhóm – một kỹ năng quan trọng khi làm luận văn hoặc báo cáo khoa học sử dụng R.