👨‍💼

2.4 타이타닉 Python - 1

 
  • 상관도 분석 넣기

위니브에서 분석한 기본 분석

1. 데이터 읽어오기

1-1. 문제 정의하기

이 챕터에서는 Python으로 타이타닉 생존자/사망자 데이터를 분석하게 됩니다.
이 데이터 분석을 통해서 train.csv 파일에서 어떤 분류의 사람들이 타이타닉 사고에서 생존할 가능성이 높은지 분석할 것이며, test.csv파일에서 실제로 살아남은 사람을 예측할 수 있는지 판단하기 위해 머신러닝을 사용합니다.

1-2. 데이터 가져오기

타이타닉 데이터는 이전 챕터에서 다운받으실 수 있습니다. 혹은 Kaggle에서도 제공하니 아래 링크를 눌러주세요! PDF로 보시는 분들은 공식 kaggle 사이트에서 데이터를 다운로드 받으실 수 있습니다.
kaggle(타이타닉 데이터 다운받기)
 
실행환경은 ColabJupyter notebook을 사용합니다.

1) train 데이터를 로드하고, 테스트해보기

우선 train, test 데이터를 다운 받고, 다운받은 데이터를 불러옵니다.
💡
주의! train 데이터의 저장 위치를 잘 확인해주세요!
%matplotlib inline import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 작업파일과 다운받은 파일이 다른위치에 있을경우 'train.csv'를 수정해주셔야합니다! train = pd.read_csv('train.csv', index_col='PassengerId') test = pd.read_csv('test.csv', index_col='PassengerId') train.head() #train.tail()을 하게 되면, 마지막 데이터를 확인합니다.
notion imagenotion image
Colab이나 Jupyter notebook을 사용하신다면, 위 코드를 모두 작성하시고 Alt + Enter를 눌러주세요. 위 코드가 실행되면서 동시에 아래 셀이 하나 추가됩니다.
그럼 위와 같이 데이터를 불러온 것을 확인하실 수 있습니다. 여기서 %matplotlib inline은 그래프 등을 다른 파일로 출력하는 것이 아니라 이 창에서 출력하겠다는 것이며, import는 다른 라이브러리를 불러오겠다는 것입니다. numpy, pandas, matplotlibpython 기본 강좌Ch.8으로 제공되고 있습니다.
하지만 이 분석 챕터를 앞에 둔 이유가 있습니다. 문법을 먼저 보시기 보다, 데이터 분석의 흐름부터 익혀보세요. 그러면 뒤에 numpy, pandas, matplitlib을 좀 더 쉽게 이해하실 수 있습니다. 가볍게 따라하시는 수준으로 이 챕터를 이용하세요.

2. 데이터 기본 정리/ 분석

2-1. 데이터 기본 정보

  • Survived : 생존은 1로 사망은 0으로 표시
  • Pclass : 1등석은 1, 2등석은 2, 3등석은 3으로 표시
  • Sibsp : siblings / spouses (형제, 배우자)
  • Parch : parents / children (부모님, 자녀)
  • ticket : 티켓 일련번호
  • cabin : 선실 번호
  • embarked : C : Cherbourg, Q : Queenstown, S : Southampton (선착장)
train.shape, test.shape
# Output ((891, 11), (418, 10))
위 명령어의 결과값으로 데이터는 총 891개의 열과 12개의 컬럼으로 구성되어 있다는 것을 알 수 있습니다.
train.csv와 다르게 test.csv 데이터에는 Survived 데이터가 없습니다. 우리가 분석해서 그 결과값을 알아내야 합니다.
train.info()
이제 train 데이터에 결측치가 얼마나 있는지 확인해보도록 하겠습니다. Age 714개, Cabin 204개, Embarked 889개로 이 세가지의 컬럼에서 결측치가 발생했네요. 나머지는 아래 보이는 것처럼 891개의 데이터가 모두 채워져 있는 것을 볼 수 있습니다.
아래 값은 위 코드를 실행한 실행 결과입니다.
# Output <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float64 6 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float64 10 Cabin 204 non-null object 11 Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB
 
결측치는 이렇게도 확인할 수 있어요
train.isnull().sum()
#Output Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
이 값을 모두 채워줘야 머신러닝이 제대로 된 예측을 할 수 있습니다.
 

2-2. 결측치 처리하기

그럼, 결측치를 처리해 보도록 합시다. 결측치를 채울 때에는 traintest를 모두 같은 방식으로 채우는 것이 좋습니다. 여기서는 복잡도를 증가시키지 않기 위해 test는 나중에 처리하도록 하겠습니다.

1) Age

빈 나이 값에는 어떤 값들을 채워 넣어야 할까요? 이러한 값을 결측치라고 하는데요. 결측치는 평균값, 중앙값, 선행값, 후행값, 그룹 평균값 등 다양한 값으로 채울 수 있습니다. 타이타닉 침몰 사고는 1912년에 일어났고, 1900년대의 평균 수명은 60세였습니다. 이러한 시대적인 배경에서 나오는 값들을 채워넣을 수도 있어요.
우리는 예측값이 더 정확할 수 있도록 남자는 남자 승객의 평균나이를, 여자는 여자 승객의 평균나이를 채워 넣겠습니다.
더 정확하게 하고싶다면 객실+성별의 평균 나이 등 더 구체적인 평균 값을 넣으면 될 것 같네요. 지금은 아래 코드가 정확히 어떤 의미인지 모르셔도 괜찮습니다. 한 줄 씩 설명을 드리겠지만, 흐름만 이해하시고 넘어가주세요.
sex_mean = train.groupby('Sex')['Age'].mean() train.loc[(train["Sex"] == 'female') & (train["Age"].isnull()), "Age"] = int(sex_mean[0]) train.loc[(train["Sex"] == 'male') & (train["Age"].isnull()), "Age"] = int(sex_mean[1]) train['Age'] = train['Age'].apply(lambda x:round(x)) train.head(40)
 
먼저 sex_mean이라는 값을 구합니다. 이 값은 성별의 평균입니다.
train.groupby('Sex')['Age'].mean() 이 코드를 한 번 보도록 하겠습니다. train이라는 데이터에서 그룹을 지어줄겁니다. groupby를 이용해서요. 'Sex'를 기준으로 그룹을 만듭니다. 그리고 그 그룹별로 'Age'라는 값을 뽑아내요. 대괄호를 이용해서요. 그리고 그렇게 성별 별로 뽑힌 Age 값을 평균내죠. mean()을 사용합니다.
자, 이번에는 좀 더 긴 코드입니다. 하지만 겁먹지 마세요. 지금은 흐름을 익히는데 중점을 두세요.train.loc[(train["Sex"] == 'female') & (train["Age"].isnull()), "Age"] = int(sex_mean[0]) 이 코드는 성별이 female이면서 동시에(&) Age가 비어있는 값을 추출(isnull())하여 평균값에 0번째로 넣어주겠다는 얘기입니다. 0번째 값으로는 female값이 들어있거든요!
 

2) Cabin

이번에는 Cabin 컬럼의 결측치를 채워 넣도록 하겠습니다.
Cabin 칼럼은 선실의 정보를 나타내주는 데이터로, 알파벳과 숫자로 이루어져 있습니다. 또한 해당 칼럼에서는 선실을 대표하는 알파벳이 맨 처음에 나옵니다.
train.Cabin.value_counts()
#Output G6 4 B96 B98 4 C23 C25 C27 4 C22 C26 3 E101 3 .. D11 1 D45 1 C118 1 D56 1 C103 1 Name: Cabin, Length: 147, dtype: int64
 
맨 앞에 있는 알파벳 말고, 다른 숫자에서 유의미한 데이터를 구하긴 힘들 것으로 보입니다. 따라서 첫번째 알파벳만 추출하여 저장해보도록 하겠습니다. 만약 값이 없다면 N으로 대체(fillna 사용)하겠습니다.
apply를 통해 0번째 값으로만 해당 값을 변경시켜줍니다. 예를 들어 'apple'이라면 'a'로만 바꿔주는 것입니다. lambda는 함수를 만드는 명령이에요. 뒤에 문법 부분에가서 좀 더 상세하게 다뤄드릴 예정입니다!
# 맨 앞의 알파벳 추출하기 train['Cabin'] = train['Cabin'].fillna('N') #결측치를 'N'으로 채우라는 명령 train['Cabin'] = train['Cabin'].apply(lambda x:x[0]) #해당 값을 0번째 값으로만 채우라는 명령 train.head(20) #제대로 반영이 되었는지 20개만 출력을 해봅니다.

3) Embarked

Embarked의 결측치는 2개 밖에 없으므로 어렵게 생각하지 않고, 가장 많은 데이터를 가지고 있는 'Southampton'으로 변환하도록 하겠습니다. 그 전에 데이터를 한 번 확인해보도록 할게요.
train['Embarked'].value_counts()
#Output S 644 C 168 Q 77 Name: Embarked, dtype: int64
 
결측치는 얼마나 있는지 확인하고 가장 빈도가 높은 'S'로 채워주도록 하겠습니다.
train['Embarked'].isnull().sum()
#Output 2
 
2개의 값이 결측치가 있네요. 이 값에 'S'를 채워주도록 할게요.
💡
실제로는 이렇게 train 데이터만 가지고 전처리를 하지 않습니다. train 데이터와 test 데이터를 모두 가지고 처음부터 똑같이 전처리를 해주어야 합니다. 하지만, 앞에서도 말씀드린 것처럼 복잡도를 올리지 않기 위해 이번 챕터에서는 train만 가지고 전처리를 하도록 하겠습니다.
train['Embarked'] = train['Embarked'].fillna('S')
 

2-3. 생존자, 사망자 인원수 출력하기

자 이제 결측치는 정리가 다 된 것 같습니다. 그렇다면 데이터를 좀 더 깔끔하게 정리해보도록 할게요.
train['Survived'].value_counts()
#Output 0 549 1 342 Name: Survived, dtype: int64
 
value_counts()는 해당 컬럼에 어떤 값들이 얼마만큼 있는지 확인해주는 메서드입니다. 0은 타이타닉 사고에서 살아남지 못한 사람, 1은 살아남은 사람을 의미해요. 이렇게 숫자로 표시되어 있으니 이 숫자가 의미인지 정확하게 파악하지 못하겠죠? 데이터를 보다 직관적으로 정리해 봅시다.
물론, 사람이 보기에 직관적인 것이고, 컴퓨터는 Dead, Survived를 이해하지 못하니, 나중에 이 필드는 날려야 합니다.
 
train["Survived_label"] = train["Survived"].replace(0, "Dead").replace(1, "Survived") train[['Survived','Survived_label']].head()
우선 Survived_label이라는 컬럼을 새로 만들고, 0이면 Dead, 1이면 Survived라고 명시해줄게요.
 
notion imagenotion image
결과값을 보니 잘 구분이 된 것을 볼 수 있습니다. 그럼 이제 전체 생존율을 확인해봅시다.
 

2-4. 전체 생존율 구하기

위에서 배웠던 value_counts()를 이용해서 생존율을 구해볼 거예요.
먼저 값을 확인해봅시다.
train['Survived_label'].value_counts()
#Output Dead 549 Survived 342 Name: Survived_label, dtype: int64
생존율은 이렇게 구할 수 있으므로 이 공식을 이용해볼게요.
참고로 value_counts()는 Series 형태로 출력해줍니다. 그래서 인덱스 값을 이용해 접근할 수 있어요.
temp = train['Survived_label'].value_counts() survival_rate = temp[1]/(temp[0] + temp[1])*100 print(f"생존율은 {survival_rate:.1f}% 입니다.")
#Output 생존율은 38.4% 입니다.
결과값이 잘 나온 것을 확인할 수 있습니다. 그럼 이제 시각화를 해볼까요?
 

2-5. 생존자 시각화하기

생존자 그래프는 파이 그래프와, 바 그래프 두개로 그려보도록 하겠습니다.
train['Survived'].plot(kind='hist', bins=3)
notion imagenotion image
bins의 값을 늘려보세요. 그러면 bins가 의미하는 바를 알 수 있습니다. 히스토그램은 빈도수를 출력해주는 그래프입니다. 그런데 그래프 x축이 예쁘지 않죠? 아래와 같이 그려보도록 하겠습니다.
train['Survived'].value_counts().plot(kind='bar', rot='45')
notion imagenotion image
이렇게 하면 좀 더 보기 편하지만, 여전히 0과 1이라는 값이 있어 불편합니다. 우리는 Survived_label라는 값을 만들어 두었으니 활용해보도록 하겠습니다.
train['Survived_label'].value_counts().plot(kind='bar', rot='45')
notion imagenotion image
이제 누가 보더라도, 데이터를 한눈에 파악할 수 있게 되었습니다. 같은 방법으로 pie 그래프도 그려보도록 하겠습니다.
train['Survived'].value_counts().plot(kind='pie')
notion imagenotion image
이렇게 그려놓으니 어떤 값이 어느정도인지 한 눈에 들어오지 않죠? 아래와 같은 코드를 실행해보도록 하겠습니다.
train['Survived_label'].value_counts().plot(kind='pie', autopct='%1.2f%%')
notion imagenotion image
 
조금 어렵겠지만 아래처럼 2개의 그래프로 나누어 출력할 수도 있답니다. 그래프를 그리는 자세한 방법은 뒤에 시각화 챕터를 참고해주세요! 우리는 데이터 분석에 흐름을 이해하는데 좀 더 초점을 맞춰보도록 하겠습니다.
여기서 sns라는 것을 사용했는데, 맨 첫 장에 보시면 아래와 같은 코드가 있었을 거에요! 아래 코드는 실행시키지 않으셔도 됩니다.
import matplotlib.pyplot as plt import pandas as pd import seaborn as sns
그래프를 그리는 방법에는 여러가지가 있는데 sns도 많이 사용합니다.
f,ax=plt.subplots(1,2,figsize=(12,6)) train['Survived_label'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.2f%%',ax=ax[0]) ax[0].set_title('Survived') ax[0].set_ylabel('') sns.countplot('Survived_label',data=train,ax=ax[1]) ax[1].set_title('Survived') plt.show()
 
notion imagenotion image
 

2-6. 객실 데이터 정리 및 시각화하기

객실 컬럼(Pclass)은 생존 컬럼(Survived)과 마찬가지로 1, 2, 3으로 구별되어 있습니다. 사람이 좀 더 보기 쉽게 하기 위해 데이터를 정리해 줄게요.
1은 First Class, 2는 Business, 3은 Economy로 정리하겠습니다.
train['Pclass_label'] = train["Pclass"].replace(1, 'First Class').replace(2, 'Business').replace(3, 'Economy') train[['Pclass','Pclass_label']].head()
notion imagenotion image
 
데이터가 잘 들어갔죠? 이제 이 데이터를 가지고 시각화를 해볼게요.
train['Pclass_label'].value_counts().plot(kind='pie', autopct='%1.2f%%')
notion imagenotion image
이제 바 그래프로도 그려보도록 하겠습니다. 위에 있는 코드 그대로 가져와서 대괄호 안에 있는 텍스트만 변경해주세요. 그리고 기억하세요. 여러분이 다른 데이터를 가지고 오셔도 안에 있는 텍스트만 마꿔가시며 시각화 해보시면 됩니다.
train['Pclass_label'].value_counts().plot(kind='bar', rot='45')
notion imagenotion image
이해하기 쉬운 그래프를 택하시면 좋습니다. 저는 파이그래프가 더 한눈에 보기 좋네요. 이번에는 sns를 사용해 생존 값과 함께 시각화 해보도록 하겠습니다.
 
sns.countplot(data=train, x="Pclass_label", hue="Survived_label")
notion imagenotion image
seaborn 모듈을 사용해서 시각화를 해봤습니다. x축은 비교할 컬럼을 넣고, hue값은 카테고리 형 값이 들어있는 변수를 입력하면 됩니다. 단일 수치를 시각화한 것보다 조금 어려우실 수 있지만, 자주 쓰는 방식이니 익숙해 지시는 것이 좋습니다.
시각화를 해보니 이코노미석에 탄 사람들은 대부분 사망하였고, 1등석에 탄 사람들이 비교적 생존자가 많네요. Pclass의 값이 의미 있는 데이터라고 기억해두고 넘어가도록 하겠습니다.
 

2-7. 출발지 데이터 정리 및 시각화하기

출발지 데이터는 'Embarked'에 저장되어 있지만 마찬가지로 'C', 'S', 'Q'로 보기 어려운 데이터로 저장되어 있습니다. 이 데이터도 정리해볼게요.
train['Embarked_label'] = train['Embarked'].replace('S','Southampton').replace('C','Cherbourg').replace('Q','Queenstown') train[['Embarked','Embarked_label']].head()
notion imagenotion image
데이터가 잘 들어간 것을 확인할 수 있어요.
혹시 더 많은 값들을 출력하고 싶다면 마지막 줄 head()안에 출력하고 싶은 row만큼 숫자를 적어주시면 됩니다.
이번에는 별도로 단일 수치는 시각화하지 않고 바로 생존자와 연결하여 시각화해보도록 하겠습니다.
sns.countplot(data=train, x="Embarked_label", hue="Survived_label")
notion imagenotion image
앞에서 했던 시각화 부분을 그대로 가져와서 x축의 값만 수정해 주세요. 이 데이터에서도 Cherbourg에서 탑승한 사람들이 조금 더 많이 산 것을 확인할 수 있네요. 그런데 일반화 시키기엔 미묘한 수치라 이 부분은 넘어가도록 할게요.

3. 데이터 분석하기

본격적인 데이터 분석을 해보도록 하겠습니다. train 데이터를 다시 보도록 할게요.
notion imagenotion image
우리의 최종 목표는 이 데이터를 가지고 학습을 시킨 다음, 새로운 데이터가 들어왔을 때 살아남았는지 예측을 해보는것 입니다.
그렇다면 어떤 가설을 가지고 학습을 시키는지에 따라 정확도가 달라지겠죠?
 

3-1. 가설 세우기

문제 정의와 가설 설정은 데이터 분석에 기초라고 할 수 있습니다. 가설이란 쉽게 'X 때문에 Y 되었다.'라는 결론을 얘기합니다. 그런데 아직 데이터 분석을 하지 않았죠? 이 가설은 틀릴 수도 있고 맞을 수도 있습니다. 이렇게 검증하는 것을 가설 검증이라고 합니다.

1) 타이타닉이 어떻게 침몰했는지?

우선 타이타닉이 아래 사진에서 보이는 것 처럼 앞부분이 먼저 추락했기 때문에 앞부분에 객실이 있던 3등급 탑승객들이 많이 사망했을 것이라는 분석 결과가 있습니다.
이 결과를 데이터 분석할 때 반영해 주시는게 좋습니다!
 
notion imagenotion image
 

2) 이름

이번에는 train 데이터 중 Name 컬럼을 확인해보도록 하겠습니다.
train[['Name']].head(15)
이름에 별로 중요한 정보가 없을 것 같습니다. 하지만 영어에서는 Mr, Mrs 와 같이 결혼 여부를 알 수 있죠! 머신 러닝 부분에서도 얘기하겠지만 결혼 여부와 자식이 있는지 여부가 생존에 중요한 영향을 끼치고 있습니다.
 

3) 성별

sns.countplot(data=train, x="Sex", hue="Survived_label")
데이터를 정리하면서 사용했던 시각화 코드를 x축만 변경하여 그대로 가져와 보겠습니다.
 
notion imagenotion image
여성이 훨씬 더 많이 살아남은 것을 알 수 있네요. 그렇다면 '여자들이 살아남을 확률은 남자보다 높았다.'라는 가설을 세울 수 있을 것입니다.
 

4) 객실

1. Pclass
아까 위에서 객실 데이터를 정리하면서 시각화했던 그 표를 다시 가져와볼게요.
sns.countplot(data=train, x="Pclass_label", hue="Survived_label")
notion imagenotion image
이 표에서도 가설을 세울 수 있겠죠? 'First Class에 탄 사람들이 살아남을 확률이 더 높았다.'라는 가설을 세울 수 있을 것입니다. 하지만 이 가설은 앞서 엑셀 분석에서 해봤던 것처럼 틀린 가설이라는 것을 알 수 있습니다.
 
2. Cabin
객실 데이터가 하나 더 있습니다. 전처리 해주었던 'Cabin' 컬럼을 그래프로 그려보도록 하겠습니다.
sns.countplot(x='Cabin', hue='Survived', data=train)
 
notion imagenotion image
Cabin 컬럼의 생존자/사망자 분포는 위와 같습니다. Cabin 데이터가 있는 사람들과 그렇지 않은 사람들 간에 의미있는 차이값이 존재하네요. 이 데이터를 분석 시 사용할 수 있을 것 같습니다.
 

5) 나이

그렇다면 'Age' 컬럼에서는 어떤관계가 있을까요? 이 컬럼은 x축이 너무 길어서 연속된 그래프인 히스토그램으로 그려보도록 하겠습니다.
train['Age'].hist(bins=20,figsize=(10,5),grid=False,edgecolor='black',color='yellowgreen');
 
notion imagenotion image
너무 많은 나이대가 보인다 생각하신다면 bins를 10으로 줄여보세요.
notion imagenotion image
 
x축은 나이 분포를 나타냅니다. 시각화 된 그래프를 보고 청년이 많이 탔다는 것을 알 수 있네요. 그럼 청년들의 생존율은 얼마나 될까요?
sns.countplot(x='Age', hue='Survived', data=train)
notion imagenotion image
이 부분은 나이별 구간화가 필요할 것 같아요. 지금이 작업으로 알 수 있는 정보가 많이 없군요. 하지만, 가설 확립은 가능합니다. '청년이 더 많이 살아남았을 것이다' 또는 '청년이 더 많이 죽었을 것이다' 입니다. 이 가설이 유의미 하다면, 나중에 검증을 하면 되는 것이니까요.
이번에는 좀 더 어려운 그래프를 그려볼거에요. seaborn의 커널 밀도 추정(KDE) 그래프 입니다. 커널 밀도 추정(Kernel Density Estimator)이란 바로 위에서 그린 히스토그램 분포 그래프를 곡선화 시켜준 그래프입니다. 여기서는 Dead와 Survived를 동시에 볼 수 있습니다.
 
f = sns.FacetGrid(train, hue='Survived_label', aspect=3) f.map(sns.kdeplot,'Age',shade=True) f.set(xlim=(0,train['Age'].max())) f.add_legend()
 
notion imagenotion image
(밀도 조절은 'aspect'에서 하시면 되고, 높이가 낮을수록 빽빽하며 높을수록 간격이 넓습니다.)
그래프에서 나오다시피, 20대 청년들은 살아남은 사람보다 죽은 사람이 더 많은 것을 알 수 있습니다. 반면 10세 이하인 유아, 어린이들은 많이 살아남은 것을 확인할 수 있어요.
여기서 가설을 세워볼 수 있습니다. 영화를 보셨나요? 그렇다면 아이와 여성을 먼저 대피시키는 장면이 기억이 나실 겁니다.
"아이와 여성은 살아남을 확율이 높았다!"

6) 형제, 배우자

그리고 'SibSp'라는 컬럼도 똑같이 그려볼 거예요. 'SibSp'는 탑승객과 함께 탄 배우자와 형제, 자매의 수를 의미한답니다.
sns.countplot(data=train, x="SibSp", hue="Survived_label")
 
notion imagenotion image
 
이 차트는 2명 이상의 형제자매 또는 배우자와 함께 탑승 한 사람이 생존 가능성이 더 높다는 것을 알 수 있습니다.
즉, 형제자매나 배우자 없이 탑승한 사람이 사망했을 가능성이 더 높다는 것을 알 수 있어요.
 

7) 부모, 자식

다음으로 'Parch'데이터를 확인해보겠습니다. 'Parch'는 parent, children 데이터로, 함께 탑승한 부모 또는 자녀의 수를 의미합니다.
sns.countplot(data=train, x="Parch", hue="Survived_label")
notion imagenotion image
이 차트는 부모 또는 자녀가 2명 이상인 사람이 생존 가능성이 더 높습니다. 즉, 혼자 탑승한 사람이 사망했을 가능성이 더 높다는 것을 알 수 있습니다.
 

3-2. 가설 세우기2

1) 가족의 유무

형제, 배우자, 부모, 자식 간 그래프도 그려봤으니 이번에는 모두 합친 '가족' 데이터를 가지고 그래프를 그려보겠습니다.
SibSp, Parch 둘 다 없는 사람은 혼자 탄 사람이니 'Single'이라고 저장해두고 둘 중 하나라도 있는 사람은 가족과 같이 탄 사람이니 'Family'로 저장하도록 하겠습니다.
train.loc[(train["SibSp"] == 0 ) & (train["Parch"] == 0),"Single"] = 'Single' train.loc[(train["SibSp"] != 0 ) | (train["Parch"] != 0),"Single"] = 'Family' train[["SibSp","Parch","Single"]].head(5)
 
Single과 Family 각각의 생존율도 확인해볼게요.
pd.pivot_table(data=train, index="Single", values="Survived")
notion imagenotion image
 
sns.countplot(data=train, x="Single", hue="Survived_label")
 
notion imagenotion image
 
train["FamilySize"] = train["SibSp"] + train["Parch"] + 1 train[["SibSp", "Parch", "FamilySize"]].head(10)
그렇다면 이제 'FamilySize'라는 가족수를 알려주는 컬럼을 새로 만들겠습니다. 마찬가지로 생존율을 확인해보겠습니다.
pd.pivot_table(train, index="FamilySize", values="Survived")
생존율도 확인했으니 시각화까지 해봐야겠죠?
sns.countplot(data=train, x="FamilySize", hue="Survived_label")
 
notion imagenotion image
FamilySize 컬럼을 보기 좋게 라벨링 해보겠습니다.
  • 1명 : Single
  • 2~4명 : Nuclear
  • 5명 이상 : Big
train.loc[train["FamilySize"] == 1, "FamilySize_label"] = "Single" train.loc[(train["FamilySize"] > 1) & (train["FamilySize"] < 5), "FamilySize_label"] = "Nuclear" train.loc[train["FamilySize"] >= 5, "FamilySize_label"] = "Big" train[["FamilySize", "FamilySize_label"]].head(10)
 
그 값을 가지고 시각화 하도록 하겠습니다.
sns.countplot(data=train, x="FamilySize_label", hue="Survived_label")
 
notion imagenotion image
자, 어떠신가요? 탐색적 데이터 분석(EDA)은 대부분 이러한 흐름이 반복됩니다. 이제 머신러닝으로 가서, 어떻게 예측 할 수 있는지 확인해보도록 하겠습니다. 그 전에, 머신러닝이 무엇인지, 데이터 분석이 무엇인지에 대해 확인하고 가실게요. 해당 영상은 '제주코딩베이스캠프' 유튜브 채널에서도 확인이 가능합니다.
 
Video preview
Video preview