[파이썬]캐글 타이타닉 데이터 탐색 #1 #2


캐글 타이타닉 데이터 탐색

파이썬으로 데이터 탐색하는 것을 해보려한다. 맨날 SQL과 엑셀로만 데이터분석을 해서 약간 실력도 줄어드는 것 같아서… 좋은 유튜브 영상이 있어서 따라서 해보려 한다.

참고 : You Han Lee 유튜브

(참고)쥬피터 노트북 깃허븡 블로그에 올리기

그리고 쥬피터 노트북을 바로 github post에 올리는 법을 몰랐는데 GitHub 블로그에 Jupyter notebook 올리는 방법 여기 블로그를 보고 참고했다. 아직은 자동화방법은 모르겠어서 나중으로 미루려고한다 ㅎㅎ 하….

import numpy as np # 연산
import pandas as pd # 데이터 프레임
import matplotlib.pyplot as plt # 비쥬얼라이징
import seaborn as sns # 비쥬얼라이징

# 여기서 부터는 한방에 스타일 만들기
plt.style.use('seaborn') # 디폴트가 아니고 시본 스타일로 나온다.
sns.set(font_scale=2.5) # 그림 계속 사이즈 조정하기 귀찮아서
import missingno as msno

# ignore warnings
import warnings
warnings.filterwarnings('ignore') # 업그레이드 했으면 좋겠다 이런거 무시

# matplot 쓸 때, show를 하면 윈도우가 나타나는데 이 노트북에 바로바로 볼수 있게 끔
%matplotlib inline
# 싸이키런이라는 라이브러리를 써야한다. 모르면 안된다. 파이썬을 활용한 머신러닝이라는 책이 있는데 꼭 봐야한다.
df_train = pd.read_csv('../input/train.csv')
df_test = pd.read_csv('../input/test.csv')
df_train.head() # 데이터 확인
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
# 데이터프레임 객체입니다.
df_train.describe()
PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000714.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607114.5264971.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000020.1250000.0000000.0000007.910400
50%446.0000000.0000003.00000028.0000000.0000000.00000014.454200
75%668.5000001.0000003.00000038.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200
df_train.shape
(891, 12)
df_test.describe()
PassengerIdPclassAgeSibSpParchFare
count418.000000418.000000332.000000418.000000418.000000417.000000
mean1100.5000002.26555030.2725900.4473680.39234435.627188
std120.8104580.84183814.1812090.8967600.98142955.907576
min892.0000001.0000000.1700000.0000000.0000000.000000
25%996.2500001.00000021.0000000.0000000.0000007.895800
50%1100.5000003.00000027.0000000.0000000.00000014.454200
75%1204.7500003.00000039.0000001.0000000.00000031.500000
max1309.0000003.00000076.0000008.0000009.000000512.329200

1. Data Null값 확인

df_train.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
for col in df_train.columns:
    msg = 'column : {:>11} \t Percent of NAN value : {:.2f}%'.format(col, 100*(df_train[col].isnull().sum() / df_train[col].shape[0]))
    print(msg)
# {:>11} 이건 오른쪽 정렬이고 11은 몇 자리 공간을 둘껀지
# {}이게 그다음 포맷에 들어갈 자리에다가 포맷
# isnull의 개수/전체shape(행)갯수=obs갯수
column : PassengerId 	 Percent of NAN value : 0.00%
column :    Survived 	 Percent of NAN value : 0.00%
column :      Pclass 	 Percent of NAN value : 0.00%
column :        Name 	 Percent of NAN value : 0.00%
column :         Sex 	 Percent of NAN value : 0.00%
column :         Age 	 Percent of NAN value : 19.87%
column :       SibSp 	 Percent of NAN value : 0.00%
column :       Parch 	 Percent of NAN value : 0.00%
column :      Ticket 	 Percent of NAN value : 0.00%
column :        Fare 	 Percent of NAN value : 0.00%
column :       Cabin 	 Percent of NAN value : 77.10%
column :    Embarked 	 Percent of NAN value : 0.22%
for col in df_test.columns:
    msg = 'column : {:>11} \t Percent of NAN value : {:.2f}%'.format(col, 100*(df_test[col].isnull().sum() / df_test[col].shape[0]))
    print(msg)
column : PassengerId 	 Percent of NAN value : 0.00%
column :      Pclass 	 Percent of NAN value : 0.00%
column :        Name 	 Percent of NAN value : 0.00%
column :         Sex 	 Percent of NAN value : 0.00%
column :         Age 	 Percent of NAN value : 20.57%
column :       SibSp 	 Percent of NAN value : 0.00%
column :       Parch 	 Percent of NAN value : 0.00%
column :      Ticket 	 Percent of NAN value : 0.00%
column :        Fare 	 Percent of NAN value : 0.24%
column :       Cabin 	 Percent of NAN value : 78.23%
column :    Embarked 	 Percent of NAN value : 0.00%
msno.matrix(df=df_train.iloc[:, :], figsize=(8, 8), color=(0.8, 0.5, 0.2))
# 미싱노 라이브러리 사용
# [:,:] 다 가져오겠다. 1로 2로 막 바꿔보셈
# iloc 인덱싱하는거
# null 데이터의 분포, 위치를 보고싶을때,
<matplotlib.axes._subplots.AxesSubplot at 0x7fe1d1f741d0>

png

msno.bar(df=df_test.iloc[:, :], figsize=(8, 8), color=(0.8, 0.5, 0.2))
# 몇 퍼센트의 Null 데이터가 있는지 확인
<matplotlib.axes._subplots.AxesSubplot at 0x7fe1d2f50e10>

png

# 타겟레이블이 얼마만큼 밸런스되어 있는가? 어떤 분포인지?
f, ax = plt.subplots(1, 2, figsize=(18,8)) # 도화지를 꺼내는 과정 row = 1, column = 2 하나의 행에 두개의 그림, 사이즈는 가로 18 x 세로 8

df_train['Survived'].value_counts().plot.pie(explode=[0,0.1], autopct='%1.1f%%', ax=ax[0], shadow=True) 
# explode 째는거, 퍼센트, ax[0] - 어디도화지에 그릴것인가, shawdow - 그림자
ax[0].set_title('Pie plot - Survived')
ax[0].set_ylabel('')
sns.countplot('Survived', data=df_train, ax=ax[1]) # count수 세기
ax[1].set_title('Count plot -Survived')
plt.show()

png

2.1 Pclass

df_train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=True).count()
Survived
Pclass
1216
2184
3491
df_train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=True).mean()
Survived
Pclass
10.629630
20.472826
30.242363
pd.crosstab(df_train['Pclass'], df_train['Survived'], margins=True).style.background_gradient(cmap='winter')
# margins 토탈이 있냐 없냐. # style 이거는 그냥 색깔
Survived01All
Pclass
180136216
29787184
3372119491
All549342891
df_train['Survived'].unique()
array([0, 1])
df_train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=True).mean().sort_values(by='Survived', ascending=False).plot.bar()
# 아래에 왜 index를 트루로 해야하는지 알수있다.
<matplotlib.axes._subplots.AxesSubplot at 0x7fe1bff6ea58>

png

df_train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False).plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x7fe1c423cba8>

png

y_position = 1.02
f, ax = plt.subplots(1, 2, figsize=(18,8))
df_train['Pclass'].value_counts().plot.bar(color=['#CD7F32', '#FFDF00', '#D3D3D3'], 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=df_train, ax=ax[1]) # hue - 색으로 구분해서 나타나게 해준다.
ax[1].set_title('Pclass: Survived vs Dead', y=y_position)
plt.show()

png




© 2018. by statssy

Powered by statssy