본문 바로가기
데이터 분석

타이타닉 데이터로 알아보는 승객 정보와 생존률

by Boggi 2024. 1. 10.
반응형

1. 목적

실제로 여성이 남성보다 생존률이 높을까?

실제로 1등석 승객이 3등석 승객보다 생존률이 높을까?

그 당시 티켓의 가격은 어땠을까?

어떤 사람들이 배에 승선했을까?

 

타이타닉 영화를 보며 궁금해지는 과거의 상황을 유추해보고 의사결정나무로 분류 분석 모델을 만들어보자.

 

2. 분석 대상 데이터

타이타닉에 탑승한 891명의 승객 데이터

 

3. 분석 결과

클래스과 생존률의 관계는 상관이 있다.

성별과 생존률의 관계는 상관이 있다.

나이와 생존률의 관계는 상관이 있다.

결론: 3등선, 20대&30대&40대 남자가 많은 희생을 당했다.

 

모델 성능

Accuracy (정확도): 0.8379
전체 테스트 데이터 중 올바르게 예측한 비율로, 약 83.8%의 정확도를 보인다.


Classification Report (분류 보고서):
Precision (정밀도): 예측 True 중 올바르게 True를 찾아낸 비율 --> 사망일거라고 예측 실제로 사망을 맞춘 확률. 생존이라고 예측하고 실제로 생존을 맞출 확률사망 0에 대한 정밀도: 0.87
생존 1에 대한 정밀도: 0.78


Recall (재현율): 실제 True 중 올바르게 True를 찾아낸 비율 Precision과 동일한 지표로 모형의 완전성을 평가하는 지표 -->

실제로 사망한 데이터 중 올바르게 사망을 예측한 비율 실제 생존 데이터 중 생존을 올바르게 예측한 비율
사망 0의 재현율: 0.89 모델이 --> 89%를 올바르게 예측
생존 1의 재현율: 0.74 --> 모델이 74%를 올바르게 예측


F1-score (F1 점수): 정밀도와 재현율의 조화 평균으로, 두 지표의 균형을 나타냄
사망 0의 F1-score: 0.88
생존 1의 F1-score: 0.76

이 결과를 종합하면, 사망과 생존을 구별하는 능력은 꽤 좋지만, 생존 데이터에 대한 예측이 약간 부족한 것으로 나타남. 생존 데이터와 사망 데이터의 불균형 때문에 일어나는 당연한 현상임.

 

+ 알아낸 사실

가장 비싼 배값은?? 마지막에 추가

데이터를 깊이 보다가 뜻밖에 알게 된 너무 슬픈 사실.. 이것도 마지막에 추가

 

4. 전체 과정

1) data load

 

2.결측값 처리

Embarked(승선) 컬럼에서2개의 결측값

나이 데이터에 100개 이상의 결측값이 있음

 

3. 이상값 확인

Fare(표값)에 이이상값이 많은 것을 확인. 왜 표에 이상값이 많을까? 표값은 한정적일텐데?라는 의구심을 가짐.

아마 개별로 표값을 매긴 게 아니라 단체손님은 단체값을 기재했을 가능성 예측.

 

4. Outlier함수 만들기

 

5. 상한값을 넘가는 Fare 알아보기

배값이 263불도 보이고.. 76불도 보이고 너무 차이가 많이 난다고 생각. 그럼 그 당시 티켓의 가격은 얼마였을까? 의문점 발생

 

6. 티켓의 평균값 구하기

1등선 84불

2등선 20불

3등선 13불

이건 매우 중요한 정보였다! 그럼 200불이 넘어가는 상한가는 뭔가 다른 요소가 있었다는 의미!

 

7. 티켓의 값을 집중적으로 분석

Pclass(3등선) 가장 저렴한3등선인데 69불이 나왔을 리가 없다. 

Name컬럼을 보니 모두 가족인 것 같다. 그리고 가족의 표값이 모두 합쳐져서 동일하게 나왔을 가능성 추측

1인당 표값은 약 8달러가 아닐까 예상

 

8. 1등석 단체 표값 확인

3등석의 가족승객 표값과 1등석의 가족승객 표값을 보니 평균보다 낮은 걸 알 수 있다. 그럼 단체 표값에는 단체할인이 들어갔을 것으로 예측해본다.(하지만 이상치때문에 그럴 수도 있으니 확신할 수는 없다)

 

 

9. SibSp컬럼과 Parch컬럼의 예측

Kaggle에 보면 SibSp는 남매의 수(라고만 알고이었는데 남매와 배우자인 것 같다), Parch는 부모와 자식의 수를 의미한다고 나와있다. 그래서 어떻게 기재를 했을까 이 두 데이터의 Age를 보면 빨간 박스가 된 분들이 부모였을 것이다. 부모는 SibSp에 배우자를 적었을 것으로 예측이 되고 Parch에는 자식들과 본인을 적었을 것을 추정. 아이들은 SibSp에 본인들의 남매 수를 적고 Parch에는 부모님의 수(2명)을 적었을 것이라 추정. 그래서 둘이 합치면 가족수가 나오는 것 같다.

하지만 SibSp 일정하지가 않았다. 이 당시 아메리칸드림을 꿈꾸는 사람들도 많이 승선했다는 배경지식을 보자면 아마 영어를 잘 하지 못 하는 가족들이 기재를 잘못했을 가능성을 예측.

 

 

10. 배값을 내지 않고 승선한 사람들

Fare값을 내지 않은 사람들이 있다.  총 15명이 있고 이들의 공통점은 가족정보를 적지 않거나 나이정보 등 개인 신상정보를 자세히 적지 않았고 모두 남자였다는 사실! 누구였을까 값을 내지 않고 승선했던 이 사람들은?

 

 

11. 가족 승객이 더 많았을까? 혼자 탄 승객이 더 많았을까?

람다함수로 파생변수 family에 0인 사람들을 1로 돌리고 family의 value_counts를 구해보니 혼자 탄 승객이 압도적으로 모든 가족을 다 합친 수보다 압도적으로 많았다. 

  • 혼자 탄 사람의 비율 : 78%
  • 동반 탑승 : 22%

 

12. Fare의 이상치를 조정하자

이상치가 있으면 분석에 방해가 되니 가격을 파생변수인 가족으로 나눠서 개인의 표값을 adj_fare이라는 파생변수로 만듦.

 

13. 분석에 사용할 변수 선택

 

14. 등급별 생존 그래프

앞에 1,2,3은 1등선 2등선 3등선을, 컴마 뒤에 있는 1은 생존을, 0은 사망을 의미한다.

 

 

15. 성별별 생존률

 

16 나이별 생존률

결론: 3등선, 20대&30대&40대 남자가 많은 희생을 당했다.

 

참고로 나이를 나누는 함수를 작성해서 나이를 나눴다

 

17. 변수를 나누고 홀드아웃

 

18 .의사결정 나무로 분류분석 모델 생성

결과:

Accuracy (정확도): 0.8379
전체 테스트 데이터 중 올바르게 예측한 비율로, 약 83.8%의 정확도를 보인다.


Classification Report (분류 보고서):
Precision (정밀도): 예측 True 중 올바르게 True를 찾아낸 비율 --> 사망일거라고 예측 실제로 사망을 맞춘 확률. 생존이라고 예측하고 실제로 생존을 맞출 확률사망 0에 대한 정밀도: 0.87
생존 1에 대한 정밀도: 0.78

Recall (재현율): 실제 True 중 올바르게 True를 찾아낸 비율 Precision과 동일한 지표로 모형의 완전성을 평가하는 지표 -->

실제로 사망한 데이터 중 올바르게 사망을 예측한 비율 실제 생존 데이터 중 생존을 올바르게 예측한 비율
사망 0의 재현율: 0.89 모델이 --> 89%를 올바르게 예측
생존 1의 재현율: 0.74 --> 모델이 74%를 올바르게 예측


F1-score (F1 점수): 정밀도와 재현율의 조화 평균으로, 두 지표의 균형을 나타냄
사망 0의 F1-score: 0.88
생존 1의 F1-score: 0.76

이 결과를 종합하면, 사망과 생존을 구별하는 능력은 꽤 좋지만, 생존 데이터에 대한 예측이 약간 부족한 것으로 나타남. 생존 데이터와 사망 데이터의 불균형 때문에 일어나는 당연한 현상임.

 

 

 

 

궁금점! 가장 비싼 배값은 얼마였을까?

데이터에 나온 값은 자그마치 512불. 이 세명은 가족은 아닌 것 같다. 성인 3명이고, 친구일 수도 있고 직장 동료일 수도 있다. 이들의 티켓 정보가 동일한 것으로 보아 한 방을 썼을 가능성이 있다.

저 500불이 한 방의 가격일 수도 있고 한 명의 가격일 수도 있다. 여러분은 어떻게 생각하는가?

 

번외편) 뜻밖에 알게 된 슬픈 사실

  파생변수 family의 가장 많은 수를 찾아보니 10이 나왔다. 그래서 그 숫자를 찾아서 어떤 단체인지 확인을 해보았다.

데이터를 보면 3등석을 탄 가족이었고 10명의 가족이었지만 이름이나 티켓으로 찾아봐도 7명만 나왔다. 그리고 이들의 나이는 모두 미기재된 상태였다( 여기에 채워진 Age값은 KNN으로 채워진 값이다) 

이들이 모두 SibSp에는 8이라고 적혀있고 Parch는 2라고 적힌 것으로 보아서는 전부 자식들이었던 것 같다. 자식들 중에 그나마 가장 장남 장녀는 동생들의 표를 기재하느라 정신이 없고 나이를 쓸 시간도 없이 배에 승선하느라 바빴을 것이다.

그리고 그 결과 배에 승선한 자식들은 모두 사망한 것을 데이터를 보고 알 수 있다.(Survived 값이 0은 사망을 의미한다)

 

  이 데이터를 보고이런 상상을 했다. 부모가 자식들에게 아메리칸 드림을 선물해주기 위해서 8자식을 태웠을 것이다.

하지만 이 선물은 아이들에게 인생의 마지막이었다는 거. 배에 승선한 행복이 죽음의 길이었다는 거..

이 데이터는 많은 생각을 들게 했다.

내가 좋은 것이라고 생각하고 쫓고있는 무언가가 사실 내 발복을 잡게되는 무언가일수도 있지 않을까. 그렇다면 무엇을 생각하고, 바라보며 나아가야 할까. 내 눈 앞에 좋아보이고 행복이라고 외치는 것들에게 진짜 행복이 있을까. 이런 생각을 한다.