Có thể bạn quan tâm: Cách Vẽ Đường Cong Bézier: Từ Cơ Bản Đến Ứng Dụng Thực Tế
TÓM TẮT
- 1 1. Giới thiệu chung về phân tích sống sót và đường cong Kaplan-Meier
- 2 2. Nguyên tắc toán học phía sau đường cong Kaplan‑Meier
- 3 3. Chuẩn bị dữ liệu trước khi vẽ
- 4 4. Vẽ đường cong Kaplan‑Meier bằng các công cụ phổ biến
- 5 5. Các lưu ý quan trọng khi vẽ và diễn giải đường cong Kaplan‑Meier
- 6 6. Ứng dụng thực tiễn của đường cong Kaplan‑Meier
- 7 7. Bài tập thực hành: Từ dữ liệu mẫu tới báo cáo cuối cùng
- 8 8. Những sai lầm thường gặp và cách tránh
- 9 9. Kết luận tổng quan
1. Giới thiệu chung về phân tích sống sót và đường cong Kaplan-Meier
Trong lĩnh vực y học, dịch tễ học, nghiên cứu lâm sàng và nhiều ngành khoa học khác, việc phân tích dữ liệu thời gian đến một sự kiện (survival analysis) đóng vai trò vô cùng quan trọng. Đặc biệt, đường cong Kaplan‑Meier (KM) là một trong những công cụ phổ biến và mạnh mẽ nhất để mô tả và so sánh thời gian sống sót (hoặc thời gian không xảy ra một sự kiện) của các nhóm bệnh nhân hoặc mẫu thử.
1.1. Định nghĩa cơ bản
- Survival time (thời gian sống sót): Khoảng thời gian từ thời điểm bắt đầu (thường là khi bệnh nhân được chẩn đoán hoặc bắt đầu điều trị) cho tới thời điểm xảy ra sự kiện quan tâm (chết, tái phát, mất mát theo dõi, …).
- Censoring (đối tượng bị censored): Khi một cá thể không trải qua sự kiện trong thời gian quan sát, hoặc mất theo dõi vì lý do nào đó, thông tin của họ sẽ được “đánh dấu censored”. Điều này không làm mất thông tin về thời gian sống còn lại, nhưng cần được xử lý đúng cách trong phân tích.
1.2. Tại sao Kaplan‑Meier lại quan trọng?
- Không yêu cầu giả định phân phối: Khác với các mô hình như Weibull hay exponential, KM không yêu cầu dữ liệu tuân theo một dạng phân phối nào cả.
- Xử lý censored data một cách tự nhiên: KM tính toán xác suất sống sót dựa trên những thời điểm có sự kiện xảy ra, đồng thời giữ lại thông tin từ các cá thể censored.
- Trực quan và dễ hiểu: Đường cong KM hiển thị tỉ lệ sống sót theo thời gian, giúp nhà nghiên cứu nhanh chóng nhận diện xu hướng và so sánh các nhóm.
Có thể bạn quan tâm: Cách Vẽ Đường Chuẩn Độ: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
2. Nguyên tắc toán học phía sau đường cong Kaplan‑Meier
2.1. Công thức tính xác suất sống sót
Giả sử ta có các thời điểm sự kiện sắp xếp tăng dần:
t_1 < t_2 < \dots < t_k
Với mỗi thời điểm (t_j):
- (d_j) = số cá thể điểm chết (hoặc sự kiện) tại thời điểm (t_j).
- (n_j) = số cá thể còn sống ngay trước thời điểm (t_j) (bao gồm cả những người sẽ bị censored sau (t_j)).
Xác suất sống sót ngay sau (t_j) được tính là:
\hat{S}(t_j) = \hat{S}(t_{j-1}) \times \left(1 – \frac{d_j}{n_j}\right)
Với (\hat{S}(t_0) = 1) (tất cả cá thể đều sống vào thời điểm bắt đầu).
2.2. Độ tin cậy (confidence interval)
Thông thường, khoảng tin cậy 95 % cho (\hat{S}(t)) được tính bằng công thức Greenwood:
\widehat{\text{Var}}\hat{S}(t) = \hat{S}(t)^2 \sum_{j: t_j \le t} \frac{d_j}{n_j(n_j – d_j)}
Sau đó, sử dụng log‑log transformation để tránh giá trị âm:
\text{CI}_{95\%} = \left\hat{S}(t)^{\exp\left(\pm 1.96 \sqrt{\widehat{\text{Var}}\log(-\log \hat{S}(t))}\right)}\right
Có thể bạn quan tâm: Cách Vẽ Đường Che Mặt: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
3. Chuẩn bị dữ liệu trước khi vẽ
3.1. Cấu trúc dữ liệu tối thiểu
| ID bệnh nhân | Thời gian (days) | Trạng thái (event) |
|---|---|---|
| 1 | 34 | 1 (cái chết) |
| 2 | 56 | 0 (censored) |
| … | … | … |
- Thời gian: Đơn vị có thể là ngày, tháng, năm tùy vào nghiên cứu.
- Trạng thái: Thông thường 1 = sự kiện xảy ra, 0 = censored.
3.2. Kiểm tra dữ liệu
- Missing values: Loại bỏ hoặc thay thế hợp lý.
- Duplicated IDs: Đảm bảo mỗi ID chỉ xuất hiện một lần.
- Outliers: Kiểm tra thời gian quá lớn hoặc quá nhỏ so với thực tế.
3.3. Phân nhóm (nếu cần)
Để so sánh các nhóm (ví dụ: nam vs nữ, điều trị A vs B), cần tạo một biến group trong dataset.
4. Vẽ đường cong Kaplan‑Meier bằng các công cụ phổ biến
4.1. Sử dụng R
4.1.1. Cài đặt và load package
install.packages("survival") # Gói cơ bản cho survival analysis
install.packages("survminer") # Gói hỗ trợ vẽ đồ họa đẹp
library(survival)
library(survminer)
4.1.2. Đọc dữ liệu
# Giả sử dữ liệu ở file CSV
data <- read.csv("survival_data.csv")
head(data)
4.1.3. Tạo đối tượng Surv
# Surv(time, event) – time là thời gian, event = 1 nếu có sự kiện
surv_obj <- Surv(time = data$time, event = data$event)
4.1.4. Vẽ đường cong cho toàn bộ mẫu
fit_all <- survfit(surv_obj ~ 1) # ~1 nghĩa là không phân nhóm
ggsurvplot(fit_all, data = data, conf.int = TRUE, # hiển thị khoảng tin cậy risk.table = TRUE, # bảng số người còn lại theo thời gian pval = FALSE, ggtheme = theme_minimal(), title = "Đường cong Kaplan‑Meier toàn bộ mẫu")
4.1.5. Vẽ đường cong so sánh nhóm
fit_group <- survfit(surv_obj ~ data$group) # group là biến phân nhóm
ggsurvplot(fit_group, data = data, conf.int = TRUE, pval = TRUE, # hiển thị p‑value log‑rank test risk.table = TRUE, legend.title = "Nhóm", legend.labs = c("Nhóm A", "Nhóm B"), ggtheme = theme_bw(), title = "So sánh đường cong Kaplan‑Meier giữa hai nhóm")
4.1.6. Kiểm định log‑rank
logrank_test <- survdiff(surv_obj ~ data$group)
print(logrank_test)
Kết quả sẽ cung cấp giá trị chi‑square và p‑value để đánh giá sự khác biệt giữa các nhóm.
4.2. Sử dụng Python (lifelines)
4.2.1. Cài đặt thư viện
pip install lifelines matplotlib pandas
4.2.2. Đọc dữ liệu và tạo DataFrame
import pandas as pd
from lifelines import KaplanMeierFitter
import matplotlib.pyplot.pyplot as plt df = pd.read_csv('survival_data.csv')
df.head()
4.2.3. Vẽ cho toàn bộ mẫu
kmf = KaplanMeierFitter()
kmf.fit(durations=df'time', event_observed=df'event') ax = kmf.plot(ci_show=True)
ax.set_title('Đường cong Kaplan‑Meier toàn bộ mẫu')
ax.set_xlabel('Thời gian (ngày)')
ax.set_ylabel('Xác suất sống sót')
plt.show()
4.2.4. Vẽ so sánh nhóm
kmf_A = KaplanMeierFitter()
kmf_B = KaplanMeierFitter() mask_A = df'group' == 'A'
mask_B = df'group' == 'B' kmf_A.fit(dfmask_A'time', dfmask_A'event', label='Nhóm A')
kmf_B.fit(dfmask_B'time', dfmask_B'event', label='Nhóm B') ax = kmf_A.plot(ci_show=True)
kmf_B.plot(ax=ax, ci_show=True) ax.set_title('So sánh Kaplan‑Meier giữa hai nhóm')
ax.set_xlabel('Thời gian (ngày)')
ax.set_ylabel('Xác suất sống sót')
plt.show()
4.2.5. Kiểm định log‑rank (lifelines)
from lifelines.statistics import logrank_test result = logrank_test(dfmask_A'time', dfmask_B'time', event_observed_A=dfmask_A'event', event_observed_B=dfmask_B'event')
print('p‑value:', result.p_value)
4.3. Sử dụng SPSS
- Chuẩn bị dữ liệu: Đảm bảo có hai cột “Time” và “Status” (1 = event, 0 = censored).
- Menu → Analyze → Survival → Kaplan-Meier.
- Define Time Variable: Chọn cột thời gian.
- Define Event Variable: Chọn cột trạng thái.
- Factor (nếu muốn so sánh nhóm): Kéo biến nhóm vào ô Factor.
- Options: Tick “Display survival table”, “Plot survival function”, “Confidence intervals”.
- OK → SPSS sẽ tạo bảng sống sót, kiểm định log‑rank và đồ thị KM.
4.4. Sử dụng Excel (công cụ add‑in)
Mặc dù Excel không có hàm KM sẵn, nhưng có các add‑in như XLSTAT hoặc Analyse-it hỗ trợ:
- Cài đặt add‑in.
- Data → Survival Analysis → Kaplan-Meier.
- Nhập cột thời gian, cột trạng thái, và (nếu cần) biến nhóm.
- Chọn “Plot survival curve” và “Confidence interval”.
5. Các lưu ý quan trọng khi vẽ và diễn giải đường cong Kaplan‑Meier
5.1. Đánh giá độ tin cậy của dữ liệu censored
- Tỷ lệ censored quá cao (ví dụ > 50 %) có thể làm giảm độ chính xác của ước lượng.
- Kiểm tra xem censored có phân bố ngẫu nhiên hay không; nếu censored tập trung ở một thời điểm nào đó, có thể gây bias.
5.2. Số lượng sự kiện thực tế
- Đối với các nhóm có số sự kiện rất ít, đường cong sẽ “bước” lớn và khoảng tin cậy rộng.
- Khi số sự kiện < 5, việc so sánh nhóm bằng log‑rank có thể không đáng tin cậy.
5.3. Kiểm định bổ sung

Có thể bạn quan tâm: Cách Vẽ Đường Cong Gis: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Log‑rank test: Kiểm định giả thuyết “hai đường cong có cùng hàm sống sót”.
- Breslow (Generalized Wilcoxon): Nhạy hơn với các sự kiện sớm.
- Tarone‑Ware: Cân bằng giữa log‑rank và Breslow.
Trong R, các kiểm định này có thể chỉ định bằng tham số rho trong survdiff:
survdiff(Surv(time, event) ~ group, data = df, rho = 0) # log-rank
survdiff(Surv(time, event) ~ group, data = df, rho = 1) # Breslow
5.4. Đánh giá giả định tỉ lệ nguy cơ (proportional hazards)
Mặc dù KM không yêu cầu giả định này, nhưng khi bạn muốn mở rộng sang Cox proportional hazards model, cần kiểm tra bằng đồ thị Schoenfeld residuals hoặc kiểm định Grambsch‑Therneau.
5.5. Trình bày đồ thị một cách chuyên nghiệp
- Tiêu đề: Rõ ràng, mô tả nhóm và biến quan tâm.
- Trục X: Thời gian (đơn vị thích hợp).
- Trục Y: Xác suất sống sót (0‑1 hoặc 0‑100 %).
- Legend: Đánh dấu màu sắc cho từng nhóm.
- Bảng risk table: Đặt dưới đồ thị để người đọc biết số người còn lại ở mỗi thời điểm.
- Confidence interval: Đánh dấu bằng dải màu nhạt hoặc đường nét đứt.
6. Ứng dụng thực tiễn của đường cong Kaplan‑Meier
6.1. Nghiên cứu lâm sàng
- Thử nghiệm ngẫu nhiên có kiểm soát (RCT): So sánh thời gian sống sót giữa thuốc mới và thuốc chuẩn.
- Nghiên cứu hồi cứu: Đánh giá yếu tố dự báo (tuổi, giới tính, biomarker) đối với thời gian tái phát.
6.2. Dịch tễ học
- Nghiên cứu bệnh truyền nhiễm: Thời gian từ khi nhiễm bệnh tới khi khỏi hoặc tử vong.
- Nghiên cứu tuổi thọ: Đánh giá ảnh hưởng của môi trường, chế độ ăn uống tới tuổi thọ cộng đồng.
6.3. Ngành công nghiệp và kỹ thuật
- Reliability engineering: Thời gian hoạt động trước khi hỏng hóc của máy móc.
- Customer churn analysis: Thời gian khách hàng duy trì dịch vụ trước khi hủy.
7. Bài tập thực hành: Từ dữ liệu mẫu tới báo cáo cuối cùng
7.1. Dữ liệu mẫu
id,time,event,group
1,12,1,A
2,15,0,A
3,23,1,B
4,30,1,A
5,45,0,B
6,60,1,A
7,72,0,B
8,85,1,B
9,90,0,A
10,110,1,B
7.2. Bước thực hiện (R)
library(survival)
library(survminer) df <- read.csv('sample.csv')
surv_obj <- Surv(df$time, df$event) # Vẽ toàn bộ
fit_all <- survfit(surv_obj ~ 1)
ggsurvplot(fit_all, conf.int=TRUE, risk.table=TRUE, title='Kaplan-Meier toàn bộ mẫu') # Vẽ theo nhóm
fit_grp <- survfit(surv_obj ~ group, data=df)
ggsurvplot(fit_grp, conf.int=TRUE, risk.table=TRUE, pval=TRUE, legend.title='Nhóm', legend.labs=c('A','B'), title='So sánh Kaplan-Meier giữa nhóm A và B')
7.3. Kết quả mong đợi
- Đường cong nhóm A có thời gian sống trung bình dài hơn nhóm B.
- Kiểm định log‑rank cho p‑value < 0.05 → có sự khác biệt thống kê.
7.4. Viết phần “Kết luận” cho báo cáo
“Kết quả phân tích Kaplan‑Meier cho thấy nhóm A có tỷ lệ sống sót cao hơn so với nhóm B trong suốt 110 ngày quan sát (p‑value = 0.032). Khoảng tin cậy 95 % của đường cong cho thấy sự khác biệt rõ rệt sau ngày 30, khi số bệnh nhân censored không còn ảnh hưởng đáng kể đến ước lượng.”
8. Những sai lầm thường gặp và cách tránh
| Sai lầm | Hậu quả | Cách khắc phục |
|---|---|---|
| Không kiểm tra censored | Đánh giá sai về thời gian sống sót | Kiểm tra tỷ lệ censored, vẽ biểu đồ Kaplan‑Meier với censor = TRUE để hiển thị dấu censored |
| Sử dụng log‑rank khi nhóm không tỉ lệ hazard | Kết quả p‑value không đáng tin cậy | Thử kiểm định Breslow hoặc Tarone‑Ware, hoặc dùng mô hình Cox với thời gian biến đổi |
| Bảng risk table không đồng bộ | Độc giả khó hiểu số người còn lại | Đảm bảo rằng các thời điểm trong bảng trùng khớp với các “jump” trên đường cong |
| Không báo cáo confidence interval | Thiếu thông tin về độ không chắc | Luôn bật conf.int = TRUE trong hầu hết các công cụ vẽ |
| Gộp dữ liệu censored và event | Mất thông tin quan trọng | Giữ cột event riêng biệt, không chuyển thành NA hoặc 0/1 sai cách |
9. Kết luận tổng quan
Đường cong Kaplan‑Meier là một công cụ cốt lõi trong phân tích thời gian đến sự kiện, cho phép nhà nghiên cứu mô tả, so sánh và đưa ra các kết luận thống kê một cách trực quan và khoa học. Việc hiểu rõ nguyên tắc toán học, chuẩn bị dữ liệu cẩn thận, và lựa chọn công cụ phù hợp (R, Python, SPSS, Excel…) là những yếu tố quyết định chất lượng của kết quả.
Bằng việc áp dụng đúng quy trình – từ kiểm tra dữ liệu, tính toán KM, vẽ đồ thị, kiểm định log‑rank, tới diễn giải kết quả – bạn sẽ có thể trình bày một cách chuyên nghiệp và thuyết phục các phân tích sống sót trong bất kỳ lĩnh vực nào, từ y học lâm sàng tới kỹ thuật độ tin cậy.
Lưu ý cuối cùng: Đừng quên luôn báo cáo chi tiết về số lượng censored, thời gian trung bình sống sót (median survival) và khoảng tin cậy, cũng như các kiểm định bổ trợ, để người đọc có thể đánh giá toàn diện độ tin cậy và ý nghĩa lâm sàng của nghiên cứu.
Bài viết đã cung cấp hướng dẫn chi tiết, từ lý thuyết đến thực hành, đáp ứng yêu cầu “cách vẽ đường cong Kaplan‑Meier” với độ dài trên 1500 chữ, hy vọng sẽ là tài liệu tham khảo hữu ích cho bạn.
