BASHA TECH
Predict survival on the Titanic 타이타닉 생존자 예측 예제 1 본문
728x90
타이타닉 생존자 예측.ipynb
0.21MB
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 학습 데이터, 테스트 데이터를 로딩 => DataFrame으로 만들거임
train = pd.read_csv('../data/titanic/train.csv')
test = pd.read_csv('../data/titanic/test.csv')
#### 2. Exploratory data analysis (EDA: 탐색적 데이터 분석)
- 탐색적 데이터 분석 : 데이터 탐색해서 데이터 구조와 의미 파악
train.head(5)
데이터 정리
- PassengerId : 고객 번호
- Survived : 생존 여부, 0 = No, 1 = Yes
- Pclass : Ticket Class 1, 1 = 1st, 2 = 2nd, 3 = 3rd
- Name : 이름 => 결혼 여부, 가족 여부 확인
- Sex : 남, 여
- Age : 나이
- SibSp : 형제, 배우자 인원 수
- Parch : 부모, 자식 인원 수
- Ticket : Ticket Number
- Fare : 금액
- Cabin : 방 번호
- Embarked : 선착장 => port가 3군데 : C = Cherbourg, Q = Queenstown, S = Southampton
|
# 데이터 구조
train.shape, test.shape
train.columns, test.columns # shape 찍기
train.info()
train[train['Survived']==1] # DataFrame이 나옴
train[train['Survived']==1]['Sex']
train[train['Survived']==1]['Sex'].value_counts()
train[train['Survived']==0]['Sex'].value_counts()
살고 죽는 것에 성별이 중요한 포인트라는 것을 알 수 있다.
train[train['Survived']==1]['Pclass'].value_counts()
-------------------------------------------
train[train['Survived']==0]['Pclass'].value_counts()
등급칸에 따라서도 영향을 받는다는 사실을 알 수 있음
def bar_chart(feature):
survived = train[train['Survived']==1][feature].value_counts()
dead = train[train['Survived']==0][feature].value_counts()
df = pd.DataFrame([survived, dead])
df.index = ['Survived', 'Dead']
df.plot(
kind = 'bar'
, stacked = False
, figsize=(6,5)
)
bar_chart('Sex')
------------
bar_chart('Pclass')
------------
def bar_chart(feature):
survived = train[train['Survived']==1][feature].value_counts()
dead = train[train['Survived']==0][feature].value_counts()
df = pd.DataFrame([survived, dead])
df.index = ['Survived', 'Dead']
df.plot(
kind = 'bar'
, stacked = True # 데이터가 쌓임
, figsize=(6,5)
)
쌓인 데이터로 한번에 보기!
bar_chart('Sex')
-------------
bar_chart('Pclass')
-------------
bar_chart('SibSp') # 형제나 배우자가 없는 사람이 더 많이 죽었다는 사실을 알 수 있다.
-------------
bar_chart('Parch') # 부모, 자식이 없는 경우 죽는 확률이 2배 된다는 것을 알 수 있다.
-------------
bar_chart('Embarked') # 선착장도 죽음에 영향이 있다는 사실을 알 수 있다.
# Name 처리
# 추출
train_test_data = [train, test]
for dataset in train_test_data:
dataset['Title'] = dataset['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
train['Title'].head()
train['Title'].value_counts()
train['Title'].value_counts().index
# Mapping => Mr:0, Miss:1, Mrs:2, Other: 3
title_mapping = {
'Mr':0, 'Miss':1, 'Mrs':2, 'Master':3
, 'Dr':3, 'Rev':3, 'Mlle':3, 'Major':3, 'Col':3
, 'Countess':3, 'Capt':3, 'Ms':3, 'Sir':3, 'Lady':3, 'Mme':3, 'Don':3
, 'Jonkheer':3
}
for dataset in train_test_data:
dataset['Title'] = dataset['Title'].map(title_mapping)
train['Title'].head()
# drop
train.drop('Name', axis=1, inplace=True)
test.drop('Name', axis=1, inplace=True)
# Sex = > 0,1
train['Sex'].value_counts()
sex_mapping = {
'male' : 0
, 'female' : 1
}
for dataset in train_test_data:
dataset['Sex'] = dataset['Sex'].map(sex_mapping)
# 나이 처리
# NaN 처리
# 비연속 데이터 변경
train['Age'].isnull().sum()
# Title 기준으로 나이를 중앙값으로 대체
train['Age'].fillna(
train.groupby('Title')['Age'].transform('median')
, inplace=True
)
test['Age'].fillna(
test.groupby('Title')['Age'].transform('median')
, inplace=True
)
facet = sns.FacetGrid(data=train, hue='Survived', aspect=4)
facet.map(sns.kdeplot, 'Age', shade=True)
facet.set(xlim=(0, train['Age'].max()))
facet.add_legend()
plt.show()
# 나이 비연속 데이터 변환
for dataset in train_test_data:
dataset.loc[dataset['Age'] <= 16, 'Age'] = 0
dataset.loc[(dataset['Age'] > 16)&(dataset['Age']<=26),'Age']= 1
dataset.loc[(dataset['Age'] > 26)&(dataset['Age']<=36),'Age']= 2
dataset.loc[(dataset['Age'] > 36)&(dataset['Age']<=62),'Age']= 3
dataset.loc[dataset['Age'] > 62, 'Age'] = 4
train['Age'].value_counts()
train.Embarked.isnull().sum()
# 결측치 개수 : 2, 0.22%
train.Embarked.isnull().sum() / len(train.index) * 100
train.Embarked.value_counts()
# 선착장별 개수, %
train.Embarked.value_counts() / len(train.index) * 100 # %가 보인다
# 선착장 처리
for dataset in train_test_data:
dataset['Embarked'] = dataset['Embarked'].fillna('S')
# 숫자 변경
embarked_mapping = {
'S' : 0
, 'C' : 1
, 'Q' : 2 #mapping할 dictionary 만들기
}
for dataset in train_test_data:
dataset['Embarked'] = dataset['Embarked'].map(embarked_mapping)
# 티켓 가격
# NaN 확인
train.Fare.isnull().sum()
# import pandas as pd
# ages = [0, 10, 15, 13, 21, 23, 37, 31, 43, 80, 61, 20, 41, 32, 100]
# bins = [0, 15, 25, 35, 60, 100]
# labels = ['어린이', '청년', '장년', '중년', '노년']
# cuts = pd.cut(ages, bins, right=False, labels=labels)
# cuts
------------------------------------------------
# import pandas as pd
# ages = [0, 10, 15, 13, 21, 23, 37, 31, 43, 80, 61, 20, 41, 32, 100]
# bins = [0, 16, 26, 36, 62, 80]
# labels = [0, 1, 2, 3, 4]
# cuts = pd.cut(ages, bins, right=False, labels=labels)
# cuts
------------------------------------------------
#pd.cut()으로 자르는 방법
# import pandas as pd
# bins = [0, 17, 30, 100, 500]
# labels = [0, 1, 2, 3, 4]
# cuts = pd.cut(train['Fare'], bins, right=False, labels=labels)
# cuts
# import pandas as pd
# bins = [0, 17, 30, 100, 500]
# labels = [0, 1, 2, 3, 4]
# train['Fare'] = pd.cuts(train['Fare'], bins, right=False, labels=labels)
for dataset in train_test_data:
dataset.loc[dataset['Fare'] <= 17, 'Fare'] = 0
dataset.loc[(dataset['Fare'] > 17)&(dataset['Fare']<=30),'Fare']= 1
dataset.loc[(dataset['Fare'] > 30)&(dataset['Fare']<=100),'Fare']= 2
dataset.loc[dataset['Fare'] > 100, 'Fare'] = 3
train.head()
train.Cabin.value_counts()
# 알파벳 추출
for dataset in train_test_data:
dataset['Cabin'] = dataset['Cabin'].str[:1] # 앞의 첫자만 가져와라
train.Cabin.value_counts()
-------------------------
train.groupby('Pclass')['Cabin'].count()
-------------------------
train.groupby('Pclass')['Cabin'].value_counts()
-------------------------
train.Pclass.value_counts()
# Cabin => number 변환
cabin_mapping = {'A':0,'B':0.4,'C':0.8,'D':1.2,'E':1.6,'F':2.0,'G':2.4,'T':2.8}
for dataset in train_test_data:
dataset['Cabin'] = dataset['Cabin'].map(cabin_mapping)
# fillna
train['Cabin'].fillna(
train.groupby('Pclass')['Cabin'].transform('median')
# categorical 하게 처리해야하므로 평균값이 아닌 중앙값이 들어가야함
, inplace=True
)
test['Cabin'].fillna(
test.groupby('Pclass')['Cabin'].transform('median')
, inplace=True
)
train.Cabin.isnull().sum()
# 가족
train['FamilySize'] = train['SibSp'] + train['Parch'] + 1
test['FamilySize'] = test['SibSp'] + test['Parch'] + 1
train.FamilySize.value_counts()
family_mapping = {1:0, 2:0.4, 3:0.8, 4:1.2, 5:1.6
, 6:2, 7:2.4, 8:2.8, 9:3.2, 10:3.6, 11:4.0}
for dataset in train_test_data:
dataset['FamilySize'] = dataset['FamilySize'].map(family_mapping)
test.FamilySize.value_counts()
features_drop = ['Ticket', 'SibSp', 'Parch']
train = train.drop(features_drop, axis =1)
test = test.drop(features_drop, axis =1)
# 고객 번호 삭제
train = train.drop(['PassengerId'], axis=1)
train.head()
train_X = train.drop('Survived', axis=1) # X : 행렬, x : 벡터 or 스칼라 or... etc
train_y = train['Survived'] # y : 1차원 데이터
train_X.shape, train_y.shape
test.shape
test.columns
728x90
반응형
'Computer > Pandas' 카테고리의 다른 글
데이터 분석 하는 과정 정리 (1) | 2022.10.05 |
---|---|
Predict survival on the Titanic 타이타닉 생존자 예측 예제 2 (0) | 2022.10.05 |
셀프 주유소 가격 분석 (1) | 2022.10.04 |
네이버 매크로 예제 (0) | 2022.10.04 |
시카고 맛집 분석 예제 (1) | 2022.09.30 |
Comments