pdf_document: pdf_document: latex_engine: xelatex date: “2025-10-12” —
dataset <- read_excel(file.choose())
head(dataset)
## # A tibble: 6 × 16
## year gender age location `race:AfricanAmerican` `race:Asian`
## <dbl> <chr> <dbl> <chr> <dbl> <dbl>
## 1 2020 Female 32 Alabama 0 0
## 2 2015 Female 29 Alabama 0 1
## 3 2015 Male 18 Alabama 0 0
## 4 2015 Male 41 Alabama 0 0
## 5 2016 Female 52 Alabama 1 0
## 6 2016 Male 66 Alabama 0 0
## # ℹ 10 more variables: `race:Caucasian` <dbl>, `race:Hispanic` <dbl>,
## # `race:Other` <dbl>, hypertension <dbl>, heart_disease <dbl>,
## # smoking_history <chr>, bmi <dbl>, hbA1c_level <dbl>,
## # blood_glucose_level <dbl>, diabetes <dbl>
dim(dataset)
## [1] 100000 16
names(dataset)
## [1] "year" "gender" "age"
## [4] "location" "race:AfricanAmerican" "race:Asian"
## [7] "race:Caucasian" "race:Hispanic" "race:Other"
## [10] "hypertension" "heart_disease" "smoking_history"
## [13] "bmi" "hbA1c_level" "blood_glucose_level"
## [16] "diabetes"
sum(duplicated(dataset))
## [1] 14
colSums(is.na(dataset))
## year gender age
## 0 0 0
## location race:AfricanAmerican race:Asian
## 0 0 0
## race:Caucasian race:Hispanic race:Other
## 0 0 0
## hypertension heart_disease smoking_history
## 0 0 0
## bmi hbA1c_level blood_glucose_level
## 0 0 0
## diabetes
## 0
variable_meaning <- data.frame(
Variable = c(
"gender",
"age",
"hypertension",
"heart_disease",
"smoking_history",
"bmi",
"HbA1c_level",
"blood_glucose_level",
"diabetes",
"location"),
Meaning = c(
"Giới tính của bệnh nhân (Male/Female)",
"Tuổi của bệnh nhân (tính theo năm)",
"Tình trạng tăng huyết áp (1 = Có, 0 = Không)",
"Tình trạng bệnh tim (1 = Có, 0 = Không)",
"Lịch sử hút thuốc (never, former, current, ...)",
"Chỉ số khối cơ thể (BMI - Body Mass Index)",
"Mức HbA1c (%) – chỉ số trung bình đường huyết trong 2–3 tháng gần nhất",
"Mức đường huyết đo tại thời điểm kiểm tra (mg/dL)",
"Tình trạng tiểu đường (1 = Có, 0 = Không)",
"Khu vực sinh sống hoặc nơi thu thập dữ liệu của bệnh nhân"
),
stringsAsFactors = FALSE
)
library(knitr)
kable(variable_meaning, booktabs = TRUE)
Variable | Meaning |
---|---|
gender | Giới tính của bệnh nhân (Male/Female) |
age | Tuổi của bệnh nhân (tính theo năm) |
hypertension | Tình trạng tăng huyết áp (1 = Có, 0 = Không) |
heart_disease | Tình trạng bệnh tim (1 = Có, 0 = Không) |
smoking_history | Lịch sử hút thuốc (never, former, current, …) |
bmi | Chỉ số khối cơ thể (BMI - Body Mass Index) |
HbA1c_level | Mức HbA1c (%) – chỉ số trung bình đường huyết trong 2–3 tháng gần nhất |
blood_glucose_level | Mức đường huyết đo tại thời điểm kiểm tra (mg/dL) |
diabetes | Tình trạng tiểu đường (1 = Có, 0 = Không) |
location | Khu vực sinh sống hoặc nơi thu thập dữ liệu của bệnh nhân |
sum(sapply(dataset, is.numeric))
## [1] 13
sum(sapply(dataset, function(x) is.factor(x) | is.character(x)))
## [1] 3
names(dataset)[sapply(dataset, is.numeric)]
## [1] "year" "age" "race:AfricanAmerican"
## [4] "race:Asian" "race:Caucasian" "race:Hispanic"
## [7] "race:Other" "hypertension" "heart_disease"
## [10] "bmi" "hbA1c_level" "blood_glucose_level"
## [13] "diabetes"
names(dataset)[sapply(dataset, function(x) is.factor(x) | is.character(x))]
## [1] "gender" "location" "smoking_history"
summary(dataset)
## year gender age location
## Min. :2015 Length:100000 Min. : 0.08 Length:100000
## 1st Qu.:2019 Class :character 1st Qu.:24.00 Class :character
## Median :2019 Mode :character Median :43.00 Mode :character
## Mean :2018 Mean :41.89
## 3rd Qu.:2019 3rd Qu.:60.00
## Max. :2022 Max. :80.00
## race:AfricanAmerican race:Asian race:Caucasian race:Hispanic
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.2022 Mean :0.2001 Mean :0.1988 Mean :0.1989
## 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## race:Other hypertension heart_disease smoking_history
## Min. :0.0 Min. :0.00000 Min. :0.00000 Length:100000
## 1st Qu.:0.0 1st Qu.:0.00000 1st Qu.:0.00000 Class :character
## Median :0.0 Median :0.00000 Median :0.00000 Mode :character
## Mean :0.2 Mean :0.07485 Mean :0.03942
## 3rd Qu.:0.0 3rd Qu.:0.00000 3rd Qu.:0.00000
## Max. :1.0 Max. :1.00000 Max. :1.00000
## bmi hbA1c_level blood_glucose_level diabetes
## Min. :10.01 Min. :3.500 Min. : 80.0 Min. :0.000
## 1st Qu.:23.63 1st Qu.:4.800 1st Qu.:100.0 1st Qu.:0.000
## Median :27.32 Median :5.800 Median :140.0 Median :0.000
## Mean :27.32 Mean :5.528 Mean :138.1 Mean :0.085
## 3rd Qu.:29.58 3rd Qu.:6.200 3rd Qu.:159.0 3rd Qu.:0.000
## Max. :95.69 Max. :9.000 Max. :300.0 Max. :1.000
female_data <- dataset %>%
filter(gender == "Female")
head(female_data)
## # A tibble: 6 × 16
## year gender age location `race:AfricanAmerican` `race:Asian`
## <dbl> <chr> <dbl> <chr> <dbl> <dbl>
## 1 2020 Female 32 Alabama 0 0
## 2 2015 Female 29 Alabama 0 1
## 3 2016 Female 52 Alabama 1 0
## 4 2015 Female 49 Alabama 0 0
## 5 2016 Female 15 Alabama 0 0
## 6 2016 Female 53 Alabama 0 0
## # ℹ 10 more variables: `race:Caucasian` <dbl>, `race:Hispanic` <dbl>,
## # `race:Other` <dbl>, hypertension <dbl>, heart_disease <dbl>,
## # smoking_history <chr>, bmi <dbl>, hbA1c_level <dbl>,
## # blood_glucose_level <dbl>, diabetes <dbl>
alabama_data <- dataset %>%
filter(location == "Alabama")
head(alabama_data)
## # A tibble: 6 × 16
## year gender age location `race:AfricanAmerican` `race:Asian`
## <dbl> <chr> <dbl> <chr> <dbl> <dbl>
## 1 2020 Female 32 Alabama 0 0
## 2 2015 Female 29 Alabama 0 1
## 3 2015 Male 18 Alabama 0 0
## 4 2015 Male 41 Alabama 0 0
## 5 2016 Female 52 Alabama 1 0
## 6 2016 Male 66 Alabama 0 0
## # ℹ 10 more variables: `race:Caucasian` <dbl>, `race:Hispanic` <dbl>,
## # `race:Other` <dbl>, hypertension <dbl>, heart_disease <dbl>,
## # smoking_history <chr>, bmi <dbl>, hbA1c_level <dbl>,
## # blood_glucose_level <dbl>, diabetes <dbl>
alabama_female <- dataset %>%
filter(location == "Alabama", gender == "Female")
head(alabama_female)
## # A tibble: 6 × 16
## year gender age location `race:AfricanAmerican` `race:Asian`
## <dbl> <chr> <dbl> <chr> <dbl> <dbl>
## 1 2020 Female 32 Alabama 0 0
## 2 2015 Female 29 Alabama 0 1
## 3 2016 Female 52 Alabama 1 0
## 4 2015 Female 49 Alabama 0 0
## 5 2016 Female 15 Alabama 0 0
## 6 2016 Female 53 Alabama 0 0
## # ℹ 10 more variables: `race:Caucasian` <dbl>, `race:Hispanic` <dbl>,
## # `race:Other` <dbl>, hypertension <dbl>, heart_disease <dbl>,
## # smoking_history <chr>, bmi <dbl>, hbA1c_level <dbl>,
## # blood_glucose_level <dbl>, diabetes <dbl>
dataset <- dataset %>%
mutate(age_group = cut(age,
breaks = c(0, 30, 50, 100),
labels = c("Dưới 30", "30-50", "Trên 50")))
dataset %>%
group_by(age_group) %>%
summarise(
Mean_BMI = mean(bmi, na.rm = TRUE),
Mean_Glucose = mean(blood_glucose_level, na.rm = TRUE)
)
## # A tibble: 3 × 3
## age_group Mean_BMI Mean_Glucose
## <fct> <dbl> <dbl>
## 1 Dưới 30 24.0 133.
## 2 30-50 29.1 136.
## 3 Trên 50 28.9 144.
ggplot(dataset, aes(x = age)) +
geom_histogram(bins = 30, fill = "skyblue", color = "black") +
labs(title = "Phân bố tuổi", x = "Tuổi", y = "Tần suất") +
theme_minimal()
c(
Min = min(dataset$bmi, na.rm = TRUE),
Max = max(dataset$bmi, na.rm = TRUE),
Mean = mean(dataset$bmi, na.rm = TRUE),
Median = median(dataset$bmi, na.rm = TRUE),
SD = sd(dataset$bmi, na.rm = TRUE),
Var = var(dataset$bmi, na.rm = TRUE)
)
## Min Max Mean Median SD Var
## 10.010000 95.690000 27.320767 27.320000 6.636783 44.046894
Giá trị nhỏ nhất (Min): 10.01 — Mức BMI thấp nhất trong mẫu quan sát.
Trung vị (Median): 27.32 — Một nửa mẫu có BMI dưới mức này.
Giá trị trung bình (Mean): 27.32 — Mức BMI trung bình của toàn bộ mẫu.
Giá trị lớn nhất (Max): 95.69 — Mức BMI cao nhất trong dữ liệu.
Độ lệch chuẩn (SD): 6.64 — Mức độ phân tán của BMI quanh giá trị trung bình.
Phương sai (Var): 44.05 — Độ biến thiên tổng thể của BMI trong mẫu.
c(
Min = min(dataset$blood_glucose_level, na.rm = TRUE),
Max = max(dataset$blood_glucose_level, na.rm = TRUE),
Mean = mean(dataset$blood_glucose_level, na.rm = TRUE),
Median = median(dataset$blood_glucose_level, na.rm = TRUE),
SD = sd(dataset$blood_glucose_level, na.rm = TRUE),
Var = var(dataset$blood_glucose_level, na.rm = TRUE)
)
## Min Max Mean Median SD Var
## 80.00000 300.00000 138.05806 140.00000 40.70814 1657.15234
Giá trị nhỏ nhất (Min): 80 — Là mức đường huyết thấp nhất được ghi nhận trong mẫu dữ liệu.
Giá trị lớn nhất (Max): 300 — Là mức đường huyết cao nhất, cho thấy có cá nhân trong mẫu có chỉ số rất cao.
Giá trị trung bình (Mean): 138.06 — Trung bình các cá nhân trong mẫu có mức đường huyết ở khoảng 138 mg/dL.
Trung vị (Median): 140 — Một nửa số người có đường huyết thấp hơn 140 và nửa còn lại cao hơn; đây là mức phổ biến đại diện cho nhóm trung bình.
Độ lệch chuẩn (SD): 40.71 — Chỉ ra mức độ phân tán lớn quanh giá trị trung bình; dữ liệu có sự chênh lệch đáng kể giữa các cá nhân.
Phương sai (Var): 1657.15 — Là bình phương của độ lệch chuẩn, phản ánh mức độ biến động của chỉ số đường huyết trong toàn bộ mẫu. ## 3.3 Phân tích theo giới tính
tong_hop_theo_gender <- dataset %>%
group_by(gender) %>%
summarise(
so_quan_sat = n(),
# Biến 1: blood_glucose_level
Glucose_min = min(blood_glucose_level, na.rm = TRUE),
Glucose_max = max(blood_glucose_level, na.rm = TRUE),
Glucose_mean = mean(blood_glucose_level, na.rm = TRUE),
Glucose_median = median(blood_glucose_level, na.rm = TRUE),
Glucose_var = var(blood_glucose_level, na.rm = TRUE),
Glucose_sd = sd(blood_glucose_level, na.rm = TRUE),
# Biến 2: bmi
BMI_min = min(bmi, na.rm = TRUE),
BMI_max = max(bmi, na.rm = TRUE),
BMI_mean = mean(bmi, na.rm = TRUE),
BMI_median = median(bmi, na.rm = TRUE),
BMI_var = var(bmi, na.rm = TRUE),
BMI_sd = sd(bmi, na.rm = TRUE),
# Biến 3: age
Age_min = min(age, na.rm = TRUE),
Age_max = max(age, na.rm = TRUE),
Age_mean = mean(age, na.rm = TRUE),
Age_median = median(age, na.rm = TRUE),
Age_var = var(age, na.rm = TRUE),
Age_sd = sd(age, na.rm = TRUE),
.groups = "drop"
)
print(tong_hop_theo_gender)
## # A tibble: 3 × 20
## gender so_quan_sat Glucose_min Glucose_max Glucose_mean Glucose_median
## <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Female 58552 80 300 137. 140
## 2 Male 41430 80 300 139. 140
## 3 Other 18 80 200 139. 158
## # ℹ 14 more variables: Glucose_var <dbl>, Glucose_sd <dbl>, BMI_min <dbl>,
## # BMI_max <dbl>, BMI_mean <dbl>, BMI_median <dbl>, BMI_var <dbl>,
## # BMI_sd <dbl>, Age_min <dbl>, Age_max <dbl>, Age_mean <dbl>,
## # Age_median <dbl>, Age_var <dbl>, Age_sd <dbl>
Phân tích mô tả biến Glucose theo giới tính
Nhóm nữ (Female) có 58.552 quan sát.
Min: 80 mg/dL — Mức đường huyết thấp nhất trong nhóm này.
Max: 300 mg/dL — Mức cao nhất ghi nhận được.
Mean: 137,47 mg/dL — Trung bình nồng độ glucose của nhóm nữ.
Median: 140 mg/dL — Một nửa số quan sát có giá trị glucose dưới 140, phản ánh phân bố khá cân đối.
Độ lệch chuẩn (SD): 40,10 — Cho thấy sự biến động mức glucose trong nhóm nữ ở mức vừa phải.
tong_hop_theo_location <- dataset %>%
group_by(location) %>%
summarise(
so_quan_sat = n(),
# 1️⃣ Biến BMI
BMI_min = min(bmi, na.rm = TRUE),
BMI_max = max(bmi, na.rm = TRUE),
BMI_mean = mean(bmi, na.rm = TRUE),
BMI_median = median(bmi, na.rm = TRUE),
BMI_var = var(bmi, na.rm = TRUE),
BMI_sd = sd(bmi, na.rm = TRUE),
# 2️⃣ Biến HbA1c_level
HbA1c_min = min(hbA1c_level, na.rm = TRUE),
HbA1c_max = max(hbA1c_level, na.rm = TRUE),
HbA1c_mean = mean(hbA1c_level, na.rm = TRUE),
HbA1c_median = median(hbA1c_level, na.rm = TRUE),
HbA1c_var = var(hbA1c_level, na.rm = TRUE),
HbA1c_sd = sd(hbA1c_level, na.rm = TRUE),
# 3️⃣ Biến blood_glucose_level
Glucose_min = min(blood_glucose_level, na.rm = TRUE),
Glucose_max = max(blood_glucose_level, na.rm = TRUE),
Glucose_mean = mean(blood_glucose_level, na.rm = TRUE),
Glucose_median = median(blood_glucose_level, na.rm = TRUE),
Glucose_var = var(blood_glucose_level, na.rm = TRUE),
Glucose_sd = sd(blood_glucose_level, na.rm = TRUE),
.groups = "drop"
)
print(tong_hop_theo_location)
## # A tibble: 55 × 20
## location so_quan_sat BMI_min BMI_max BMI_mean BMI_median BMI_var BMI_sd
## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Alabama 2036 10.5 67.5 27.2 27.3 45.5 6.74
## 2 Alaska 2035 12.0 64.6 27.4 27.3 41.6 6.45
## 3 Arizona 1986 12.2 83.7 27.3 27.3 46.0 6.79
## 4 Arkansas 2037 12.2 66.5 27.3 27.3 41.3 6.43
## 5 California 1986 11.2 68.5 27.2 27.3 45.0 6.71
## 6 Colorado 2035 12.0 65.4 27.4 27.3 42.7 6.54
## 7 Connecticut 2035 12.2 62.2 27.2 27.3 44.4 6.66
## 8 Delaware 2036 11.3 79.5 27.6 27.3 45.6 6.75
## 9 District of C… 2036 12.1 88.7 27.3 27.3 47.4 6.89
## 10 Florida 2037 11.8 63.2 27.4 27.3 45.3 6.73
## # ℹ 45 more rows
## # ℹ 12 more variables: HbA1c_min <dbl>, HbA1c_max <dbl>, HbA1c_mean <dbl>,
## # HbA1c_median <dbl>, HbA1c_var <dbl>, HbA1c_sd <dbl>, Glucose_min <dbl>,
## # Glucose_max <dbl>, Glucose_mean <dbl>, Glucose_median <dbl>,
## # Glucose_var <dbl>, Glucose_sd <dbl>
tong_hop_smoking <- dataset %>%
group_by(smoking_history) %>%
summarise(
so_quan_sat = n(),HbA1c_median = median(hbA1c_level, na.rm = TRUE),
HbA1c_var = var(hbA1c_level, na.rm = TRUE),
HbA1c_sd = sd(hbA1c_level, na.rm = TRUE),
# 3️⃣ Biến blood_glucose_level
Glucose_min = min(blood_glucose_level, na.rm = TRUE),
Glucose_max = max(blood_glucose_level, na.rm = TRUE),
Glucose_mean = mean(blood_glucose_level, na.rm = TRUE),
Glucose_median = median(blood_glucose_level, na.rm = TRUE),
Glucose_var = var(blood_glucose_level, na.rm = TRUE),
Glucose_sd = sd(blood_glucose_level, na.rm = TRUE),
.groups = "drop"
)
print(tong_hop_smoking)
## # A tibble: 6 × 11
## smoking_history so_quan_sat HbA1c_median HbA1c_var HbA1c_sd Glucose_min
## <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 No Info 35816 5.8 1.04 1.02 80
## 2 current 9286 5.8 1.20 1.09 80
## 3 ever 4004 5.8 1.21 1.10 80
## 4 former 9352 5.8 1.31 1.15 80
## 5 never 35095 5.8 1.17 1.08 80
## 6 not current 6447 5.8 1.21 1.10 80
## # ℹ 5 more variables: Glucose_max <dbl>, Glucose_mean <dbl>,
## # Glucose_median <dbl>, Glucose_var <dbl>, Glucose_sd <dbl>