데이터 분석/프로젝트

[클론 프로젝트] 타이타닉 시각화/랜덤포레스트로 생존 여부 예측하기

용이 (young) 2023. 6. 30. 19:13
본 게시물은 youhan lee 님의 유튜브 영상을 기반으로 클론코딩을 진행한 뒤 정리한 글입니다. 
(유튜브 링크: https://youtu.be/_iqz7tFhox0) 

제가 작성한 전체 코드는 깃허브에서 확인하실 수 있어요. 

 

🙄 Titanic 탑승객의 생존 여부를 예측해봅시다 

  • 목적: titanic 탑승객의 정보를 바탕으로 생존 여부 예측하기 
  • 결과물: 랜덤포레스트로 예측 모델 구현 (정확도 87%), 가장 중요한 변수: Fare로 나타남 

 

python 시각화 연습과 분석 프로세스를 익히기 위해 진행한 클론 프로젝트입니다. 

 

titanic 데이터는 정말 유명하죠! 아마 데이터 시각화, 데이터 분석에 대한 강의나 이야기를 한 번이라도 들었다면 이 데이터는 아마 익숙할 것입니다. 

 

저도 익숙하게 들어온 데이터셋이지만, 생각해보니 정작 A to Z까지 해봤던 적은 없더라고요. youhan lee 님의 강의 영상을 보고 따라한 뒤 내용을 정리해보았습니다. 

 


데이터 정보 (전처리 전) 

  • 데이터 출처: 캐글의 titanic data에서 train.csv를 사용합니다 (test.csv는 Survived 컬럼이 존재하지 않음)  
컬럼명  타입  설명 
Survived (target label)  categorical  생존 여부 (0= Not Survived, 1= Survived)
- - -
PassengerId string(object)   탑승객 고유 아이디 
Pclass categorical 좌석 등급 (1, 2, 3) 
Name string(object)  탑승객 이름 
Sex categorical  성별 (male, female) 
Age int 나이 
SibSp int 형제자매 수 
Parch  int 같이 탑승한 부모님 혹은 자녀 수 
Ticket  string(object)  티켓 이름 (불분명)  
Fare  float 탑승 요금 
Cabin categorical  선실 
Embarked  categorical  탑승한 항구 이름 

 


🧐 분석 프로세스 

 

 

각 프로세스의 목적과 짚고 넘어간 내용 

1) Data 확인 

  • 필요한 라이브러리, 데이터셋 임포트
  • 요약 통계, 결측치 여부 체크 (info(), msno, isna.sum() 등 활용) 

2) EDA 

  • 목적: target label이 독립 변수에 대하여 어떤 분포를 가지는지 중심으로 파악 
  • 필요 시 새로운 변수 생성 (Family = SibSp + Parch) 
  • crosstab 혹은 kdeplot, countplot 등 활용 
  • 추후 모델링 과정에서 어떤 변수를 유의해서 봐야할지 파악할 수 있음 

예시


** 다음의 과정은 ML 모델을 적용하기 위한 준비입니다. 어떤 방법론을 선택하느냐에 따라서 달라질 수 있음. 

3) Feature Engineering 

  • 결측치 채우기 - age는 Name 기준 grouping 평균으로 채우기 
    • Name에서 성을 추출하여 그룹핑
    • 성 추출하여 initial 컬럼 생성 
  • 적은 수의 결측치를 가진 경우는 최빈값으로 채우기 (Embarked) 
  • age 등은 categorizing (함수로 apply 적용)
  • Fare은 skewness 확인하고 Scaling (skewness = 4.79 -> 0.44)

4) Pearson Correlation 

  • 목적: 랜덤포레스트모델 적용 전, 상관계수가 높은 변수들이 있는지 확인하기 위함 (보통 절댓값 >0.7이면 높은 것) 
  • 이 titanic의 경우 상관관계 강한 변수 없어서 모든 변수 갖고 모델링 진행하기로 

5) One-hot Encoding 

  • 범주형(categorical) 컬럼을 dummy column 만들기 -> 모델의 예측력 높이기 위한 사전 작업 
  • 필요없는 변수는 drop하기 (dummy column 생성 시 기존 원래 컬럼은 필요없음, 결측치 많았던 컬럼 drop하기) 

6) Modeling (RandomForestClassifier) 

  • 7:3으로 train set/test set split, 랜덤포레스트분류모델 활용 (정확도: 87.2%) 

 

7) Feature Importance 

  • model 해석 위한 feature importance 추출해보기 
  • 결과: 해당 모델에서 Fare이 가장 중요도가 높은 변수로 나옴 

8) (추가) Tree Visualization 

  • export_graphviz 활용해 트리 그려보기 
  • but 랜덤포레스트는 ensemble 모델이라서 하나의 트리만을 임의로 골라서 그려봐야 함. 즉, 크게 의미는 없을 듯 하다 (하나만 그려본다면)