info) 정규세션 2주차 Titanic 시각화 실습

Titanic 데이터를 활용하여 시각화 그래프 그리기


Graph2) Pclass별 투숙객들의 연령 분포 BoxPlot / 가족 구성원에 따른 생존율 차이 HeatMap

1-1. 시각화 목적

1) 각 객실등급(Pclass)별 투숙객들의 정보를 확인하기 위한 목적에서 그래프를 그려보았습니다. 여러 정보들 중에서도 연령분포를 확인해보았습니다.

2) 가족관계가 생존율에 영향을 주었는지 살펴보기 위한 목적에서 그래프를 그려보았습니다. 가족에 대한 변수 중 'SibSp(형제/자매)'와 'Parch(부모/자녀)'를 사용하여 구성원에 따른 생존율 차이를 시각화하고자 하였습니다.

1-2. 시각화 과정 소개

1) 연속형 데이터에 대한 최대, 최소, 중앙값, 이상치 등을 한 눈에 확인할 수 있다는 점과 범주형 변수와 연속형 변수 사이의 비교가 용이하다는 점에서 boxplot을 사용하였습니다. seaborn의 catplot함수에서 'box' 파라미터를 지정하여 그래프를 만들었습니다. 

2) 'SibSp'와 'Parch'는 둘 다 카테고리 변수로 같은 단위("명")를 공유하고 있습니다. 2개의 변수 사이의 관계를 살펴보기 위해 crosstab(교차표)를 그려볼 수 있는데 이를 시각화하면 어떨까 하는 생각이 들었습니다. 언젠가 heatmap을 통해 시계열 데이터(월, 시간) 간의 관계를 표현한 heatmap 그래프를 본 적이 있습니다. crosstab의 형태가 heatmap과 잘 어울린다고 판단되어 crosstab을 heatmap 그래프로 변환하였습니다. (실제로 상관계수(Correlation coefficient)와 오분류표(confusion matrix)와 같은 범주형 변수 사이의 관계를 나타내는 표를 heatmap으로 시각화하는 작업이 많이 알려져 있습니다.) 

1-3. 그래프 그리기

Graph2-1) Pclass별 투숙객들의 연령 분포 BoxPlot

sns.catplot(data=df, x="Pclass", y="Age", kind="box", height = 4, aspect = 1);

분석 : 그래프를 그려본 결과 3등급에서 1등급으로 갈 수록 평균연령을 비롯한 연령 분포가 점차 높아지는 것을 확인할 수 있습니다. 1등급의 경우 정규분포에 가까운 형태라고 할 수 있고 나머지 등급의 경우에는 고령층에 이상치가 발견된다는 점에서 히스토그램으로 변환했을 때 right-skewed된 형태가 될 것으로 짐작됩니다. 

Graph2-2) 가족 구성원에 따른 생존율 차이 HeatMap

Parch와 SibSp를 각각 index와 column으로 하는 pivot table을 그려보았습니다. 앞서 설명에서는 crosstab이라고 말씀 드렸는데 지금 보니 pivot table을 그렸던 것으로 보입니다. 사실 crosstab이 pivot table의 일종이기 때문에 그다지 큰 차이는 없습니다. 그리고 여기서는 groupby 집계 후에 pivot()함수를 사용하였는데 이를 한번에 pivot_table()로 처리(aggfunc = 'mean')할 수도 있습니다. 

# 그래프를 그리기 위한 피봇테이블 생성
family_df = df[["PassengerId","SibSp", "Parch", "Survived"]]
family_df = pd.DataFrame((family_df.groupby(['SibSp','Parch'])['Survived'].mean() * 100).round(1))
family_df.reset_index(inplace = True)
pivot_df = family_df.pivot(index = 'SibSp', columns = 'Parch', values = 'Survived')
print(pivot_df)

위에서 만들어진 pivot table을 heatmap으로 변환해보도록 하겠습니다. 

# heatmap 그래프로 생존율의 차이 확인
plt.figure(figsize = (8, 6))
ax = sns.heatmap(pivot_df, annot = True, linewidths = .5, cmap = 'Reds', fmt = 'g')
plt.xlabel('부모 또는 자녀의 수')
plt.ylabel('형제 자매 수')
plt.title('<가족 관계에 따른 생존율 차이>', fontweight = 'semibold')
plt.show()

분석 : null 값이 많았던 터라 heatmap의 경우도 값이 빈 경우가 많고 때문에 적은 값(가족 인원 수)들에 분포가 몰린 것을 볼 수 있습니다. 데이터 자체가 heatmap으로 표현하기에는 부족했던 것 같습니다. 또한, 데이터 분포를 보더라도 그다지 패턴이나 군집화(cluster) 경향을 확인할 수 없습니다. 물론 더 정확한 분석을 위해서는 다른 분석 기법을 통해 확인해보아야겠지만 시각화 결과만으로는 그다지 뚜렷한 관계를 파악할 수는 없습니다. 그냥 재미로 보고 넘어가는 것이 바람직할 것 같습니다. 

+ Recent posts