TIỂU LUẬN PHÂN TÍCH DỮ LIỆU ĐỊNH TÍNH


LỜI CẢM ƠN


Trong quá trình thực hiện học phần Phân tích dữ liệu định tính tại Trường Đại học Tài chính – Marketing, em xin trân trọng gửi lời cảm ơn sâu sắc đến Ban Giám hiệu Nhà trường và Khoa Khoa học Dữ liệu đã tạo điều kiện thuận lợi, xây dựng môi trường học tập chuyên nghiệp nhằm hỗ trợ sinh viên tiếp thu kiến thức một cách hiệu quả.

Em xin gửi lời cảm ơn trân trọng đến Thầy ThS. Trần Mạnh Tường, người đã tận tình hỗ trợ, đồng hành và định hướng chuyên môn cho em trong suốt quá trình thực hiện học phần. Sự tận tâm và hỗ trợ của Thầy là nguồn động lực giúp em hoàn thiện bài tiểu luận này.

Một lần nữa, em xin gửi lời cảm ơn chân thành đến Nhà trường và Quý Thầy Cô đã luôn đồng hành và tạo mọi điều kiện thuận lợi trong suốt quá trình học tập và nghiên cứu.

LỜI CAM ĐOAN


Em xin cam đoan rằng toàn bộ nội dung, số liệu, thông tin và các kết quả trình bày trong đề tài này là trung thực và chính xác, được thu thập và xử lý một cách khách quan. Mọi nguồn thông tin tham khảo đều đã được trích dẫn rõ ràng và đúng quy định. Em xin chịu hoàn toàn trách nhiệm về tính chính xác và tính xác thực của những thông tin, số liệu được trình bày.

CHƯƠNG 1: TỔNG QUAN NGHIÊN CỨU


1.1 Bối cảnh nghiên cứu

Đột quỵ là một căn bệnh nguy hiểm, có thể xảy ra bất ngờ và để lại hậu quả nặng nề. Việc tìm hiểu rõ các nguyên nhân gây đột quỵ rất quan trọng để có thể phòng tránh hiệu quả. Ngoài các yếu tố thường gặp như huyết áp cao, tiểu đường, mỡ máu, hút thuốc hay ít vận động, còn nhiều yếu tố khác cũng góp phần làm tăng nguy cơ. Giới tính và tuổi tác là một trong số đó — nam giới thường bị sớm hơn, còn nữ giới lại dễ gặp biến chứng nặng hơn. Tuổi càng cao thì nguy cơ đột quỵ càng lớn, nhưng hiện nay người trẻ cũng đã bắt đầu mắc nhiều hơn. Ngoài ra, môi trường sống như ô nhiễm, căng thẳng, thức khuya, hoặc làm việc quá sức cũng là những yếu tố không thể bỏ qua. Hiểu rõ những nguyên nhân này giúp mỗi người biết cách chăm sóc sức khỏe của mình tốt hơn. Nghiên cứu kỹ các yếu tố gây đột quỵ cũng giúp bác sĩ phát hiện sớm và điều trị kịp thời cho những người có nguy cơ cao.

1.2. Mục tiêu nghiên cứu

  • Mục tiêu chung: Phân tích và đánh giá các yếu tố ảnh hưởng đến tình trạng đột quỵ bằng cách áp dụng hồi quy tuyến tính tổng quát (GLM).

  • Mục tiêu cụ thể:

    • Xác định các yếu tố cá nhân và sức khỏe (tuổi, huyết áp, BMI, thói quen hút thuốc,…) ảnh hưởng đến nguy cơ mắc đột quỵ dựa trên dữ liệu thực tế.

    • Ước lượng mức độ ảnh hưởng của từng yếu tố đến tình trạng đột quỵ bằng mô hình GLM theo phương pháp ước lượng hàm hợp lỳ cực đại (Maximum Likelihood Estimation).

    • Đề xuất các khuyến nghị phòng ngừa đột quỵ có cơ sở dữ liệu hỗ trợ, phù hợp với từng nhóm đối tượng (theo độ tuổi, giới tính, tình trạng sức khỏe).

1.3. Đối tượng nghiên cứu

Đối tượng nghiên cứu: Bao gồm các thông tin cá nhân của các bệnh nhân tương ứng như: Tuổi, Giới tính, Tình trạng hôn nhân, Loại hình công việc, Khu vực sinh sống, Tình trạng hút thuốc, Chỉ số cơ thể, Nồng độ đường huyết trung bình, Tình trạng tăng huyết áp, Tình trạng bệnh tim, Kết quả đột quỵ.

1.4. Phương pháp nghiên cứu

Phương pháp nghiên cứu:

  • Thu thập dữ liệu: Dữ liệu được thu thập về thông tin cá nhân của các bệnh nhân, từ nguồn dữ liệu chính thống.

  • Tiền xử lý dữ liệu: Mã hóa các biến định lượng và xử lý dữ liệu thiếu, ngoại lệ để đảm bảo độ ổn định của mô hình.

  • Phân tích thống kê mô tả từng biến: Mô tả đặc điểm của mẫu nghiên cứu, tính toán các chỉ số trung bình, độ lệch chuẩn của các biến.

  • Xác định sự phụ thuộc giữa các yếu tố nguy cơ và đột quỵ: Thực hiện kiểm định Chi-square để đánh giá mối liên hệ giữa từng biến nguy cơ rời rạc và biến phụ thuộc , nhằm xác định các yếu tố có liên quan đáng kể về mặt thống kê.

  • Phân tích thống kê mô tả giữa biến độc lập và biến phụ thuộc nhằm quan sát sự khác biệt trong tỷ lệ mắc đột quỵ giữa các nhóm.

  • Xây dựng và ước lượng mô hình: Tiến hành phân tích hồi quy theo đơn biến và theo đa biến biến kết hợp nhằm đánh giá ảnh hưởng của các yếu tố nguy cơ đến tình trạng đột quỵ.

  • Đánh giá mô hình: Dựa trên các chỉ số AIC, BIC để kiểm tra độ phù hợp và khả năng dự đoán của mô hình.

  • Đề xuất và ứng dụng: Dựa trên kết quả phân tích, đưa ra các khuyến nghị cụ thể về quản lý yếu tố nguy cơ và phòng ngừa đột quỵ, đặc biệt cho các nhóm có xác suất mắc bệnh cao.

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT


2.1. Khái quát về bệnh đột quỵ và các yếu tố nguy cơ

Đột quỵ, hay còn gọi là tai biến mạch máu não, là tình trạng não bị tổn thương nghiêm trọng do dòng máu lên não bị tắc nghẽn hoặc vỡ mạch máu. Khi máu không thể đưa oxy và dưỡng chất đến các tế bào não, chúng bắt đầu chết chỉ sau vài phút. Có hai dạng chính là đột quỵ thiếu máu cục bộ (chiếm phần lớn các ca, do tắc mạch máu) và đột quỵ xuất huyết (do vỡ mạch máu não). Đây là một trong những nguyên nhân hàng đầu gây tử vong và để lại di chứng nặng nề như liệt, rối loạn ngôn ngữ, mất trí nhớ hoặc tàn phế suốt đời nếu không được cấp cứu kịp thời.

Có nhiều yếu tố nguy cơ dẫn đến đột quỵ, trong đó phổ biến nhất là tăng huyết áp – nguyên nhân hàng đầu gây tổn thương thành mạch và hình thành cục máu đông. Ngoài ra, bệnh tim mạch (như rung nhĩ, suy tim), đái tháo đường, rối loạn mỡ máu, hút thuốc lá, uống rượu, thừa cân, ít vận động và căng thẳng kéo dài cũng góp phần làm tăng khả năng bị đột quỵ. Việc nhận biết sớm các dấu hiệu như méo miệng, yếu hoặc liệt tay chân, nói ngọng, mất thăng bằng và xử lý cấp cứu kịp thời có thể cứu sống bệnh nhân và giảm nhẹ biến chứng. Phòng ngừa đột quỵ hiệu quả bắt đầu từ việc kiểm soát tốt các yếu tố nguy cơ và duy trì lối sống lành mạnh.

2.2. Mô hình nghiên cứu

2.2.1. Mô hình Hồi quy Tuyến tính Tổng quát

Mô hình Hồi quy Tuyến tính Tổng quát (Generalized Linear Models – GLMs) là một khung phân tích thống kê được phát triển bởi Nelder và Wedderburn vào năm 1972 nhằm mở rộng khả năng của hồi quy tuyến tính cổ điển (OLS). GLM đặc biệt hữu ích trong trường hợp biến phụ thuộc không tuân theo phân phối chuẩn hoặc không phải là biến liên tục. Khác với OLS, vốn chỉ áp dụng tốt cho dữ liệu có phân phối chuẩn và phương sai đồng nhất, GLM xử lý hiệu quả các biến định tính, biến đếm hoặc biến có phân phối lệch.

Một mô hình GLM bao gồm ba thành phần chính:

a. Thành phần ngẫu nhiên (Random Component)

Xác định phân phối xác suất của biến phụ thuộc 𝑌 Y, với điều kiện các biến độc lập. GLM yêu cầu phân phối này phải thuộc họ phân phối mũ (Exponential Family) – bao gồm các phân phối quen thuộc như Normal, Binomial, Poisson, và Gamma.

Mỗi phân phối trong họ mũ có thể biểu diễn dưới dạng tham số tự nhiên \(\theta\) và tham số phân tán \(\phi\) với phương sai của \(Y\) được xác định như sau:

\[ \operatorname{Var}(Y) = \phi \cdot V(\mu) \] Trong đó, \(V(\mu)\) là hàm phương sai đặc trưng của từng phân phối:

  • Normal: \(V(\mu) = 1\), \(\phi = \sigma^2\)

  • Poisson: \(V(\mu) = \mu\), \(\phi = 1\)

  • Binomial: \(V(\mu) = \mu \left(1 - \frac{\mu}{n} \right)\), \(\phi = 1\)

  • Gamma: \(V(\mu) = \mu^2\), \(\phi = \frac{1}{\nu}\)

b. Thành phần hệ thống (Systematic Component)

Đây là tổ hợp tuyến tính của các biến độc lập:

\[ \eta = X\beta = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]

Trong đó, \(\eta\) gọi là bộ tiên đoán tuyến tính (linear predictor). Đây chính là nơi phản ánh ảnh hưởng của các biến độc lập đến kết quả dự báo.

c. Hàm liên kết (Link Function)

Hàm liên kết \(g(\cdot)\) liên kết kỳ vọng của biến phụ thuộc \((\mu = \mathbb{E}(Y))\) với bộ tiên đoán tuyến tính \((\eta)\):

\[ g(\mu) = \eta \]

Hàm liên kết phải là hàm đơn điệu và khả vi, cho phép ánh xạ từ miền giá trị hợp lý của \(Y\) (chẳng hạn, xác suất nằm trong khoảng \((0,1)\)) sang toàn bộ trục số thực của \(\eta\). Mỗi phân phối thường có một hàm liên kết kinh điển (canonical link) giúp đơn giản hóa việc ước lượng:

Phân phối Hàm liên kết kinh điển Ứng dụng phổ biến
Normal Identity: \(g(\mu) = \mu\) Hồi quy tuyến tính
Binomial Logit: \(g(\mu) = \log\left(\frac{\mu}{1 - \mu}\right)\) Hồi quy Logistic
Binomial Probit: \(g(\mu) = \Phi^{-1}(\mu)\) Hồi quy Probit
Poisson Log: \(g(\mu) = \log(\mu)\) Hồi quy Poisson
Binomial Complementary log-log Mô hình xác suất bất đối xứng

2.2.2. Phương pháp ước lượng trong GLM: Hợp lý tối đa (MLE)

Khác với OLS sử dụng bình phương tối thiểu, GLM ước lượng các tham số \(\beta\) thông qua phương pháp Hợp lý Tối đa (Maximum Likelihood Estimation – MLE).

Nguyên lý của MLE là tìm bộ tham số \(\beta\) sao cho hàm hợp lý (likelihood) – tức xác suất xảy ra của toàn bộ dữ liệu quan sát được – là lớn nhất. Trong thực tế, người ta thường sử dụng log-hợp lý để tính toán dễ hơn:

\[ \ell(\beta) = \sum_{i=1}^{n} \log f(y_i; \beta) \]

Do các phương trình đạo hàm thường không giải được dạng đóng, MLE trong GLM thường được tìm bằng các thuật toán số như Newton-Raphson hoặc Iteratively Reweighted Least Squares (IRLS).

Ước lượng MLE có nhiều tính chất tốt khi mẫu lớn, như:

  • Không chệch tiệm cận (asymptotically unbiased)

  • Hiệu quả (efficient) – đạt phương sai nhỏ nhất có thể

  • Phân phối chuẩn tiệm cận – cho phép kiểm định và xây dựng khoảng tin cậy

2.2.3. Phương pháp đánh giá mô hình

Khi có nhiều mô hình GLM, việc lựa chọn mô hình phù hợp không thể chỉ dựa vào giá trị \(R^2\) hay số lượng biến. Hai tiêu chí phổ biến là Akaike Information Criterion (AIC) và Bayesian Information Criterion (BIC) – cả hai đều dựa trên log-likelihood và đều áp dụng nguyên tắc “đánh đổi giữa độ phù hợp và độ đơn giản”.

Akaike Information Criterion (AIC)

Công thức:

\[ \text{AIC} = -2 \cdot \ell_{\text{fit}} + 2p \]

  • \(\ell_{\text{fit}}\): log-likelihood tối đa của mô hình.

  • \(p\): số lượng tham số ước lượng.

Ý nghĩa: AIC đánh giá độ phù hợp của mô hình với dữ liệu trong khi áp dụng một mức phạt cho độ phức tạp (số tham số). Giá trị AIC càng nhỏ càng tốt, cho thấy mô hình đạt được sự cân bằng tốt giữa độ khớp và tính gọn nhẹ.

Ứng dụng: AIC được ưa dùng khi mục tiêu là tối ưu hóa khả năng dự báo, chấp nhận mô hình phức tạp hơn nếu nó cải thiện độ chính xác dự đoán.

Bayesian Information Criterion (BIC)

Công thức:

\[ \text{BIC} = -2 \cdot \ell_{\text{fit}} + p \cdot \ln(N) \]

Với \(N\) là số quan sát.

Ý nghĩa: Tương tự AIC, nhưng BIC áp đặt hình phạt nặng hơn cho số lượng tham số (vì \(ln(N) >2\) khi \(N>7\)). Vì vậy, BIC thường chọn mô hình đơn giản hơn AIC.

Ứng dụng: BIC được sử dụng khi bạn ưu tiên khả năng diễn giải và đơn giản hóa mô hình hơn là tối đa hóa dự đoán.

CHƯƠNG 3: PHƯƠNG PHÁP VÀ DỮ LIỆU NGHIÊN CỨU


3.1. Thiết kế nghiên cứu

Quá trình nghiên cứu bắt đầu bằng việc thu thập dữ liệu từ các nguồn chính thống, đảm bảo đầy đủ các thông tin liên quan đến yếu tố nguy cơ và tình trạng đột quỵ. Sau khi thu thập, dữ liệu được xử lý sơ bộ để loại bỏ các biến có giá trị thiếu (NA), giá trị ngoại lệ hoặc các trường hợp không hợp lệ. Đồng thời, các biến định tính được mã hóa lại phù hợp để phục vụ cho việc phân tích định lượng trong các mô hình hồi quy.

Tiếp theo, tiến hành thống kê mô tả cho từng biến riêng biệt nhằm hiểu rõ đặc điểm phân phối và tính chất của từng yếu tố trong tập dữ liệu. Mục tiêu là nhận diện sơ bộ các yếu tố có khả năng liên quan đến nguy cơ đột quỵ. Sau đó, sử dụng kiểm định Chi bình phương (Chi-square test) để đánh giá mối liên hệ giữa từng biến độc lập với biến phụ thuộc, qua đó sàng lọc các biến có ý nghĩa thống kê đáng kể để đưa vào mô hình phân tích.

Sau bước kiểm định, thực hiện thống kê mô tả giữa từng biến độc lập với biến phụ thuộc, nhằm khảo sát sự phân bố và khác biệt giữa các nhóm. Kết quả này giúp củng cố thêm cơ sở lý thuyết và trực giác thống kê trước khi đi vào mô hình hóa.

Giai đoạn tiếp theo là xây dựng mô hình hồi quy tuyến tính tổng quát (GLM) nhằm đánh giá mối liên hệ giữa các yếu tố và nguy cơ đột quỵ. Trước tiên, thực hiện hồi quy đơn biến với từng biến độc lập, sử dụng mô hình logit để xác định các yếu tố có ảnh hưởng riêng lẻ. Sau đó, xây dựng mô hình hồi quy đa biến nhằm kiểm soát đồng thời các yếu tố. Trong bước này, lần lượt thử nghiệm ba mô hình GLM phổ biến gồm: logit (hàm liên kết logit), probit (hàm liên kết chuẩn hóa tích lũy) và cloglog (hàm liên kết log-log bổ sung), để so sánh sự phù hợp.

Cuối cùng, đánh giá và lựa chọn mô hình phù hợp dựa trên các tiêu chí như Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC) . Việc so sánh này nhằm xác định mô hình không chỉ phù hợp với dữ liệu quan sát mà còn có khả năng tổng quát hóa tốt trong dự đoán nguy cơ đột quỵ.

3.2. Dữ liệu nghiên cứu

3.2.1 Đặc điểm dữ liệu

Dữ liệu được thu thập từ Kaggle, một nền tảng về chia sẻ bộ dữ liệu và cuộc thi khoa học dữ liệu. Bộ dữ liệu có tên là Stroke Prediction Dataset.

Mỗi dòng trong bộ dữ liệu tương ứng với thông tin của một bệnh nhân.

data <- read.csv(file.choose(), header = T, na.strings = "N/A")

head(data)
id gender age hypertension heart_disease ever_married work_type Residence_type avg_glucose_level bmi smoking_status stroke
9046 Male 67 0 1 Yes Private Urban 228.69 36.6 formerly smoked 1
51676 Female 61 0 0 Yes Self-employed Rural 202.21 NA never smoked 1
31112 Male 80 0 1 Yes Private Rural 105.92 32.5 never smoked 1
60182 Female 49 0 0 Yes Private Urban 171.23 34.4 smokes 1
1665 Female 79 1 0 Yes Self-employed Rural 174.12 24.0 never smoked 1
56669 Male 81 0 0 Yes Private Urban 186.21 29.0 formerly smoked 1

Một số thông tin về bộ dữ liệu:

Bảng 3.1: Cấu trúc của dữ liệu
'data.frame':   5110 obs. of  12 variables:
 $ id               : int  9046 51676 31112 60182 1665 56669 53882 10434 27419 60491 ...
 $ gender           : chr  "Male" "Female" "Male" "Female" ...
 $ age              : num  67 61 80 49 79 81 74 69 59 78 ...
 $ hypertension     : int  0 0 0 0 1 0 1 0 0 0 ...
 $ heart_disease    : int  1 0 1 0 0 0 1 0 0 0 ...
 $ ever_married     : chr  "Yes" "Yes" "Yes" "Yes" ...
 $ work_type        : chr  "Private" "Self-employed" "Private" "Private" ...
 $ Residence_type   : chr  "Urban" "Rural" "Rural" "Urban" ...
 $ avg_glucose_level: num  229 202 106 171 174 ...
 $ bmi              : num  36.6 NA 32.5 34.4 24 29 27.4 22.8 NA 24.2 ...
 $ smoking_status   : chr  "formerly smoked" "never smoked" "never smoked" "smokes" ...
 $ stroke           : int  1 1 1 1 1 1 1 1 1 1 ...

Đặc điểm về bộ dữ liệu:

Đặc điểm về dữ liệu:

  • Tổng số quan sát: 5110 quan sát.

  • Tổng số biến: 12 biến.

  • Biến định danh: id.

  • Số lượng biến định lượng:

    • age: Tuổi của bệnh nhân (theo năm).

    • avg_glucose_level: Nồng độ đường huyết trung bình của bệnh nhân.

    • bmi: Chỉ số khối cơ thể (Body Mass Index).

  • Tổng số biến định tính:

    • gender: Giới tính của bệnh nhân: “Male”, “Female”, hoặc “Other”.

    • hypertension: Tăng huyết áp: 0 = không có, 1 = có.

    • heart_disease: Bệnh tim: 0 = không có, 1 = có.

    • ever_married: Tình trạng hôn nhân: “Yes” hoặc “No”.

    • work_type: Loại công việc: “children”, “Govt_job”, “Never_worked”, “Private”, “Self-employed”.

    • Residence_type: Khu vực sinh sống: “Urban” hoặc “Rural”.

    • smoking_status: Tình trạng hút thuốc: “formerly smoked”, “never smoked”, “smokes”, hoặc “Unknown”.

    • stroke: Kết quả đột quỵ: 1 nếu đã từng bị, 0 nếu chưa.

3.2.2. Thực hiện kiểm tra dữ liệu

KIỂM TRA GIÁ TRỊ NA

na_table <- data.frame(
  Variable = names(data),
  Missing_Values = colSums(is.na(data))
)

kable(na_table, caption = "Bảng 3.2: Số lượng giá trị thiếu (NA) theo từng biến", row.names = FALSE) %>%
  kable_styling(full_width = FALSE) %>%
  column_spec(1, width = "3cm") %>%
  column_spec(2, width = "2cm")
Bảng 3.2: Số lượng giá trị thiếu (NA) theo từng biến
Variable Missing_Values
id 0
gender 0
age 0
hypertension 0
heart_disease 0
ever_married 0
work_type 0
Residence_type 0
avg_glucose_level 0
bmi 201
smoking_status 0
stroke 0

Kiểm tra giá trị thiếu (NA) cho thấy rằng biến bmi có tổng cộng 201 giá trị NA, trong khi tất cả các biến còn lại không có giá trị thiếu nào.

KIỂM TRA GIÁ TRỊ UNKNOWN

unknown_table <- data.frame(
  Variable = names(data),
  Unknown_Count = sapply(data, function(col) sum(tolower(as.character(col)) == "unknown", na.rm = TRUE)))

kable(unknown_table, caption = "Bảng 3.3: Số lượng giá trị 'unknown' theo từng biến", row.names = FALSE) %>%
  kable_styling(full_width = FALSE) %>%
  column_spec(1, width = "3cm") %>%
  column_spec(2, width = "2cm")
Bảng 3.3: Số lượng giá trị ‘unknown’ theo từng biến
Variable Unknown_Count
id 0
gender 0
age 0
hypertension 0
heart_disease 0
ever_married 0
work_type 0
Residence_type 0
avg_glucose_level 0
bmi 0
smoking_status 1544
stroke 0

Kết quả kiểm tra cho thấy biến định tính smoking_status có tổng cộng 1544 giá trị “unknown”.

Như vậy khi thực hiện kiểm tra các giá trị không hợp lệ trong bộ dữ liệu thì ta nhận thấy được có 201 giá trị NA và 1544 giá trị Unknown. Để đảm bảo tính trực quan và độ chính xác trong phân tích, đặc biệt là khi trực quan hóa dữ liệu, ta sẽ loại bỏ các quan sát chứa các giá trị này. Việc này giúp tránh sai lệch do các giá trị không rõ ràng, đồng thời giúp hình ảnh trực quan rõ ràng, dễ hiểu hơn.

data <- na.omit(data)
data <- data %>%
  filter(!if_any(everything(), ~ tolower(as.character(.)) == "unknown"))
na_unknown_summary <- data.frame(
  Variable = names(data),
  NA_Count = sapply(data, function(col) sum(is.na(col))),
  Unknown_Count = sapply(data, function(col) sum(tolower(as.character(col)) == "unknown", na.rm = TRUE))
)

kable(na_unknown_summary, caption = "Bảng 3.4: Số lượng giá trị NA và 'unknown' theo từng biến", row.names = FALSE) %>%
  kable_styling(full_width = FALSE) %>%
  column_spec(1, width = "7cm") %>%
  column_spec(2:3, width = "3cm")
Bảng 3.4: Số lượng giá trị NA và ‘unknown’ theo từng biến
Variable NA_Count Unknown_Count
id 0 0
gender 0 0
age 0 0
hypertension 0 0
heart_disease 0 0
ever_married 0 0
work_type 0 0
Residence_type 0 0
avg_glucose_level 0 0
bmi 0 0
smoking_status 0 0
stroke 0 0

Sau khi thống kê số lượng giá trị thiếu (NA) và giá trị không xác định (“unknown”) theo từng biến, tất cả các quan sát chứa các giá trị này đã được loại bỏ khỏi bộ dữ liệu. Việc loại bỏ này giúp đảm bảo độ sạch và chất lượng của dữ liệu, từ đó tăng độ tin cậy cho quá trình phân tích và xây dựng mô hình tiếp theo.

Sau khi xử lý, số lượng quan sát còn lại trong bộ dữ liệu là 3426.

3.2.3. Mã hóa dữ liệu

Sau khi tiến hành làm sạch dữ liệu để phục vụ cho quá trình phân tích, dữ liệu được kiểm tra và nhận thấy hầu hết các biến không thuộc dạng factor. Do đó, các biến định tính sẽ được chuyển đổi sang dạng factor nhằm đảm bảo phù hợp với các phương pháp phân tích tiếp theo.

data$gender <- as.factor(data$gender)
data$hypertension <- as.factor(data$hypertension)
data$heart_disease <- as.factor(data$heart_disease)
data$ever_married <- as.factor(data$ever_married)
data$work_type <- as.factor(data$work_type)
data$Residence_type <- as.factor(data$Residence_type)
data$smoking_status <- as.factor(data$smoking_status)
data$stroke <- as.factor(data$stroke)
Bảng 3.5: Cấu trúc của dữ liệu sau mã hóa
'data.frame':   3426 obs. of  12 variables:
 $ id               : int  9046 31112 60182 1665 56669 53882 10434 12109 12095 12175 ...
 $ gender           : Factor w/ 3 levels "Female","Male",..: 2 2 1 1 2 2 1 1 1 1 ...
 $ age              : num  67 80 49 79 81 74 69 81 61 54 ...
 $ hypertension     : Factor w/ 2 levels "0","1": 1 1 1 2 1 2 1 2 1 1 ...
 $ heart_disease    : Factor w/ 2 levels "0","1": 2 2 1 1 1 2 1 1 2 1 ...
 $ ever_married     : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 1 2 2 2 ...
 $ work_type        : Factor w/ 5 levels "children","Govt_job",..: 4 4 4 5 4 4 4 4 2 4 ...
 $ Residence_type   : Factor w/ 2 levels "Rural","Urban": 2 1 2 1 2 1 2 1 1 2 ...
 $ avg_glucose_level: num  229 106 171 174 186 ...
 $ bmi              : num  36.6 32.5 34.4 24 29 27.4 22.8 29.7 36.8 27.3 ...
 $ smoking_status   : Factor w/ 3 levels "formerly smoked",..: 1 2 3 2 1 2 2 2 3 3 ...
 $ stroke           : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
 - attr(*, "na.action")= 'omit' Named int [1:201] 2 9 14 20 28 30 44 47 51 52 ...
  ..- attr(*, "names")= chr [1:201] "2" "9" "14" "20" ...

CHƯƠNG 4: PHÂN TÍCH KẾT QUẢ NGHIÊN CỨU


4.1. Thống kê mô tả một biến

4.1.1. Thống kê mô tả biến Gender

Biến gender thể hiện giới tính của đối tượng trong nghiên cứu, với ba mức (level) là Male (nam), Female (nữ) và Other (khác). Việc phân loại này giúp phân tích sự khác biệt hoặc mối liên hệ giữa giới tính và các yếu tố sức khỏe trong nghiên cứu.

# Tạo bảng tần số và tần suất cho biến gender
gender_table <- data %>%
  count(gender) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số`= n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
gender_table %>%
  kable(col.names = c("Giới tính", "Tần số", "Tần suất (%)"),
        caption = "Bảng 4.1: Bảng tần số và tần suất (%) theo giới tính")
Bảng 4.1: Bảng tần số và tần suất (%) theo giới tính
Giới tính Tần số Tần suất (%)
Female 2086 60.89
Male 1339 39.08
Other 1 0.03
# Vẽ biểu đồ cột thể hiện tần số cho biến gender
gender_plot_1 <- ggplot(gender_table, aes(x = gender, y = `Tần số`, fill = gender)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo Giới tính",
       x = "Giới tính", y = "Tần số") +
  scale_fill_brewer(palette = "Pastel1") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến gender
gender_plot_2 <- ggplot(gender_table, aes(x = "", y = `Tần suất (%)`, fill = gender)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(`Tần suất (%)`, 2), "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo Giới tính",
       x = NULL, y = NULL, fill = "Giới tính") +
  scale_fill_brewer(palette = "Pastel1") +
  theme_void()

# Gộp hai biểu đồ
gender_plot_1 + gender_plot_2

Nhận xét:

  • Phân bố không đồng đều giữa các nhóm giới tính:

    • Nữ chiếm 60.89% tổng số mẫu khảo sát (2,086 người), là nhóm chiếm tỷ lệ cao nhất.

    • Nam chiếm 39.08% (1,339 người), ít hơn đáng kể so với nhóm nữ.

    • Giới tính khác (Other) chỉ chiếm 0.03% (1 người), gần như không đáng kể trong mẫu nghiên cứu.

  • Mẫu khảo sát có xu hướng nghiêng về nhóm giới tính nữ, cho thấy sự mất cân bằng giới tính trong dữ liệu. Điều này có thể ảnh hưởng đến tính đại diện nếu mục tiêu nghiên cứu cần sự phân bố đều giữa các giới tính.

4.1.2. Thống kê mô tả biến Age

Biến age là một biến định lượng liên tục, biểu thị độ tuổi của các bệnh nhân trong mẫu nghiên cứu. Biến này phản ánh khoảng cách và mức độ khác biệt giữa các độ tuổi, cho phép thực hiện các phép đo như trung bình, phương sai, và áp dụng các phương pháp thống kê định lượng để phân tích mối liên hệ với các biến khác như tình trạng sức khỏe hay nguy cơ đột quỵ.

# Thống kê mô tả cho biến age
age_summary <- summary(data$age)
# Hiển thị bảng
age_summary
Thống kê Giá trị
Min. 10
1st Qu. 34
Median 50
Mean 49
3rd Qu. 63
Max. 82
# Biểu đồ mật độ cho biến age
ggplot(data, aes(x = age)) +
  geom_density(fill = "lightyellow", color = "darkblue", alpha = 0.6) +
  labs(
    title = "Biểu đồ mật độ độ tuổi",
    x = "Tuổi",
    y = "Mật độ"
  ) +
  theme_minimal()

Nhận xét:

  • Độ tuổi dao động rộng: Tuổi của bệnh nhân từ 10 đến 82, cho thấy mẫu nghiên cứu bao gồm cả người trẻ và người cao tuổi.

  • Phân phối khá đều nhưng lệch trái:

    • Đỉnh mật độ rơi vào khoảng 50–55 tuổi, cho thấy phần lớn người tham gia có độ tuổi trung niên.

    • Phân phối hơi lệch trái, tức có nhiều người lớn tuổi hơn là trẻ tuổi.

  • Các giá trị đặc trung đo xu thế trung tâm:

    • Trung vị (Median): 50 → một nửa số người có độ tuổi dưới 50.

    • Giá trị trung bình (Mean): 49 → khá gần trung vị, cho thấy không có sự lệch mạnh.

    • Tứ phân vị thứ nhất (Q1): 34 và Q3: 63 → 50% số người nằm trong khoảng từ 34 đến 63 tuổi.

4.1.3. Thống kê mô tả biến Hypertension

Biến hypertension (tăng huyết áp) là một biến phân loại nhị phân, gồm hai mức giá trị: 0 biểu thị không bị tăng huyết áp và 1 biểu thị có bị tăng huyết áp. Đây là một biến quan trọng trong phân tích sức khỏe vì tăng huyết áp là yếu tố nguy cơ phổ biến liên quan đến nhiều vấn đề tim mạch, bao gồm cả đột quỵ.

# Tạo bảng tần số và tần suất cho biến hypertension
hypertension_table <- data %>%
  count(hypertension) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số`= n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
hypertension_table %>%
  kable(col.names = c("Tình trạng tăng huyết áp", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) tình trạng tăng huyết áp")
Bảng tần số và tần suất (%) tình trạng tăng huyết áp
Tình trạng tăng huyết áp Tần số Tần suất (%)
0 3018 88.09
1 408 11.91
# Vẽ biểu đồ cột thể hiện tần số cho biến hypertension
hypertension_plot_1 <- ggplot(hypertension_table, aes(x = hypertension, y = `Tần số`, fill = hypertension)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo tình trạng tăng huyết áp",
       x = "Tình trạng tăng huyết áp", y = "Tần số") +
  scale_fill_brewer(palette = "Accent") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến hypertension
hypertension_plot_2 <- ggplot(hypertension_table, aes(x = "", y = `Tần suất (%)`, fill = hypertension)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(`Tần suất (%)`, 2), "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo tình trạng tăng huyết áp",
       x = NULL, y = NULL, fill = "Tình trạng tăng huyết áp") +
  scale_fill_brewer(palette = "Accent") +
  theme_void()

# Gộp hai biểu đồ
hypertension_plot_1 + hypertension_plot_2

Nhận xét:

Trong tổng số người tham gia khảo sát:

  • 3018 người (chiếm 88.09%) không bị tăng huyết áp.

  • 408 người (chiếm 11.91%) có tình trạng tăng huyết áp.

Điều này cho thấy đa số người tham gia không gặp vấn đề về huyết áp, tuy nhiên tỷ lệ gần 12% có tăng huyết áp là một con số đáng lưu ý trong cộng đồng. Việc phát hiện sớm và theo dõi nhóm này là quan trọng để ngăn ngừa các biến chứng sức khỏe nghiêm trọng liên quan đến tim mạch.

4.1.4. Thống kê mô tả biến Heart disease

Biến heart_disease là biến phân loại nhị phân, phản ánh tình trạng mắc bệnh tim của đối tượng nghiên cứu. Biến được mã hóa với hai mức: 0 tương ứng với không mắc bệnh tim và 1 tương ứng với có mắc bệnh tim.

# Tạo bảng tần số và tần suất cho biến heart_disease
heart_disease_table <- data %>%
  count(heart_disease) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
heart_disease_table %>%
  kable(col.names = c("Tình trạng bệnh tim", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) tình trạng bệnh tim")
Bảng tần số và tần suất (%) tình trạng bệnh tim
Tình trạng bệnh tim Tần số Tần suất (%)
0 3220 93.99
1 206 6.01
# Vẽ biểu đồ cột thể hiện tần số cho biến heart_disease
heart_disease_plot_1 <- ggplot(heart_disease_table, aes(x = heart_disease, y = `Tần số`, fill = heart_disease)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo tình trạng bệnh tim",
       x = "Tình trạng bệnh tim", y = "Tần số") +
  scale_fill_brewer(palette = "Pastel2") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến heart_disease
heart_disease_plot_2 <- ggplot(heart_disease_table, aes(x = "", y = `Tần suất (%)`, fill = heart_disease)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(`Tần suất (%)`, 2), "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo tình trạng bệnh tim",
       x = NULL, y = NULL, fill = "Tình trạng bệnh tim") +
  scale_fill_brewer(palette = "Pastel2") +
  theme_void()

# Gộp hai biểu đồ
heart_disease_plot_1 + heart_disease_plot_2

Nhận xét:

Trong tổng số người tham gia khảo sát:

  • 3220 người (chiếm 93.99%) không mắc bệnh tim.

  • 206 người (chiếm 6.01%) có tình trạng bệnh tim.

Tỷ lệ này phản ánh rằng bệnh tim không phổ biến trong mẫu khảo sát, tuy nhiên sự xuất hiện của bệnh ở một bộ phận nhỏ vẫn là điều cần được lưu ý.

4.1.5. Thống kê mô tả biến Ever married

Biến tình trạng hôn nhân là một biến phân loại nhị phân, thể hiện tình trạng hôn nhân của người tham gia khảo sát với hai mức: “Đã kết hôn” và “Chưa kết hôn”. Biến này giúp phân tích mối liên hệ giữa yếu tố hôn nhân và khả năng mắc các vấn đề sức khỏe như đột quỵ, từ đó cung cấp góc nhìn về vai trò của yếu tố xã hội trong y tế cộng đồng.

# Tạo bảng tần số và tần suất cho biến ever_married
ever_married_table <- data %>%
  count(ever_married) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
ever_married_table %>%
  kable(col.names = c("Tình trạng hôn nhân", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) tình trạng hôn nhân")
Bảng tần số và tần suất (%) tình trạng hôn nhân
Tình trạng hôn nhân Tần số Tần suất (%)
No 827 24.14
Yes 2599 75.86
# Vẽ biểu đồ cột thể hiện tần số cho biến ever_married
ever_married_plot_1 <- ggplot(ever_married_table, aes(x = ever_married, y = `Tần số`, fill = ever_married)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo tình trạng hôn nhân",
       x = "Tình trạng hôn nhân", y = "Tần số") +
  scale_fill_brewer(palette = "PuRd") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến ever_married
ever_married_plot_2 <- ggplot(ever_married_table, aes(x = "", y = `Tần suất (%)`, fill = ever_married)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(`Tần suất (%)`, 2), "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo tình trạng hôn nhân",
       x = NULL, y = NULL, fill = "Tình trạng hôn nhân") +
  scale_fill_brewer(palette = "PuRd") +
  theme_void()

# Gộp hai biểu đồ
ever_married_plot_1 + ever_married_plot_2

Nhận xét:

Kết quả phân tích cho thấy:

  • 75.86% người tham gia khảo sát đã kết hôn (tương ứng 2.599 người).

  • 24.14% chưa kết hôn (tương ứng 827 người).

Tỷ lệ người đã kết hôn chiếm ưu thế trong mẫu khảo sát. Điều này có thể phản ánh đặc điểm về độ tuổi hoặc giai đoạn sống của nhóm đối tượng nghiên cứu – nhiều khả năng là người trưởng thành trong độ tuổi lao động hoặc trung niên.

4.1.6. Thống kê mô tả biến Work type

Biến work_type thể hiện loại hình công việc mà người tham gia khảo sát đang hoặc đã làm. Gồm 5 nhóm: Children (Trẻ em), Govt_job (Nhân viên làm việc trong khu vực nhà nước), Never_worked (Chưa từng làm việc), Private (Làm việc trong doanh nghiệp tư nhân) và Self-employed (Tự làm chủ hoặc làm nghề tự do).

# Tạo bảng tần số và tần suất cho biến work_type
work_type_table <- data %>%
  count(work_type) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
work_type_table %>%
  kable(col.names = c("Loại công việc", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) loại công việc")
Bảng tần số và tần suất (%) loại công việc
Loại công việc Tần số Tần suất (%)
children 68 1.98
Govt_job 514 15.00
Never_worked 14 0.41
Private 2201 64.24
Self-employed 629 18.36
# Vẽ biểu đồ cột thể hiện tần số cho biến work_type
work_type_plot_1 <- ggplot(work_type_table, aes(x = reorder(work_type, -`Tần số`), y = `Tần số`, fill = work_type)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo loại công việc",
       x = "Loại công việc", y = "Tần số") +
  scale_fill_brewer(palette = "Spectral") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến work_type
work_type_plot_2 <- ggplot(work_type_table, aes(x = "", y = `Tần suất (%)`, fill = work_type)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(`Tần suất (%)`, "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo loại công việc",
       x = NULL, y = NULL, fill = "Loại công việc") +
  scale_fill_brewer(palette = "Spectral") +
  theme_void()

# Gộp hai biểu đồ
work_type_plot_1 + work_type_plot_2

Nhận xét:

  • Nhóm làm việc trong khu vực Private chiếm tỷ lệ lớn nhất (64.24%), cho thấy khu vực tư nhân là nguồn lao động chủ yếu.

  • Tỷ lệ Self-employed (18.36%) tương đối cao, phản ánh xu hướng lao động tự chủ hoặc làm nghề tự do.

  • Govt_job chiếm 15%, thể hiện mức độ ổn định của lao động trong khu vực công.

  • Children và Never_worked chiếm tỷ lệ rất thấp (dưới 2.5%), cho thấy đa phần mẫu khảo sát là người trong độ tuổi lao động.

Nhìn chung, Biến work_type cho thấy phần lớn người tham gia khảo sát làm việc trong khu vực tư nhân, theo sau là lao động tự do và khu vực nhà nước, trong khi số người chưa từng làm việc hoặc còn nhỏ chiếm tỷ lệ rất thấp.

4.1.7 Thống kê mô tả biến Residence type

Biến Residence type biểu thị nơi cư trú của đối tượng nghiên cứu, được chia thành hai mức: Urban (khu vực thành thị) và Rural (khu vực nông thôn). Biến này giúp phản ánh điều kiện sống và môi trường sinh hoạt – những yếu tố có thể ảnh hưởng đến sức khỏe và nguy cơ mắc các bệnh như đột quỵ. Trong thống kê mô tả, việc phân tích biến này giúp ta hiểu rõ hơn về phân bố dân cư theo khu vực trong tập dữ liệu.

# Tạo bảng tần số và tần suất cho biến Residence_type
residence_table <- data %>%
  count(Residence_type) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
residence_table %>%
  kable(col.names = c("Loại nơi cư trú", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) theo loại nơi cư trú")
Bảng tần số và tần suất (%) theo loại nơi cư trú
Loại nơi cư trú Tần số Tần suất (%)
Rural 1681 49.07
Urban 1745 50.93
# Vẽ biểu đồ cột thể hiện tần số cho biến Residence_type
residence_plot_1 <- ggplot(residence_table, aes(x = Residence_type, y = `Tần số`, fill = Residence_type)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo loại nơi cư trú",
       x = "Loại nơi cư trú", y = "Tần số") +
  scale_fill_brewer(palette = "RdPu") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến Residence_type
residence_plot_2 <- ggplot(residence_table, aes(x = "", y = `Tần suất (%)`, fill = Residence_type)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(`Tần suất (%)`, "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo loại nơi cư trú",
       x = NULL, y = NULL, fill = "Loại nơi cư trú") +
  scale_fill_brewer(palette = "RdPu") +
  theme_void()

# Gộp hai biểu đồ
residence_plot_1 + residence_plot_2

Nhận xét:

  • Tỷ lệ người tham gia khảo sát sống ở khu vực thành thị (Urban) chiếm 50.93%, nhỉnh hơn một chút so với khu vực nông thôn (Rural) là 49.07%. Điều này cho thấy mẫu dữ liệu có sự phân bố tương đối đồng đều theo loại nơi cư trú.

  • Sự khác biệt không lớn giữa hai loại nơi cư trú cũng có thể phản ánh sự phổ biến đồng đều của các yếu tố nguy cơ đột quỵ ở cả khu vực nông thôn và thành thị trong cộng đồng hiện nay.

4.1.8. Thống kê mô tả biến Avg glucose level

Biến avg_glucose_level là biến định lượng, đo mức đường huyết trung bình của bệnh nhân (mg/dL), phản ánh tình trạng chuyển hóa đường trong máu và liên quan đến nguy cơ đột quỵ.

# Thống kê mô tả cho biến avg_glucose_level
glucose_summary <- summary(data$avg_glucose_level)
# Hiển thị bảng
glucose_summary
Thống kê Giá trị
Min. 55.12
1st Qu. 77.24
Median 92.36
Mean 108.32
3rd Qu. 116.21
Max. 271.74
# Biểu đồ histogram cho biến avg_glucose_level
ggplot(data, aes(x = avg_glucose_level)) +
  geom_histogram(binwidth = 5, fill = "skyblue", color = "black", alpha = 0.7) +
  labs(
    title = "Biểu đồ histogram mức đường huyết trung bình",
    x = "Mức đường huyết trung bình (mg/dL)",
    y = "Tần số"
  ) +
  theme_minimal()

Nhận xét:

  • Phân phối lệch phải (right-skewed): Biểu đồ có đuôi kéo dài về bên phải (các giá trị lớn hơn), điều này cho thấy có một số cá nhân có mức đường huyết rất cao so với phần lớn người khác.

  • Giá trị trung bình (Mean = 108) > Trung vị (Median = 92): Điều này cũng xác nhận sự lệch phải của phân phối.

  • Khoảng giá trị phổ biến nhất: Tần số cao nhất rơi vào khoảng 80 – 110 mg/dL, cho thấy phần lớn người khảo sát có mức đường huyết nằm trong ngưỡng này.

  • Một số giá trị ngoại lệ: Có một nhóm nhỏ đối tượng có mức đường huyết rất cao (trên 200 mg/dL), đây có thể là các cá nhân có nguy cơ cao liên quan đến bệnh tiểu đường.

4.1.9. Thống kê mô tả biến BMI

Biến BMI (Body Mass Index - Chỉ số khối cơ thể) là một biến định lượng, sử dụng để đánh giá tình trạng cân nặng của một người dựa trên chiều cao và cân nặng. Chỉ số này thường được sử dụng để phân loại mức độ gầy, bình thường, thừa cân hoặc béo phì trong nghiên cứu y tế và sức khỏe.

# Thống kê mô tả cho biến bmi
bmi_summary <- summary(data$bmi)
# Hiển thị bảng
bmi_summary
Thống kê Giá trị
Min. 11.50
1st Qu. 25.30
Median 29.10
Mean 30.29
3rd Qu. 34.10
Max. 92.00
# Biểu đồ mật độ cho biến BMI
ggplot(data, aes(x = bmi)) +
  geom_density(fill = "lightyellow", color = "orange", alpha = 0.6) +
  labs(
    title = "Biểu đồ mật độ chỉ số BMI",
    x = "BMI",
    y = "Mật độ"
  ) +
  theme_minimal()

Nhận xét:

  • Hình dạng phân bố: Phân bố của chỉ số BMI có dạng lệch phải (skewed right), nghĩa là phần lớn giá trị tập trung ở bên trái (BMI thấp đến trung bình), và có đuôi kéo dài về bên phải do tồn tại một số cá thể có BMI rất cao.

  • Đỉnh phân bố (Mode): Đỉnh cao nhất nằm gần 25, tức là nhiều người có chỉ số BMI trong khoảng cận trên chuẩn bình thường hoặc tiền béo phì (theo chuẩn của WHO: BMI 18.5–24.9 là bình thường, 25–29.9 là thừa cân).

  • Giá trị cực đại (Max = 92.00) rất cao và xa trung tâm → có thể là outlier cần xem xét thêm.

4.1.10 Thống kê mô tả biến Smoking status

Biến soking_status (Tình trạng hút thuốc) phản ánh thói quen hút thuốc của người tham gia khảo sát, được phân loại thành ba nhóm: “formerly smoked” (đã từng hút thuốc), “never smoked” (chưa từng hút thuốc) và “smokes” (hiện đang hút thuốc). Đây là một biến định tính dạng danh mục, thường được sử dụng để phân tích mối liên hệ với các vấn đề sức khỏe như đột quỵ, bệnh tim mạch hoặc hô hấp.

# Tạo bảng tần số và tần suất cho biến smoking_status
smoking_status_table <- data %>%
  count(smoking_status) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>% 
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
smoking_status_table %>%
  kable(col.names = c("Tình trạng hút thuốc", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) tình trạng hút thuốc")
Bảng tần số và tần suất (%) tình trạng hút thuốc
Tình trạng hút thuốc Tần số Tần suất (%)
formerly smoked 837 24.43
never smoked 1852 54.06
smokes 737 21.51
# Vẽ biểu đồ cột thể hiện tần số cho biến smoking_status
smoking_status_plot_1 <- ggplot(smoking_status_table, aes(x = smoking_status, y = `Tần số`, fill = smoking_status)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo tình trạng hút thuốc",
       x = "Tình trạng hút thuốc", y = "Tần số") +
  scale_fill_brewer(palette = "Set3") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến smoking_status
smoking_status_plot_2 <- ggplot(smoking_status_table, aes(x = "", y = `Tần suất (%)`, fill = smoking_status)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(`Tần suất (%)`, 2), "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo tình trạng hút thuốc",
       x = NULL, y = NULL, fill = "Tình trạng hút thuốc") +
  scale_fill_brewer(palette = "Set3") +
  theme_void()

# Gộp hai biểu đồ
smoking_status_plot_1 + smoking_status_plot_2

Nhận xét:

  • Tỷ lệ người chưa từng hút thuốc chiếm cao nhất trong mẫu, với 54.06% (1852 người), cho thấy phần lớn người tham gia có lối sống không hút thuốc.

  • 24.43% (837 người) đã từng hút thuốc nhưng hiện đã bỏ, cho thấy một xu hướng chuyển đổi hành vi theo hướng tích cực trong cộng đồng.

  • 21.51% (737 người) hiện vẫn đang hút thuốc, là một tỷ lệ đáng lưu ý, cần được theo dõi và can thiệp phù hợp để phòng tránh các bệnh liên quan đến thuốc lá.

Nhìn chung, Phần lớn người tham gia chưa từng hút thuốc (54.06%), trong khi khoảng 46% còn lại từng hút hoặc đang hút, cho thấy hành vi hút thuốc vẫn khá phổ biến.

4.1.11 Thống kê mô tả biến Stroke

Biến stroke là biến nhị phân phản ánh tình trạng từng bị đột quỵ của cá nhân. Biến này gồm hai giá trị: “Yes” (có đột quỵ) và “No” (không có đột quỵ), được mã hóa dưới dạng factor để phục vụ cho việc phân tích. Đây là biến phụ thuộc chính trong nghiên cứu nhằm tìm hiểu các yếu tố nguy cơ liên quan đến tình trạng đột quỵ.

# Tạo bảng tần số và tần suất cho biến stroke
stroke_table <- data %>%
  count(stroke) %>%
  mutate(Percentage = n / sum(n) * 100) %>%
  rename(`Tần số` = n,
         `Tần suất (%)` = Percentage) %>%
  mutate(`Tần suất (%)` = round(`Tần suất (%)`, 2))

# Hiển thị bảng
stroke_table %>%
  kable(col.names = c("Tình trạng đột quỵ", "Tần số", "Tần suất (%)"),
        caption = "Bảng tần số và tần suất (%) tình trạng đột quỵ")
Bảng tần số và tần suất (%) tình trạng đột quỵ
Tình trạng đột quỵ Tần số Tần suất (%)
0 3246 94.75
1 180 5.25
# Vẽ biểu đồ cột thể hiện tần số cho biến stroke
stroke_plot_1 <- ggplot(stroke_table, aes(x = stroke, y = `Tần số`, fill = stroke)) +
  geom_col() +
  geom_text(aes(label = `Tần số`), vjust = 0.5, size = 4) +
  labs(title = "Tần số theo tình trạng đột quỵ",
       x = "Tình trạng đột quỵ", y = "Tần số") +
  scale_fill_brewer(palette = "Reds") +
  theme_minimal() +
  theme(legend.position = "none")

# Vẽ biểu đồ tròn thể hiện tần suất cho biến stroke
stroke_plot_2 <- ggplot(stroke_table, aes(x = "", y = `Tần suất (%)`, fill = stroke)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(`Tần suất (%)`, "%")),
            position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tần suất (%) theo tình trạng đột quỵ",
       x = NULL, y = NULL, fill = "Tình trạng đột quỵ") +
  scale_fill_brewer(palette = "Reds") +
  theme_void()

# Gộp hai biểu đồ
stroke_plot_1 + stroke_plot_2

Nhận xét:

  • Tỷ lệ không đột quỵ chiếm đa số: Có 3246 người (94.75%) không bị đột quỵ trong tổng số quan sát.

  • Tỷ lệ từng bị đột quỵ tương đối thấp: Chỉ có 180 người (5.25%) có tiền sử đột quỵ.

Biến tình trạng đột quỵ cho thấy phần lớn người tham gia khảo sát chưa từng bị đột quỵ, trong khi chỉ có số ít từng trải qua đột quỵ. Điều này cho thấy đột quỵ là một biến cố hiếm trong mẫu dữ liệu, tuy nhiên vẫn cần được quan tâm do mức độ nghiêm trọng và nguy cơ sức khỏe tiềm ẩn mà nó mang lại.

4.2 Kiểm định mối quan hệ giữa biến độc lập và phụ thuộc

Bộ dữ liệu nghiên cứu bao gồm cả các biến định tính (như giới tính, tình trạng hôn nhân, nghề nghiệp) và định lượng (như tuổi, mức đường huyết, chỉ số BMI). Do đó, để thuận tiện trong việc phân tích mối quan hệ giữa các biến độc lập và biến phụ thuộc (tình trạng đột quỵ), các biến định lượng sẽ được phân loại thành các nhóm và mã hóa thành biến định tính. Việc chuyển đổi này giúp việc thống kê mô tả, so sánh nhóm và kiểm định mối liên hệ giữa các yếu tố trở nên dễ dàng và trực quan hơn.

4.2.1 Mã hóa dữ liệu

Đối với biến Age

Biến tuổi tác sẽ được chia thành 5 nhóm. Việc chia thành 5 nhóm dựa trên các giai đoạn phát triển và nguy cơ sức khỏe khác nhau trong đời người. Cụ thể:

  • Dưới 35 tuổi: Nhóm trẻ, nguy cơ đột quỵ thấp.

  • Từ 35–44 và 45–54 tuổi: Bắt đầu xuất hiện các yếu tố nguy cơ như huyết áp cao, tim mạch.

  • Từ 55–64 tuổi: Nguy cơ gia tăng đáng kể do tuổi tác và tích lũy bệnh nền.

  • Trên 65 tuổi: Nhóm cao tuổi, có nguy cơ đột quỵ cao nhất.

# Phân dữ liệu thành 5 nhóm
data$age <- cut(data$age, 
                breaks = c(-Inf, 34, 44, 54, 64, Inf),
                labels = c("<35", "35–44", "45–54", "55–64", "≥65"),
                             right = TRUE)

Đối với biến avg_glucose_level

Trong nghiên cứu này, biến định lượng avg_glucose_level được chia thành ba nhóm: thấp (≤ 100), trung bình (101–140) và cao (> 140) nhằm mục đích đơn giản hóa phân tích và thuận tiện khi kiểm định mối liên hệ với biến định tính như stroke. Việc phân nhóm giúp so sánh tỷ lệ đột quỵ giữa các mức đường huyết khác nhau một cách rõ ràng hơn. Đồng thời, chia thành ba mức đảm bảo số lượng quan sát trong mỗi nhóm đủ lớn để thực hiện kiểm định thống kê chính xác và có ý nghĩa.

# Phân dữ liệu thành 3 nhóm
data$avg_glucose_level <- cut(data$avg_glucose_level,
                          breaks = c(-Inf, 100, 140, Inf),
                          labels = c("Thấp", "Trung bình", "Cao"),
                          right = TRUE)

Đối với biến BMI

Biến BMI (Body Mass Index) là biến định lượng liên tục, phản ánh chỉ số khối cơ thể. Để thuận tiện cho việc phân tích mối liên hệ giữa BMI và tình trạng đột quỵ (biến định tính), đồng thời giúp dễ dàng trình bày và diễn giải kết quả, biến này được phân nhóm theo 4 mức độ sức khỏe dựa trên phân loại chuẩn của Tổ chức Y tế Thế giới (WHO), như sau:

  • Nhóm 1 – Thiếu cân: Bao gồm các cá nhân có chỉ số BMI nhỏ hơn 18.5 (BMI < 18.5).

  • Nhóm 2 – Bình thường: Gồm những người có chỉ số BMI từ 18.5 đến dưới 25 (18.5 ≤ BMI < 25).

  • Nhóm 3 – Thừa cân: Gồm các trường hợp có chỉ số BMI từ 25 đến dưới 30 (25 ≤ BMI < 30).

  • Nhóm 4 – Béo phì: Bao gồm các cá nhân có chỉ số BMI từ 30 trở lên (BMI ≥ 30).

data$bmi <- cut(data$bmi,
                breaks = c(-Inf, 18.5, 25, 30, Inf),
                labels = c("Thiếu cân", "Bình thường", "Thừa cân", "Béo phì"),
                right = FALSE)

4.2.2 Thực hiện kiểm định chi bình phương

Kiểm định Chi-bình phương là công cụ thống kê giúp đánh giá xem hai biến định tính có mối liên hệ hay không. Việc xác định sự độc lập giữa các biến giúp hiểu rõ hơn mối quan hệ giữa các yếu tố, từ đó hỗ trợ ra quyết định chính xác.

Với cặp giả thuyết kiểm định:

  • Giả thuyết \(H_0\): Hai biến độc lập với nhau.

  • Giả thuyết \(H_1\): Hai biến có mối quan hệ với nhau.

Nếu giá trị p-value < 0.05, bác bỏ \(H_0\), tức là có mối liên hệ thống kê giữa hai biến. Ngược lại, nếu p-value ≥ 0.05 thì không đủ bằng chứng để bác bỏ \(H_0\), nghĩa là hai biến độc lập với nhau.

Đối với biến Stroke và Gender

chisq.test(table(data$stroke, data$gender))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$gender)
## X-squared = 0.58334, df = 2, p-value = 0.747

Đối với biến Stroke và Age

chisq.test(table(data$stroke, data$age))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$age)
## X-squared = 218.13, df = 4, p-value < 2.2e-16

Đối với biến Stroke và Hypertension

chisq.test(table(data$stroke, data$hypertension))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$stroke, data$hypertension)
## X-squared = 68.72, df = 1, p-value < 2.2e-16

Đối với biến Stroke và Heart disease

chisq.test(table(data$stroke, data$heart_disease))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$stroke, data$heart_disease)
## X-squared = 63.183, df = 1, p-value = 1.884e-15

Đối với biến Stroke và Ever married

chisq.test(table(data$stroke, data$ever_married))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$stroke, data$ever_married)
## X-squared = 16.865, df = 1, p-value = 4.013e-05

Đối với biến Stroke và Work type

chisq.test(table(data$stroke, data$work_type))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$work_type)
## X-squared = 12.717, df = 4, p-value = 0.01274

Đối với biến Stroke và Residence type

chisq.test(table(data$stroke, data$Residence_type))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$stroke, data$Residence_type)
## X-squared = 0.07761, df = 1, p-value = 0.7806

Đối với biến Stroke và Avg glucose level

chisq.test(table(data$stroke, data$avg_glucose_level))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$avg_glucose_level)
## X-squared = 60.107, df = 2, p-value = 8.872e-14

Đối với biến Stroke và BMI

chisq.test(table(data$stroke, data$bmi))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$bmi)
## X-squared = 4.9942, df = 3, p-value = 0.1722

Đối với biến Smoking status

chisq.test(table(data$stroke, data$smoking_status))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$stroke, data$smoking_status)
## X-squared = 5.9932, df = 2, p-value = 0.04996

Dựa vào các kết quả kiểm định trên, ta tóm tắt thành bảng sau:

Tên biến p-value Kết luận
gender 0.747 Không có mối liên hệ với đột quỵ
age < 2.2e-16 Có mối liên hệ với đột quỵ
hypertension < 2.2e-16 Có mối liên hệ với đột quỵ
heart_disease 1.884e-15 Có mối liên hệ với đột quỵ
ever_married 4.013e-05 Có mối liên hệ với đột quỵ
work_type 0.01274 Có mối liên hệ với đột quỵ
Residence_type 0.7806 Không mối liên hệ với đột quỵ
avg_glucose_level 8.872e-14 Có mối liên hệ với đột quỵ
bmi 0.1722 Không mối liên hệ với đột quỵ
smoking_status 0.04996 Có mối liên hệ với đột quỵ

Trong khuôn khổ nghiên cứu này, bài báo cáo tập trung phân tích các yếu tố ảnh hưởng đến nguy cơ đột quỵ dựa trên kết quả từ bộ dữ liệu thu thập được. Cụ thể, chỉ những biến có mối liên hệ thống kê với đột quỵ mới được đưa vào phân tích sâu hơn, bao gồm: độ tuổi, tình trạng tăng huyết áp, bệnh tim, tình trạng hôn nhân, loại hình việc làm, mức đường huyết trung bình và tình trạng hút thuốc.

4.3. Phân tích mối quan hệ giữa hai biến

4.3.1 Đối với biến Stroke và Age

Thống kê bảng tần số và tần suất

Biến tuổi có thể có mối quan hệ chặt chẽ với tình trạng đột quỵ, bởi nguy cơ đột quỵ thường gia tăng theo độ tuổi. Khi tuổi càng cao, cơ thể dễ mắc các bệnh lý nền như tăng huyết áp, tiểu đường hay xơ vữa động mạch – những yếu tố làm tăng khả năng xảy ra đột quỵ. Do đó, tuổi tác được xem là một yếu tố nguy cơ quan trọng cần được xem xét trong các phân tích về sức khỏe tim mạch và mạch máu não.

# Tạo bảng tần số
table_age_stroke <- table(data$age, data$stroke)
colnames(table_age_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Tạo bảng tần suất
prop_age_stroke <- round(prop.table(table_age_stroke, margin =1),3)
colnames(prop_age_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Gộp 2 bảng
combined_age_stroke <- cbind(table_age_stroke, prop_age_stroke)

# Chuyển thành dataframe
df_combined_age_stroke <- as.data.frame.matrix(combined_age_stroke)

# Hiển thị bảng
kable(df_combined_age_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo độ tuổi") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo độ tuổi
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
<35 901 1 0.999 0.001
35–44 526 4 0.992 0.008
45–54 600 25 0.960 0.040
55–64 550 33 0.943 0.057
≥65 669 117 0.851 0.149
ggplot(data, aes(x = age, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("0" = "lightyellow", "1" = "darkblue"),
    labels = c("Không đột quỵ", "Đột quỵ")
  ) +
  labs(
    title = "Biểu đồ tần số tình trạng đột quỵ theo nhóm tuổi",
    x = "Nhóm tuổi",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

Nhóm tuổi càng cao, tần suất đột quỵ càng lớn:

  • Ở nhóm <35 tuổi, tần suất đột quỵ cực thấp (0.1%), gần như không đáng kể.

  • Tỷ lệ tăng dần qua các nhóm tuổi, đặc biệt ở nhóm ≥65 tuổi, tần suất đột quỵ lên đến 14.9% — cao nhất trong tất cả các nhóm.

Chênh lệch rõ rệt giữa “không đột quỵ” và “đột quỵ”:

  • Ở các nhóm tuổi thấp (dưới 55), gần như tất cả đều không bị đột quỵ.

  • Sự khác biệt thu hẹp dần ở nhóm tuổi cao hơn, nhất là từ 55–64 tuổi trở lên.

Tỷ số nguy cơ

riskratio(table_age_stroke, method = "wald")
## $data
##        
##         Không đột quỵ Đột quỵ Total
##   <35             901       1   902
##   35–44           526       4   530
##   45–54           600      25   625
##   55–64           550      33   583
##   ≥65             669     117   786
##   Total          3246     180  3426
## 
## $measure
##        risk ratio with 95% C.I.
##           estimate      lower    upper
##   <35     1.000000         NA       NA
##   35–44   6.807547  0.7628855  60.7466
##   45–54  36.080000  4.9016131 265.5792
##   55–64  51.056604  7.0021999 372.2797
##   ≥65   134.267176 18.7995757 958.9405
## 
## $p.value
##        two-sided
##           midp.exact fisher.exact   chi.square
##   <35             NA           NA           NA
##   35–44 7.256512e-02 6.570262e-02 4.611354e-02
##   45–54 2.458951e-09 2.399103e-09 7.642707e-09
##   55–64 4.951595e-13 4.866758e-13 2.909203e-12
##   ≥65   0.000000e+00 6.810511e-40 1.600014e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm tuổi Risk Ratio (95% CI) p-value (Chi-square) Nhận xét
<35 1.00 (ref) NA Nhóm <35 được chọn làm nhóm chuẩn (baseline) để so sánh.
35–44 6.81 (0.76 – 60.75) 0.0461 Nguy cơ đột quỵ cao hơn ~6.8 lần so với nhóm <35, nhưng khoảng tin cậy chứa giá trị 1, tức là có khả năng risk ratio = 1 (không khác biệt). Vì vậy, chưa đủ bằng chứng thống kê để khẳng định có sự khác biệt thực sự giữa hai nhóm.
45–54 36.08 (4.90 – 265.58) 7.64e-09 Nguy cơ đột quỵ tăng mạnh (~36 lần), có ý nghĩa thống kê cao.
55–64 51.06 (7.00 – 372.28) 2.91e-12 Nguy cơ rất cao (~51 lần), khác biệt có ý nghĩa thống kê rõ ràng.
≥65 134.27 (18.80 – 958.94) 1.60e-32 Nguy cơ cao nhất (~134 lần), khác biệt có ý nghĩa rất mạnh.

lưu ý: Nếu khoảng tin cậy (CI) chứa 1.00 trong risk ratio, điều đó có nghĩa rằng có thể tồn tại khả năng nguy cơ giữa hai nhóm là bằng nhau, do đó không thể kết luận chắc chắn có sự khác biệt thống kê, ngay cả khi p-value xấp xỉ 0.05.

Tỷ số chênh

oddsratio(table_age_stroke, method = "wald", conf.level = 0.95)
## $data
##        
##         Không đột quỵ Đột quỵ Total
##   <35             901       1   902
##   35–44           526       4   530
##   45–54           600      25   625
##   55–64           550      33   583
##   ≥65             669     117   786
##   Total          3246     180  3426
## 
## $measure
##        odds ratio with 95% C.I.
##           estimate      lower      upper
##   <35     1.000000         NA         NA
##   35–44   6.851711  0.7638028   61.46343
##   45–54  37.541667  5.0733744  277.79868
##   55–64  54.060000  7.3730454  396.37402
##   ≥65   157.573991 21.9558370 1130.88664
## 
## $p.value
##        two-sided
##           midp.exact fisher.exact   chi.square
##   <35             NA           NA           NA
##   35–44 7.256512e-02 6.570262e-02 4.611354e-02
##   45–54 2.458951e-09 2.399103e-09 7.642707e-09
##   55–64 4.951595e-13 4.866758e-13 2.909203e-12
##   ≥65   0.000000e+00 6.810511e-40 1.600014e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm tuổi Odds Ratio (95% CI) p-value (Chi-square) Nhận xét
<35 1.00 (ref) NA Nhóm chuẩn, dùng làm mốc so sánh.
35–44 6.85 (0.76 – 61.46) 0.0461 Mặc dù tỷ lệ đột quỵ ở nhóm này cao hơn khoảng 6.85 lần so với nhóm <35, nhưng khoảng tin cậy chứa 1, nghĩa là có thể OR = 1 (không khác biệt). Do đó, chưa đủ bằng chứng thống kê để khẳng định khác biệt.
45–54 37.54 (5.07 – 277.80) 7.64e-09 Tỷ lệ đột quỵ tăng mạnh (~37.5 lần), có ý nghĩa thống kê cao.
55–64 54.06 (7.37 – 396.37) 2.91e-12 Tỷ lệ rất cao (~54 lần), khác biệt có ý nghĩa thống kê rõ ràng.
≥65 157.57 (21.96 – 1130.89) 1.60e-32 Cao nhất (~158 lần), có ý nghĩa thống kê rất mạnh.

lưu ý: Nếu khoảng tin cậy (CI) chứa 1.00 trong odds ratio, điều đó có nghĩa rằng có thể tồn tại khả năng nguy cơ giữa hai nhóm là bằng nhau, do đó không thể kết luận chắc chắn có sự khác biệt thống kê, ngay cả khi p-value xấp xỉ 0.05.

Nhận xét chung

Kết quả phân tích cho thấy tuổi có mối liên hệ chặt chẽ với nguy cơ đột quỵ:

  • Tỷ lệ mắc đột quỵ tăng dần theo độ tuổi. Ở nhóm <35 tuổi, tỷ lệ đột quỵ rất thấp, nhưng bắt đầu tăng rõ rệt từ nhóm 45–54 trở đi, đặc biệt rất cao ở nhóm ≥65 tuổi.

  • Các Risk Ratio (RR) và Odds Ratio (OR) đều cho thấy xu hướng tăng mạnh theo tuổi:

    • Nhóm ≥65 tuổi có nguy cơ đột quỵ cao gấp ~80–160 lần so với nhóm <35.

    • Nhóm 45–54 và 55–64 cũng có nguy cơ tăng đáng kể, với các RR và OR đều trên 30–50 lần.

4.3.2 Đối với biến Stroke và Hypertension

Thống kê bảng tần số và tần suất

Cao huyết áp là nguyên nhân phổ biến nhất dẫn đến đột quỵ. Huyết áp cao làm tổn thương mạch máu não, tăng nguy cơ tắc nghẽn hoặc vỡ mạch. Trong thực tế, phần lớn bệnh nhân đột quỵ đều có tiền sử tăng huyết áp. Vì vậy, kiểm soát huyết áp là cách hiệu quả để phòng ngừa đột quỵ.

# Tạo bảng tần số
table_hypertension_stroke <- table(data$hypertension, data$stroke)
colnames(table_hypertension_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(table_hypertension_stroke) <- c("Không tăng huyết áp", "Tăng huyết áp")

# Tạo bảng tần suất
prop_hypertension_stroke <- round(prop.table(table_hypertension_stroke, margin =1),3)
colnames(prop_hypertension_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(prop_hypertension_stroke) <- c("Không tăng huyết áp", "Tăng huyết áp")

# Gộp 2 bảng
combined_hypertension_stroke <- cbind(table_hypertension_stroke, prop_hypertension_stroke)

# Chuyển thành dataframe
df_ombined_hypertension_stroke <- as.data.frame.matrix(combined_hypertension_stroke)

# Hiển thị bảng
kable(df_ombined_hypertension_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo tình trạng tăng huyết áp") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo tình trạng tăng huyết áp
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
Không tăng huyết áp 2895 123 0.959 0.041
Tăng huyết áp 351 57 0.860 0.140
ggplot(data, aes(x = hypertension, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("0" = "darkgreen", "1" = "purple"),
    labels = c("Không đột quỵ", "Đột quỵ")
  ) +
  labs(
    title = "Biểu đồ tần số tình trạng đột quỵ theo tình trạng tăng huyết áp",
    x = "Tình trạng tăng huyết áp",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

  • Tỷ lệ đột quỵ ở người có tăng huyết áp là 14%, cao hơn nhiều so với 4.1% ở người không tăng huyết áp.

  • Như vậy, tăng huyết áp có thể là yếu tố nguy cơ quan trọng làm gia tăng khả năng bị đột quỵ.

  • Người bị tăng huyết áp có nguy cơ đột quỵ cao hơn khoảng 3 lần so với người không bị.

Hiệu hai tỷ lệ

Với giả thuyết kiểm định:

  • \(H_0\): \(p_1 = p_2\): Tỷ lệ đột quỵ ở hai nhóm là bằng nhau – không có sự khác biệt.

  • \(H_0\): \(p_1 \neq p_2\): Tỷ lệ đột quỵ ở hai nhóm là khác nhau.

    Trong đó:

    • \(p_1\) là Tỷ lệ đột quỵ ở nhóm người có tăng huyết áp.

    • \(p_2\) là Tỷ lệ đột quỵ ở nhóm người không tăng huyết áp.

prop.test(x = c(57, 123), n = c(408, 3018))
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(57, 123) out of c(408, 3018)
## X-squared = 68.72, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.06318814 0.13471269
## sample estimates:
##     prop 1     prop 2 
## 0.13970588 0.04075547
  • Tỷ lệ đột quỵ ở nhóm tăng huyết áp là 13.97%, cao hơn rõ rệt so với nhóm không tăng huyết áp (4.08%).

  • Kết quả kiểm định cho thấy:

    • Giá trị p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa 0.05.

    • Vì vậy, bác bỏ giả thuyết không \(H_0\) – tức là có sự khác biệt có ý nghĩa thống kê về tỷ lệ đột quỵ giữa hai nhóm.

  • Khoảng tin cậy 95% cho hiệu tỷ lệ nằm trong khoảng [0.063; 0.135], nghĩa là: Nhóm tăng huyết áp có nguy cơ đột quỵ cao hơn nhóm không tăng huyết áp từ 6.3% đến 13.5%.

Tỷ số nguy cơ

riskratio(table_hypertension_stroke, method = "wald")
## $data
##                      
##                       Không đột quỵ Đột quỵ Total
##   Không tăng huyết áp          2895     123  3018
##   Tăng huyết áp                 351      57   408
##   Total                        3246     180  3426
## 
## $measure
##                      risk ratio with 95% C.I.
##                       estimate    lower    upper
##   Không tăng huyết áp 1.000000       NA       NA
##   Tăng huyết áp       3.427905 2.548251 4.611215
## 
## $p.value
##                      two-sided
##                        midp.exact fisher.exact   chi.square
##   Không tăng huyết áp          NA           NA           NA
##   Tăng huyết áp       3.88356e-13 3.095809e-13 4.172136e-17
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm huyết áp Risk Ratio (95% CI) p-value (Chi-square) Nhận xét
Không tăng huyết áp 1.00 (ref) NA Đây là nhóm tham chiếu, dùng để so sánh với nhóm “Tăng huyết áp”.
Tăng huyết áp 3.43 (2.55 – 4.61) 4.17e-17 Nguy cơ đột quỵ ở người tăng huyết áp cao hơn khoảng 3.4 lần so với người không tăng huyết áp. Khoảng tin cậy không chứa 1, và p-value rất nhỏ → có ý nghĩa thống kê mạnh.

Tỷ số chênh

oddsratio(table_hypertension_stroke, method = "wald", conf.level = 0.95)
## $data
##                      
##                       Không đột quỵ Đột quỵ Total
##   Không tăng huyết áp          2895     123  3018
##   Tăng huyết áp                 351      57   408
##   Total                        3246     180  3426
## 
## $measure
##                      odds ratio with 95% C.I.
##                       estimate    lower    upper
##   Không tăng huyết áp 1.000000       NA       NA
##   Tăng huyết áp       3.822181 2.739594 5.332566
## 
## $p.value
##                      two-sided
##                        midp.exact fisher.exact   chi.square
##   Không tăng huyết áp          NA           NA           NA
##   Tăng huyết áp       3.88356e-13 3.095809e-13 4.172136e-17
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm huyết áp Odds Ratio (95% CI) p-value (Chi-square) Nhận xét
Không tăng huyết áp 1.00 (ref) NA Nhóm không tăng huyết áp được chọn làm nhóm chuẩn (baseline) để so sánh.
Tăng huyết áp 3.82 (2.74 – 5.33) 4.17e-17 Người tăng huyết áp có odds đột quỵ cao hơn khoảng 3.8 lần so với người không tăng huyết áp. Khoảng tin cậy không chứa 1, p rất nhỏ → có ý nghĩa thống kê mạnh.

Nhận xét chung

  • Tỷ lệ đột quỵ ở người tăng huyết áp (13.97%) cao gấp hơn 3 lần so với người không tăng huyết áp (4.08%). Điều này phản ánh sự khác biệt rõ rệt về tần suất mắc bệnh giữa hai nhóm.

  • Các chỉ số Risk Ratio (RR) và Odds Ratio (OR) đều cho thấy mức độ nguy cơ tăng mạnh ở nhóm có tăng huyết áp:

    • Risk Ratio = 3.43 (CI 95%: 2.55 – 4.61): Người tăng huyết áp có nguy cơ đột quỵ cao gấp ~3.4 lần so với người không tăng huyết áp.

    • Odds Ratio = 3.82 (CI 95%: 2.74 – 5.33): Xác suất bị đột quỵ ở người tăng huyết áp cũng cao hơn ~3.8 lần, khác biệt có ý nghĩa thống kê mạnh.

  • Kiểm định hiệu hai tỷ lệ cho kết quả p-value < 2.2e-16, và khoảng tin cậy cho hiệu tỷ lệ nằm trong khoảng [6.3%; 13.5%], khẳng định rằng sự khác biệt không phải do ngẫu nhiên.

Như vậy, tăng huyết áp là yếu tố nguy cơ quan trọng và có ý nghĩa thống kê cao trong việc gia tăng khả năng bị đột quỵ, từ đó nhấn mạnh vai trò thiết yếu của việc kiểm soát huyết áp trong phòng ngừa đột quỵ.

4.3.3. Đối với biến Stroke và Heart disease

Thống kê bảng tần số và tần suất

Bệnh tim có mối liên hệ mật thiết với nguy cơ đột quỵ. Các rối loạn về tim, đặc biệt là rung nhĩ và suy tim, có thể làm máu lưu thông kém hoặc hình thành cục máu đông, từ đó gây tắc nghẽn mạch máu não. Ngoài ra, bệnh tim thường đi kèm với các yếu tố nguy cơ khác như tăng huyết áp hoặc xơ vữa động mạch, làm gia tăng nguy cơ đột quỵ. Do đó, chăm sóc và kiểm soát sức khỏe tim mạch đóng vai trò quan trọng trong việc phòng ngừa đột quỵ.

# Tạo bảng tần số
table_heart_stroke <- table(data$heart_disease, data$stroke)
colnames(table_heart_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(table_heart_stroke) <- c("Không bệnh tim", "Có bệnh tim")

# Tạo bảng tần suất theo hàng (tỷ lệ trong từng nhóm bệnh tim)
prop_heart_stroke <- round(prop.table(table_heart_stroke, margin = 1), 3)
colnames(prop_heart_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(prop_heart_stroke) <- c("Không bệnh tim", "Có bệnh tim")

# Gộp bảng tần số và tần suất
combined_heart_stroke <- cbind(table_heart_stroke, prop_heart_stroke)

# Chuyển thành dataframe
df_combined_heart_stroke <- as.data.frame.matrix(combined_heart_stroke)

# Hiển thị bảng
kable(df_combined_heart_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo tình trạng bệnh tim") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo tình trạng bệnh tim
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
Không bệnh tim 3076 144 0.955 0.045
Có bệnh tim 170 36 0.825 0.175
ggplot(data, aes(x = heart_disease, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("0" = "lightgreen", "1" = "orange"),
    labels = c("Không đột quỵ", "Đột quỵ")
  ) +
  labs(
    title = "Biểu đồ tần số tình trạng đột quỵ theo tình trạng bệnh tim",
    x = "Tình trạng bệnh tim",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

  • Tình trạng bệnh tim có mối liên hệ rõ ràng với nguy cơ đột quỵ.

  • Tỷ lệ đột quỵ ở người có bệnh tim là 17.5%, trong khi ở người không có bệnh tim chỉ là 4.5%.

  • Như vậy, người có bệnh tim có nguy cơ đột quỵ cao gấp gần 4 lần so với người không mắc bệnh tim.

  • Điều này cho thấy bệnh tim là một yếu tố nguy cơ quan trọng đối với đột quỵ.

Hiệu hai tỷ lệ

Với giả thuyết kiểm định:

  • \(H_0\): \(p_1 = p_2\): Tỷ lệ đột quỵ ở hai nhóm là bằng nhau – không có sự khác biệt.

  • \(H_0\): \(p_1 \neq p_2\): Tỷ lệ đột quỵ ở hai nhóm là khác nhau.

    Trong đó:

    • \(p_1\) là Tỷ lệ đột quỵ ở nhóm người có bệnh tim.

    • \(p_2\) là Tỷ lệ đột quỵ ở nhóm người không có bệnh tim.

prop.test(x = c(36, 144), n = c(206, 3220), correct = TRUE)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(36, 144) out of c(206, 3220)
## X-squared = 63.183, df = 1, p-value = 1.884e-15
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.07510638 0.18496719
## sample estimates:
##    prop 1    prop 2 
## 0.1747573 0.0447205
  • Tỷ lệ đột quỵ ở nhóm có bệnh tim (\(p_1\)): 17.48%

  • Tỷ lệ đột quỵ ở nhóm không có bệnh tim (\(p_2\)): 4.47%

Điều này cho thấy hiệu tỷ lệ khoảng 13%, với khoảng tin cậy 95% là [7.5%; 18.5%].

  • Giá trị p-value = 1.884 × 10⁻¹⁵ < 0.05 → Bác bỏ \(H_0\).

Khẳng định có sự khác biệt có ý nghĩa thống kê giữa hai nhóm.

=> Kết luận rằng: Nhóm có bệnh tim có nguy cơ đột quỵ cao hơn đáng kể so với nhóm không có bệnh tim.

Tỷ số nguy cơ

riskratio(table_heart_stroke, method = "wald")
## $data
##                 
##                  Không đột quỵ Đột quỵ Total
##   Không bệnh tim          3076     144  3220
##   Có bệnh tim              170      36   206
##   Total                   3246     180  3426
## 
## $measure
##                 risk ratio with 95% C.I.
##                  estimate    lower    upper
##   Không bệnh tim 1.000000       NA       NA
##   Có bệnh tim    3.907767 2.789896 5.473552
## 
## $p.value
##                 two-sided
##                    midp.exact fisher.exact   chi.square
##   Không bệnh tim           NA           NA           NA
##   Có bệnh tim    3.997558e-11 3.296104e-11 5.069697e-16
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm Tỷ lệ đột quỵ (%) Risk Ratio (RR) Khoảng tin cậy 95% CI p-value Nhận xét
Không bệnh tim 144 / 3220 ≈ 4.47% 1 (mốc so sánh) Đây là nhóm tham chiếu để so sánh.
Có bệnh tim 36 / 206 ≈ 17.48% 3.91 [2.79; 5.47] < 0.001 Nguy cơ đột quỵ cao gấp ~3.9 lần, khác biệt có ý nghĩa thống kê.

Tỷ số chênh

oddsratio(table_heart_stroke, method = "wald", conf.level = 0.95)
## $data
##                 
##                  Không đột quỵ Đột quỵ Total
##   Không bệnh tim          3076     144  3220
##   Có bệnh tim              170      36   206
##   Total                   3246     180  3426
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate    lower    upper
##   Không bệnh tim 1.000000       NA       NA
##   Có bệnh tim    4.523529 3.042777 6.724883
## 
## $p.value
##                 two-sided
##                    midp.exact fisher.exact   chi.square
##   Không bệnh tim           NA           NA           NA
##   Có bệnh tim    3.997558e-11 3.296104e-11 5.069697e-16
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm Tỷ lệ đột quỵ (%) Odds Ratio (OR) Khoảng tin cậy 95% CI p-value Nhận xét
Không bệnh tim 144 / 3220 ≈ 4.47% 1 (mốc so sánh) Nhóm tham chiếu.
Có bệnh tim 36 / 206 ≈ 17.48% 4.52 [3.04; 6.72] < 0.001 Nguy cơ (odds) đột quỵ cao hơn ~4.5 lần, khác biệt có ý nghĩa thống kê.

Nhận xét chung:

  • Tỷ lệ đột quỵ ở người có bệnh tim (17.48%) cao gấp gần 4 lần so với người không có bệnh tim (4.47%). Điều này phản ánh sự khác biệt rõ rệt về tần suất mắc đột quỵ giữa hai nhóm.

  • Các chỉ số Risk Ratio (RR) và Odds Ratio (OR) đều cho thấy mức độ nguy cơ tăng mạnh ở nhóm có bệnh tim:

    • Risk Ratio = 3.91 (CI 95%: 2.79 – 5.47): Người có bệnh tim có nguy cơ bị đột quỵ cao gấp ~3.9 lần so với người không có bệnh tim.

    • Odds Ratio = 4.52 (CI 95%: 3.04 – 6.72): Xác suất bị đột quỵ ở người có bệnh tim cũng cao hơn ~4.5 lần, khác biệt có ý nghĩa thống kê mạnh.

  • Kiểm định hiệu hai tỷ lệ cho kết quả p-value = 1.884 × 10⁻¹⁵, nhỏ hơn rất nhiều so với mức ý nghĩa 0.05. Khoảng tin cậy cho hiệu tỷ lệ nằm trong khoảng [7.5%; 18.5%], cho thấy sự khác biệt này là có ý nghĩa thống kê và không phải do ngẫu nhiên.

Kết luận: Bệnh tim là một yếu tố nguy cơ nghiêm trọng đối với đột quỵ. Việc kiểm soát và điều trị hiệu quả các bệnh lý tim mạch là cực kỳ quan trọng trong công tác phòng ngừa đột quỵ.

4.3.4. Đối với biến Stroke và Ever married

Thống kê bảng tần số và tần suất

Tình trạng hôn nhân có thể liên quan đến nguy cơ đột quỵ. Người đã kết hôn thường nhận được hỗ trợ tinh thần và chăm sóc tốt hơn, trong khi người chưa kết hôn có thể gặp nhiều căng thẳng hoặc ít tiếp cận y tế. Tuy nhiên, mối liên hệ này còn phụ thuộc vào nhiều yếu tố khác như tuổi, giới, sức khỏe.

# Tạo bảng tần số
table_married_stroke <- table(data$ever_married, data$stroke)
colnames(table_married_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(table_married_stroke) <- c("Chưa từng kết hôn", "Đã kết hôn")

# Tạo bảng tần suất (theo hàng)
prop_married_stroke <- round(prop.table(table_married_stroke, margin = 1), 3)
colnames(prop_married_stroke) <- c("Không đột quỵ", "Đột quỵ")
rownames(prop_married_stroke) <- c("Chưa từng kết hôn", "Đã kết hôn")

# Gộp bảng tần số và tần suất
combined_married_stroke <- cbind(table_married_stroke, prop_married_stroke)

# Chuyển thành dataframe
df_combined_married_stroke <- as.data.frame.matrix(combined_married_stroke)

# Hiển thị bảng
kable(df_combined_married_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo tình trạng hôn nhân") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo tình trạng hôn nhân
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
Chưa từng kết hôn 807 20 0.976 0.024
Đã kết hôn 2439 160 0.938 0.062
ggplot(data, aes(x = ever_married, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("0" = "lightyellow", "1" = "purple"),
    labels = c("Không đột quỵ", "Đột quỵ")
  ) +
  scale_x_discrete(labels = c("0" = "Chưa từng kết hôn", "1" = "Đã kết hôn")) +
  labs(
    title = "Biểu đồ tần số tình trạng đột quỵ theo tình trạng hôn nhân",
    x = "Tình trạng hôn nhân",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

Qua kết quả ta nhận xét được:

  • Trong nhóm chưa từng kết hôn, có 827 người, trong đó 20 người bị đột quỵ, chiếm 2.4%.

  • Trong nhóm đã kết hôn, có 2,599 người, trong đó 160 người bị đột quỵ, chiếm 6.2%.

  • Tỷ lệ đột quỵ ở người đã kết hôn cao hơn khoảng 2.6 lần so với người chưa từng kết hôn.

  • Điều này gợi ý rằng người đã kết hôn có nguy cơ đột quỵ cao hơn trong mẫu khảo sát này.

Hiệu hai tỷ lệ

Với giả thuyết kiểm định:

  • \(H_0\): \(p_1 = p_2\): Tỷ lệ đột quỵ ở hai nhóm là bằng nhau – không có sự khác biệt.

  • \(H_0\): \(p_1 \neq p_2\): Tỷ lệ đột quỵ ở hai nhóm là khác nhau.

    Trong đó:

    • \(p_1\) là Tỷ lệ đột quỵ ở nhóm người đã kết hôn.

    • \(p_2\) là Tỷ lệ đột quỵ ở nhóm người chưa kết hôn.

prop.test(x = c(160, 20), n = c(2599, 827))
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(160, 20) out of c(2599, 827)
## X-squared = 16.865, df = 1, p-value = 4.013e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  0.02261681 0.05213987
## sample estimates:
##     prop 1     prop 2 
## 0.06156214 0.02418380
  • Về tỷ lệ kiểm định:

    • Nhóm đã kết hôn: 6.16% (160/2599)

    • Nhóm chưa kết hôn: 2.42% (20/827)

  • Kết quả kiểm định:

    • Giá trị p-value = 0.00004013 (rất nhỏ, < 0.05)

    • Khoảng tin cậy 95% cho chênh lệch tỷ lệ: [2.26%, 5.21%]

  • Kết luận:

    • Bác bỏ giả thuyết \(H_0\).

    • Có sự khác biệt có ý nghĩa thống kê về tỷ lệ đột quỵ giữa hai nhóm.

    • Cụ thể, người đã kết hôn có tỷ lệ đột quỵ cao hơn đáng kể so với người chưa kết hôn trong mẫu nghiên cứu này.

Tỷ số nguy cơ

riskratio(table_married_stroke, method = "wald")
## $data
##                    
##                     Không đột quỵ Đột quỵ Total
##   Chưa từng kết hôn           807      20   827
##   Đã kết hôn                 2439     160  2599
##   Total                      3246     180  3426
## 
## $measure
##                    risk ratio with 95% C.I.
##                     estimate    lower   upper
##   Chưa từng kết hôn 1.000000       NA      NA
##   Đã kết hôn        2.545594 1.609867 4.02521
## 
## $p.value
##                    two-sided
##                       midp.exact fisher.exact   chi.square
##   Chưa từng kết hôn           NA           NA           NA
##   Đã kết hôn        6.907363e-06 9.454577e-06 2.713968e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm Tỷ lệ đột quỵ (%) Risk Ratio (RR) Khoảng tin cậy 95% Giá trị p Kết luận thống kê
Chưa từng kết hôn 20 / 827 ≈ 2.4% 1 (tham chiếu)
Đã kết hôn 160 / 2599 ≈ 6.2% 2.55 [1.61 ; 4.03] < 0.001 Có sự khác biệt có ý nghĩa thống kê

Tỷ số chênh

oddsratio(table_married_stroke, method = "wald", conf.level = 0.95)
## $data
##                    
##                     Không đột quỵ Đột quỵ Total
##   Chưa từng kết hôn           807      20   827
##   Đã kết hôn                 2439     160  2599
##   Total                      3246     180  3426
## 
## $measure
##                    odds ratio with 95% C.I.
##                     estimate    lower    upper
##   Chưa từng kết hôn 1.000000       NA       NA
##   Đã kết hôn        2.646986 1.651709 4.241993
## 
## $p.value
##                    two-sided
##                       midp.exact fisher.exact   chi.square
##   Chưa từng kết hôn           NA           NA           NA
##   Đã kết hôn        6.907363e-06 9.454577e-06 2.713968e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm Tỷ lệ đột quỵ (%) Odds Ratio (OR) Khoảng tin cậy 95% Giá trị p Kết luận thống kê
Chưa từng kết hôn 20 / 827 ≈ 2.4% 1 (tham chiếu)
Đã kết hôn 160 / 2599 ≈ 6.2% 2.65 [1.65 ; 4.24] < 0.001 Có sự khác biệt có ý nghĩa thống kê

Nhận xét chung:

  • Tỷ lệ đột quỵ ở người đã kết hôn cao hơn rõ rệt so với người chưa từng kết hôn (6.2% so với 2.4%).

  • Kiểm định tỷ lệ cho thấy sự khác biệt có ý nghĩa thống kê (p-value < 0.05), với khoảng tin cậy cho chênh lệch tỷ lệ từ 2.26% đến 5.21%.

  • Tỷ số nguy cơ (RR = 2.55) và tỷ số chênh (OR = 2.65) đều cho thấy nguy cơ đột quỵ ở người đã kết hôn cao hơn khoảng 2.5 lần so với người chưa kết hôn.

Kết luận: Có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và nguy cơ đột quỵ. Trong mẫu khảo sát này, người đã kết hôn có nguy cơ đột quỵ cao hơn đáng kể.

4.3.5 Đối với biến Stroke và Work type

Thống kê bảng tần số và tần suất

Tình trạng việc làm có thể ảnh hưởng đến nguy cơ đột quỵ thông qua mức độ căng thẳng, lối sống và khả năng tiếp cận chăm sóc y tế. Người không có việc làm (thất nghiệp, nghỉ hưu) thường có nguy cơ cao hơn do ít vận động, thu nhập thấp hoặc sức khỏe yếu sẵn có. Tuy nhiên, người đang làm việc trong môi trường căng thẳng cũng có thể đối mặt với rủi ro đột quỵ nếu không kiểm soát tốt sức khỏe.

# Tạo bảng tần số
table_worktype_stroke <- table(data$work_type, data$stroke)
colnames(table_worktype_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Tạo bảng tần suất theo hàng (từng loại việc làm)
prop_worktype_stroke <- round(prop.table(table_worktype_stroke, margin = 1), 3)
colnames(prop_worktype_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Gộp bảng tần số và tần suất
combined_worktype_stroke <- cbind(table_worktype_stroke, prop_worktype_stroke)

# Chuyển thành dataframe
df_combined_worktype_stroke <- as.data.frame.matrix(combined_worktype_stroke)

# Hiển thị bảng
kable(df_combined_worktype_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo tình trạng việc làm") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo tình trạng việc làm
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
children 68 0 1.000 0.000
Govt_job 491 23 0.955 0.045
Never_worked 14 0 1.000 0.000
Private 2092 109 0.950 0.050
Self-employed 581 48 0.924 0.076
# Đổi nhãn stroke thành dạng factor để dễ gán màu
data$stroke <- factor(data$stroke, levels = c(0, 1), labels = c("Không đột quỵ", "Đột quỵ"))

# Vẽ biểu đồ
ggplot(data, aes(x = work_type, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("Không đột quỵ" = "orange", "Đột quỵ" = "blue")
  ) +
  labs(
    title = "Biểu đồ tần số tình trạng đột quỵ theo loại việc làm",
    x = "Tình trạng việc làm",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

  • Nhóm “children” và “Never_worked” hoàn toàn không có ca đột quỵ nào, tuy nhiên cần lưu ý rằng đây là nhóm có đặc điểm đặc biệt (trẻ em, người chưa từng đi làm), nên kết quả có thể không phản ánh rõ ràng mối liên hệ với nguy cơ đột quỵ.

  • Nhóm làm việc cho nhà nước (“Govt_job”) và làm việc tư nhân (“Private”) có tỷ lệ đột quỵ lần lượt là 4.5% và 5.0%, tương đối tương đồng nhau.

  • Nhóm “Self-employed” (tự làm chủ) có tỷ lệ đột quỵ cao nhất trong các nhóm đang làm việc (7.6%), gợi ý rằng công việc tự làm chủ có thể liên quan đến nguy cơ đột quỵ cao hơn, có thể do áp lực công việc, thiếu bảo hiểm y tế, hoặc thời gian nghỉ ngơi không ổn định.

Tóm lại: Loại hình công việc có sự khác biệt nhất định về tỷ lệ đột quỵ, đáng chú ý là nhóm tự làm chủ có tỷ lệ cao hơn so với các nhóm còn lại.

Tỷ số nguy cơ

new_table_worktype_stroke <- table_worktype_stroke[c("Self-employed", "Govt_job", "Private", "children", "Never_worked"), ]

riskratio(new_table_worktype_stroke, method = "wald")
## $data
##                
##                 Không đột quỵ Đột quỵ Total
##   Self-employed           581      48   629
##   Govt_job                491      23   514
##   Private                2092     109  2201
##   children                 68       0    68
##   Never_worked             14       0    14
##   Total                  3246     180  3426
## 
## $measure
##                risk ratio with 95% C.I.
##                  estimate     lower     upper
##   Self-employed 1.0000000        NA        NA
##   Govt_job      0.5863732 0.3616836 0.9506474
##   Private       0.6489569 0.4676011 0.9006503
##   children      0.0000000 0.0000000       NaN
##   Never_worked  0.0000000 0.0000000       NaN
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact  chi.square
##   Self-employed         NA           NA          NA
##   Govt_job      0.02741340   0.03561134 0.027850049
##   Private       0.01240031   0.01319075 0.009642481
##   children      0.00602875   0.01011124 0.018239680
##   Never_worked  0.33362004   0.61478924 0.282598758
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm công việc Tỷ lệ đột quỵ (%) Risk Ratio (95% CI) P-value (Fisher’s Exact) Nhận xét ngắn gọn
Self-employed 7.63% 1.00 (Tham chiếu) Nhóm tham chiếu.
Govt_job 4.47% 0.59 (0.36 – 0.95) 0.036 Nguy cơ thấp hơn, có ý nghĩa thống kê.
Private 4.95% 0.65 (0.47 – 0.90) 0.013 Nguy cơ thấp hơn, có ý nghĩa thống kê.
children 0.00% 0.00 (CI không xác định) 0.010 Không có ca đột quỵ nào.
Never_worked 0.00% 0.00 (CI không xác định) 0.615 Không có ca đột quỵ nào, kết quả không có ý nghĩa.

Tỷ số chênh

oddsratio(new_table_worktype_stroke, method = "wald", conf.level = 0.95)
## $data
##                
##                 Không đột quỵ Đột quỵ Total
##   Self-employed           581      48   629
##   Govt_job                491      23   514
##   Private                2092     109  2201
##   children                 68       0    68
##   Never_worked             14       0    14
##   Total                  3246     180  3426
## 
## $measure
##                odds ratio with 95% C.I.
##                  estimate     lower     upper
##   Self-employed 1.0000000        NA        NA
##   Govt_job      0.5669976 0.3400179 0.9454982
##   Private       0.6306664 0.4436504 0.8965171
##   children      0.0000000 0.0000000       NaN
##   Never_worked  0.0000000 0.0000000       NaN
## 
## $p.value
##                two-sided
##                 midp.exact fisher.exact  chi.square
##   Self-employed         NA           NA          NA
##   Govt_job      0.02741340   0.03561134 0.027850049
##   Private       0.01240031   0.01319075 0.009642481
##   children      0.00602875   0.01011124 0.018239680
##   Never_worked  0.33362004   0.61478924 0.282598758
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm công việc Đột quỵ (%) OR (95% CI) P-value (Fisher’s exact) Nhận xét ngắn gọn
Self-employed 7.63% 1.00 (Tham chiếu) Nhóm tham chiếu.
Govt_job 4.47% 0.57 (0.34 – 0.95) 0.036 Nguy cơ đột quỵ giảm đáng kể, có ý nghĩa thống kê.
Private 4.95% 0.63 (0.44 – 0.90) 0.013 Nguy cơ đột quỵ thấp hơn, có ý nghĩa thống kê.
children 0.00% 0.00 (CI không xác định) 0.010 Không có ca đột quỵ.
Never_worked 0.00% 0.00 (CI không xác định) 0.615 Không có ca đột quỵ, không có ý nghĩa thống kê.

Nhận xét chung:

  • Nhóm tự làm chủ có nguy cơ đột quỵ cao nhất (7.6%), là nhóm tham chiếu.

  • Nhóm làm nhà nước và làm tư nhân có nguy cơ thấp hơn đáng kể, với cả RR và OR đều < 1, có ý nghĩa thống kê (p < 0.05).

  • Trẻ em và người chưa từng làm việc không ghi nhận ca đột quỵ nào, nhưng kết quả này khó khái quát do tính chất đặc thù của nhóm.

Kết luận: Công việc có liên quan đến nguy cơ đột quỵ; đáng chú ý, nhóm tự làm chủ có nguy cơ cao hơn rõ rệt.

4.3.6. Đối với biến Stroke và Avg glucose level

Thống kê bảng tần số và tần suất

Lượng đường huyết trung bình (HbA1c) cao có liên quan đến nguy cơ đột quỵ, đặc biệt ở người mắc tiểu đường. Tăng HbA1c kéo dài làm tổn thương mạch máu, thúc đẩy xơ vữa và tăng huyết áp. Đây đều là yếu tố nguy cơ chính dẫn đến đột quỵ. Kiểm soát tốt HbA1c giúp giảm nguy cơ biến cố tim mạch, bao gồm cả đột quỵ.

# Tạo bảng tần số
table_glucose_stroke <- table(data$avg_glucose_level, data$stroke)
colnames(table_glucose_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Tạo bảng tần suất
prop_glucose_stroke <- round(prop.table(table_glucose_stroke, margin = 1), 3)
colnames(prop_glucose_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Gộp 2 bảng
combined_glucose_stroke <- cbind(table_glucose_stroke, prop_glucose_stroke)

# Chuyển thành dataframe
df_combined_glucose_stroke <- as.data.frame.matrix(combined_glucose_stroke)

# Hiển thị bảng
kable(df_combined_glucose_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo nhóm lượng đường huyết trung bình") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo nhóm lượng đường huyết trung bình
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
Thấp 1981 77 0.963 0.037
Trung bình 722 32 0.958 0.042
Cao 543 71 0.884 0.116
ggplot(data, aes(x = avg_glucose_level, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("Không đột quỵ" = "#A6CEE3", "Đột quỵ" = "#FB9A99")
  ) +
  labs(
    title = "Biểu đồ tần số đột quỵ theo nhóm lượng đường huyết trung bình",
    x = "Nhóm lượng đường huyết trung bình",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

Từ bảng tần số và tần suất giữa tình trạng đột quỵ và mức đường huyết trung bình ta thấy:

  • Tỷ lệ đột quỵ ở nhóm có mức đường huyết thấp là 3.7% (77/2058).

  • Nhóm có mức đường huyết trung bình có tỷ lệ đột quỵ là 4.2% (32/754), cao hơn một chút so với nhóm thấp.

  • Nhóm có mức đường huyết cao có tỷ lệ đột quỵ lên tới 11.6% (71/614), cao gấp khoảng 3 lần so với nhóm thấp.

  • Tỷ lệ đột quỵ tăng rõ rệt theo mức đường huyết, cho thấy mối liên hệ dương giữa mức đường huyết trung bình và nguy cơ đột quỵ.

Tỷ số nguy cơ

riskratio(table_glucose_stroke, method = "wald")
## $data
##             
##              Không đột quỵ Đột quỵ Total
##   Thấp                1981      77  2058
##   Trung bình           722      32   754
##   Cao                  543      71   614
##   Total               3246     180  3426
## 
## $measure
##             risk ratio with 95% C.I.
##              estimate     lower    upper
##   Thấp       1.000000        NA       NA
##   Trung bình 1.134314 0.7575457 1.698469
##   Cao        3.090613 2.2676383 4.212263
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   Thấp                 NA           NA           NA
##   Trung bình 5.369639e-01 5.813170e-01 5.408222e-01
##   Cao        7.008616e-12 6.459182e-12 1.033883e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm lượng đường huyết Risk Ratio (RR) Khoảng tin cậy 95% P-value (Chi-square) Nhận xét
Thấp 1.00 (tham chiếu) Nhóm tham chiếu
Trung bình 1.13 [0.76 ; 1.70] 0.5408 Không có ý nghĩa thống kê
Cao 3.09 [2.27 ; 4.21] 1.03e-13 Nguy cơ đột quỵ cao hơn có ý nghĩa thống kê

Tỷ số chênh

oddsratio(table_glucose_stroke, method = "wald", conf.level = 0.95)
## $data
##             
##              Không đột quỵ Đột quỵ Total
##   Thấp                1981      77  2058
##   Trung bình           722      32   754
##   Cao                  543      71   614
##   Total               3246     180  3426
## 
## $measure
##             odds ratio with 95% C.I.
##              estimate     lower    upper
##   Thấp       1.000000        NA       NA
##   Trung bình 1.140267 0.7485014 1.737083
##   Cao        3.363971 2.4035718 4.708119
## 
## $p.value
##             two-sided
##                midp.exact fisher.exact   chi.square
##   Thấp                 NA           NA           NA
##   Trung bình 5.369639e-01 5.813170e-01 5.408222e-01
##   Cao        7.008616e-12 6.459182e-12 1.033883e-13
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm đường huyết Odds Ratio (OR) Khoảng tin cậy 95% P-value (Chi-square) Nhận xét
Thấp 1.00 (tham chiếu) Nhóm tham chiếu
Trung bình 1.14 [0.75 ; 1.74] 0.5408 Không có ý nghĩa thống kê
Cao 3.36 [2.40 ; 4.71] 1.03e-13 Khả năng đột quỵ cao hơn rõ rệt, có ý nghĩa thống kê

Nhận xét chung:

  • Tỷ lệ đột quỵ tăng dần theo mức đường huyết: thấp (3.7%) → trung bình (4.2%) → cao (11.6%).

  • Risk Ratio (RR) cho nhóm cao là 3.09 (p < 0.001), cho thấy nguy cơ đột quỵ gấp 3 lần so với nhóm thấp, có ý nghĩa thống kê.

  • Nhóm trung bình có RR = 1.13, không có ý nghĩa thống kê (p = 0.54).

  • Odds Ratio (OR) cho nhóm cao là 3.36, cũng cho thấy khả năng đột quỵ cao hơn rõ rệt so với nhóm thấp.

Nhìn chung, có mối liên hệ dương và có ý nghĩa giữa mức đường huyết cao và nguy cơ đột quỵ.

4.3.7. Đối với biến Stroke và Smoking status

Thống kê bảng tần số và tần suất

Hút thuốc làm tổn thương mạch máu, tăng nguy cơ hình thành cục máu đông và xơ vữa động mạch, từ đó dễ gây đột quỵ. Ngoài ra, nó làm giảm oxy trong máu, khiến não dễ bị tổn thương hơn. Đây là yếu tố nguy cơ có thể kiểm soát được.

# Tạo bảng tần số
table_smoking_stroke <- table(data$smoking_status, data$stroke)
colnames(table_smoking_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Tạo bảng tần suất theo hàng (từng nhóm hút thuốc)
prop_smoking_stroke <- round(prop.table(table_smoking_stroke, margin = 1), 3)
colnames(prop_smoking_stroke) <- c("Không đột quỵ", "Đột quỵ")

# Gộp 2 bảng
combined_smoking_stroke <- cbind(table_smoking_stroke, prop_smoking_stroke)

# Chuyển thành dataframe
df_combined_smoking_stroke <- as.data.frame.matrix(combined_smoking_stroke)

# Hiển thị bảng
kable(df_combined_smoking_stroke, align = "c", caption = "Bảng Tần số và Tần suất theo tình trạng hút thuốc") %>%
  add_header_above(c(" " = 1, "Tần số" = 2, "Tần suất" = 2)) %>%
  kable_styling(full_width = FALSE, position = "center")
Bảng Tần số và Tần suất theo tình trạng hút thuốc
Tần số
Tần suất
Không đột quỵ Đột quỵ Không đột quỵ Đột quỵ
formerly smoked 780 57 0.932 0.068
never smoked 1768 84 0.955 0.045
smokes 698 39 0.947 0.053
ggplot(data, aes(x = smoking_status, fill = stroke)) +
  geom_bar(position = "dodge") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    position = position_dodge(width = 0.9),
    vjust = -0.3,
    size = 3.5
  ) +
  scale_fill_manual(
    values = c("Không đột quỵ" = "green", "Đột quỵ" = "red")
  ) +
  labs(
    title = "Biểu đồ tần số đột quỵ theo tình trạng hút thuốc",
    x = "Tình trạng hút thuốc",
    y = "Tần số",
    fill = "Tình trạng đột quỵ"
  ) +
  theme_minimal()

Nhận xét cho mối quan hệ giữa tình trạng đột quỵ và tình trạng hút thuốc:

  • Nhóm từng hút thuốc (formerly smoked) có tỷ lệ đột quỵ cao nhất (6.8%) trong ba nhóm.

  • Nhóm chưa từng hút thuốc (never smoked) có tỷ lệ đột quỵ thấp nhất (4.5%).

  • Nhóm đang hút thuốc (smokes) có tỷ lệ đột quỵ trung bình (5.3%), cao hơn nhóm chưa từng hút.

Nhìn chung, tỷ lệ đột quỵ có xu hướng cao hơn ở những người có tiền sử hút thuốc.

Tỷ số nguy cơ

riskratio(table_smoking_stroke, method = "wald")
## $data
##                  
##                   Không đột quỵ Đột quỵ Total
##   formerly smoked           780      57   837
##   never smoked             1768      84  1852
##   smokes                    698      39   737
##   Total                    3246     180  3426
## 
## $measure
##                  risk ratio with 95% C.I.
##                    estimate     lower     upper
##   formerly smoked 1.0000000        NA        NA
##   never smoked    0.6660225 0.4806015 0.9229808
##   smokes          0.7770478 0.5234378 1.1535340
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   formerly smoked         NA           NA         NA
##   never smoked    0.01653805   0.01913231 0.01429237
##   smokes          0.21105374   0.24559321 0.20911852
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm hút thuốc Risk Ratio (RR) Khoảng tin cậy 95% P-value (Chi-square) Nhận xét ngắn
Formerly smoked 1.00 (mốc so sánh) Mốc tham chiếu
Never smoked 0.666 [0.481 ; 0.923] 0.0143 Nguy cơ đột quỵ thấp hơn đáng kể so với nhóm từng hút
Smokes 0.777 [0.523 ; 1.154] 0.2091 Không khác biệt có ý nghĩa so với nhóm từng hút

Tỷ số chênh

oddsratio(table_smoking_stroke, method = "wald", conf.level = 0.95)
## $data
##                  
##                   Không đột quỵ Đột quỵ Total
##   formerly smoked           780      57   837
##   never smoked             1768      84  1852
##   smokes                    698      39   737
##   Total                    3246     180  3426
## 
## $measure
##                  odds ratio with 95% C.I.
##                    estimate     lower     upper
##   formerly smoked 1.0000000        NA        NA
##   never smoked    0.6501548 0.4596558 0.9196038
##   smokes          0.7645906 0.5024188 1.1635686
## 
## $p.value
##                  two-sided
##                   midp.exact fisher.exact chi.square
##   formerly smoked         NA           NA         NA
##   never smoked    0.01653805   0.01913231 0.01429237
##   smokes          0.21105374   0.24559321 0.20911852
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm hút thuốc Odds Ratio (OR) Khoảng tin cậy 95% P-value (Chi-square) Nhận xét ngắn
Formerly smoked 1.00 (mốc so sánh) Mốc tham chiếu
Never smoked 0.650 [0.460 ; 0.920] 0.0143 Giảm khả năng mắc đột quỵ đáng kể so với nhóm từng hút
Smokes 0.765 [0.502 ; 1.164] 0.2091 Không có sự khác biệt rõ ràng với nhóm từng hút

Nhận xét chung:

  • Tỷ lệ đột quỵ cao nhất ở nhóm từng hút thuốc (6.8%), thấp nhất ở nhóm chưa từng hút (4.5%).

  • Nhóm đang hút thuốc có tỷ lệ đột quỵ (5.3%) cao hơn nhóm chưa từng hút, nhưng thấp hơn nhóm từng hút.

  • Nguy cơ (RR) và khả năng (OR) mắc đột quỵ ở nhóm chưa từng hút giảm đáng kể so với nhóm từng hút (p < 0.05).

  • Nhóm đang hút thuốc không có sự khác biệt có ý nghĩa thống kê so với nhóm từng hút (p > 0.05).

Nhìn chung, hút thuốc (hiện tại hoặc quá khứ) liên quan đến nguy cơ đột quỵ cao hơn.

4.4. Hồi quy Logit đơn biến

4.4.1. Hồi quy biến Stroke và Age

summary(glm(factor(stroke) ~ age, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ age, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -6.804      1.001  -6.800 1.05e-11 ***
## age35–44       1.924      1.119   1.719 0.085557 .  
## age45–54       3.625      1.021   3.550 0.000385 ***
## age55–64       3.990      1.016   3.926 8.65e-05 ***
## age≥65         5.060      1.006   5.032 4.85e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1187.6  on 3421  degrees of freedom
## AIC: 1197.6
## 
## Number of Fisher Scoring iterations: 9

Mô hình hồi quy sử dụng

\[ \log\left( \frac{P(\text{Đột quỵ})}{1 - P(\text{Đột quỵ})} \right) = -6.804 +\ 1.924 \cdot \text{age}_{35{-}44} +\ 3.625 \cdot \text{age}_{45{-}54} \\ \quad +\ 3.990 \cdot \text{age}_{55{-}64} +\ 5.060 \cdot \text{age}_{\geq 65} \]

Với mốc tham chiếu là độ tuổi dưới 35, vì vậy các hệ số là mức chênh lệch log odds so với nhóm <35 tuổi.

Đối với độ tuổi từ dưới 35

  • (Intercept) = -6.804. Đây là log odds của việc bị đột quỵ đối với người dưới 35 tuổi. Tức là log odds bị đột quỵ khi tất cả các biến độc lập đều bằng 0.

  • Từ công thức \(\text{odds} = \frac{\mu}{1 - \mu}\), ta tính được xác suất đột quỵ ở độ tuổi này là 0.11%. Điều này cho thấy ở nhóm dưới 35 tuổi, nguy cơ bị đột quỵ là rất thấp, gần như không đáng kể trong bộ dữ liệu.

Đối với độ tuổi từ 35-44

  • Hệ số = 1.924, p_value = 0.0856. Hệ số này cho biết khi so với nhóm tuổi < 35, thì nhóm 35–44 có log odds bị đột quỵ tăng thêm 1.924 đơn vị. T

  • Xác suất tính theo công thức \(\text{odds} = \frac{\mu}{1 - \mu}\) là 0.75%.

  • So với nhóm <35, nhóm này có nguy cơ đột quỵ cao hơn khoảng 6.8 lần (odds ratio ≈ \(e^{1.924}\) ≈ 6.85).

  • Ý nghĩa thống kê chưa mạnh, nhưng xu hướng tăng nguy cơ rõ ràng.

Đối với độ tuổi từ 45-54

  • Hệ số = 3.625, p_value = 0.000385 (*** có ý nghĩa thống kê cao).

  • Xác suất đột quỵ xấp xĩ 3.98%

  • So với nhóm <35, nguy cơ đột quỵ cao hơn khoảng 37 lần (OR ≈ \(e^{3.625}\)).

  • Nhóm này bắt đầu thể hiện rõ ràng nguy cơ đột quỵ tăng đáng kể.

Đối với độ tuổi từ 55-65

  • Hệ số = 3.990, p = 8.65e-05. So với nhóm <35, nhóm 55–64 có log odds đột quỵ tăng 3.990 đơn vị, có ý nghĩa thống kê rất mạnh.

  • Xác suất đột quỵ ≈ 5.65%

  • So với nhóm <35, nguy cơ cao hơn khoảng 54 lần.

  • Khả năng mắc đột quỵ tăng rõ rệt, mô hình phản ánh tốt xu hướng tuổi tác ảnh hưởng đến sức khỏe tim mạch.

Đối với độ tuổi từ 65 trở lên

  • Hệ số = 5.060, p = 4.85e-07 (rất có ý nghĩa).

  • Xác suất ≈ 14.86%

  • So với nhóm <35, nguy cơ đột quỵ cao hơn khoảng 157 lần (OR ≈ \(e^{5.060}\)).

  • Đây là nhóm tuổi có rủi ro cao nhất, phản ánh đúng thực tế về tình trạng đột quỵ ở người cao tuổi.

Nhận xét chung cho mô hình hồi quy

Mô hình hồi quy logistic này cho thấy tuổi tác là một yếu tố dự báo có ý nghĩa đối với nguy cơ đột quỵ. Các hệ số dương và tăng dần theo độ tuổi phản ánh mối quan hệ tuyến tính giữa tuổi cao và log odds bị đột quỵ.

  • Các nhóm tuổi từ 45 trở lên đều có hệ số có ý nghĩa thống kê mạnh (p < 0.001), chứng tỏ mối liên hệ này là đáng tin cậy trong bộ dữ liệu.

  • Xác suất đột quỵ tăng rõ rệt theo độ tuổi, từ 0.11% ở nhóm <35 lên đến gần 15% ở nhóm ≥65.

  • Tỷ số odds (odds ratio) tăng nhanh theo tuổi, thể hiện nguy cơ đột quỵ ở người lớn tuổi cao hơn hàng chục đến hàng trăm lần so với người trẻ.

  • Mô hình phản ánh xu hướng thực tế về ảnh hưởng của tuổi già đến sức khỏe tim mạch và nguy cơ đột quỵ, từ đó có thể hỗ trợ cảnh báo và phòng ngừa sớm.

4.4.2. Hồi quy biến Stroke và Hypertension

summary(glm(factor(stroke) ~ hypertension, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ hypertension, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -3.15856    0.09206 -34.309  < 2e-16 ***
## hypertension1  1.34082    0.16991   7.892 2.99e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1358.2  on 3424  degrees of freedom
## AIC: 1362.2
## 
## Number of Fisher Scoring iterations: 6

Mô hình hồi quy sử dụng

\[ \log\left( \frac{P(\text{Đột quỵ})}{1 - P(\text{Đột quỵ})} \right) = -3.159 + 1.341 \cdot \text{hypertension}_1 \]

Trong đó:

  • hypertension = 0: Không bị cao huyết áp (mốc tham chiếu)

  • hypertension = 1: Có bị cao huyết áp

Đối với nhóm không bị cao huyết áp

  • (Intercept) = -3.159: Đây là log odds bị đột quỵ khi không bị cao huyết áp.

  • Dựa vào công thức: \(\mu = \frac{1 + e^{-3.159}}{e^{-3.159}} \approx 0.041\) hay 4.1%. Như vậy, xác suất đột quỵ ở người không bị cao huyết áp là khoảng 4.1%.

Đối với nhóm có cao huyết áp

  • Hệ số = 1.341, p-value ≈ 3e-15 ⇒ Có ý nghĩa thống kê rất cao.

  • \(\mu = \frac{1}{1 + e^{-(-1.818)}} = \frac{1}{1 + e^{1.818}} \approx 0.1397\) hay 13.97%. Khi đó, xác suất một người bị cao huyết áp có tình trạng bị đột quỵ là 13.97%.

  • So với người không bị cao huyết áp, nguy cơ đột quỵ cao hơn khoảng: OR= \(e^{1.341}\) ≈3.82 lần. Tức là người có huyết áp cao có nguy cơ đột quỵ gấp gần 4 lần so với người không bị.

Nhận xét chung cho mô hình hồi quy

Mô hình hồi quy logistic này cho thấy cao huyết áp là một yếu tố ảnh hưởng mạnh đến nguy cơ đột quỵ.

  • Hệ số hồi quy dương và có ý nghĩa thống kê cao (p < 0.001), cho thấy mối liên hệ giữa cao huyết áp và đột quỵ là rất đáng tin cậy.

  • Người bị cao huyết áp có nguy cơ đột quỵ gấp gần 4 lần người không bị, với xác suất tăng từ 4.1% lên gần 14%.

  • Kết quả phản ánh đúng thực tế lâm sàng, cho thấy cao huyết áp là một yếu tố nguy cơ quan trọng cần được kiểm soát để phòng ngừa đột quỵ.

4.4.3. Hồi quy biến Stroke và Heart disease

summary(glm(factor(stroke) ~ heart_disease, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ heart_disease, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -3.06157    0.08525  -35.91  < 2e-16 ***
## heart_disease1  1.50929    0.20231    7.46 8.62e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1367.3  on 3424  degrees of freedom
## AIC: 1371.3
## 
## Number of Fisher Scoring iterations: 5

Mô hình hồi quy sử dụng

\[\log\left(\frac{1 - P(\text{Đột quỵ})}{P(\text{Đột quỵ})}\right) = -3.062 + 1.509 \cdot \text{heart disease(1)}\]

Trong đó:

  • heart_disease = 0: Không mắc bệnh tim

  • heart_disease = 1: Có bệnh tim

  • Nhóm tham chiếu là những người không mắc bệnh tim.

Đối với nhóm không mắc bệnh tim

  • Intercept = -3.062: Đây là log odds bị đột quỵ của người không mắc bệnh tim.

  • Từ công thức \(\text{odds} = \frac{\mu}{1 - \mu}\), ta tính được xác suất đột quỵ ≈ 4.43% ở nhóm này.

Đối với nhóm có bệnh tim

  • Hệ số = 1.509, với p-value < 0.001 (*** rất có ý nghĩa thống kê***) → nguy cơ đột quỵ tăng có ý nghĩa.

  • Xác suất đột quỵ ≈ 17.5%

  • So với người không mắc bệnh tim, nhóm này có nguy cơ đột quỵ cao gấp khoảng 4.5 lần (odds ratio ≈ \(e^{1.509} ≈ 4.52\)).

Nhận xét chung cho mô hình hồi quy

Mô hình hồi quy logistic này cho thấy bệnh tim là một yếu tố nguy cơ quan trọng đối với đột quỵ:

  • Sự hiện diện của bệnh tim làm tăng đáng kể log odds và xác suất xảy ra đột quỵ.

  • Xác suất đột quỵ ở người có bệnh tim tăng từ 4.43% lên 17.5%, và odds ratio ~4.5 → một sự khác biệt rõ ràng và có ý nghĩa thống kê.

  • Mô hình cho thấy cần đặc biệt theo dõi sức khỏe tim mạch để phòng ngừa đột quỵ, nhất là ở nhóm có tiền sử bệnh tim.

4.4.4 Hồi quy biến Stroke và Ever married

summary(glm(factor(stroke) ~ ever_married, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ ever_married, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -3.6976     0.2264 -16.335  < 2e-16 ***
## ever_marriedYes   0.9734     0.2406   4.045 5.22e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1390.4  on 3424  degrees of freedom
## AIC: 1394.4
## 
## Number of Fisher Scoring iterations: 6

Mô hình hồi quy sử dụng

\[\log\left(\frac{1 - P(\text{Đột quỵ})}{P(\text{Đột quỵ})}\right) = -3.698 + 0.973 \cdot \text{ever married (Yes)}\]

Trong đó:

  • ever_married = No: Chưa từng kết hôn (nhóm tham chiếu)

  • ever_married = Yes: Đã từng kết hôn

Đối với nhóm chưa kết hôn

  • Intercept = -3.698 → log odds đột quỵ = -3.698

  • Xác suất đột quỵ của người chưa kết hôn ≈ \(\frac{e^{-3.698}}{1 + e^{-3.698}}\) ≈ 2.41%

Đối với nhóm đã kết hôn

  • Hệ số = 0.973, p < 0.001 → có ý nghĩa thống kê

  • Xác suất đột quỵ đối với người đã kết hôn là ≈ 6.13%

  • So với nhóm chưa kết hôn, nhóm đã kết hôn có nguy cơ đột quỵ cao hơn khoảng 2.65 lần (odds ratio ≈ \(e^{0.973} ≈ 2.65\))

Nhận xét chung cho mô hình hồi quy

  • Người đã từng kết hôn có log odds bị đột quỵ cao hơn 0.973 so với người chưa kết hôn.

  • Xác suất bị đột quỵ của người từng kết hôn cao hơn đáng kể.

  • Nguy cơ đột quỵ cao hơn khoảng 2.65 lần

  • Kết hôn có thể liên quan đến tuổi tác cao hơn hoặc các yếu tố sức khỏe, cho thấy đây là nhóm cần được quan tâm phòng ngừa sớm.

4.4.5 Hồi quy biến Stroke và Work type

data$work_type <- relevel(data$work_type, ref = "Self-employed")
summary(glm(factor(stroke) ~ work_type, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ work_type, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             -2.4935     0.1502 -16.604   <2e-16 ***
## work_typechildren      -15.0725   479.7574  -0.031   0.9749    
## work_typeGovt_job       -0.5674     0.2609  -2.175   0.0296 *  
## work_typeNever_worked  -15.0725  1057.3337  -0.014   0.9886    
## work_typePrivate        -0.4610     0.1795  -2.569   0.0102 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1394.8  on 3421  degrees of freedom
## AIC: 1404.8
## 
## Number of Fisher Scoring iterations: 16

Mô hình hồi quy sử dụng

\[\log\left(\frac{1 - P(\text{Đột quỵ} = 1)}{P(\text{Đột quỵ} = 1)}\right) = -2.4935 - 0.5674 \cdot \text{Govt job} - 15.0741 \cdot \text{Never worked}\\ \quad - 0.4610 \cdot \text{Private} - 15.6272 \cdot \text{children}\]

Với mốc tham chiếu là nhóm làm việc tự doanh (Self-employed), các hệ số thể hiện mức chênh lệch log odds đột quỵ so với nhóm này.

Đối với nhóm làm việc tự doanh (Self-employed)

  • (Intercept) = -2.4935. Đây là log odds bị đột quỵ đối với nhóm làm tự doanh.

  • Xác suất đột quỵ tương ứng ≈ 7.57%.

Nhóm làm việc cho Chính phủ (Govt_job)

  • Hệ số = -0.5674, p = 0.0296 (có ý nghĩa thống kê).

  • Xác suất đột quỵ ≈ 4.45%

  • Nguy cơ thấp hơn nhóm tự doanh khoảng 43% (OR ≈ \(e^{−0.5674}= 0.567\))

→ Làm việc trong cơ quan nhà nước có liên quan đến nguy cơ đột quỵ thấp hơn.

Nhóm làm việc tư nhân (Private)

  • Hệ số = -0.4610, p = 0.0102 (có ý nghĩa thống kê).

  • Xác suất đột quỵ ≈ 4.95%

  • Nguy cơ thấp hơn nhóm tự doanh khoảng 37% (OR ≈ \(e^{−0.461}= 0.631\))

→ Làm việc tư nhân cũng gắn với nguy cơ đột quỵ thấp hơn nhóm tự doanh.

Nhóm trẻ em (children) và Never_worked

  • Hệ số rất âm (-15.07), không có ý nghĩa thống kê (p > 0.97)

→ Không đủ dữ liệu để rút ra kết luận, có thể do số lượng rất ít.

Nhận xét chung cho mô hình hồi quy

  • Loại công việc có ảnh hưởng đến nguy cơ đột quỵ.

  • Người làm việc tự doanh có nguy cơ đột quỵ cao hơn so với nhóm làm công (cả nhà nước và tư nhân).

  • Những người làm trong hệ thống nhà nước có tỷ lệ đột quỵ thấp nhất trong mô hình.

  • Mô hình cho thấy đặc điểm công việc có thể phản ánh mức độ ổn định, áp lực hoặc điều kiện sống – các yếu tố gián tiếp ảnh hưởng đến sức khỏe tim mạch.

4.4.6. Hồi quy biến Stroke và Avg glucose level

summary(glm(factor(stroke) ~ avg_glucose_level, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ avg_glucose_level, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -3.2476     0.1162 -27.959  < 2e-16 ***
## avg_glucose_levelTrung bình   0.1313     0.2148   0.611    0.541    
## avg_glucose_levelCao          1.2131     0.1715   7.073 1.52e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1361.7  on 3423  degrees of freedom
## AIC: 1367.7
## 
## Number of Fisher Scoring iterations: 6

Mô hình hồi quy sử dụng

\[\log\left(\frac{1 - P(\text{Đột quỵ} = 1)}{P(\text{Đột quỵ} = 1)}\right) = −3.2476 + 0.1313 \cdot\text{Trung bình} + 1.2131 \cdot {\text{Cao}}\]

Trong đó:

  • stroke = 1 nếu cá nhân bị đột quỵ, = 0 nếu không.

  • Biến avg_glucose_level đã được phân loại thành 3 nhóm: Thấp (nhóm tham chiếu), Trung bình, và Cao. Nhóm Thấp là nhóm tham chiếu.

Đối với nhóm thấp

  • Là nhóm được dùng để so sánh trong mô hình (không có hệ số riêng).

  • Đựợc xem là nhóm ít rủi ro nhất về đột quỵ.

  • Xác suất bị đột quỵ thấp hơn so với các nhóm khác, là cơ sở để đánh giá mức tăng nguy cơ ở các nhóm cao hơn.

Đối với nhóm trung bình

  • Hệ số = 0.1313, p-value = 0.541

  • hông có ý nghĩa thống kê.

  • So với nhóm Thấp, khả năng bị đột quỵ không khác biệt rõ ràng ở nhóm Trung bình.

Đối với nhóm cao

  • Hệ số = 1.2131, p-value < 0.001 (có ý nghĩa)

  • Rất có ý nghĩa thống kê.

  • So với nhóm Thấp, nhóm Cao có nguy cơ đột quỵ tăng mạnh.

  • Nếu tính Odds Ratio: OR = \(e^{1.2131}\) ≈ 3.36

→ Tức là người có đường huyết cao có khả năng bị đột quỵ cao gấp ~3.4 lần so với nhóm đường huyết thấp.

Nhận xét chung cho mô hình hồi quy

  • Nhóm đường huyết cao có nguy cơ bị đột quỵ cao hơn rõ rệt so với nhóm đường huyết thấp, với Odds Ratio khoảng 3.36 lần, và mối liên hệ này có ý nghĩa thống kê.

  • Nhóm đường huyết trung bình không cho thấy sự khác biệt rõ ràng về nguy cơ đột quỵ so với nhóm thấp (p > 0.05).

  • Trong ba mức độ của đường huyết (thấp, trung bình, cao), chỉ nhóm “cao” có ý nghĩa thống kê, tức là ảnh hưởng của nó lên xác suất đột quỵ không phải do ngẫu nhiên mà có cơ sở đáng tin cậy.

4.4.7 Hồi quy biến Stroke và Smoking status

summary(glm(factor(stroke) ~ smoking_status, family = binomial(link = 'logit'), data = data))
## 
## Call:
## glm(formula = factor(stroke) ~ smoking_status, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                            Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 -2.6162     0.1372 -19.068   <2e-16 ***
## smoking_statusnever smoked  -0.4305     0.1769  -2.434   0.0149 *  
## smoking_statussmokes        -0.2684     0.2142  -1.253   0.2102    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1405.3  on 3423  degrees of freedom
## AIC: 1411.3
## 
## Number of Fisher Scoring iterations: 5

Mô hình hồi quy sử dụng

\[\log\left(\frac{1 - P(\text{stroke} = 1)}{P(\text{stroke} = 1)}\right) = -2.6162 - 0.4305 \cdot \text{never smoked} - 0.2684 \cdot \text{smokes}\]

Đối với người đã từng hút thuốc

  • Intercept (-2.6162): là log-odds bị đột quỵ đối với nhóm “formerly smoked” (đã từng hút thuốc).

Đối với người chưa từng hút thuốc

  • Nhóm chưa bao giờ hút thuốc có log-odds bị đột quỵ giảm đáng kể so với nhóm từng hút thuốc.

  • Khi chuyển sang Odds Ratio: \(\text{OR} = e^{-0.4305} \approx 0.65\)

  • Nhóm này giảm khoảng 35% nguy cơ bị đột quỵ so với nhóm từng hút thuốc.

Đối với người đang hút thuốc

  • Nhóm đang hút thuốc cũng có log-odds thấp hơn nhóm từng hút, nhưng không có ý nghĩa thống kê (p > 0.05).

Nhận xét cho mô hình hồi quy

  • Người chưa từng hút thuốc có nguy cơ đột quỵ giảm ~35% so với người từng hút thuốc (OR ≈ 0.65, p = 0.0149) → ý nghĩa thống kê.

  • Người đang hút thuốc có nguy cơ đột quỵ thấp hơn nhẹ so với người từng hút, nhưng không có ý nghĩa thống kê (p = 0.2102).

4.5 Hồi quy Logit đa biến

logit <- glm(stroke ~ age + hypertension + heart_disease + ever_married + avg_glucose_level + smoking_status,
    family = binomial(link = 'logit'),
    data = data)
summary(logit)
## 
## Call:
## glm(formula = stroke ~ age + hypertension + heart_disease + ever_married + 
##     avg_glucose_level + smoking_status, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 -6.85914    1.01740  -6.742 1.56e-11 ***
## age35–44                     2.00354    1.12789   1.776 0.075674 .  
## age45–54                     3.61831    1.03525   3.495 0.000474 ***
## age55–64                     3.89957    1.03219   3.778 0.000158 ***
## age≥65                       4.86694    1.02259   4.759 1.94e-06 ***
## hypertension1                0.61264    0.17907   3.421 0.000623 ***
## heart_disease1               0.50287    0.21496   2.339 0.019317 *  
## ever_marriedYes             -0.32370    0.26388  -1.227 0.219931    
## avg_glucose_levelTrung bình  0.18049    0.22289   0.810 0.418075    
## avg_glucose_levelCao         0.57821    0.18181   3.180 0.001472 ** 
## smoking_statusnever smoked  -0.02644    0.18585  -0.142 0.886869    
## smoking_statussmokes         0.25818    0.22784   1.133 0.257155    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1152.2  on 3414  degrees of freedom
## AIC: 1176.2
## 
## Number of Fisher Scoring iterations: 9

Mô hình hồi quy

\(\begin{aligned} \log\left(\frac{1 - P(\text{stroke} = 1)}{P(\text{stroke} = 1)}\right) =\ & -6.85914 + 2.00354 \cdot \text{age}_{35{-}44} + 3.61831 \cdot \text{age}_{45{-}54} + 3.89957 \cdot \text{age}_{55{-}64} \\ & + 4.86694 \cdot \text{age}_{\ge65} + 0.61264 \cdot \text{hypertension}_{1} + 0.50287 \cdot \text{heart disease}_{1} - 0.32370 \cdot \text{ever married}_{Yes} \\ & + 0.18049 \cdot \text{glucose}_{Trung bình} + 0.57821 \cdot \text{glucose}_{Cao} - 0.02644 \cdot \text{never smoked} + 0.25818 \cdot \text{smokes} \end{aligned}\)

Nhận xét

1. Intercept = -6.85914

  • Đây là log-odds mắc đột quỵ của nhóm tham chiếu: tuổi <35, không tăng huyết áp, không có bệnh tim, chưa từng kết hôn, đường huyết thấp, đã từng hút thuốc.

  • Odds = exp(-6.85914) ≈ 0.00105 → Xác suất ≈ 0.10%, tức là nguy cơ đột quỵ rất thấp ở nhóm cơ bản.

2. Tuổi (so với nhóm <35)

  • age35–44 = 2.00354 (p ≈ 0.075): Odds đột quỵ cao hơn 7.41 lần (OR ≈ exp(2.00354)) → chưa đủ ý nghĩa thống kê nhưng xu hướng tăng.

  • age45–54 = 3.61831 (***) → OR ≈ 37.29 lần, có ý nghĩa rõ ràng.

  • age55–64 = 3.89957 (***) → OR ≈ 49.36 lần.

  • age≥65 = 4.86694 (***) → OR ≈ 129.68 lần. → Tuổi càng cao, nguy cơ đột quỵ càng tăng mạnh.

3. Tăng huyết áp (hypertension = 1)

  • β = 0.61264 (***) → OR ≈ 1.85 → Người tăng huyết áp có khả năng bị đột quỵ cao hơn 1.85 lần so với người bình thường.

4. Bệnh tim (heart_disease = 1)

  • β = 0.50287 (*) → OR ≈ 1.65 → Có bệnh tim làm tăng nguy cơ đột quỵ lên khoảng 65%.

5. Tình trạng hôn nhân (ever_married = Yes)

  • β = -0.3237 (p > 0.05) → Không có ý nghĩa thống kê → Không thể kết luận rõ ràng người đã kết hôn có nguy cơ cao hay thấp hơn.

6. Mức đường huyết (so với nhóm Thấp)

  • avg_glucose_levelTrung bình = 0.18049 → OR ≈ 1.2, không có ý nghĩa thống kê.

  • avg_glucose_levelCao = 0.57821 (**) → OR ≈ 1.78 → Người có đường huyết cao có khả năng đột quỵ cao hơn 78% so với người có đường huyết thấp.

7. Tình trạng hút thuốc (so với nhóm từng hút - formerly smoked)

  • never smoked = -0.02644, smokes = 0.25818 → Cả hai không có ý nghĩa thống kê (p > 0.05) → Không đủ bằng chứng để kết luận hút thuốc hiện tại hay chưa từng hút ảnh hưởng rõ đến nguy cơ đột quỵ.

Nhận xét chung

  • Mô hình cho thấy các yếu tố tuổi, tăng huyết áp, bệnh tim, và đường huyết cao là các biến dự báo có ý nghĩa thống kê mạnh đối với đột quỵ.

  • Tình trạng hôn nhân và hút thuốc không có ảnh hưởng rõ ràng trong mô hình này.

  • Tuổi tác là yếu tố mạnh nhất: người ≥65 tuổi có nguy cơ đột quỵ cao hơn 129 lần so với người <35.

4.6 Hồi quy Probit đa biến

probit <- glm(stroke ~ age + hypertension + heart_disease + ever_married + avg_glucose_level + smoking_status,
    family = binomial(link = 'probit'),
    data = data)
summary(probit)
## 
## Call:
## glm(formula = stroke ~ age + hypertension + heart_disease + ever_married + 
##     avg_glucose_level + smoking_status, family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 -3.08324    0.31347  -9.836  < 2e-16 ***
## age35–44                     0.65614    0.35807   1.832 0.066887 .  
## age45–54                     1.30059    0.32555   3.995 6.47e-05 ***
## age55–64                     1.41044    0.32494   4.341 1.42e-05 ***
## age≥65                       1.91388    0.31924   5.995 2.03e-09 ***
## hypertension1                0.32381    0.09500   3.408 0.000653 ***
## heart_disease1               0.27680    0.11785   2.349 0.018835 *  
## ever_marriedYes             -0.14453    0.13567  -1.065 0.286745    
## avg_glucose_levelTrung bình  0.07164    0.10885   0.658 0.510451    
## avg_glucose_levelCao         0.28381    0.09341   3.038 0.002380 ** 
## smoking_statusnever smoked  -0.02766    0.09402  -0.294 0.768634    
## smoking_statussmokes         0.13424    0.11441   1.173 0.240652    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1152.3  on 3414  degrees of freedom
## AIC: 1176.3
## 
## Number of Fisher Scoring iterations: 9

Mô hình hồi quy

\(\begin{aligned} \Phi^{-1}(P(\text{stroke} = 1)) =\ & -3.0832 + 0.6561 \cdot \text{age}_{35{-}44} + 1.3006 \cdot \text{age}_{45{-}54} + 1.4104 \cdot \text{age}_{55{-}64} + 1.9139 \cdot \text{age}_{\ge65} \\ & + 0.3238 \cdot \text{hypertension}_{1} + 0.2768 \cdot \text{heart\_disease}_{1} - 0.1445 \cdot \text{ever\_married}_{Yes} + 0.0716 \cdot \text{glucose}_{Trung bình} \\ & + 0.2838 \cdot \text{glucose}_{Cao} - 0.0277 \cdot \text{never smoked} + 0.1342 \cdot \text{smokes} \end{aligned}\)

Nhận xét

1. Yếu tố tuổi (age)

So với nhóm <35 tuổi (nhóm tham chiếu):

  • Tuổi 35–44: Xác suất bị đột quỵ tăng, nhưng chưa có ý nghĩa thống kê (p ≈ 0.067).

  • Tuổi 45–54: Nguy cơ bị đột quỵ tăng đáng kể (p < 0.001).

  • Tuổi 55–64: Nguy cơ tăng cao, có ý nghĩa (p < 0.001).

  • Tuổi ≥65: Nguy cơ tăng mạnh nhất, rất có ý nghĩa (p < 0.001).

Kết luận: Tuổi càng cao, nguy cơ bị đột quỵ càng tăng rõ rệt và có ý nghĩa thống kê cao.

2. Tăng huyết áp (hypertension)

  • Người bị tăng huyết áp có xác suất bị đột quỵ cao hơn đáng kể (p < 0.001).

3. Bệnh tim (heart_disease)

  • Có bệnh tim làm tăng nguy cơ bị đột quỵ (p < 0.05).

4. Tình trạng hôn nhân (ever_married)

  • Người từng kết hôn không có sự khác biệt rõ về nguy cơ đột quỵ (p > 0.05).

5. Mức đường huyết trung bình (avg_glucose_level)

So với nhóm đường huyết thấp:

  • Trung bình: Không có ảnh hưởng rõ rệt (p > 0.05).

  • Cao: Tăng nguy cơ bị đột quỵ có ý nghĩa thống kê (p < 0.01).

Kết luận: Mức đường huyết cao liên quan đến nguy cơ đột quỵ cao hơn.

6. Tình trạng hút thuốc (smoking_status)

So với nhóm từng hút:

  • Chưa từng hút: Không khác biệt đáng kể (p > 0.05).

  • Đang hút: Nguy cơ cao hơn nhưng không có ý nghĩa thống kê (p > 0.05).

Tổng kết:

  • Nguy cơ đột quỵ tăng đáng kể theo tuổi, tăng huyết áp, bệnh tim, và mức đường huyết cao.
  • Các yếu tố hút thuốc và tình trạng hôn nhân không có ảnh hưởng rõ ràng trong mô hình này.

4.7 Hồi quy Cloglog đa biến

cloglog <- glm(stroke ~ age + hypertension + heart_disease + ever_married + avg_glucose_level + smoking_status,
    family = binomial(link = 'cloglog'),
    data = data)
summary(cloglog)
## 
## Call:
## glm(formula = stroke ~ age + hypertension + heart_disease + ever_married + 
##     avg_glucose_level + smoking_status, family = binomial(link = "cloglog"), 
##     data = data)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 -6.85785    1.01458  -6.759 1.39e-11 ***
## age35–44                     2.00247    1.12498   1.780 0.075075 .  
## age45–54                     3.60559    1.03136   3.496 0.000472 ***
## age55–64                     3.88925    1.02787   3.784 0.000154 ***
## age≥65                       4.79771    1.01856   4.710 2.47e-06 ***
## hypertension1                0.56745    0.16384   3.463 0.000533 ***
## heart_disease1               0.45178    0.19373   2.332 0.019701 *  
## ever_marriedYes             -0.31376    0.24040  -1.305 0.191828    
## avg_glucose_levelTrung bình  0.16919    0.21119   0.801 0.423052    
## avg_glucose_levelCao         0.54395    0.16891   3.220 0.001280 ** 
## smoking_statusnever smoked  -0.01654    0.17317  -0.096 0.923915    
## smoking_statussmokes         0.24793    0.21193   1.170 0.242051    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1411.0  on 3425  degrees of freedom
## Residual deviance: 1152.3  on 3414  degrees of freedom
## AIC: 1176.3
## 
## Number of Fisher Scoring iterations: 9

Mô hình hồi quy

\(\begin{aligned} \log\left(-\log(1 - P(\text{stroke} = 1))\right) =\ & -6.85785 + 2.00247 \cdot \text{age}_{35{-}44} + 3.60559 \cdot \text{age}_{45{-}54} + 3.88925 \cdot \text{age}_{55{-}64} + 4.79771 \cdot \text{age}_{\ge65} \\ & + 0.56745 \cdot \text{hypertension}_{1} + 0.45178 \cdot \text{heart disease}_{1} - 0.31376 \cdot \text{ever married}_{Yes} + 0.16919 \cdot \text{glucose}_{Trung bình} \\ & + 0.54395 \cdot \text{glucose}_{Cao} - 0.01654 \cdot \text{smoking}_{Never} + 0.24793 \cdot \text{smoking}_{Smokes} \end{aligned}\)

Nhận xét

1. Biến tuổi (age) (tham chiếu: <35 tuổi)

  • 35–44 tuổi: Tăng nguy cơ bị đột quỵ, nhưng chưa đủ ý nghĩa thống kê (p = 0.075).

  • 45–54 tuổi: Nguy cơ tăng rõ rệt, có ý nghĩa thống kê (p < 0.001).

  • 55–64 tuổi: Nguy cơ cao hơn nữa, có ý nghĩa thống kê mạnh (p < 0.001).

  • ≥65 tuổi: Nguy cơ cao nhất, rất có ý nghĩa thống kê (p < 0.001).

Tuổi càng cao, nguy cơ đột quỵ càng tăng rõ rệt và có ý nghĩa.

2. Tăng huyết áp (hypertension)

  • Người bị tăng huyết áp có nguy cơ đột quỵ cao hơn đáng kể so với người không bị (p < 0.001).

3. Bệnh tim (heart_disease)

  • Người có bệnh tim có nguy cơ đột quỵ cao hơn và có ý nghĩa thống kê (p < 0.05).

4. Tình trạng hôn nhân (ever_married)

  • Không có ý nghĩa thống kê (p > 0.1) → Không thể kết luận người đã kết hôn khác biệt rõ ràng so với chưa kết hôn về nguy cơ đột quỵ.

5. Mức đường huyết trung bình (avg_glucose_level) (tham chiếu: thấp)

  • Trung bình: Không có ý nghĩa thống kê (p > 0.4).

  • Cao: Nguy cơ đột quỵ cao hơn đáng kể, có ý nghĩa thống kê (p = 0.001).

Đường huyết cao làm tăng đáng kể nguy cơ đột quỵ.

6. Tình trạng hút thuốc (smoking_status) (tham chiếu: formerly smoked)

  • Chưa từng hút: Không khác biệt rõ ràng (p > 0.9).

  • Đang hút: Không có ý nghĩa thống kê (p > 0.2).

Mối liên hệ giữa hút thuốc và đột quỵ chưa rõ ràng trong mô hình này.

4.8 Đánh giá mô hình hồi quy đa biến

4.8.1 Đánh giá theo chỉ số AIC

AIC (Akaike Information Criterion) là chỉ số đánh giá mức độ phù hợp của mô hình, AIC càng thấp thì mô hình càng tốt.

Mô hình liên kết AIC
Logit (logistic) 1176.2(thấp nhất)
Probit 1176.3
Complementary log-log 1176.3

Kết luận:

  • Mặc dù sự chênh lệch AIC là rất nhỏ (chỉ 0.1), mô hình logit có AIC thấp nhất, vì vậy được xem là mô hình phù hợp nhất trong 3 mô hình.

  • Tuy nhiên, các mô hình có hiệu suất gần như tương đương nhau – điều này cho thấy lựa chọn liên kết (logit, probit hay cloglog) không ảnh hưởng quá lớn đến mức độ phù hợp trong trường hợp này.

4.8.2 Đánh giá theo chỉ số BIC

Brier Score được dùng để đánh giá độ chính xác của mô hình dự đoán nhị phân. Chỉ số này đo độ lệch giữa xác suất dự báo và kết quả thực tế, càng nhỏ càng tốt. Đây là cách so sánh hiệu quả giữa các mô hình như logit, probit và cloglog.

b_logit <- BrierScore(logit)
b_probit <- BrierScore(probit)
b_cloglog <- BrierScore(cloglog)

brier_df <- data.frame(
  Model = c("Logit", "Probit", "Cloglog"),
  Brier_Score = c(b_logit, b_probit, b_cloglog)
)

print(brier_df)
##     Model Brier_Score
## 1   Logit  0.04549854
## 2  Probit  0.04552902
## 3 Cloglog  0.04548379

Kết luận:

  • Cả ba mô hình đều dự đoán tốt, nhưng cloglog là lựa chọn tối ưu hơn một chút về độ chính xác xác suất (theo tiêu chí Brier Score).

  • Tuy nhiên, sự khác biệt không đáng kể, nên lựa chọn mô hình có thể cân nhắc thêm về giải thích và ứng dụng thực tế.

4.8.3 Đánh giá chung về ba mô hình

Dựa trên hai tiêu chí đánh giá là AIC và Brier Score, cả ba mô hình logit, probit và cloglog đều thể hiện mức độ phù hợp và độ chính xác dự báo khá tương đương nhau. Mô hình logit có AIC thấp nhất, cho thấy độ phù hợp tốt nhất về mặt thống kê, trong khi mô hình cloglog có Brier Score nhỏ nhất, phản ánh độ chính xác cao hơn một chút trong dự báo xác suất. Tuy nhiên, sự chênh lệch giữa các mô hình là rất nhỏ, do đó việc lựa chọn mô hình nên dựa thêm vào khả năng giải thích và mục đích ứng dụng thực tiễn.

CHƯƠNG 5: KẾT LUẬN


5.1 Kết luận chung

Mẫu dữ liệu nghiên cứu cho thấy sự đa dạng về độ tuổi, giới tính, nghề nghiệp và tình trạng sức khỏe. Đáng chú ý, tỷ lệ người từng bị đột quỵ chỉ chiếm khoảng 5.25%, cho thấy sự mất cân bằng nghiêm trọng giữa hai nhóm trong biến phụ thuộc. Điều này là cơ sở quan trọng để lựa chọn mô hình phân tích phù hợp.

Các phân tích hai biến và hồi quy cho thấy tuổi tác, tăng huyết áp, bệnh tim và mức đường huyết cao là những yếu tố có mối liên hệ chặt chẽ và có ý nghĩa thống kê với nguy cơ đột quỵ. Đặc biệt, nguy cơ đột quỵ tăng rõ rệt theo độ tuổi, nổi bật ở nhóm ≥65 tuổi.

Một số yếu tố nhân khẩu học như tình trạng hôn nhân và loại hình công việc ban đầu thể hiện mối liên hệ với đột quỵ, nhưng khi kiểm soát đồng thời trong mô hình đa biến, ảnh hưởng của chúng không còn rõ rệt hoặc mất ý nghĩa thống kê, cho thấy có thể chịu tác động trung gian của các biến khác.

Các mô hình hồi quy đa biến (logit, probit, cloglog) đều cho kết quả tương đồng về các yếu tố dự báo chính. Mô hình logit có AIC thấp nhất, cho thấy mức độ phù hợp cao nhất, trong khi mô hình cloglog đạt Brier Score thấp nhất, thể hiện khả năng dự báo xác suất tốt nhất. Tuy nhiên, sự chênh lệch giữa các mô hình là nhỏ, cho thấy kết quả phân tích có tính nhất quán và đáng tin cậy.

Kết quả nghiên cứu khẳng định rằng các yếu tố sức khỏe như tăng huyết áp, bệnh tim và đường huyết cao, kết hợp với tuổi tác, là các chỉ báo quan trọng của nguy cơ đột quỵ. Điều này nhấn mạnh sự cần thiết của việc sàng lọc và can thiệp sớm ở các nhóm nguy cơ cao, đặc biệt là người lớn tuổi có bệnh nền. Các mô hình thống kê sử dụng trong nghiên cứu đóng vai trò hỗ trợ hiệu quả trong việc xây dựng hệ thống dự báo và phòng ngừa bệnh lý này trong cộng đồng.