27-07-2025# 1. Load các thư viện cần thiết
library(tidyverse)
library(ggplot2)
library(epitools)
library(DescTools)
library(DT)
library(energy)
library(readr)
library(skimr)
library(scales)
library(reshape2)
library(magick)
img <- image_read("C:/Users/Hoang Quyen/Downloads/biatl.png")
print(img)
Em xin chân thành bày tỏ lòng biết ơn sâu sắc đến Thầy Trần Mạnh Tường đã dành thời gian, công sức để truyền đạt kiến thức và kinh nghiệm quý báu trong môn học “Phân tích dữ liệu định tính”. Nhờ sự hướng dẫn tận tình, phương pháp giảng dạy khoa học cùng những ví dụ minh họa sinh động của Thầy, em đã có thể hiểu rõ bản chất của nghiên cứu định tính, nắm vững các kỹ thuật phân tích và ứng dụng chúng vào thực tế một cách hiệu quả. Em mong rằng những kiến thức thu nhận được sẽ là hành trang vững chắc cho hành trình học thuật và nghề nghiệp sau này. Một lần nữa, em xin gửi lời tri ân chân thành nhất đến Thầy. Kính chúc Thầy luôn dồi dào sức khỏe, hạnh phúc và tiếp tục lan tỏa tri thức đến nhiều thế hệ sinh viên.
Tôi xin cam đoan rằng những kiến thức và kỹ năng thu nhận được từ môn học “Phân tích dữ liệu định tính” dưới sự hướng dẫn của Thầy sẽ được tôi vận dụng một cách nghiêm túc, có hệ thống và hiệu quả trong các hoạt động học thuật cũng như công việc chuyên môn sau này. Tôi cam kết sử dụng các phương pháp phân tích định tính đã được học một cách chính xác, tuân thủ các nguyên tắc nghiên cứu khoa học và đạo đức học thuật. Đồng thời, tôi luôn ghi nhớ và trân trọng những chỉ dẫn quý báu của giảng viên, coi đây là nền tảng quan trọng để phát triển năng lực nghiên cứu và tư duy phân tích của bản thân, hoàn toàn chịu trách nhiệm về việc áp dụng những kiến thức này vào thực tiễn và cam kết phát huy giá trị môn học một cách tốt nhất.
Mục tiêu của nghiên cứu này là phân tích các yếu tố liên quan đến tình trạng béo phì của cá nhân dựa trên dữ liệu y tế thu thập được. Trọng tâm là tìm hiểu mối quan hệ giữa các hành vi sinh hoạt (đặc biệt là thói quen ăn fast food, hành vi kiểm soát calo, mức độ hoạt động thể chất và tiêu thụ nước) với xác suất mắc béo phì. Từ đó, xác định các yếu tố nguy cơ quan trọng nhằm phục vụ công tác dự phòng và kiểm soát béo phì trong cộng đồng.
Nghiên cứu tập trung vào các bước: mô tả đặc điểm phân phối của biến
béo phì (obesity_group) và các biến giải thích thông qua
bảng tần số và biểu đồ; kiểm định giả thuyết thống kê để phân tích mối
liên hệ giữa các biến định tính với béo phì bằng kiểm định Chi-squared,
tính toán Relative risk (RR) và Odds Ratio
(OR); và cuối cùng, xây dựng các mô hình hồi quy nhị phân
(logit, probit, cloglog) để lượng hóa ảnh hưởng của từng biến đến xác
suất béo phì. Ngoài ra, mô hình được đánh giá thông qua các chỉ số độ
phù hợp như AIC, Brier Score và hiệu suất phân loại (Confusion
Matrix).
Nghiên cứu áp dụng quy trình phân tích định lượng theo ba giai đoạn chính:
(1) Thống kê mô tả: Các đặc điểm phân phối của
biến phụ thuộc obesity_group (hoặc dạng nhị phân
obese_binary) và các biến độc lập như
fast_food, calorie_check, age
được khảo sát bằng bảng tần số, biểu đồ cột và biểu đồ phân bố. Điều này
giúp nhận diện xu hướng và cấu trúc cơ bản trong dữ liệu.
(2) Phân tích suy diễn: Sử dụng bảng chéo và kiểm định χ² để kiểm tra giả thuyết về tính độc lập giữa tình trạng béo phì và các yếu tố hành vi. Ngoài ra, các chỉ số đo lường nguy cơ như Tỷ số rủi ro (RR) và Tỷ số odds (OR) được tính toán nhằm định lượng mức độ ảnh hưởng tương đối. Các phép kiểm định tỷ lệ (prop.test) được sử dụng để so sánh xác suất béo phì giữa các nhóm.
(3) Xây dựng mô hình hồi quy: Để dự báo xác suất mắc béo phì, ba mô hình hồi quy nhị phân được xây dựng ứng với ba hàm liên kết: logit, probit, và complementary log-log (cloglog). Các mô hình được ước lượng bằng phương pháp tối đa hóa hàm hợp lý (MLE). Hiệu quả của từng mô hình được đánh giá và so sánh thông qua AIC (Akaike Information Criterion), Brier Score, và ma trận nhầm lẫn (confusion matrix). Các hệ số hồi quy được giải thích về mặt xác suất và odds để cung cấp cái nhìn định lượng về ảnh hưởng của từng biến.
Toàn bộ quy trình phân tích được thực hiện bằng phần mềm
RStudio, với sự hỗ trợ của các gói thư viện như
dplyr, ggplot2, epiR,
pROC, và caret, đảm bảo độ chính xác, khả tái
lập và tuân thủ các nguyên tắc phân tích dữ liệu y tế - thống kê hiện
đại.
Thống kê mô tả là bước đầu tiên trong phân tích dữ liệu, nhằm tóm tắt đặc điểm cơ bản của tập dữ liệu. Đối với dữ liệu định tính, các công cụ như bảng tần số, biểu đồ cột, biểu đồ tròn được sử dụng để mô tả sự phân bố của từng biến. Đối với dữ liệu định lượng, các chỉ số như trung bình, trung vị, độ lệch chuẩn, phương sai giúp hiểu rõ xu hướng trung tâm và độ biến thiên của dữ liệu.
Tần số (frequency) và tỷ lệ phần trăm (proportion) cho biến định tính. Biểu đồ cột (bar plot) hoặc biểu đồ tròn (pie chart) để minh họa trực quan. Tỷ số chênh lệch (odds ratio, OR) và tỷ số nguy cơ (Relative Risk, RR) được sử dụng để mô tả mối liên hệ giữa hai biến nhị phân.
Để kiểm định giả thuyết về mối quan hệ giữa các biến, các phương pháp suy diễn được áp dụng bao gồm:
Mục đích: kiểm tra sự độc lập giữa hai biến định tính.
Giả thuyết:
\(H_0\): Hai biến độc lập. \(H_1\): Hai biến có mối liên hệ.
Công thức thống kê:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó:
\(O_{ij}\): tần số quan sát. \(E_{ij}\): tần số kỳ vọng.
Dùng để so sánh tỷ lệ giữa hai nhóm (như nhóm có bệnh và không có bệnh).
Công thức tỷ số nguy cơ:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Công thức odds ratio:
\[ OR = \frac{a / b}{c / d} = \frac{ad}{bc} \] ### 4.2.3. Tỷ số nguy cơ (RR) và Tỷ số odds (OR)
Khi phân tích mối liên hệ giữa một yếu tố phơi nhiễm (exposure) và một biến kết cục nhị phân (binary outcome), đặc biệt là trong các nghiên cứu quan sát (hồi cứu, cắt ngang hoặc tiến cứu), tỷ số nguy cơ (RR) và tỷ số odds (OR) là hai thước đo phổ biến được sử dụng để định lượng mức độ liên quan giữa phơi nhiễm và kết cục.
Giả sử có một biến độc lập định tính nhị phân (phơi nhiễm: có/không) và biến phụ thuộc nhị phân (kết cục: mắc/không mắc). Dữ liệu thường được trình bày dưới dạng bảng chéo 2x2:
| Kết cục = 1 (Có) | Kết cục = 0 (Không) | Tổng | |
|---|---|---|---|
| Phơi nhiễm = 1 (Có) | a | b | a + b |
| Phơi nhiễm = 0 (Không) | c | d | c + d |
| Tổng | a + c | b + d | n |
Khái niệm
Tỷ số nguy cơ (RR – Relative Risk) là một chỉ số định lượng so sánh xác suất xảy ra một biến cố (kết cục) giữa hai nhóm đối tượng: nhóm có yếu tố nguy cơ (phơi nhiễm) và nhóm không có yếu tố nguy cơ.
Cụ thể:
RR đo lường mức độ mà yếu tố phơi nhiễm ảnh hưởng đến khả năng xảy ra kết cục, dựa trên xác suất tương đối.
Công thức toán học
Giả sử có bảng 2x2 thể hiện phân bố giữa phơi nhiễm và kết cục:
| Kết cục = 1 (Yes) | Kết cục = 0 (No) | Tổng | |
|---|---|---|---|
| Phơi nhiễm = 1 | a | b | a + b |
| Phơi nhiễm = 0 | c | d | c + d |
Khi đó:
\[ RR = \frac{P(\text{Kết cục} = 1 \mid \text{Phơi nhiễm} = 1)}{P(\text{Kết cục} = 1 \mid \text{Phơi nhiễm} = 0)} = \frac{a / (a + b)}{c / (c + d)} \]
Diễn giải kết quả
Bối cảnh áp dụng
Khái niệm
Tỷ số odds (OR – Odds Ratio) đo tỷ lệ giữa odds (tỷ số giữa khả năng xảy ra và không xảy ra) của kết cục giữa hai nhóm (phơi nhiễm và không phơi nhiễm).
Công thức toán học
Từ bảng 2x2 đã trình bày:
\[ \text{Odds}_1 = \frac{a}{b} \]
\[ \text{Odds}_0 = \frac{c}{d} \]
\[ OR = \frac{a/b}{c/d} = \frac{a \cdot d}{b \cdot c} \]
Diễn giải kết quả
Bối cảnh áp dụng
\[ \log(\text{OR}) = \beta_1 \Rightarrow \text{OR} = e^{\beta_1} \]
So sánh RR và OR
| Tiêu chí | Relative Risk (RR) | Odds Ratio (OR) |
|---|---|---|
| Bản chất | Tỷ số giữa hai xác suất | Tỷ số giữa hai odds |
| Công thức | \(\frac{a/(a+b)}{c/(c+d)}\) | \(\frac{a \cdot d}{b \cdot c}\) |
| Giá trị | Luôn nhỏ hơn OR nếu kết cục phổ biến | Lớn hơn RR nếu kết cục phổ biến |
| Ý nghĩa thực tế | Trực quan hơn với người không chuyên | Khó hiểu hơn, mang tính kỹ thuật hơn |
| Phù hợp với nghiên cứu | Cohort study, RCT | Case-control, mô hình hồi quy logistic |
| Kết nối với mô hình | Không xuất hiện trực tiếp trong mô hình hồi quy | Là hệ số biến đổi trong hồi quy logistic: \(e^{\beta}\) |
Khi biến phản hồi \(Y\) là biến nhị phân (chỉ nhận giá trị 0 hoặc 1), ta không thể sử dụng mô hình hồi quy tuyến tính thông thường vì:
Để giải quyết vấn đề này, mô hình hồi quy tổng quát hóa (GLM) được áp dụng với ba thành phần chính:
Random component (thành phần ngẫu nhiên): \(Y \sim \text{Bernoulli}(\pi)\), với \(\pi = P(Y = 1 \mid \mathbf{x})\) là xác suất xảy ra sự kiện.
Systematic component (thành phần hệ thống): \(\eta = \beta_0 + \beta_1 x_1 + \ldots + \beta_p x_p\), là tổ hợp tuyến tính của các biến độc lập.
Link function (hàm liên kết): Biến đổi xác suất \(\pi\) thành một giá trị trên toàn trục thực: \(g(\pi) = \eta\).
Ba hàm liên kết phổ biến trong mô hình hồi quy nhị phân là:
| Hàm liên kết | Công thức liên kết \(g(\pi)\) | Biến ngược liên kết \(\pi = g^{-1}(\eta)\) | Ý nghĩa thực tiễn |
|---|---|---|---|
| Logit | \(\log \left( \frac{\pi}{1 - \pi} \right)\) | \(\pi = \frac{1}{1 + e^{-\eta}}\) | Thường dùng nhất, cho phép diễn giải hệ số hồi quy dưới dạng odds ratio |
| Probit | \(\Phi^{-1}(\pi)\), với \(\Phi\) là CDF của chuẩn chuẩn hóa | \(\pi = \Phi(\eta)\) | Phù hợp khi lỗi giả định là phân phối chuẩn |
| Cloglog | \(\log(-\log(1 - \pi))\) | \(\pi = 1 - \exp(-\exp(\eta))\) | Phù hợp với các quá trình xảy ra sự kiện hiếm hoặc có thời gian chờ (extreme value) |
✅ Logit link là hàm phổ biến nhất trong thực hành thống kê và học máy vì tính dễ diễn giải và kết nối trực tiếp với odds.
Trong mô hình hồi quy logistic, ta sử dụng hàm liên kết logit:
\[ \log\left(\frac{\pi(\mathbf{x})}{1 - \pi(\mathbf{x})}\right) = \eta = \beta_0 + \beta_1 x_1 + \ldots + \beta_p x_p \]
Tương đương:
\[ \pi(\mathbf{x}) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + \ldots + \beta_p x_p)}} \]
trong đó:
\[ \text{odds ratio} = e^{\beta_j} \]
=> Mỗi đơn vị tăng trong \(x_j\) làm odds của sự kiện xảy ra tăng \(e^{\beta_j}\) lần (nếu \(\beta_j > 0\)), hoặc giảm nếu \(\beta_j < 0\).
\[ \pi = P(Y = 1 | \mathbf{x}) \]
\[ \text{odds} = \frac{\pi}{1 - \pi} \]
\[ \log(\text{odds}) = \eta = \beta_0 + \sum \beta_j x_j \]
| Thành phần | Logit | Probit | Cloglog |
|---|---|---|---|
| Link function \(g(\pi)\) | \(\log\left(\frac{\pi}{1 - \pi}\right)\) | \(\Phi^{-1}(\pi)\) | \(\log(-\log(1 - \pi))\) |
| Inverse link \(\pi\) | \(\frac{1}{1 + e^{-\eta}}\) | \(\Phi(\eta)\) | \(1 - \exp(-\exp(\eta))\) |
| Diễn giải hệ số | Rõ ràng (OR) | Khó hơn | Thường dùng cho dữ liệu có đuôi nặng |
| Đặc điểm | Phổ biến nhất | Đường cong S đối xứng | Đối xứng lệch phải |
| Sử dụng khi | Phân tích hồi quy nhị phân tiêu chuẩn | Dữ liệu có giả định phân phối chuẩn | Biến cố hiếm, thời gian đến sự kiện |
Ước lượng: Các hệ số \(\beta_j\) được ước lượng bằng phương pháp tối đa hóa hàm hợp lý (Maximum Likelihood Estimation - MLE).
Kiểm định:
Khoảng tin cậy 95% cho OR: Với hệ số \(\hat{\beta}_j\), khoảng tin cậy cho OR là:
\[ \left[ e^{\hat{\beta}_j - 1.96 \cdot SE(\hat{\beta}_j)}, \; e^{\hat{\beta}_j + 1.96 \cdot SE(\hat{\beta}_j)} \right] \]
AIC đo độ phù hợp và mức độ đơn giản của mô hình. Công thức:
\[ \text{AIC} = -2 \log(\text{Likelihood}) + 2k \]
Mô hình có AIC nhỏ hơn được xem là tốt hơn (nếu so sánh cùng một tập dữ liệu). Trong báo cáo, AIC cho thấy logit và probit là hai mô hình tốt nhất (AIC = 938410.2).
Brier Score đo độ chính xác của dự đoán xác suất. Công thức:
\[ \text{Brier Score} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{p}_i)^2 \]
Giá trị càng thấp càng tốt. Kết quả: Logit và Probit có Brier Score = 0.1717 → phù hợp tương đương.
Ma trận nhầm lẫn (Confusion Matrix) là công cụ cơ bản và quan trọng trong đánh giá hiệu năng của các mô hình phân loại nhị phân (ví dụ: phân loại có hay không bị trầm cảm). Ma trận thể hiện sự so sánh giữa giá trị thực tế (ground truth) và giá trị dự đoán từ mô hình học máy.
| Thực tế = 1 (Positive) | Thực tế = 0 (Negative) | |
|---|---|---|
| Dự đoán = 1 (Positive) | TP (True Positive) | FP (False Positive) |
| Dự đoán = 0 (Negative) | FN (False Negative) | TN (True Negative) |
Các chỉ số sau được tính từ ma trận nhầm lẫn, giúp đánh giá khả năng phân loại chính xác của mô hình:
Đo lường tỷ lệ tổng thể các dự đoán đúng trên toàn bộ mẫu quan sát.
\[ \text{Accuracy} = \frac{TP + TN}{TP + FP + FN + TN} \]
Đo lường khả năng mô hình phát hiện đúng các trường hợp dương tính (Positive) – ví dụ: phát hiện đúng người bị trầm cảm.
\[ \text{Sensitivity} = \frac{TP}{TP + FN} \]
Đo lường khả năng mô hình phát hiện đúng các trường hợp âm tính (Negative) – ví dụ: xác định đúng người không bị trầm cảm.
\[ \text{Specificity} = \frac{TN}{TN + FP} \]
\[ \text{FPR} = \frac{FP}{FP + TN} = 1 - \text{Specificity} \]
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Là trung bình điều hòa giữa độ nhạy và độ chính xác (precision), dùng trong trường hợp cần cân bằng giữa việc phát hiện đúng và hạn chế sai sót.
\[ \text{F1-score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]
# 1. Load các thư viện cần thiết
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(epitools)
library(DescTools)
library(DT)
library(energy)
library(readr)
library(skimr)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(reshape2)
##
## Attaching package: 'reshape2'
##
## The following object is masked from 'package:tidyr':
##
## smiths
library(gmodels)
## Registered S3 method overwritten by 'gdata':
## method from
## reorder.factor DescTools
library(epitools)
library(scales)
library(broom)
library(readxl)
obesity<-read_csv("C:/Users/Hoang Quyen/Downloads/obesity.csv")
## Rows: 2111 Columns: 17
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (9): Gender, family_history_with_overweight, FAVC, CAEC, SMOKE, SCC, CAL...
## dbl (8): Age, Height, Weight, FCVC, NCP, CH2O, FAF, TUE
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
obesity <- obesity %>%
rename(
gender = Gender,
age = Age,
height = Height,
weight = Weight,
family_history = family_history_with_overweight,
fast_food = FAVC,
veg_intake = FCVC,
meal_count = NCP,
snack_habit = CAEC,
smoke = SMOKE,
water_intake = CH2O,
calorie_check = SCC,
physical_activity = FAF,
screen_time = TUE,
alcohol = CALC,
transport = MTRANS,
obesity_level = NObeyesdad
)
# Gộp nhóm biến mục tiêu obesity_level thành obesity_group
obesity$obesity_group <- ifelse(obesity$obesity_level %in% c("Obesity_Type_I", "Obesity_Type_II", "Obesity_Type_III"),
"Obese", "Non_Obese")
obesity$obesity_group <- as.factor(obesity$obesity_group)
obesity$gender <- as.factor(obesity$gender)
obesity$family_history <- as.factor(obesity$family_history)
obesity$fast_food <- as.factor(obesity$fast_food)
obesity$snack_habit <- as.factor(obesity$snack_habit)
obesity$smoke <- as.factor(obesity$smoke)
obesity$calorie_check <- as.factor(obesity$calorie_check)
obesity$alcohol <- as.factor(obesity$alcohol)
obesity$transport <- as.factor(obesity$transport)
names(obesity)
## [1] "gender" "age" "height"
## [4] "weight" "family_history" "fast_food"
## [7] "veg_intake" "meal_count" "snack_habit"
## [10] "smoke" "water_intake" "calorie_check"
## [13] "physical_activity" "screen_time" "alcohol"
## [16] "transport" "obesity_level" "obesity_group"
Dữ liệu được sử dụng trong nghiên cứu bao gồm 2.111 cá thể (quan sát), đại diện cho các đối tượng có đặc điểm nhân khẩu học và hành vi lối sống khác nhau, liên quan đến tình trạng béo phì. Mỗi cá thể được mô tả bởi 18 biến độc lập, trong đó phản ánh nhiều khía cạnh như nhân khẩu học (giới tính, tuổi, chiều cao, cân nặng), thói quen sinh hoạt (ăn fast food, kiểm tra lượng calo, hút thuốc, uống rượu, hoạt động thể chất, thời gian trước màn hình, v.v.), cũng như tiền sử gia đình và phương tiện đi lại.
Trong tổng số 18 biến, có:
4 biến định lượng::
age: Tuổi của cá nhân (kiểu số thực, đơn vị:
năm)height: Chiều cao (mét)weight: Cân nặng (kg)physical_activity: Mức độ hoạt động thể chất trung bình
mỗi tuần (thường được định lượng theo thời gian)Các biến định lượng này có thể tham gia vào các mô hình hồi quy như biến dự đoán tuyến tính, và có thể kiểm tra phân phối chuẩn hoặc xác định khoảng giá trị, độ lệch chuẩn,…
14 biến định tính, bao gồm:
gender: Giới tính (male,
female)family_history: Tiền sử gia đình bị béo phì
(yes, no)fast_food: Thói quen ăn fast food (yes,
no)calorie_check: Có kiểm soát lượng calo nạp vào
(yes, no)veg_intake: Mức độ ăn rau (low,
moderate, high)meal_count: Số bữa ăn chính mỗi ngày (1,
2, 3+)snack_habit: Thói quen ăn vặt (no,
sometimes, frequently)smoke: Hút thuốc lá (yes,
no)water_intake: Lượng nước uống hàng ngày
(low, moderate, high)screen_time: Thời gian trước màn hình mỗi ngày
(short, moderate, long)alcohol: Uống rượu/bia (no,
sometimes, frequently)transport: Phương tiện di chuyển chủ yếu
(walking, bike, motorbike,
car, public)obesity_level: Mức độ béo phì gốc (gồm 7 cấp độ từ
Insufficient Weight đến Obesity Type III)obesity_group: Phiên bản nhị phân của mức độ béo phì:
Obese vs. Non_ObeseCác biến định tính là nền tảng cho việc xây dựng bảng tần số, bảng chéo và kiểm định thống kê như χ², tính RR, OR và được mã hóa thành biến nhị phân trong mô hình hồi quy.
Đặc biệt, biến mục tiêu trong nghiên cứu là
obese_binary, một biến nhị phân được tạo
ra từ obesity_level để phân loại cá nhân vào hai nhóm
chính: Obese (1) và
Non_Obese (0), nhằm mục tiêu dự đoán xác
suất bị béo phì thông qua mô hình thống kê nhị phân.
library(dplyr)
obesity_group_tab <- obesity %>%
count(obesity_group) %>%
mutate(perc = round(n / sum(n) * 100, 1))
knitr::kable(obesity_group_tab, caption = "Tần số và tần suất của biến obesity_group")
| obesity_group | n | perc |
|---|---|---|
| Non_Obese | 1139 | 54 |
| Obese | 972 | 46 |
Kết quả nghiên cứu
Phân tích tần số và tần suất của biến obesity_group cho thấy sự phân bố khá cân đối giữa hai nhóm “Non_Obese” (không béo phì) và “Obese” (béo phì). Cụ thể, trong tổng số 2.111 quan sát, nhóm “Non_Obese” chiếm 1.139 trường hợp, tương ứng với tỷ lệ 54%, trong khi nhóm “Obese” có 972 trường hợp, chiếm 46%.
Kết quả này phản ánh một sự chênh lệch không quá lớn giữa hai nhóm, với tỷ lệ người không béo phì cao hơn nhóm béo phì khoảng 8%. Sự phân bố này có thể được kiểm định sâu hơn bằng các phương pháp thống kê như kiểm định chi-square để đánh giá tính độc lập hoặc phụ thuộc của biến obesity_group với các biến khác trong nghiên cứu. Ngoài ra, việc tính toán khoảng tin cậy (confidence interval) cho các tỷ lệ này cũng sẽ cung cấp thêm thông tin về độ chính xác của ước lượng.
Nhìn chung, kết quả trên cho thấy tỷ lệ béo phì trong mẫu nghiên cứu là đáng kể (46%), điều này có thể gợi ý nhu cầu phân tích sâu hơn về các yếu tố liên quan như chế độ ăn uống, lối sống, hoặc yếu tố di truyền để hiểu rõ hơn nguyên nhân và đề xuất các giải pháp can thiệp phù hợp.
obesity_group_tab %>%
ggplot(aes(x = "", y = perc, fill = obesity_group)) +
geom_col(width = 1) +
coord_polar("y") +
geom_text(aes(label = paste0(perc, "%")), position = position_stack(vjust = 0.5)) +
labs(title = "Tỷ lệ phần trăm của các nhóm obesity_group") +
theme_void()
Biểu đồ tròn (pie chart) thể hiện tỷ lệ phần trăm của hai nhóm Non_Obese (54%) và Obese (46%) trong nghiên cứu.
obesity_group) và thói quen tiêu thụ thức ăn nhanh
(fast_food)Mục tiêu của phần này là kiểm định xem liệu có tồn tại mối liên hệ thống kê có ý nghĩa giữa thói quen ăn thức ăn nhanh và tình trạng béo phì hay không. Việc xác định mối quan hệ này giúp làm rõ vai trò của hành vi ăn uống trong nguy cơ phát triển béo ph
fast_food_tab <- table(obesity$fast_food, obesity$obesity_group)
fast_food_tab
##
## Non_Obese Obese
## no 226 19
## yes 913 953
Trong tổng số 2111 cá nhân:
→ Dữ liệu ban đầu gợi ý rằng nhóm có thói quen ăn fast food có xu hướng bị béo phì cao hơn nhiều.
chisq.test(fast_food_tab)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: fast_food_tab
## X-squared = 161.82, df = 1, p-value < 2.2e-16
Để kiểm định xem hai biến định tính này có mối liên hệ thống kê hay không, ta sử dụng kiểm định Chi-square Pearson với hiệu chỉnh Yates.
Giả thuyết kiểm định:
fast_food và
obesity_group độc lập nhau (không có mối liên hệ).fast_food và
obesity_group.Kết quả kiểm định:
Kết luận:
Do p-value < 0.05, chúng ta bác bỏ giả thuyết H₀. Như vậy, có mối liên hệ có ý nghĩa thống kê giữa thói quen ăn fast food và tình trạng béo phì.
obesity %>%
group_by(fast_food, obesity_group) %>%
summarise(n = n(), .groups = "drop") %>%
mutate(perc = round(n / sum(n) * 100, 1)) %>%
ggplot(aes(x = fast_food, y = perc, fill = obesity_group)) +
geom_col(position = "dodge") +
geom_text(aes(label = paste0(perc, "%")), position = position_dodge(width = 0.9), vjust = -0.2) +
labs(title = "Tỷ lệ béo phì theo thói quen ăn fast food") +
theme_minimal()
Biểu đồ cột theo phần trăm cho thấy:
=> Sự khác biệt này là rõ ràng, củng cố kết quả từ kiểm định thống kê.
Để lượng hóa mức độ ảnh hưởng của thói quen ăn fast food đến tình trạng béo phì, chúng tôi ước lượng Relative risk (RR) và Odds Ratio (OR).
riskratio(fast_food_tab)
## $data
##
## Non_Obese Obese Total
## no 226 19 245
## yes 913 953 1866
## Total 1139 972 2111
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## no 1.000000 NA NA
## yes 6.585576 4.266291 10.16569
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0 1.113112e-43 1.883989e-37
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Relative risk (RR) – Tỷ lệ rủi ro:
\[ RR = \frac{P(Y=1 \mid \text{Fast food = yes})}{P(Y=1 \mid \text{Fast food = no})} \]
\[ RR = \frac{0.5107}{0.0776} \approx 6.5856 \]
Người có ăn fast food có nguy cơ mắc béo phì cao gấp khoảng 6.59 lần so với nhóm không ăn fast food. Khoảng tin cậy 95% không bao gồm 1 cho thấy kết quả này có ý nghĩa thống kê.
oddsratio(fast_food_tab)
## $data
##
## Non_Obese Obese Total
## no 226 19 245
## yes 913 953 1866
## Total 1139 972 2111
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## no 1.00000 NA NA
## yes 12.31025 7.847881 20.52677
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0 1.113112e-43 1.883989e-37
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Odds Ratio (OR) – Tỷ lệ cược:
\[ OR = \frac{\dfrac{953}{913}}{\dfrac{19}{226}} = \frac{\text{odds}_{\text{yes}}}{\text{odds}_{\text{no}}} \]
\[ OR = \frac{1.0438}{0.0841} \approx 12.31 \]
Tỷ số odds mắc béo phì ở nhóm ăn fast food cao hơn nhóm không ăn khoảng 12.31 lần. Đây là một mức tăng rất lớn về mặt xác suất tương đối, củng cố nhận định rằng fast food là yếu tố nguy cơ nghiêm trọng.
x_ff <- c(fast_food_tab["yes", "Obese"], fast_food_tab["no", "Non_Obese"])
n_ff <- c(sum(fast_food_tab["yes", ]), sum(fast_food_tab["no", ]))
prop.test(x = x_ff, n = n_ff, correct = FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: x_ff out of n_ff
## X-squared = 148.89, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.4521794 -0.3712823
## sample estimates:
## prop 1 prop 2
## 0.5107181 0.9224490
Phân tích nhằm kiểm tra xem tỷ lệ béo phì ở nhóm có thói quen ăn fast food và nhóm không ăn fast food có sự khác biệt có ý nghĩa thống kê hay không.
Gọi:
Giả thuyết thống kê:
\[ \begin{aligned} H_0 &: p_1 = p_2 \quad \text{(không có sự khác biệt)} \\ H_1 &: p_1 \ne p_2 \quad \text{(có sự khác biệt)} \end{aligned} \]
Kết quả kiểm định
\(\chi^2 = 148.89\), df = 1
p-value < 2.2 ^{-16}
Khoảng tin cậy 95% cho hiệu tỷ lệ:
\[ (\hat{p}_1 - \hat{p}_2) \in [-0.4522,\ -0.3713] \]
Với p-value gần bằng 0, ta bác bỏ giả thuyết \(H_0\), khẳng định rằng có sự khác biệt có ý nghĩa thống kê giữa hai tỷ lệ.
Sự khác biệt thực nghiệm:
\[ \hat{p}_1 - \hat{p}_2 = 0.5107 - 0.0776 ≈ 0.4331 \]
Điều này cho thấy người ăn fast food có tỷ lệ béo phì cao hơn đáng kể so với người không ăn.
Khoảng tin cậy loại trừ 0 hoàn toàn, điều này xác nhận tính ổn định và đáng tin cậy của chênh lệch tỷ lệ giữa hai nhóm.
Phân tích kiểm định tỷ lệ cho thấy thói quen tiêu thụ fast food có liên quan chặt chẽ và có ý nghĩa thống kê đến tình trạng béo phì. Với khoảng cách gần 44 điểm phần trăm về tỷ lệ béo phì giữa hai nhóm, kết quả này cho thấy rằng fast food là một yếu tố hành vi quan trọng cần được kiểm soát trong các chương trình can thiệp sức khỏe cộng đồng.
obesity_group) và thói quen kiểm tra calo
(calorie_check)Phân tích này nhằm kiểm định giả thuyết về mối liên hệ giữa việc kiểm tra lượng calo tiêu thụ và tình trạng béo phì. Chúng tôi kỳ vọng hành vi kiểm soát dinh dưỡng này sẽ góp phần giảm thiểu nguy cơ béo phì.
calorie_tab <- table(obesity$calorie_check, obesity$obesity_group)
calorie_tab
##
## Non_Obese Obese
## no 1046 969
## yes 93 3
yes), chỉ 3
người bị béo phì (~3.1%)⟶ Dữ liệu ban đầu cho thấy một xu hướng rõ rệt: việc kiểm tra calo có thể liên quan đến tỷ lệ béo phì thấp hơn.
chisq.test(calorie_tab)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: calorie_tab
## X-squared = 72.774, df = 1, p-value < 2.2e-16
Để xác định xem sự khác biệt trên có ý nghĩa thống kê hay không, ta thực hiện kiểm định Chi-square.
Giả thuyết kiểm định:
calorie_check và
obesity_group độc lập.Kết quả:
*Kết luận:**
Với p-value rất nhỏ, chúng ta bác bỏ giả thuyết H₀. Do đó, tồn tại mối liên hệ có ý nghĩa thống kê giữa việc kiểm tra calo và tình trạng béo phì.
obesity %>%
group_by(calorie_check, obesity_group) %>%
summarise(n = n(), .groups = "drop") %>%
mutate(perc = round(n / sum(n) * 100, 1)) %>%
ggplot(aes(x = calorie_check, y = perc, fill = obesity_group)) +
geom_col(position = "dodge") +
geom_text(aes(label = paste0(perc, "%")), position = position_dodge(width = 0.9), vjust = -0.2) +
labs(title = "Tỷ lệ béo phì theo thói quen kiểm tra calo") +
theme_minimal()
Biểu đồ cột thể hiện tỷ lệ phần trăm người béo phì theo thói quen
calorie_check:
⟶ Khác biệt rất rõ ràng giữa hai nhóm.
riskratio(calorie_tab)
## $data
##
## Non_Obese Obese Total
## no 1046 969 2015
## yes 93 3 96
## Total 1139 972 2111
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## no 1.00000000 NA NA
## yes 0.06498323 0.02131565 0.1981089
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0 3.502564e-22 5.844121e-18
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Relative risk (RR):
\[ RR = \frac{P(\text{Obese}|\text{Check})}{P(\text{Obese}|\text{No check})} = \frac{3/96}{969/2015} \approx 0.065 \]
⟶ Người có thói quen kiểm tra calo có nguy cơ béo phì thấp hơn ~93.5% so với người không kiểm tra.
oddsratio(calorie_tab)
## $data
##
## Non_Obese Obese Total
## no 1046 969 2015
## yes 93 3 96
## Total 1139 972 2111
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## no 1.0000000 NA NA
## yes 0.0366283 0.008714613 0.09781913
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## no NA NA NA
## yes 0 3.502564e-22 5.844121e-18
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Odds Ratio (OR):
\[ OR = \frac{3/93}{969/1046} \approx 0.0366 \]
⟶ Odds (cơ hội) béo phì ở nhóm kiểm tra calo thấp hơn ~27 lần so với nhóm không kiểm tra.
x_cal <- c(calorie_tab["yes", "Obese"], calorie_tab["no", "Non_Obese"])
n_cal <- c(sum(calorie_tab["yes", ]), sum(calorie_tab["no", ]))
prop.test(x = x_cal, n = n_cal, correct = FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: x_cal out of n_cal
## X-squared = 87.241, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.5289336 -0.4467798
## sample estimates:
## prop 1 prop 2
## 0.0312500 0.5191067
Xét hai tỷ lệ:
\(p_1\): Tỷ lệ béo phì ở nhóm có kiểm tra calo
\(p_2\): Tỷ lệ không béo phì ở nhóm không kiểm tra calo Giả thuyết:
H₀: Tỷ lệ béo phì ở hai nhóm là bằng nhau.
H₁: Tỷ lệ này khác biệt. \[ \begin{aligned} H_0 &: p_1 = p_2 \\ H_1 &: p_1 \ne p_2 \end{aligned} \]
Kết quả:
Với p-value gần bằng 0, chúng ta bác bỏ giả thuyết \(H_0\) ở mức ý nghĩa bất kỳ. Điều này cung cấp bằng chứng thống kê mạnh mẽ cho thấy tỷ lệ béo phì khác biệt đáng kể giữa hai nhóm hành vi.
Cụ thể:
Việc thường xuyên kiểm tra lượng calo hấp thụ trong khẩu phần ăn có liên hệ chặt chẽ với xác suất mắc béo phì thấp hơn. Kết quả kiểm định tỷ lệ xác thực điều này ở mức độ thống kê mạnh mẽ. Về mặt ứng dụng, thói quen theo dõi năng lượng tiêu thụ nên được khuyến khích trong các chương trình phòng ngừa béo phì.
Trong tất cả các mô hình hồi quy nhị phân (logit, probit, cloglog),
mục tiêu là ước lượng xác suất một cá nhân rơi vào nhóm béo phì
(obese_binary = 1) dựa trên các biến giải thích như
fast_food, calorie_check và
age.
Ta xét mô hình tổng quát:
\[ g(p) = \beta_0 + \beta_1 \cdot \text{fast\_foodyes} + \beta_2 \cdot \text{calorie\_checkyes} + \beta_3 \cdot \text{age} \]
Trong đó:
obesity$obese_binary <- ifelse(obesity$obesity_level %in% c("Obesity_Type_I", "Obesity_Type_II", "Obesity_Type_III"),
1, 0)
# Logit model
model_logit <- glm(obese_binary ~ fast_food + calorie_check + age ,
data = obesity, family = binomial(link = "logit"))
summary(model_logit)
##
## Call:
## glm(formula = obese_binary ~ fast_food + calorie_check + age,
## family = binomial(link = "logit"), data = obesity)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.969660 0.319829 -12.412 < 2e-16 ***
## fast_foodyes 2.405282 0.248792 9.668 < 2e-16 ***
## calorie_checkyes -2.793954 0.594139 -4.703 2.57e-06 ***
## age 0.068205 0.008036 8.488 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2913.2 on 2110 degrees of freedom
## Residual deviance: 2573.9 on 2107 degrees of freedom
## AIC: 2581.9
##
## Number of Fisher Scoring iterations: 6
Nhằm phân tích các yếu tố ảnh hưởng đến tình trạng béo phì (biến nhị
phân obese_binary: 1 = Béo phì, 0 = Không béo phì) nghiên
cứu đã xây dựng một mô hình hồi quy logistic có dạng:
\[ \log\left(\frac{P(Y = 1 \mid X)}{1 - P(Y = 1 \mid X)}\right) = \beta_0 + \beta_1 \cdot \text{fast\_foodyes} + \beta_2 \cdot \text{calorie\_checkyes} + \beta_3 \cdot \text{age} \]
Trong đó:
Vế trái là logit của xác suất bị béo phì,
Biến giải thích gồm:
fast_foodyes: thói quen ăn fast food (yes = 1),calorie_checkyes: hành vi kiểm tra lượng calo tiêu thụ
(yes = 1),age: tuổi (liên tục),Các hệ số \(\beta\) được ước lượng bằng phương pháp tối đa hóa hợp lý (Maximum Likelihood Estimation).
Diễn giải hệ số hồi quy
Ta có thể diễn giải các hệ số ước lượng theo xác suất bằng cách chuyển từ logit về xác suất:
\[ P(Y = 1 \mid X) = \frac{1}{1 + \exp(-\eta)}, \quad \text{trong đó } \eta = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k \]
Với cá nhân không ăn fast food, không kiểm calo, và tuổi bằng 0, logit của xác suất bị béo phì là -3.970, tương ứng với xác suất khoảng:
\[ P \approx \frac{1}{1 + e^{3.97}} \approx 0.0185 \ (1.85\%) \]
Điều này phản ánh xác suất nền rất thấp trong nhóm tham chiếu.
Khi cá nhân có thói quen ăn fast food, logit tăng thêm 2.405 đơn vị. Odds béo phì tăng:
\[ \exp(2.405) \approx 11.08 \]
→ Nguy cơ béo phì cao hơn khoảng 11 lần so với người không ăn fast food (giữ các yếu tố khác không đổi).
Ngược lại, với người thường xuyên kiểm tra calo, logit giảm đi 2.794 đơn vị → odds giảm:
\[ \exp(-2.794) \approx 0.061 \]
→ Odds béo phì giảm hơn 93%, cho thấy hành vi này có tác dụng bảo vệ mạnh.
Mỗi năm tuổi tăng thêm làm odds béo phì tăng:
\[ \exp(0.068) \approx 1.07 \]
→ Mỗi năm tăng tuổi tương ứng với odds béo phì tăng 7%, một cách tuyến tính.
5. Kết luận
Mô hình hồi quy logistic cho thấy rằng:
Tất cả biến đều có ý nghĩa thống kê cao, và mô hình có độ phù hợp tốt, là một lựa chọn hợp lý cho phân tích xác suất béo phì trên tập dữ liệu hiện tại.
# Probit model
model_probit <- glm(obese_binary ~ fast_food + calorie_check + age ,
data = obesity, family = binomial(link = "probit"))
summary(model_probit)
##
## Call:
## glm(formula = obese_binary ~ fast_food + calorie_check + age,
## family = binomial(link = "probit"), data = obesity)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.289239 0.170985 -13.389 < 2e-16 ***
## fast_foodyes 1.376574 0.126792 10.857 < 2e-16 ***
## calorie_checkyes -1.460323 0.260395 -5.608 2.05e-08 ***
## age 0.039673 0.004746 8.359 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2913.2 on 2110 degrees of freedom
## Residual deviance: 2578.0 on 2107 degrees of freedom
## AIC: 2586
##
## Number of Fisher Scoring iterations: 6
Mô hình có dạng:
\[ \Phi^{-1}(P(Y = 1 \mid X)) = \beta_0 + \beta_1 \cdot \text{fast\_foodyes} + \beta_2 \cdot \text{calorie\_checkyes} + \beta_3 \cdot \text{age} \]
Trong đó, \(\Phi^{-1}(\cdot)\) là hàm nghịch đảo của phân phối chuẩn chuẩn hóa (probit link), và các hệ số \(\beta_i\) được ước lượng bằng phương pháp tối đa hóa hợp lý (MLE). Giá trị \(P(Y = 1 \mid X)\) đại diện cho xác suất một cá nhân thuộc nhóm béo phì, dựa trên đặc điểm của họ.
Diễn giải ý nghĩa thống kê
Intercept = -2.289: Khi các biến độc lập ở mức
tham chiếu (fast_food = "no",
calorie_check = "no", và age = 0), giá trị của
hàm liên kết (z-score) là -2.289. Tương ứng với xác suất khoảng 1.1%,
theo bảng phân phối chuẩn chuẩn hóa.
fast_foodyes = 1.377: Những người có thói quen ăn fast food có z-score cao hơn 1.377 đơn vị so với nhóm không ăn, giữ các yếu tố khác không đổi. Điều này cho thấy xác suất béo phì tăng mạnh theo hướng dương — là bằng chứng thống kê rất mạnh cho mối liên hệ giữa fast food và béo phì.
calorie_checkyes = -1.460: Việc kiểm soát lượng calo có tác dụng làm giảm xác suất béo phì. Hệ số âm cho thấy cá nhân có hành vi này sẽ có z-score giảm xuống trung bình 1.46 đơn vị, từ đó làm giảm xác suất thuộc nhóm béo phì một cách đáng kể.
age = 0.040: Mỗi năm tăng thêm tuổi tương ứng với tăng nhẹ z-score của béo phì khoảng 0.040 đơn vị. Đây là tác động có ý nghĩa thống kê cao, phản ánh xu hướng nguy cơ béo phì tăng dần theo tuổi.
Kết luận
Mô hình probit khẳng định rằng các yếu tố hành vi như ăn fast food thường xuyên hay thiếu kiểm soát calo có ảnh hưởng đáng kể đến xác suất béo phì. Tuổi cũng là một yếu tố nguy cơ độc lập. Mô hình giúp định lượng xác suất mắc béo phì theo từng đặc điểm cá nhân, và có thể ứng dụng trong phân tích nguy cơ sức khỏe cộng đồng cũng như xây dựng mô hình dự báo y tế.
# Complementary log-log model
model_cloglog <- glm(obese_binary ~ fast_food + calorie_check + age ,
data = obesity, family = binomial(link = "cloglog"))
summary(model_cloglog)
##
## Call:
## glm(formula = obese_binary ~ fast_food + calorie_check + age,
## family = binomial(link = "cloglog"), data = obesity)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.205065 0.259858 -12.334 < 2e-16 ***
## fast_foodyes 2.023640 0.231502 8.741 < 2e-16 ***
## calorie_checkyes -2.561381 0.579753 -4.418 9.96e-06 ***
## age 0.035774 0.004934 7.251 4.15e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2913.2 on 2110 degrees of freedom
## Residual deviance: 2589.5 on 2107 degrees of freedom
## AIC: 2597.5
##
## Number of Fisher Scoring iterations: 10
Mô hình có dạng:
\[ \log(-\log(1 - P(Y = 1 \mid X))) = \beta_0 + \beta_1 \cdot \text{fast\_foodyes} + \beta_2 \cdot \text{calorie\_checkyes} + \beta_3 \cdot \text{age} \]
Trong đó:
Diễn giải ý nghĩa các hệ số
Intercept = -3.205: Với các cá nhân không ăn fast food, không kiểm calo và tuổi bằng 0, cloglog của xác suất mắc béo phì là -3.205. Điều này tương đương xác suất xảy ra rất thấp, gần 4% theo hàm nghịch đảo cloglog.
Fast_foodyes = 2.024: Khi một cá nhân có thói quen ăn fast food, cloglog của xác suất mắc béo phì tăng thêm 2.024 đơn vị, tương ứng với xác suất tăng mạnh. Điều này cho thấy fast food là một yếu tố nguy cơ rất mạnh đối với béo phì.
Calorie_checkyes = -2.561: Những người có hành vi kiểm soát lượng calo nạp vào có cloglog giảm 2.561 đơn vị, tức là xác suất bị béo phì giảm đáng kể so với nhóm không kiểm calo. Đây là yếu tố bảo vệ.
Age = 0.036: Mỗi năm tuổi tăng thêm làm tăng cloglog của xác suất béo phì khoảng 0.036 đơn vị. Điều này phản ánh nguy cơ tăng dần theo độ tuổi.
Để chuyển cloglog thành xác suất cụ thể, ta dùng công thức nghịch đảo:
\[ P(Y = 1 \mid X) = 1 - \exp(-\exp(\eta)), \quad \text{trong đó } \eta = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k \]
Ví dụ, với một cá nhân 18 tuổi, ăn fast food, không kiểm tra calo: \(\eta = -3.205 + 2.024 \cdot 1 - 2.561 \cdot 0 + 0.036 \cdot 18 = -3.205 + 2.024 + 0 + 0.648 = -0.533\)
\[ P \approx 1 - \exp(-\exp(-0.533)) \approx 1 - \exp(-1.704) \approx 0.817 \]
→ Xác suất mắc béo phì rất cao.
Kết luận
Mô hình cloglog cho thấy rằng:
Với tất cả các hệ số đều có ý nghĩa thống kê cao, mô hình cloglog là một lựa chọn phù hợp khi phân tích các sự kiện có xác suất cao nhưng không cân xứng giữa hai nhóm. Tuy nhiên, so với logit và probit, cloglog có AIC lớn hơn, vì vậy có thể ít phù hợp hơn trong trường hợp cụ thể của bộ dữ liệu này.
Để đánh giá và lựa chọn mô hình tốt nhất trong số các mô hình hồi quy nhị phân đã xây dựng (logit, probit, cloglog), chúng ta sử dụng tiêu chí Akaike Information Criterion (AIC). AIC là thước đo phổ biến trong thống kê dùng để cân bằng giữa độ phù hợp (goodness-of-fit) và độ phức tạp của mô hình (model complexity).
Công thức AIC:
\[ \text{AIC} = -2\log(L) + 2k \]
Trong đó:
AIC(model_logit, model_probit, model_cloglog)
## df AIC
## model_logit 4 2581.882
## model_probit 4 2585.990
## model_cloglog 4 2597.481
Trên cơ sở tiêu chí AIC, mô hình hồi quy logit được đánh giá là lựa chọn tốt nhất để mô tả xác suất béo phì dựa trên các yếu tố
fast_food,calorie_checkvàage. Ngoài ra, mô hình logit còn có ưu điểm vượt trội ở khả năng diễn giải hệ số dưới dạng odds ratio, giúp giải thích rõ ràng tác động của từng biến độc lập lên xác suất béo phì – điều này đặc biệt hữu ích trong các phân tích dịch tễ học hoặc khoa học hành vi.
Bên cạnh AIC, một chỉ số phổ biến khác để đánh giá chất lượng mô hình phân loại nhị phân là Brier Score. Đây là thước đo độ chính xác của dự báo xác suất.
Công thức Brier Score:
\[ \text{Brier Score} = \frac{1}{n} \sum_{i=1}^n (\hat{p}_i - y_i)^2 \]
Trong đó:
\(\hat{p}_i\): Xác suất dự đoán của mô hình cho quan sát thứ \(i\)
\(y_i \in \{0, 1\}\): Nhãn thực tế (0: Non-obese, 1: Obese)
Ý nghĩa của Brier Score: Chỉ số này đo lường khoảng cách trung bình giữa xác suất dự đoán và nhãn thực tế. Giá trị càng gần 0 thì mô hình càng chính xác. Giá trị tối đa có thể là 0.25 nếu mô hình đoán xác suất = 0.5 cho tất cả các quan sát.
BrierScore(model_logit)
## [1] 0.2131631
BrierScore(model_probit)
## [1] 0.2135052
BrierScore(model_cloglog)
## [1] 0.2150504
Mô hình logit có Brier Score thấp nhất (0.2132), thể hiện rằng xác suất dự đoán gần đúng nhất với thực tế, trong ba mô hình được so sánh.
Mặc dù sự khác biệt giữa logit và probit không lớn (chênh lệch ≈ 0.0003), mô hình cloglog thể hiện kém hơn đáng kể, với sai lệch xác suất dự đoán trung bình lớn hơn.
Điều này phù hợp với kết quả AIC, khi logit có AIC thấp nhất. Hai chỉ số này cùng cho thấy rằng mô hình logit là ứng viên tốt nhất.
Dựa trên chỉ số Brier Score, ta kết luận rằng mô hình hồi quy logit không chỉ có AIC thấp mà còn có độ chính xác xác suất cao nhất khi dự đoán khả năng một cá nhân thuộc nhóm béo phì.
Do đó, mô hình logit tiếp tục được lựa chọn là mô hình hồi quy nhị phân ưu việt nhất trong nghiên cứu này, cả về mức độ phù hợp lẫn hiệu quả dự đoán.
# Dự báo xác suất từ mô hình hồi quy logistic
pred_logit <- predict(model_logit, type = "response")
# Tính ngưỡng phân loại tốt nhất từ ROC
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following object is masked from 'package:gmodels':
##
## ci
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
roc_logit <- roc(obesity$obese_binary, pred_logit)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
thresh <- coords(roc_logit, "best", ret = "threshold")
# Phân loại nhị phân theo ngưỡng
pred_logit_label <- ifelse(pred_logit >= as.numeric(thresh), 1, 0)
# Ma trận nhầm lẫn đầy đủ thông tin
library(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
##
## MAE, RMSE
## The following object is masked from 'package:purrr':
##
## lift
cm_logit <- confusionMatrix(
factor(pred_logit_label),
factor(obesity$obese_binary),
positive = "1"
)
# Hiển thị bảng confusion matrix
cm_logit$table
## Reference
## Prediction 0 1
## 0 701 196
## 1 438 776
Đánh giá năng lực phân loại của mô hình hồi quy logistic
Sau khi xây dựng mô hình hồi quy logistic nhị phân với công thức:
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 \cdot \text{fast\_food} + \beta_2 \cdot \text{calorie\_check} + \beta_3 \cdot \text{age} \]
ta sử dụng mô hình này để ước lượng xác suất cá nhân thuộc nhóm béo phì.
Từ các xác suất dự đoán, ta cần chuyển về nhãn phân loại nhị phân (Obese hoặc Non-Obese). Việc chọn ngưỡng phân loại tối ưu không nên dùng mặc định 0.5, mà nên dựa trên hiệu quả phân biệt thật sự của mô hình.
Ngưỡng phân loại tối ưu được chọn theo tiêu chí Youden’s Index từ đường cong ROC:
\[ \text{Youden's J} = \text{Sensitivity} + \text{Specificity} - 1 \]
Ngưỡng tối ưu tìm được từ ROC là: 0.467
Sau khi phân loại với ngưỡng tối ưu, ta thu được kết quả như sau:
| Thực tế: Non-Obese (0) | Thực tế: Obese (1) | |
|---|---|---|
| Dự báo: 0 | 701 (True Negative) | 196 (False Negative) |
| Dự báo: 1 | 438 (False Positive) | 776 (True Positive) |
Dựa trên ma trận trên, ta có thể tính các chỉ số đánh giá mô hình như sau:
Accuracy (Độ chính xác):
\[ \frac{TP + TN}{TP + TN + FP + FN} = \frac{701 + 776}{701 + 776 + 438 + 196} \approx 0.7016 \]
Sensitivity (Recall/True Positive Rate):
\[ \frac{TP}{TP + FN} = \frac{776}{776 + 196} \approx 0.798 \]
Specificity (True Negative Rate):
\[ \frac{TN}{TN + FP} = \frac{701}{701 + 438} \approx 0.615 \]
Precision (Positive Predictive Value):
\[ \frac{TP}{TP + FP} = \frac{776}{776 + 438} \approx 0.639 \]
Nhận xét và kết luận
Mô hình hồi quy logistic có khả năng phân biệt tốt các cá nhân béo phì với độ nhạy (sensitivity) khá cao ~80%. Tuy nhiên, độ đặc hiệu còn hạn chế (~61%), cho thấy mô hình dễ mắc lỗi dự đoán nhầm người không béo phì thành béo phì.
Nhìn chung, với độ chính xác tổng thể khoảng 70% và cân bằng tương đối giữa các chỉ số, mô hình thể hiện hiệu suất phù hợp trong bối cảnh dữ liệu xã hội và hành vi sức khỏe. Tuy nhiên, trong ứng dụng thực tế, cần xem xét giá trị của các sai lệch loại I và loại II để điều chỉnh ngưỡng cho phù hợp với mục tiêu (phát hiện sớm hay tránh cảnh báo sai).
new_cases <- data.frame(
fast_food = factor(c("yes", "no"), levels = c("no", "yes")),
calorie_check = factor(c("no", "yes"), levels = c("no", "yes")),
age = c(18, 45)
)
# Dự báo xác suất theo mô hình logistic
new_cases$prob_obesity <- predict(model_logit, newdata = new_cases, type = "response")
# Xem kết quả
new_cases
## fast_food calorie_check age prob_obesity
## 1 yes no 18 0.41661561
## 2 no yes 45 0.02425978
Thông tin mô hình sử dụng:
Mô hình hồi quy logistic nhị phân (model_logit) có
công thức:
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 \cdot \text{fast_food}_{\text{yes}} + \beta_2 \cdot \text{calorie_check}_{\text{yes}} + \beta_3 \cdot \text{age} \]
Trong đó:
Diễn giải từng trường hợp:
Trường hợp 1: Một cá nhân 18 tuổi, có ăn fast food thường xuyên và không kiểm tra lượng calorie:
Trường hợp 2: Một cá nhân 45 tuổi, không ăn fast food và có kiểm tra calorie thường xuyên:
Trong bài nghiên cứu này, đã sử dụng một tập dữ liệu hành vi và nhân khẩu học để tìm hiểu mối liên hệ giữa các yếu tố như thói quen ăn fast food, kiểm soát lượng calo và độ tuổi đến tình trạng béo phì của cá nhân. Biến phụ thuộc là nhị phân (béo phì hoặc không), được trích xuất từ nhãn nhiều cấp ban đầu.
Các phân tích thống kê được triển khai gồm:
Kết quả nổi bật:
Phân tích thống kê cho thấy có mối liên hệ mạnh giữa hành vi tiêu dùng thực phẩm và béo phì. Việc thay đổi các yếu tố hành vi như hạn chế fast food và chú trọng kiểm soát calo có thể đóng vai trò quan trọng trong chiến lược phòng chống béo phì. Đồng thời, các mô hình thống kê đơn giản vẫn có thể cung cấp những kết quả định lượng đáng tin cậy, phục vụ cho việc ra quyết định trong lĩnh vực sức khỏe cộng đồng.