티스토리 뷰

https://www.kaggle.com/c/titanic

 

Titanic | Novice

Kaggle profile for Titanic

www.kaggle.com

 

위 데이터를 이용해 시각화로 변수 간의 관계를 알아봄으로써 Python의 시각화 라이브러리인 matplotlib과 seaborn을 연습해 보겠습니다.

 

데이터 설명

  Definition Key   Definition Key
PassengerId     Age Age in years  
Survived Survival 0 = No, 1 = Yes SibSp # of siblings / spouses aboard the Titanic  
Pclass Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd Parch # of parents / children aboard the Titanic  
Name Name   Ticket ticket number  
Sex Sex   Fare Passenger fare  
Cabin Cabin number   Embarked Port of Embarkation C = Cherbourg,
Q = Queenstown, S = Southampton

 

data shape : (891,12)

 #   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)

1. 범주형 변수의 사망 여부에 따른 빈도 확인

Sex, Embarked, Cabin 칼럼에서 사망 여부에 따른 빈도수를 막대그래프로 확인하기

def bar_chart(feature):
    survived = data[data['Survived']==1][feature].value_counts()  #생존한 사람의 빈도 수
    dead = data[data['Survived']==0][feature].value_counts()     #사망한 사람의 빈도 수
    df = pd.DataFrame([survived, dead])
    df.index = ['Survived', 'Dead']
    return df.plot(kind='bar', stacked=True, figsize=(4,4))   #각 빈도수를 막대 그래프로 표현

 

성별에 따르면 생존자 중에는 여성이 많지만, 사망자 중에는 남성이 많은 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

Embarked에 따르면 생존자와 사망자 모두 Embarked S가 다수인 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

Pclass에 따르면 사망자 중에서는 3등급인 사람이 다수인 것을, 생존자 중에서는 1등급과 3등급이 빈도 수가 비슷한 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

2. 연속형 변수에 대한 분포 확인

Fare, Age, SibSp, Parch에 대한 분포를 kdeplot을 통해 확인함으로써 데이터가 Scaling이 필요한지 확인할 수 있습니다.

fig, ax = plt.subplots(2,2, figsize=(4,4),constrained_layout=True)
sns.kdeplot(data=data['Fare'], ax=ax[0][0], shade=True,alpha=1)
sns.kdeplot(data=data['Age'], ax=ax[0][1], shade=True,alpha=1)
sns.kdeplot(data=data['SibSp'], ax=ax[1][0], shade=True,alpha=1)
sns.kdeplot(data=data['Parch'], ax=ax[1][1], shade=True,alpha=1)

plt.show()

연속형 변수에 대한 분포 확인

 

seaborn의 kdeplot은 연속형 변수의 분포를 확인할 수 있습니다. Age 변수를 제외한 나머지 변수도 모양이 정규 분포와 거리가 멀기에 정규화가 필요한 것을 확인할 수 있습니다.

 

3. 범주형 변수에 따른 Age와 Fare 간의 관계 확인

Sex, Pclass, 생존 여부에 따른 Age와 Fare 간의 관계를 lmplot을 통해 확인하여 상관관계가 존재하는지 확인할 수 있습니다.

sns.lmplot(data=data, x='Age', y='Fare', hue='Sex', palette='Set2',
           markers=['o','v'], height=4, aspect=1.5,scatter_kws={'s':100, 'alpha':0.7})
sns.lmplot(data=data, x='Age', y='Fare', hue='Survived', palette='Set2',
           markers=['o','v'], height=4, aspect=1.5,scatter_kws={'s':100, 'alpha':0.7})
sns.lmplot(data=data, x='Age', y='Fare', hue='Pclass', palette='Set2',
          markers=['o','v', '*'], height=4, aspect=1.5,scatter_kws={'s':100, 'alpha':0.7})
plt.show()

성별에 따른 Fare과 Age 관계 추이
Survived 에 따른 Fare와 Age 관계 추이
Pclass에 따른 Fare와 Age 관계 추이

 

위처럼 seaborn의 lmplot은 hue 매개변수를 이용해 각 범주형 변수에 따른 연속형 변수들의 관계를 확인해 전반적인 추세를 확인할 수 있습니다.

 

4. 생존 여부와 범주형 변수 별 Age, Fare 추이

seaborn의 barplot을 이용해 카테고리 별로 Age와 Fare의 추이를 확인할 수 있습니다.

#생존여부와 Pclass별 Age, Fare 추이
fig, ax = plt.subplots(2,1,figsize=(5,4),constrained_layout=True)
sns.barplot(x='Survived', y='Fare', hue='Pclass', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[0])
sns.barplot(x='Survived', y='Age', hue='Pclass', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[1])
plt.show()
#생존여부와 Sex별 Age, Fare 추이
fig, ax = plt.subplots(2,1,figsize=(5,4),constrained_layout=True)
sns.barplot(x='Survived', y='Fare', hue='Sex', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[0])
sns.barplot(x='Survived', y='Age', hue='Sex', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[1])
plt.show()
#생존여부와 Embarked별 Age, Fare 추이
fig, ax = plt.subplots(2,1,figsize=(5,4),constrained_layout=True)
sns.barplot(x='Survived', y='Fare', hue='Embarked', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[0])
sns.barplot(x='Survived', y='Age', hue='Embarked', data=data, palette='Set2', 
            capsize=0.2, errorbar=('ci',99), ax=ax[1])
plt.show()

PClass와 Survived에 따른 Fare, Age 추이
Sex와 Survived에 따른 Fare, Age 추이
Embarked와 Survived에 따른 Fare, Age추이

 

seaborn의 barplot으로 각 범주형 변수의 카테고리 별의 연속형 변수 추이를 확인해 값의 크기 차이를 확인할 수 있습니다.

  • 생존여부와 Pclass에 따른 Fare 추이에서 생존한 1등급 인원들의 Fare이 가장 높습니다. 특히 1등급에서 생존한 사람과 사망한 사람의 Fare차이가 다른 Pclass에 비해 크다는 것을 알 수 있습니다.
  • 생존여부와 Pclass에 따른 Age 추이에서 사망한 1등급 인원들의 나이가 가장 높습니다. 특히 생존여부에 무관하게 1,2,3등급 순으로 나이가 많은 것을 확인할 수 있습니다.
  • Fare는 생존한 인원이 사망한 인원보다 더 높습니다. 사망한 인원은 성별에 무관하게 Fare 차이가 거의 나지 않지만, 생존한 인원은 여성의 Fare가 남성의 Fare보다 크다는 것을 알 수 있습니다.
  • 나이는 사망한 남성이 여성보다 더 많지만 반대로 생존한 여성의 나이는 생존한 남성보다 많은 것을 알 수 있습니다.
  • 생존여부와 무관하게 C,S,Q순으로 Fare가 높은 것을 알 수 있습니다. 특히 Embarked Q는 생존여부와 무관하게 Fare 추이가 비슷하지만 Embarked C는 생존여부에 따라 Fare 차이가 큰 것을 알 수 있습니다.
  • 생존여부와 Embarked에 따라 사망한 인원의 나이가 더 많은 것을 알 수 있습니다. 생존한 인원 중 Embarked S가 Q보다 나이가 더 많지만 사망한 인원 중 Embarked S와 Q의 차이는 거의 나지 않습니다. 

5. Pclass에 따른 Fare 시각화

Pclass에 따라 Fare의 분포를 boxplot을 이용해 시각화하여 등급별 Fare가 얼마나 차이가 나는지 알 수 있습니다.

#Pclass에 따른 Fare 시각화
fig, ax = plt.subplots(1,3,figsize=(14,4),constrained_layout=True)

value1 = data[data['Pclass']==1]
sns.boxplot(y=value1['Fare'], ax=ax[0],palette='Set2')

value2 = data[data['Pclass']==2]
sns.boxplot(y=value2['Fare'], ax=ax[1],palette='Set2')

value3 = data[data['Pclass']==3]
sns.boxplot(y=value3['Fare'], ax=ax[2],palette='Set2')
plt.show()

Pclass에 따른 Fare

 

seaborn의 boxplot은 각 칼럼의 중앙값, 25%,75% 값, 이상치를 확인할 수 있습니다. 3등급의 Fare가 2등급보다 큰 것이 존재하므로 각 등급별로 Fare 구간이 명확하게 나눠지지 않은 것을 확인할 수 있습니다.

TAG more
글 보관함
최근에 올라온 글