pdf_document: pdf_document: latex_engine: xelatex date: “2025-10-12” —

Đọc dữ liệu và xem dữ liệu**

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>

1. Thông tin cơ bản dữ liệu

1.1 Kích thước dữ liệu

dim(dataset)
## [1] 100000     16

1.2 Tên các biến

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"

1.3 Kiểm tra số dòng trùng lặp

sum(duplicated(dataset))
## [1] 14

1.4 Số lượng giá trị bị thiếu trong từng cột

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

1.5 Giải thích ý nghĩa các biến trong bộ dữ liệu diabetes

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

1.6 Phân loại biến định lượng và định tính

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"

1.7 Thống kê mô tả cơ bản

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

2. Phân tổ dữ liệu theo điều kiện

2.1 Phân tổ theo female

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>

2.2 Phân tổ theo Alabama

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>

2.3 Phân tổ theo Alabama-Female

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>

2.4 Phân tổ theo nhóm tuổi và biểu đồ phân bố tuổi

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()

3. Phân tích tổng hợp theo các nhóm biến

3.1 Phân tích biến BMI

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.

3.2 Phân tích biến Blood Glucose Level

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.

3.4 Phân tích theo vị trí địa lý

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>

3.5 Phân tích theo smoking_history

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>