데이터는 캐글에 타이타닉 DATA를 그대로 가져다가썼다.
Kaggle: Your Home for Data Science
www.kaggle.com
https://www.youtube.com/channel/UC--LgKcZVgffjsxudoXg5pQ
You Han Lee
현재 KAIST 생명화학공학과에서 박사과정 재학중이며, 전공은 분자 시뮬레이션입니다. 데이터 사이언스, AI를 어디서 배울지 고민하다가 캐글을 알게 된 후, 캐글에 푹 빠져버린 대학원생입니다. 저에게 큰 도움을 준 캐글을 다른 사람들과 함께 하고 싶어 캐글 코리아(비영리 캐글 온라...
www.youtube.com
이분이 올려주신강의 14편가량을보고 공부를 하였는데 이해가 잘되게 설명해주셨다.
이분이 올려주신 코드들을가지고 혼자다시써보며 설명해가는 식으로 진행하겠다.
먼저 캐글 타이타닉 dataset을 받아 불러온다
train = pd.read_csv("DATA")
test = pd.read_csv("DATA")
그래프의 스타일을 바꾸고, 3번째줄은 한글글씨체를 깨지지 않게 하기위한 코드이다.
plt.style.use("seaborn")
sns.set(font_scale=2.5)
plt.rc('font', family='Malgun Gothic')
missingno라는 함수는 데이터의 Null 값을 시각화해서 보여준다.
import missingno as msno
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline
간단하게 train data의 수치를 찍어보았다.
train.describe()
보시다시피 수치상으로 어떻게 되어있나 볼 수 는 있지만, 확실하게 이렇다할 정보는 얻기 어렵다.
for col in test.columns:
msg = ("{:>10}\t Percent of NaN value: {:.2f}%".format(col, 100*(test[col].isnull().sum() / test[col].shape[0])))
print(msg)
train[특정컬럼].isnull()을 하면 특정컬럼의 값이 모두 True or False로 나오게되는데
train[특정컬럼].isnull().sum()을 하면 True=1, False=0으로 합산한 값을 출력한다.
즉 True 값의 합을 출력한다. 여기서는 null이 True로 나오므로 null 개수가 나온다고 보면된다.
msno.matrix(df=train.iloc[:, :], figsize=(8,8), color=(0.2, 0.5, 0.2))
![]() |
![]() |
첫번째이미지는 msno.matrix~~ 코드를 실행 한 것이고, 두번째 이미지는 msno.bar 코드를 실행하면 나오는 이미지이다
EDA
f, ax = plt.subplots(1, 2, figsize=(18, 8))
train['Survived'].value_counts().plot.pie(explode=[0, 0.1], autopct='%1.1f%%', ax=ax[0], shadow=True)
ax[0].set_ylabel('')
ax[0].set_title('Count plot - Survived')
sns.countplot('Survived', data=train, ax=ax[1])
ax[1].set_title('Count plot - Survived')
![]() |
생존한사람과 사망한 사람의 비율을 그래프로 한눈에 알 수 있고 비교또한 바로 가능하다.
|
다음은 Pclass에 관한 분석이다.
train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=True).count()
Pclass 기준으로 테이블이 하나 만들어지는데 1,2,3 클래스에 각각 몇명이 탑승해 있었는지 알 수 있다.
pd.crosstab(train['Pclass'], train['Survived'], margins=True).style.background_gradient(cmap='summer_r')
![]() |
pandas에 pd.crosstab 함수를 사용하여 좀더 풍부한 테이블을 만들어 볼 수 있다. |
train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=True).mean().sort_values(by='Survived', ascending=False).plot.bar()
Pclass의 숫자를 막대그래프로도 표현해보자.
y_position = 1.05
f, ax = plt.subplots(1, 2, figsize=(18, 8))
train['Pclass'].value_counts().plot.bar(color=['#CD7F32','#FFDF00','#030303'], ax=ax[0])
ax[0].set_title('Number of passengers By Pclass', y=y_position)
ax[0].set_ylabel('Count')
sns.countplot('Pclass', hue='Survived', data=train, ax=ax[1])
ax[1].set_title('Pclass: Survived vs Dead', y=y_position)
ax[1].set_ylabel('Count')
plt.legend(['0 == 사망','1 == 생존'])
두번째 그래프 같은 경우 각 Pclass의 생존자들의 수치를 눈으로 확인할 수 있다.
print('제일 나이 많은 탑승객 : {:.1f} Years'.format(train['Age'].max()))
print('제일 어린 탑승객 : {:>9.1f} Years'.format(train['Age'].min()))
print('탑승객 평균 나이 : {:>9.1f} Years'.format(train['Age'].mean()))
fig, ax = plt.subplots(1, 1, figsize=(9, 5))
sns.kdeplot(train[train['Survived'] ==1]['Age'], ax=ax)
sns.kdeplot(train[train['Survived'] ==0]['Age'], ax=ax)
plt.legend(['생존자 == 1', '사망자 == 0'])
plt.figure(figsize=(9,5))
train['Age'][train['Pclass']==1].plot(kind='kde')
train['Age'][train['Pclass']==2].plot(kind='kde')
train['Age'][train['Pclass']==3].plot(kind='kde')
plt.xlabel('Age')
plt.title('Age Distribution within classes')
plt.legend(['1st Class','2nd Class', '3rd Class'])
그럼이제 1,2,3 클래스에 나이에따른 생존비율은 어떻게 되는지 살펴보겠다.
fig, ax = plt.subplots(1, 1, figsize=(9, 5))
sns.kdeplot(train[(train['Survived'] == 0) & (train['Pclass'] == 1)]['Age'], ax=ax)
sns.kdeplot(train[(train['Survived'] == 1) & (train['Pclass'] == 1)]['Age'], ax=ax)
plt.legend(['사망 == 0', '생존 == 1'])
plt.title('1st class')
![]() |
1클래스만을 보았을 때 어릴수록 생존비율이 높게 나타난다.
그럼 다음클래스들도 차례대로 살펴보자 |
fig, ax = plt.subplots(1, 1, figsize=(9, 5))
sns.kdeplot(train[(train['Survived'] == 0) & (train['Pclass'] == 2)]['Age'], ax=ax)
sns.kdeplot(train[(train['Survived'] == 1) & (train['Pclass'] == 2)]['Age'], ax=ax)
plt.legend(['사망 == 0', '생존 == 1'])
plt.title('2nd class')
fig, ax = plt.subplots(1, 1, figsize=(9, 5))
sns.kdeplot(train[(train['Survived'] == 0) & (train['Pclass'] == 3)]['Age'], ax=ax)
sns.kdeplot(train[(train['Survived'] == 1) & (train['Pclass'] == 3)]['Age'], ax=ax)
plt.legend(['사망 == 0', '생존 == 1'])
plt.title('3rd class')
![]() |
![]() |
change_age_range_survival_ratio = []
for i in range(1, 80):
change_age_range_survival_ratio.append(train[train['Age'] < i]['Survived'].sum() / len(train[train['Age'] < i]['Survived']))
plt.figure(figsize=(7,7))
plt.plot(change_age_range_survival_ratio)
plt.title('Survival rate change depending on range of Age', y=1.02)
plt.ylabel('Survival rate')
plt.xlabel('Range of Age(0~x)')
f, ax = plt.subplots(1, 2, figsize=(18,8))
sns.violinplot('Pclass', 'Age', hue='Survived', data=train, scale='count', split=True, ax=ax[0])
ax[0].set_title('Pclass and Age vs Survived')
ax[0].set_yticks(range(0, 110, 20))
sns.violinplot('Sex', 'Age', hue='Survived', data=train, scale='count', split=True, ax=ax[1])
ax[1].set_title('Sex and Age vs Survived')
ax[1].set_yticks(range(0, 110, 20))
첫번째 그래프를 통해 생존비율은 젊을 수록 높은걸로 보아지고, 3클래스의 생존비율은 다른 클래스에 비해
비교적 낮다는것을 눈으로 확인할 수 있다.
두번째 그래프를 통해 남자들의 생존률이 여자에 비해 낮다는 것도 확인 할 수 있다.
Embarked
f, ax = plt.subplots(1, 1, figsize=(7,7))
train[['Embarked', 'Survived']].groupby(['Embarked'], as_index=True).mean().sort_values(by='Survived', ascending=False).plot.bar(ax=ax)
f, ax =plt.subplots(2, 2, figsize=(20, 15))
sns.countplot('Embarked', data=train, ax=ax[0, 0])
ax[0, 0].set_title('(1) No. of Passengers Boared')
sns.countplot('Embarked', hue='Sex', data=train, ax=ax[0, 1])
ax[0, 1].set_title('(2) Male-Female split for Embarked')
sns.countplot('Embarked', hue='Survived', data=train, ax=ax[1, 0])
ax[1, 0].set_title('(3) Embarked vs Survived')
sns.countplot('Embarked', hue='Pclass', data=train, ax=ax[1, 1])
ax[1, 1].set_title('(4) Embarked vs Pclass')
plt.subplots_adjust(wspace=0.2, hspace=0.5)
첫번째 그래프로 사람들이 어느 항구서 탑승을 했는지 알 수 있다.
두번째 그래프로 그 탑승한 사람들의 성비를 알 수 있고, 세번째 그래프는 탑승한 항구에 따른 생존비율을 알 수 있다.
마지막 그래프로는 탑승한 항구에 따른 사람들의 클래스 분포를 알 수 있다.