더북(TheBook)

ticket을 사용한 가족 식별

타이타닉 데이터에서 sibsp 속성은 함께 탑승한 형제 또는 배우자의 수를 나타내며, parch는 함께 탑승한 부모 또는 자녀의 수를 나타낸다. 따라서 parch가 0이 아니면 함께 탑승한 부모 또는 자녀가 있음을 알 수 있다. 그러나 parch 값이 0이 아니라고 해도 함께 탑승한 부모나 자녀가 누구인지까지는 알 수 없다. 따라서 추측으로 가족 관계를 찾아내야 한다.

타이타닉 데이터를 살펴보면 다음 속성들이 한 가족을 찾는 단서가 될 수 있음을 알 수 있다.

cabin(선실 번호)
같은 선실에 탑승한 사람들은 한 가족일 가능성이 높다.

embarked(탑승한 곳)과 name(이름) : 같은 곳에서 탑승했고 성이 같다면 한 가족일 가능성이 높다.

ticket(티켓 번호) : 한 가족이 표를 한 번에 샀다면 티켓 번호가 같을 것이다.

세 가지 방법 중 이 절에서는 ticket을 사용해 가족을 찾아볼 것이다. 또한, ticket이 같은 값을 가지는 데이터를 훈련 데이터와 검증 데이터 모두에서 찾을 것이다. 그 이유는 훈련 데이터에 있는 탑승객 중 일부는 검증 데이터 내 탑승객과 가족 관계일 수 있기 때문이다. 또 다른 이유는 타이타닉 데이터가 너무 작기 때문이다. 훈련 데이터가 작아서 가족을 사용한 모델을 검증 데이터를 제외하고 만들기가 어렵다.

훈련 데이터와 검증 데이터를 모두 사용하는 방법은 훈련 데이터만 사용해 모델을 만들고, 검증 데이터로만 성능을 평가하는 일반적인 절차에 맞지 않는다. 또, 과적합 문제가 우려된다. 검증 데이터까지 모두 포함해 모델을 만들면 노이즈에 민감한 모델이 만들어질 수 있다. 이 부분은 테스트 데이터로 모델을 최종 평가할 때 가족이 포함된 모델과 가족이 포함되지 않은 모델을 비교하여 더 나은 모델을 선택하는 것으로 보충하기로 한다. 그럼에도 부족한 부분은 남아 있겠지만 이 장에서는 다양한 R 코드를 경험하는 데 중점을 두기로 하자.

ticket이 가족을 찾는 데 얼마나 유용한지 확인해보자. 다음은 검증 데이터를 분리하지 않은 titanic.train을 ticket에 따라 정렬해 표시한 예다.

> View(titanic.train[order(titanic.train$ticket),
+      c("ticket", "parch", "name", "cabin", "embarked")])
ticket parch                                   name cabin embarked
...
110413     2                    Taussig, Miss. Ruth   E68        S
110413     1                      Taussig, Mr. Emil   E67        S
110413     1 Taussig, Mrs. Emil (Tillie Mandelbaum)   E67        S
...
111361     1           Hippach, Miss. Jean Gertrude   B18        C
111361     1             Hippach, Mrs. Louis Albert   B18        C
...

결과를 보면 ticket 번호가 110413이고, 성이 Taussig인 세 명의 탑승자가 보인다. 이들의 선실은 E68, E67, E67로 근처에 있으며, 탑승지도 S(Southampton)로 모두 동일하다. 따라서 이들이 한 가족임을 쉽게 짐작할 수 있다. 마찬가지로 ticket 번호 111361이고, 성이 Hippach인 가족을 쉽게 찾을 수 있다. Hippach 가족은 cabin이 B18로 동일하고, embarked가 C(Cherbourg)로 동일하다.

Taussig 가족을 고려하면 인접 선실에도 한 가족이 있을 수 있어 cabin이 ticket에 비해 불완전한 속성임을 알 수 있다. name에서 성을 추출하고 embarked를 고려하여 가족을 찾는 경우도 생각해볼 수 있지만, embarked에는 NA 값이 저장된 행이 있어 ticket에 비해 온전치 못하다. 다음은 ticket, embarked, cabin에서 값이 NA인 행의 수를 확인하는 코드다.

> sum(is.na(titanic.train$ticket))
[1] 0
> sum(is.na(titanic.train$embarked))
[1] 2
> sum(is.na(titanic.train$cabin))
[1] 912

확인 결과 ticket에는 NA 값이 저장된 행이 없으나 embarked에는 2개 행에 NA가 저장되어 있고 cabin에는 912개 행에 NA가 저장되어 있다. NA 값이 없는 ticket 속성이 더 정확하고 사용하기 편리함을 알 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.