만약 타이타닉에 내가 탔더라면 생존할 수 있었을까?

{$ result $}

{$ message $}


What's this?

이 페이지에서 말하는 내용은 기계학습 초보자가 초보자를 위해 쓴 글입니다.

이것은 1912년 침몰한 타이타닉호에서 생존 혹은 사망한 각 승객의 데이터를 학습하여, 주어진 정보로 어떠한 승객이 생존 할 수 있을지를 예측해보는 문제입니다.

이른바 머신러닝101이라 불리는 유명한 문제로써, 데이터 사이언스 커뮤니티 Kaggle에 소개된 문제죠.

승객 데이터는 여기에 정리가 되어있습니다. 혹은 상단에 있는 승객 목록에서 간단하게 확인 해보실 수 있습니다.


머신러닝을 아주 간단하고 naive하게 해봅시다.

우선 주어신 승객 정보를 분석해봅시다. csv로 정리된 데이터를 보면 다양한 필드가 있네요.

survival 생존 여부

주어진 학습 데이터의 정답이 되며, 후에 생존 여부를 모르는 승객 정보가 주어질때 생존인지 사망인지를 분류하게 됩니다.

pclass 승객 등급 (1~3등석)

1등석이 좋겠죠? 어쩌면 부유함과 상관관계가 있을지도 모르겠네요.

name 이름

그냥 승객의 이름에 불과합니다.

그러나 Mr., Mrs. 등의 호칭을 사용하여 알 수 없었던 나이나 가족 구성을 추정하는 사람도 있습니다.

sex 성별

"여성과 아이부터". 유명한 일화죠.

age 나이

나이를 모르는 경우가 존재합니다.

sibsp 형제수 + 배우자수

Siblings and Spouses.

parch 부모수 + 자녀수

Parents and Children.

sibspparch를 합쳐서 family size라고도 합니다.

동반한 가족이 많은 편이 꼭 좋을까요? 본인이 자식인지 부모인지에 따라서도 다르고, 고려할 것이 꽤 많습니다.

ticket 티켓

티켓 정보지만 분석에 쓰이기엔 formal한 양식이 아닙니다.

fare 요금

승객이 지불한 요금으로 보이지만, 공백도 많고 정확한 기준을 알 수 없습니다.

cabin 객실

알파벳 + 숫자 형식으로 되어있으며, 1등석 승객의 객실은 거의 알 수 있지만 그 외엔 대부분 공백입니다.

단, 숫자의 홀짝이 선박 진행 방향에서 좌우 중 어느 홀에 속하는지를 나타내며, 좌우 분위기가 서로 조금은 달랐을지도 모른다는 분석도 있습니다.

embarked 출발지

세르부르, 퀸즈타운, 사우샘프턴 중 하나거나 알 수 없으며, 승객 등급과 상관관계가 있습니다.

분석하기에 까다로운게 많으니, 여기선 다 생략하고 승객 등급, 성별, 나이 이렇게 세가지 정보만 사용하여 생존율을 추정해보기로 합시다.

참고자료: 각 factor별 correlation 그래프


주어진 조건에서, 생존일지 사망일지를 분류

간단하게 테스트 해보기 위해 이 문제를 "등급, 성별, 나이가 주어졌을때 해당 사람이 '생존'에 속하는지 '사망'에 속하는지를 분류하는 문제"라고 정의해봅시다.
이렇게 정의를 해버리면 이는 "분류 문제"가 되며, 가장 쉬운 알고리즘인 Naive Bayes Classifier를 사용해볼 수 있습니다.
문제를 더 간단하게 만들기 위하여 (원래를 이렇게 하면 안되는데) 나이는 정규분포로 존재한다고 치고, 등급은 1, 2, 3 중 하나, 성별은 1(남자), 2(여자) 중 하나, 그리고 나이를 모를 경우 학습한 나이 파라미터는 신경 안쓰기로 하죠.

한 승객이 생존하는 상황을 $s$, 등급, 성별, 나이를 각각 $x_1$, $x_2$, $x_3$라 합시다.
그러면 우리가 원하는건 $p(s \mid x_1, \, x_2, \, x_3)$가 됩니다. 혹은 $p(\neg s \mid x_1, \, x_2, \, x_3)$과 비교하면 되겠죠. 여기서 Bayes' Theorem을 사용하면

$p(s \mid x_1, \, x_2, \, x_3) = \frac{p(s)p(x_1, \, x_2, \, x_3 \mid s)}{p(x_1, \, x_2, \, x_3)}$

가 되고, 각 파라미터가 independant하다고 가정하면 (대략 등급, 성별, 나이는 서로 무관하다고 볼 수 있으니)

$Z = p(x_1, \, x_2, \, x_3) = p(x_1)p(x_2)p(x_3)$

$p(s \mid x_1, \, x_2, \, x_3) = \frac{1}{Z} p(s)p(x_1 \mid s)p(x_2 \mid s)p(x_3 \mid s)$

그리고 여기서 우변에 존재하는 모든 항들은 학습을 통해 계산해낼 수 있는 값입니다. 마찬가지로

$p(\neg s \mid x_1, \, x_2, \, x_3) = \frac{1}{Z} p(\neg s)p(x_1 \mid \neg s)p(x_2 \mid \neg s)p(x_3 \mid \neg s)$

인데 $p(s \mid x_1, \, x_2, \, x_3) + p(\neg s \mid x_1, \, x_2, \, x_3) = 1$이니까 $Z$의 계산은 생략합시다.
등급이나 나이의 경우 경우의 수가 두세개로 정해져 있으니 단순한 카운팅으로 $p(x_1 \mid s)$와 $p(x_2 \mid s)$를 계산할 수 있죠.
나이는 정규분포라고 가정했으니 (다시 말하지만 이렇게 가정해버리는건 굉장히 naive한 접근입니다. 지금은 naive한 Naive Bayesian을 사용하여 간단하게 기계학습을 맛보는 과정이니 그러려니 해봅시다) $s$인 사람의 나이의 평균을 $\mu_s$, 분산을 $\sigma_s^2$이라 하면 주어진 나이 $v$에 대해

$p(x_3 = v \mid s) = \frac{1}{\sqrt{2 \pi \sigma_s^2}}e^{\frac{(v-\mu_s)^2}{2 \sigma_s^2}}$

가 됩니다. $\neg s$의 경우도 마찬가지로 계산할 수 있습니다.


예제

1등석에 탄 25세 남자가 살아있을 확률은 어떻게 될까요?

실제로 필요한 값들은 $p(s)$, $p(x_1 = 1 \mid s)$, $p(x_2 = 1 \mid s)$, $p(x_3 = 25 \mid s)$ 그리고 $p(\neg s)$, $p(x_1 = 1 \mid \neg s)$, $p(x_2 = 1 \mid \neg s)$, $p(x_3 = 25 \mid \neg s)$가 됩니다.
이를 계산하기 위하여 891명의 승객 정보가 담긴 훈련 데이터를 사용하여 간단하게 카운팅을 해봅시다.

생존여부 전체 1등석 2등석 3등석 남자 여자
생존 342 136 87 119 109 233
사망 549 80 97 372 468 81

생존한 사람의 나이 평균, 분산 $\doteq$ 28.343689655172415, 222.76016880023758
사망한 사람의 나이 평균, 분산 $\doteq$ 30.62617924528302, 200.37499860938044

이제 주어진 정보로 하나하나 차근차근 계산을 해봅시다.

$p(s) = $ 전체 사람 중 생존한 비율 $ = \frac{342}{891}$
$p(x_1 = 1 \mid s) = $ 생존한 사람 중 1등석의 비율 $ = \frac{136}{342}$
$p(x_2 = 1 \mid s) = $ 생존한 사람 중 남자의 비율 $ = \frac{109}{342}$
$p(x_3 = 25 \mid s) = $ 공식에 대입 $ \doteq 0.027408788910349716$
생존 할 수 있을까? $ = p(s \mid x_1, \, x_2, \, x_3)Z = p(s)p(x_1 \mid s)p(x_2 \mid s)p(x_3 \mid s) \doteq 0.0013333723420265824$

$p(\neg s) = $ 전체 사람 중 사망한 비율 $ = \frac{549}{891}$
$p(x_1 = 1 \mid \neg s) = $ 사망한 사람 중 1등석의 비율 $ = \frac{80}{549}$
$p(x_2 = 1 \mid \neg s) = $ 사망한 사람 중 남자의 비율 $ = \frac{468}{549}$
$p(x_3 = 25 \mid \neg s) = $ 공식에 대입 $ \doteq 0.03049943249275581$
사망하려나? $ = p(\neg s \mid x_1, \, x_2, \, x_3)Z = p(\neg s)p(x_1 \mid \neg s)p(x_2 \mid \neg s)p(x_3 \mid \neg s) \doteq 0.0023344122310512074$

결론: 약 36.353616616793133% 확률로 생존. 아마 죽겠죠.


사족

기계학습에서 좋은 알고리즘이란 무엇일까요? 정확도가 높은걸 말할까요? 정확도가 너무 높으면 통계적 추론이 아니라 그냥 정답셋일지도?
그렇다면 훈련 데이터에 따른 정확도 변동이 낮은것? 글쎄요. 저도 잘 모르겠네요.

(사족이니까) 다른 파라미터들은 어떻게 생각해야 할까요? 예컨대 cabin의 경우 위에도 써있듯 1등석 승객의 객실 정보는 대부분 파악 할 수 있지만 그 외엔 거의 공백입니다. 좌석의 위치나 숫자의 홀짝이 중요할수도 있지만, 일단 객실이 어딘지 알 수 있는 사람과 아닌 사람을 나눠봅시다.

생존여부 전체 객실 위치 파악 됨 객실 위치 파악 안됨
생존 342 136 206
사망 549 68 481

숫자를 보면 1등석이냐 아니냐와 아주 큰 상관관계가 있습니다. 마찬가지로 embarked 역시 등급과 상관관계가 있어서, Naive Bayesian을 사용한 이 예제에서는 전부 무시했습니다. 파라미터들끼리 correlation이 없다고 가정해버리면 제대로 된 솔루션이 아니게 될수도 있지만 계산이 편리하니까요.

여전히 Kaggle에선 많은 사람들이 이 문제로 토론중입니다. 보면 정말 기발한 아이디어가 많은데, 심플하고 데이터도 작고 간단해 보이지만 어떤 파라미터를 어떻게 고려해볼지 다양한 방면에서 생각해보기에 좋은 문제라고 생각되네요.

(역시 사족이니까) 위 cabin의 테이블에서 한가지 말장난을 해볼 수 있습니다. "객실 위치를 파악할 수 있었던 승객은 약 2배 확률로 생존했습니다. 그러나 살아있던 승객 중 객실 위치를 파악할 수 있었던 승객보단 없었던 승객이 훨씬 더 많았습니다" 같은? 그럼 객실 위치가 파악 된 것이 좋은건지 아닌지 헷갈리게 만들 수 있죠. 물론 이는 객실 위치를 파악할 수 없는 경우가 훨씬 많기 때문에 생긴 일이죠.


맺으며

머리카락 먹고싶다.

참고문헌: Han, Jiawei, Micheline Kamber, and Jian Pei. Data mining: concepts and techniques: concepts and techniques. Elsevier, 2011.



created by @theeluwin