데이터 인사이트

데이터 전문가 칼럼
데이터 전문가가 전하는 데이터 노하우

[빅데이터 분석] (파이썬 기반의 데이터 분석) Pandas 패키지로 타이타닉호 생존자 분석하기

작성자
관리자
작성일
2020-10-26 10:02
조회
4403

정광윤의 개발자를 위한 파이썬 기반의 데이터 분석(2회)

Pandas 패키지로 타이타닉호 생존자 분석하기

정광윤 반도체 업체에서 생산 관리 업무를 통해 데이터 분석을 하기 시작했다. 이후 프로그래밍이 즐거워 파이썬을 이용한 데이터 분석에 관심을 갖고 있다. 인문한 전공자 대상의 파이썬 강의를 진행하였으며, 인공지능을 이용한 서비스를 개발중인 스타트업의 대표이자 현재도 주말마다 스터디 그룹을 운영하고 있다(initialkommit@gmail.com).
?

첫 연재에서는 데이터 사이언스(Data Science) 관점에서 폭넓게 데이터를 처리하고 분석하는 것을 살펴보았다. 여러 가지 도구가 있지만 특히 파이썬을 이용해 데이터를 처리하고 분석하는 것이기 때문에 파이썬의 문법도 가볍게 살펴보았다. 이번 회부터는 좀 더 깊게 파이썬에 대해 살펴보고자 한다. 데이터를 처리하는데 가장 기본이 되는 Pandas 패키지를 알아보고, 가벼운 예제를 통해 데이터를 처리하고 분석하는 맛을 함께 느껴보자. 참고로 아래에서 작성된 소스는 iPython notebook에서 작성했으며, 그래프도 iPython notebook에서 구현된 것이다. 즉 아래 소스를 실행하고 싶다면 미리 iPython notebook을 설치해야만 한다(1회 연재 참조).

1. Pandas

Pandas는 앞으로 데이터 분석 시 주로 사용하게 될 패키지다. 웨스 맥키니(Wes Mckinney)가 만들었으며, 여기에 가장 중요한 두 가지 객체는 Series와 DataFrame이다. 이 두 객체를 어떻게 다룰 것이냐가 관건이다. 이들 객체를 통해 데이터 필터링, 삭제, 추가, 수정 등의 작업은 물론, 시각화까지 할 수 있기 때문이다.

? Series

먼저 Series를 만드는 것부터 시작하자.
Input
import pandas as pd

import numpy as np

s = pd.Series([1, 2, 3, np.nan])

s
?
Output
0 1

1 2

2 3

3 NaN

dtype: float64
위에서 보듯이 Series는 배열(Array)과 똑같이 생겼다. 1차원이며 인덱스를 가지고 있지만 DataFrame은 다르다.



위에서 보듯이 DataFrame 객체는 엑셀 혹은 테이블과 똑같이 생겼다. 이제 이 객체를 통해 데이터를 그루핑하거나 계산 등을 할 수 있다. DataFrame은 columns과 index로 나눌 수 있으며 이름을 지정해줄 수도 있다.

이 두 객체만 제대로 알아도 데이터 분석의 많은 것을 할 수 있다. 앞으로 다루게 될 예제를 통해 두 객체의 기능에는 무엇이 있는지 살펴볼 것이다. 레퍼런스처럼 어떤 기능이 있다고 나열하지는 않을 작정이다. 그렇게 되면 Pandas에 대해 빨리 습득할 수 없을 뿐만 아니라 필자가 이번 연재를 하는 의미도 없어진다. 레퍼런스는 잘 갖추어진 Pandas documentation으로만으로도 충분하다(http://pandas.pydata.org/pandas-docs/stable/).

2. Example

이번에 함께 알아볼 예제는 www.kaggle.com에서 가져왔다. kaggle의 경우 세계에서 가장 큰 데이터 과학자들의 커뮤니티다. 새로운 문제가 올라오면 과학자들은 이를 여러 데이터 분석 기법을 이용해 문제를 해결한다. 여기에 경쟁 구도를 도입하고, 또한 어떻게 해결했는지 스크립트까지 볼 수 있어 매우 유익한 사이트이다. 우리나라에서도 Facebook Group을 통해 매월 '캐글뽀개기'라는 이벤트가 열린다. 자발적으로 모인 데이터 과학자들(전문가이든 비전문가이든 상관없다)이 모여 해당 문제를 같이 풀기도 하고 어떻게 풀었는지 소개도 한다.

이 글을 읽는 독자도 www.kaggle.com을 이용해 데이터 과학을 공부하면 좋겠다. 인터넷에는 무수히 많은 튜토리얼과 예제가 있다. 상당수가 좋은 자료임에 틀림없으나 kaggle과 같은 공식적인 문제들을 풀면서 다른 사용자와 소통하며 공부하면 틀림없이 더 좋은 성과를 낼 수 있다.

? Titanic: Machine Learning from Disaster

www.kaggle.com에 올라온 Competition 문제 중 2012년 9월 28일에 올라온 문제다. 자세한 내용은 https://www.kaggle.com/c/titanic에서 확인할 수 있으며 이번 예제에서 사용한 train.csv 파일도 다운로드 받을 수 있다. 우리는 침몰한 타이타닉호로부터 살아남은 생존자에 대해서 분석해 볼 것이다. 어떤 이유로 어떻게 살아왔는지 데이터 관점에서 분석하자는 것이다. 제목은 'Machine Learning'이라고 되어 있지만, 우선 데이터 분석만 할 예정이다. 최근의 핫이슈인 머신러닝을 지원하는 파이썬 패키지도 있으나 이번 연재 주제에서 벗어나므로 다루지 않겠다.

? 준비 작업

먼저 분석을 위해 사용하게 될 패키지를 선언한다.


train.csv 파일을 Pandas 패키지를 통해 loading을 해오고 이를 titanic_df라는 객체로 만들어준다.





titanic_df라는 객체는 Pandas 패키지의 DataFrame 클래스로부터 만들어진 객체이며, 이 클래스의 info()라는 함수를 사용하면 DataFrame의 기본적인 정보를 볼 수 있다.



분석할 준비작업을 아주 간단히 마쳤다. 이제는 몇 가지 질문을 통해 데이터를 분석하고 유의미한 분석을 추론해 보자. 이렇게 질문을 통해 데이터를 분석하면 목적성을 띄기 때문에 단순히 데이터를 분석하는 것보다 더 효율적이다.

1) 타이타닉호의 승객은 누구인가?

가장 먼저 알아볼 정보는 타이타닉호에 승선했던 승객은 누구인지 살펴보는 것이다. 우선 기본적인 패키지를 불러오도록 하겠다.



위에서 선언한 패키지는 numpy, matplotlib, seaborn 등 총 3개다. numpy는 1차원 벡터를 계산할 때 사용하고, 나머지 2개는 차트를 그릴 때 사용한다. 원래는 matplotlib 패키지만으로도 충분히 차트를 그릴 수 있으나 요즘은 좀 더 예쁘게 차트를 그려주는 seabon이라는 패키지를 사용한다. 이 글을 읽고 있는 독자들은 이런 패키지 사용법을 익혀두면 좋을 것이다.

3개의 패키지가 설치되어 있지 않다면 아래와 같이 콘솔 창에서 아주 간단하게 설치할 수 있다.



?여기서 'Pclass'라는 항목은 승객 등급을 의미한다. x축에는 1, 2, 3으로 승객 등급을 나열하고 y축에 그 수를 표시했다. hue는 counting할 대상을 말하는데 Sex에는 두 가지가 있으므로 두 개의 막대가 나온 것이다. 남녀 승객 차이를 분석하고 등급별로도 살펴보았다. 그런데 여기에서 조심해야 할 것이 있다. 등급별로 승객을 나누었지만 분석할 때 여러 가지 변수를 고려하지 않을 수 없다. 여기서는 남성과 여성이라는 단순 성별뿐만 아니라 '어린이'도 살펴보도록 하겠다. 그렇게 해야 추후에 생존자들을 분석할 때 더 면밀한 분석이 가능해진다.



이 단계에서는 좀 어려울 수 있다. apply 함수 때문이다.

titanic_df[['Age', 'Sex']]은 여러 컬럼 중 Age, Sex 두 컬럼에서만 출력해 준다. 여기서 나온 결과값을 apply 함수의 첫 번째 인자값인 male_female_child 함수의 인자값에 적용해주는 것이다. apply 함수는 다소 생소하고 어려울 수 있지만, 지속적으로 학습하다 보면 그리 어렵지 않다는 생각을 하게 될 것이다.

위에서 apply 함수를 적용해 산출된 반환값을 titanic_df['person'], 즉 새로운 컬럼 'person'을 만들어 그 곳에 할당해주는 것이다. 이렇게 데이터를 프로세싱, 즉 원하는 분석값을 만들기 위해 데이터를 처리하고 가공해주는 작업을 파이썬을 이용하면 간단히 할 수 있게 된다.



위의 그래프를 통해 좀 더 명확해 졌다. 어린이를 포함해 분류한 1, 2, 3등급에서 이상하게도 3등급 남성 승객이 많다는 것을 확실하게 알 수 있게 됐다. 또한 1등급 승객 중에 어린이가 거의 없다는 것도 알 수 있다.

여기서 조금만 더 나아가 나이에 대한 분석을 해보자.



DataFrame 클래스의 hist 함수를 사용해 70칸짜리 히스토그램을 그려보았다. 이렇게 보니 20~30대의 승객이 몰려 있음을 알 수 있다. 그렇다면 남성, 여성, 어린이 승객의 수는 어떻게 될까?



value_counts 함수를 이용해 자동으로 그루핑되어 sum up된 결과물을 볼 수 있다. Pandas 패키지를 통해 위와 같은 정보를 쉽게 구할 수 있게 되었다. 타이타닉호에 어떤 승객들이 탑승했는지 알아보는 것은 이 정도로 마무리하고 다음 질문으로 넘어가보도록 하자.

2) 승객들은 어떤 Deck에 있었으며 그들의 Class와는 어떤 관계에 있는가?

Deck 정보는 어느 곳에 짐을 풀 것인지 말해주는 Cabin이라는 컬럼에 정보가 숨어 있다. 이 정보를 이용할 때 두 가지 문제가 있다. cabin 정보가 없는 승객이 있다는 것과 Cabin 정보의 뒷좌석 번호는 필요없다는 것이다.



위와 같이 DataFrame의 Cabin만 가져와서 그 중 데이터가 없는 것(na)을 제거(drop)하는 함수 dropna를 이용해 새로운 객체, deck을 만들어 주었다. 이렇게 해서 첫 번째 문제는 해결했고, 이제는 첫 번째 글자만 가져와서 새로운 객체에 담아보자.



새로운 리스트 객체 levels에 앞 글자 하나만 가져와서 담은 후에 이를 아래와 같이 DataFrame으로 만들어보자.



위의 그래프를 통해 어떤 Deck에 몇 명의 승객이 있었는지 알게 됐지만 데이터에 문제가 있었다. 바로 T라는 Deck는 없는데 그래프에는 T라는 데이터가 있다는 것이다. T라는 Deck만 빼고 다시 가져와야 한다.



위에서 보는 것처럼 DataFrame[필터링 조건]을 입력하면 된다. 즉 T가 아닌 것만 추출해서 다시 cabin_df에 담아주는 것이다. 자, 이제 Deck별 승객을 파악하는 일도 마쳤으니 다음 미션으로 넘어가자.

3) 어떤 요소가 승객들을 생존하게 만들었을까?

사실 이번 데이터 분석에서 가장 중요한 질문이다. 지금까지 위에서 한 작업은 다 이 질문을 위한 준비작업이라 할 수 있을 정도다. 즉 침몰한 타이타닉호에서도 어떤 요소가 생존 확률을 높였는지 분석함으로써 앞으로 배를 만들거나 항해할 때 도움이 되는 정보를 만들어 낼 수 있다고 믿는다.

생존한 승객의 정보는 Survived에 0과 1로 값이 표기돼 있다. 이를 사람들이 알아볼 수 있게 바꾸는 작업부터 해보자.



어떤가? DataFrame인 titanic_df의 각 컬럼에 접근하는 것의 기준은 점(.)이다. Survived 컬럼에서 map이라는 함수를 이용해 특정 정보일 경우, 특정 값으로 매핑을 해준 것이다. 그렇다면 생존자는 몇 명인지 그래프에서 바로 확인해보자.



안타깝게도 생존하지 못한 사람이 더 많았음을 알 수 있다. 이 생존 확률에 어떤 요소가 작용했을지 알아보기 위해 먼저 Pclass를 살펴보자.



?위 그래프를 보면 어떠한 생각이 드는가? 3등급 승객들의 생존율이 1, 2등급에 비해 현저히 낮음을 알 수 있다. 영화 타이타닉에서도 3등급 승객들이 많이 희생된 걸로 나왔다. 영화가 과학적인 분석을 바탕으로 제작됐다는 이야기가 될 수 있다. 그러나 우리는 좀 더 면밀히 분석해보자.



좀 더 자세히 보니 2, 3등급의 남성 승객의 생존율에는 큰 차이가 없음을 알 수 있다. 어린이 승객의 생존율 또한 1등급보다 2등급이 오히려 더 높다. 그러나 여성과 어린이의 경우 3등급 승객의 생존율은 확연하게 낮다.

간단히 살펴본 위 분석을 통해 확실히 3등급보다는 1등급 승객들이 위험에 처했을 때 생존할 수 있는 확률이 높다는 것을 알 수 있다. 그렇다면 나이와의 상관관계는 어떻게 될까?



이번에는 Line 그래프를 통해 나이와의 상관관계를 보자. 위 그래프를 통해 알 수 있듯이 확실히 나이가 많아질수록 생존율이 낮음을 알 수 있다. 여기에 승객 등급을 적용시키면 결과는 어떨까?



역시 나이와는 상관없이 등급별로 3등급이 제일 낮은 생존율을 나타내고 있었다. 그렇다면 등급이 아니라 성별은 어떨까?



위 결과를 보면 남성은 나이가 많을수록 생존율이 떨어지는데 비해 여성은 반대로 나타났다. 여성은 나이가 많아질수록 생존율이 높다는 것을 알 수 있게 됐다.

우리는 이렇게 간단한 예제로 타이타닉호의 생존율에 대해 분석해보았다. 분석하기 위해 몇 가지 데이터를 처리하는 작업을 거쳤고 정제된 데이터를 통해 의미있는 그래프도 그려보았다.

이런 데이터 관점의 분석이 갖는 의미는 무엇일까? 사고율을 더 낮춰주는가? 생존율을 더 높여주는가? 아니다. 이런 분석 작업을 통해 이후 있을지도 모를 사고에 대비하기 위해 선박 제조 시 고려할 수 있는 요소를 파악할 수 있다.

?

? 정리하며

간단히 알아본 예제이지만, Pandas 패키지는 매우 훌륭한 기능을 수행하고 있음을 알 수 있다. 개발을 해 본 사람은 알겠지만 위에 소개된 몇 가지 기능들을 구현하기 위해서는 많은 에너지와 시간이 소모된다. 하지만 Pandas 패키지는 그런 기능을 이미 제공하고 있다. 이렇게 오픈된 소스를 사용할 줄 안다는 것은 데이터 분석에서 큰 의미가 있다.

이번 2회에서는 Pandas 패키지에 대해서 간단하게 알아보았다. 지난 1회에 너무나 많은 내용을 담아서 혹시 독자들이 부담을 느끼지 않았을까 다소 걱정을 했다. 그래서 이번에는 힘을 빼고 작업했다. 다음 회에서는 좀 다양하고 깊이 있는 예제를 통해 데이터 처리 방법과 분석, 그리고 시각화 하는 방법을 제시할 것이다. (다음 회에 계속)

출처 : 한국데이터베이스진흥원

제공 : 데이터 전문가 지식포털 DBguide.net