R 데이터분석 예제: 타이타닉 생존자 예측으로 배우는 데이터 분석 기초

1912년의 타이타닉호 참사는 역사상 가장 유명한 해양 사고 중 하나로, 많은 사람들의 기억 속에 남아 있습니다. 그런데 타이타닉호에 탑승했던 승객들이 누구였는지, 그리고 어떤 요인이 그들의 생사를 결정했는지 분석할 수 있다는 사실을 알고 계신가요?

이번 포스트에서는 R 데이터분석 예제로 타이타닉 생존자 데이터를 활용하여, 어떤 특징이 생존 확률에 영향을 미쳤는지 예측하는 방법을 배워보겠습니다. 이 포스트를 통해 데이터 로드부터 분석, 시각화, 그리고 예측 모델링까지 차근차근 배워볼 수 있으니 끝까지 집중해 주세요!

R 데이터분석 예제-타이타닉 데이터 시각화

타이타닉 생존자 예측의 중요성

타이타닉 데이터는 데이터 분석 학습에 있어 매우 중요한 예제로 자주 사용됩니다. 이 데이터셋은 승객들의 성별, 나이, 탑승 클래스, 운임 등 다양한 정보를 포함하고 있어, 이러한 특징들이 승객의 생존 여부에 어떤 영향을 미쳤는지 분석하기에 적합합니다. 이번 데이터분석 예제에서는 이 정보를 바탕으로 생존 여부를 예측하는 간단한 로지스틱 회귀 모델을 구축해 보겠습니다.

이 과정에서 데이터 전처리, 탐색적 데이터 분석(EDA), 시각화, 그리고 예측 모델링에 이르는 데이터 분석 전 과정을 실습할 수 있습니다.

데이터 로드 및 탐색

우선 타이타닉 데이터를 R에서 불러오고 탐색해보겠습니다. 이 데이터는 Kaggle에서 제공하는 대표적인 학습용 데이터셋으로, 승객들의 다양한 특성이 기록되어 있습니다.

R에서 데이터 로드

# 데이터셋 불러오기
install.packages("titanic")
library(titanic)

# 타이타닉 데이터 불러오기
data("titanic_train")
titanic <- titanic_train

# 데이터 탐색
str(titanic)
summary(titanic)
head(titanic)

위 코드를 통해 titanic_train 데이터를 R로 불러오고, 데이터의 구조와 기초 통계량을 확인할 수 있습니다. 데이터는 Survived, Pclass, Sex, Age, Fare, Embarked 등의 변수를 포함하고 있습니다.

R 데이터분석 예제-타이타닉 데이터 탐색1
[ str(titanic) 실행결과 화면 ]
R 데이터분석 예제-타이타닉 데이터 탐색2
[ summary(titanic) 실행결과 화면 ]
R 데이터분석 예제-타이타닉 데이터 탐색3
[ head(titanic) 실행결과 화면 ]

데이터 구조 설명

  • Survived: 생존 여부 (0 = 사망, 1 = 생존)
  • Pclass: 탑승 클래스 (1 = 1등석, 2 = 2등석, 3 = 3등석)
  • Sex: 성별 (male, female)
  • Age: 나이
  • Fare: 운임
  • Embarked: 승선한 항구 (C = Cherbourg, Q = Queenstown, S = Southampton)

이 데이터를 통해 각 승객이 가진 특성들이 생존에 어떤 영향을 미쳤는지 분석할 수 있습니다.

데이터 전처리 및 시각화

타이타닉 데이터는 일부 결측값(missing value)을 포함하고 있습니다. 특히 Age 열에 결측값이 많으므로, 이를 처리해 줘야 합니다. 기본적인 전처리 작업을 수행한 후, 승객의 나이와 성별, 탑승 클래스별 생존율을 시각화해 보겠습니다.

데이터 전처리

# 결측치 처리 (결측값을 중앙값으로 대체)
titanic$Age[is.na(titanic$Age)] <- median(titanic$Age, na.rm = TRUE)

# 데이터 구조 확인
summary(titanic$Age)

# 위 코드 실행결과 #
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.42   22.00   28.00   29.36   35.00   80.00 

위 코드에서는 나이의 결측값을 중앙값으로 대체했습니다. 데이터 전처리하고 나이에 대해서 데이터 구조를 확인해 보니 평균이 29.36세이고 중간 나이는 28세이네요. 최대 최소 나이를 보니 그 간격이 80년이나 되네요. 이제 나이와 성별, 탑승 클래스에 따른 생존율을 시각화해 보겠습니다.

R에서 생존율 시각화

# ggplot2 설치 및 로드
install.packages("ggplot2") # 설치된 경우는 삭제하시면 됩니다.
library(ggplot2)

# 성별과 탑승 클래스에 따른 생존율 시각화
ggplot(titanic, aes(x=Pclass, fill=as.factor(Survived))) +
  geom_bar(position="fill") +
  facet_wrap(~Sex) +
  labs(title="성별 및 탑승 클래스에 따른 생존율", x="탑승 클래스", y="비율", fill="생존 여부")

이 R 데이터분석 예제를 통해 성별과 탑승 클래스별 생존율을 직관적으로 확인할 수 있습니다. 예를 들어, 1등석에 탄 여성 승객의 생존율이 매우 높다는 사실을 시각적으로 확인할 수 있으며, 이는 생존 여부에 큰 영향을 미친 요인 중 하나임을 보여줍니다. 남성의 경우는 클래스에 따른 생존 여부가 그렇게 크게 영향을 미치지 않음을 알 수가 있습니다.

R 데이터분석 예제-타이타닉 데이터 시각화1

로지스틱 회귀를 이용한 생존 예측 모델

이제 본격적으로 예측 모델을 만들어 보겠습니다. 이번에는 로지스틱 회귀를 사용하여 생존 여부를 예측하는 간단한 모델을 구축하겠습니다. 로지스틱 회귀는 이진 분류 문제에서 자주 사용되는 기법으로, 데이터를 바탕으로 승객의 생존 여부를 예측할 수 있습니다.

R에서 로지스틱 회귀 모델 구축

# 로지스틱 회귀 모델 구축
model <- glm(Survived ~ Pclass + Sex + Age + Fare, data=titanic, family=binomial)

# 모델 요약
summary(model)

# 코드 실행결과 #
Call:
glm(formula = Survived ~ Pclass + Sex + Age + Fare, family = binomial, 
    data = titanic)

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  4.6553374  0.5085945   9.153  < 2e-16 ***
Pclass      -1.1529180  0.1355637  -8.505  < 2e-16 ***
Sexmale     -2.6072959  0.1872514 -13.924  < 2e-16 ***
Age         -0.0331244  0.0073991  -4.477 7.58e-06 ***
Fare         0.0005922  0.0020347   0.291    0.771    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1186.7  on 890  degrees of freedom
Residual deviance:  805.5  on 886  degrees of freedom
AIC: 815.5

Number of Fisher Scoring iterations: 5

이 코드를 통해 탑승 클래스, 성별, 나이, 운임을 독립 변수로 설정하여 생존 여부를 예측하는 로지스틱 회귀 모델을 만들 수 있습니다. summary() 함수는 모델의 계수를 보여주며, 어떤 변수가 생존에 유의미한 영향을 미치는지 알 수 있습니다.

통계수치 설명

(모델 설명)
glm(formula = Survived ~ Pclass + Sex + Age + Fare, family = binomial, data = titanic)
Survived (생존 여부)를 종속 변수로 두고, Pclass(탑승 클래스), Sex(성별), Age(나이), Fare(운임)를 독립 변수로 사용했습니다. family = binomial은 이 모델이 이진 분류 문제를 다룬다는 것을 의미합니다. 즉, 생존 여부가 0(사망) 또는 1(생존)으로 분류됩니다.
(Coefficients 계수 설명)
– Intercept(y절편)
Estimate (추정치): 4.655
의미: 이 값은 모든 독립 변수가 0일 때의 생존 확률을 나타냅니다. 로지스틱 회귀에서는 이 값을 해석하는 것이 다소 복잡할 수 있지만, 기본적으로 이는 특정 변수가 없을 때의 생존 가능성을 나타냅니다.
– Pclass (탑승 클래스)
Estimate (추정치): -1.153
의미: 클래스가 1등석에서 3등석으로 갈수록 생존 확률이 감소함을 의미합니다. 계수가 음수이기 때문에, 탑승 클래스가 높을수록(1등석) 생존 확률이 높고, 낮을수록(3등석) 생존 확률이 낮아집니다.
– Sex (성별: 남성)
Estimate (추정치): -2.607
의미: 성별이 남성일 경우, 생존 확률이 낮아진다는 것을 보여줍니다. 남성이 여성보다 생존할 확률이 더 낮음을 나타내며, 이는 타이타닉 사고 당시 “여성 우선” 구조 원칙과 일치하는 결과입니다.
– Age (나이)
Estimate (추정치): -0.033
의미: 나이가 많을수록 생존 확률이 약간 줄어듭니다. 나이의 계수는 음수이므로, 나이가 많아질수록 생존 확률이 약간 감소합니다.
– Fare (운임)
Estimate (추정치): 0.000592
의미: 운임이 높을수록 생존 확률이 증가하는 경향이 있지만, 이 값은 매우 작고 통계적으로 유의미하지 않다고 판단됩니다. 실제로 p-value(Pr(>|z|))가 0.771로, 운임이 생존 여부에 미치는 영향은 거의 없다는 것을 보여줍니다.
– p-값(Pr(>|z|))
p-value는 각 변수의 통계적 유의성을 보여줍니다. 값이 0.05보다 작으면 해당 변수는 생존 여부에 통계적으로 유의미한 영향을 미친다고 볼 수 있습니다. 결과에서 세 개의 변수는 매우 유의미한 영향을 미치며, 각각의 p-value는 다음과 같습니다:
Pclass: < 2e-16 (매우 유의미) | Sex: < 2e-16 (매우 유의미) | Age: 7.58e-06 (매우 유의미)
반면, Fare는 p-value가 0.771로 생존 여부에 통계적으로 유의미한 영향을 미치지 않습니다.
– 무이탈도 및 잔여 이탈도
Null deviance: 1186.7
모델을 적용하지 않고 평균값으로만 예측했을 때의 오차입니다.
Residual deviance: 805.5
모델을 적용한 후 남은 오차입니다. 이 두 값을 비교하면 모델이 얼마나 잘 작동했는지 확인할 수 있습니다. 오차가 줄어들었기 때문에 이 모델이 유의미한 성능을 보였다고 할 수 있습니다.
-AIC(아카이케 정보 기준): 815.5
AIC는 모델의 적합도를 나타내며, 값이 낮을수록 더 좋은 모델입니다. AIC는 다른 모델과 비교할 때 유용합니다.
(종합 정리)
탑승 클래스, 성별, 나이 모두 생존 확률에 매우 유의미한 영향을 미쳤으며, 특히 탑승 클래스와 성별은 가장 큰 영향을 미친 요인입니다. 운임은 생존에 유의미한 영향을 미치지 않았습니다. 전체적으로 이 모델은 타이타닉 생존자를 예측하는 데에 적합한 모델이라고 할 수 있습니다.

예측 결과 평가

모델을 구축한 후에는 이를 평가하는 과정이 필요합니다. 실제로 이 모델이 얼마나 정확하게 생존 여부를 예측하는지 평가하기 위해 예측 값을 생성하고, 혼동 행렬(confusion matrix)을 통해 평가합니다.

# 예측 값 생성
pred <- predict(model, type="response")

# 0.5 이상일 경우 생존으로 간주
pred_class <- ifelse(pred > 0.5, 1, 0)

# 실제 값과 비교하여 혼동 행렬 생성
table(pred_class, titanic$Survived)

# 코드 실행결과 #
pred_class   0   1
         0 469  98
         1  80 244

데이터분석 예제에서는 예측 값이 0.5 이상이면 생존(1), 그렇지 않으면 사망(0)으로 분류하여 실제 값과 비교합니다. 혼동 행렬을 통해 모델의 정확도와 예측 성능을 평가할 수 있습니다. 모델은 상당히 정확(80%)하여 대부분의 승객의 생존 상태를 정확하게 예측합니다. 정밀도(75.3%)가 높아서 즉, 누군가가 살아남을 것이라고 예측하면 일반적으로 맞습니다. 그러나 재현율(71.4%)에서는 일부 생존자를 맞추지 못하고 비생존자로 예측하는 것으로 나타났습니다. 승객이 생존하지 않았는데 생존했다고 잘못 예측하는 거짓양성률(14.6%)도 일부 있습니다.

데이터 분석에서 흔히 하는 실수와 해결 방법

R 데이터분석 예정 - 주요 실수 그림

데이터 분석을 진행하다 보면 다양한 실수를 저지를 수 있습니다. 이번 데이터분석 예제에서 발생할 수 있는 주요 실수와 그 해결 방법을 살펴보겠습니다.

  1. 결측치 처리의 실수: 결측치를 단순히 제거하거나 잘못 처리하면 분석 결과가 왜곡될 수 있습니다. 결측치를 처리할 때는 중앙값이나 평균값, 또는 모델링 기법을 사용하여 대체하는 것이 좋습니다.
  2. 데이터 스케일링 부족: 로지스틱 회귀 모델에서는 데이터의 스케일 차이가 크면 모델 성능이 떨어질 수 있습니다. 특히, 운임(Fare)과 같은 변수는 스케일링 처리가 필요할 수 있습니다.
  3. 과적합 문제: 학습 데이터에만 너무 적합된 모델을 만들면, 새로운 데이터에 대한 예측 성능이 떨어질 수 있습니다. 이럴 때는 교차 검증(Cross-validation)을 통해 모델 성능을 평가하는 것이 중요합니다.

FAQ

Q1: 타이타닉 데이터는 어디에서 다운로드할 수 있나요?
A: 타이타닉 데이터셋은 Kaggle에서 다운로드할 수 있습니다. 다양한 데이터셋과 함께 제공되며, 모델링 실습에 유용합니다.

Q2: 로지스틱 회귀 모델은 어떻게 작동하나요?
A: 로지스틱 회귀는 연속 변수가 아닌 이진 변수를 예측하는 데 사용됩니다. 확률 값을 출력하며, 이를 기준으로 특정 사건의 발생 가능성을 예측할 수 있습니다.

Q3: 데이터 전처리에서 결측값을 어떻게 처리해야 하나요?
A: 결측값을 처리하는 방법은 상황에 따라 다릅니다. 중앙값이나 평균값으로 대체하거나, 결측치를 포함한 모델링 기법을 사용할 수 있습니다.

정리하기

이번 포스트에서는 데이터분석 예제로 타이타닉 생존자 데이터를 활용하여 생존 예측 모델을 구축해 보았습니다. 데이터를 전처리하고, 다양한 시각화를 통해 인사이트를 얻었으며, 로지스틱 회귀 모델을 사용하여 예측 분석을 진행했습니다. 타이타닉 데이터는 데이터 분석의 기초부터 실전 응용까지 폭넓게 활용될 수 있는 훌륭한 학습 자료입니다.

여러분도 이번 예제를 바탕으로 데이터 분석의 기본기를 다지고, 다양한 데이터셋에 도전해 보세요!

유사한 게시물