생존 분석? 어렵지 않아요! Kaplan-Meier 모델을 R로 쉽게 이해해보자
혹시 생존 분석이라는 말을 들어보셨나요? 처음 들으면 어렵게 느껴질 수 있지만, 사실 알고 보면 그렇게 복잡한 개념은 아니에요. 오늘은 Kaplan-Meier 생존 분석 모델을 R을 사용해 쉽게 소개해보려고 합니다.
생존 분석은 주로 생명 과학이나 의학 연구에서 많이 사용되지만, 고객 이탈 분석이나 제품의 수명을 측정하는 데도 자주 쓰이는 강력한 도구입니다. 생존 분석의 대표적인 모델인 Kaplan-Meier 모델을 예제로 함께 알아볼까요?
Kaplan-Meier 생존 분석이란?
생존 분석은 시간의 흐름에 따라 사건(예: 폐업, 이탈, 사망 등)이 발생할 확률을 추정하는 방법입니다. 이 모델을 사용하면 특정 사건이 발생할 때까지의 시간을 분석할 수 있어요. 예를 들어, 고객이 서비스에서 이탈할 확률이나 제품이 고장날 때까지의 기간을 측정할 수 있습니다.
Kaplan-Meier 모델은 생존 곡선을 만들어서 시간이 지남에 따라 사건이 발생할 가능성을 시각적으로 보여줍니다. 이 곡선이 떨어질 때마다 사건이 발생했다는 뜻이에요.
쉬운 예제로 Kaplan-Meier 모델 알아보기
자, 이제 실생활에서 적용할 수 있는 쉬운 예를 들어볼게요. 고객 이탈 분석을 예로 들어보겠습니다. 우리는 10명의 고객이 서비스를 사용하고 있다고 가정할 수 있습니다. 이 중 몇 명은 서비스를 계속 사용하고, 몇 명은 이탈하겠죠? Kaplan-Meier 모델을 사용해서 이탈할 확률을 분석해볼 수 있어요.
R 코드를 사용해 이 과정을 시각화할 거예요.
# 필요한 라이브러리를 불러옵니다
library(survival)
library(survminer)
# 10명의 고객 데이터를 생성합니다
# 고객이 서비스를 사용한 연도와 이탈한 연도를 기록합니다
data <- data.frame(
customer = 1:10,
start_year = rep(2020, 10), # 모든 고객이 2020년에 서비스를 시작
leave_year = c(2021, NA, 2022, NA, 2023, 2024, NA, NA, 2023, 2024) # 이탈하지 않은 경우 NA
)
# 고객이 서비스를 사용한 기간을 계산합니다
data$time_in_service <- ifelse(is.na(data$leave_year), 2024 - data$start_year, data$leave_year - data$start_year)
# 고객의 이탈 여부를 1과 0으로 표시합니다 (1: 이탈, 0: 여전히 사용 중)
data$status <- ifelse(is.na(data$leave_year), 0, 1)
코드 설명:
- 데이터 생성: 2020년에 서비스를 시작한 10명의 고객 데이터를 생성합니다. 일부 고객은 2021년부터 이탈하기 시작하고, 나머지는 여전히 서비스를 사용 중입니다.
- 이탈 기간 계산: 각 고객이 서비스를 몇 년 동안 사용했는지 계산합니다. 이탈하지 않은 고객은 2024년까지 서비스를 사용한 것으로 간주됩니다.
- 이탈 여부: 고객이 이탈했는지 여부를 1(이탈)과 0(여전히 사용 중)으로 표시합니다.
Kaplan-Meier 생존 곡선 시각화
이제 데이터를 바탕으로 Kaplan-Meier 생존 곡선을 그려봅시다. 고객이 서비스를 얼마나 오래 사용했는지 시각적으로 나타내는 곡선을 만들어보겠습니다.
# Kaplan-Meier 생존 모델을 적용합니다
fit <- survfit(Surv(time_in_service, status) ~ 1, data = data)
# 생존 곡선을 시각화합니다 (데이터를 명시적으로 전달)
ggsurvplot(fit,
data = data, # ggsurvplot에 데이터 전달
conf.int = TRUE, # 신뢰구간 표시
xlab = "서비스 사용 기간(년)", # x축 레이블
ylab = "서비스를 사용하는 고객 비율", # y축 레이블
title = "서비스를 사용하는 고객의 생존 곡선", # 그래프 제목
palette = "blue", # 그래프 색상
risk.table = TRUE, # 각 연도별 리스크 테이블 추가
ggtheme = theme_minimal()) # 미니멀 테마 적용
코드 설명:
- Kaplan-Meier 모델 적용: 고객 데이터에 Kaplan-Meier 생존 모델을 적용하여 이탈 확률을 계산합니다.
- 생존 곡선 시각화:
ggsurvplot
함수를 사용해 서비스 사용 기간에 따른 고객의 생존 곡선을 그립니다.conf.int = TRUE
는 신뢰 구간을 나타내어 결과의 신뢰도를 높입니다. - 리스크 테이블 추가: 각 연도마다 서비스를 사용하고 있는 고객 수를 표시하는 테이블을 그래프 아래에 추가합니다.
시각화 결과 해석
1. 생존 곡선 개요
- 이 그래프는 서비스 사용 고객의 생존 곡선을 보여줍니다.
- x축은 서비스 사용 기간(년)을 나타내고, y축은 여전히 서비스를 사용하는 고객 비율을 나타냅니다.
- 처음에 모든 고객(100%)이 서비스를 사용하고 있으며, 시간이 지남에 따라 고객이 이탈하면서 생존 곡선이 단계적으로 하락합니다.
2. 곡선의 주요 지점
- 그래프는 0년에서 시작하여 처음에는 모든 고객(10명)이 서비스를 사용하고 있음을 보여줍니다.
- 1년이 경과하면서 첫 번째 이탈이 발생하고, 이때 생존 곡선이 100%에서 약 90%로 떨어집니다.
- 2년이 지나면 다시 이탈이 발생하여, 생존 곡선이 약 80%로 떨어집니다.
- 3년 이후로 생존 곡선이 다시 하락하여, 60%의 고객만이 남아 서비스를 계속 사용하고 있습니다.
- 4년 시점에서는 생존 곡선이 더 하락하여 최종적으로 약 50%의 고객만이 남습니다.
3. 신뢰 구간 (회색 음영)
- 파란색 생존 곡선 주변의 회색 음영은 신뢰 구간(Confidence Interval)을 나타냅니다.
- 이는 각 지점에서 생존 확률의 신뢰도를 나타내며, 음영이 넓을수록 예측에 대한 불확실성이 크다는 것을 의미합니다.
- 신뢰 구간은 생존 곡선이 하락할 때마다 넓어지며, 시간이 지남에 따라 예측의 불확실성이 커집니다.
4. 위험에 처한 수 (Number at Risk) 테이블
- 그래프 하단에는 “Number at Risk”라는 테이블이 있습니다.
- 이 테이블은 각 연도별로 여전히 서비스를 사용하는 고객의 수를 나타냅니다.
- 0년 시점에서는 10명의 고객이 모두 서비스를 사용 중입니다.
- 1년 후에는 9명의 고객이 남아 있고, 2년 후에는 8명, 3년 후에는 6명이 여전히 서비스를 사용 중입니다.
5. 곡선 해석
- 생존 곡선의 하락: 곡선이 하락하는 부분은 고객이 서비스를 이탈했음을 나타냅니다. 서비스 사용 기간이 길어질수록 이탈하는 고객 수가 늘어나고, 그에 따라 생존 곡선이 점차 하락합니다.
- 마지막 생존율: 4년 후에는 절반(50%)의 고객이 서비스를 계속 사용하고 있습니다. 즉, 나머지 50%는 서비스에서 이탈한 것입니다.
이 그래프는 Kaplan-Meier 생존 분석을 통해 고객의 서비스 사용 지속 기간과 이탈 경향을 시각적으로 보여줍니다. 시간 경과에 따라 서비스에서 이탈하는 고객의 비율을 명확히 파악할 수 있습니다.
정리하기: Kaplan-Meier 모델 R 분석, 더 이상 어렵지 않아요!
오늘 우리는 Kaplan-Meier 생존 분석 모델을 쉽게 이해하고, R을 사용해 직접 시각화까지 해보았습니다. 이 모델은 처음에는 어렵게 느껴질 수 있지만, 이렇게 고객 이탈 분석과 같은 실제 사례에 적용하면 훨씬 이해하기 쉬워집니다. 앞으로도 다양한 데이터 분석에 이 모델을 활용해 보세요!
아래 전체 코드를 한번에 복사해서 RStudio에 붙혀넣기 해서 실행할 수 있습니다. 혹시 이 카플란-마이어 모델의 실제 적용사례가 궁금하신 분은 흑백요리사도 피하지 못하는 미슐랭 저주: R로 분석한 이야기 포스트를 리뷰해 보시기를 바랍니다.
#전체 R 코드
# 필요한 라이브러리를 불러옵니다
library(survival)
library(survminer)
# 10명의 고객 데이터를 생성합니다
# 고객이 서비스를 사용한 연도와 이탈한 연도를 기록합니다
data <- data.frame(
customer = 1:10,
start_year = rep(2020, 10), # 모든 고객이 2020년에 서비스를 시작
leave_year = c(2021, NA, 2022, NA, 2023, 2024, NA, NA, 2023, 2024) # 이탈하지 않은 경우 NA
)
# 고객이 서비스를 사용한 기간을 계산합니다
data$time_in_service <- ifelse(is.na(data$leave_year), 2024 - data$start_year, data$leave_year - data$start_year)
# 고객의 이탈 여부를 1과 0으로 표시합니다 (1: 이탈, 0: 여전히 사용 중)
data$status <- ifelse(is.na(data$leave_year), 0, 1)
# Kaplan-Meier 생존 모델을 적용합니다
fit <- survfit(Surv(time_in_service, status) ~ 1, data = data)
# 생존 곡선을 시각화합니다 (데이터를 명시적으로 전달)
ggsurvplot(fit,
data = data, # ggsurvplot에 데이터 전달
conf.int = TRUE, # 신뢰구간 표시
xlab = "서비스 사용 기간(년)", # x축 레이블
ylab = "서비스를 사용하는 고객 비율", # y축 레이블
title = "서비스를 사용하는 고객의 생존 곡선", # 그래프 제목
palette = "blue", # 그래프 색상
risk.table = TRUE, # 각 연도별 리스크 테이블 추가
ggtheme = theme_minimal()) # 미니멀 테마 적용