요즘 유망한 AI, DATA, Cloud 등을 살펴보면서 대학 수업때 머신러닝에 대해 배웠던 기억을 살려 Dacon에서 딥러닝 입문 프로젝트로 유명한 타이타닉 프로젝트를 진행했다.
Dacon - 타이타닉 생존자 예측
예전에 공부했던 머신러닝도 기억나는게 거의 없어 '모두의 딥러닝' 이라는 책과 유튜브로 배워가면서 프로젝트를 진행했다.
타이타닉은 Dacon에서 주어진 데이터를 바탕으로 어떤 탑승객이 생존할 것인지 예측하는 대회이다.
주어진 데이터 (train.csv)
PassengerId : 탑승객의 고유 아이디
Survival : 생존여부(0:사망, 1:생존)
Pclass : 등실의 등급(1: 1등급, 2: 2등급, 3: 3등급)
Name : 이름
Sex : 성별
Age : 나이
Sibsp : 함께 탑승한 형제자매, 아내 남편의 수
Parch : 함께 탑승한 부모, 자식의 수
Ticket : 티켓번호
Fare : 티켓의 요금
Cabin : 객실번호
Embarked : 배에 탑승한 위치(C = Cherbourg, Q = Queenstown, S = Southampton)
Google Colab 환경에서 진행했다.
1. 라이브러리 및 데이터 불러오기
import pandas as pd #판다스 패키지 불러오기
from sklearn.linear_model import LogisticRegression # 로지스틱 회귀 모델 불러오기
from sklearn.tree import DecisionTreeClassifier # 의사결정 나무 모델 불러오기
2. 데이터 불러오기
# 데이터 불러오기
train = pd.read_csv('/content/drive/MyDrive/데이터분석/타이타닉/data/train.csv') # 모델 학습 파일
test = pd.read_csv('/content/drive/MyDrive/데이터분석/타이타닉/data/test.csv') # 모델 시험지 파일
submission = pd.read_csv('/content/drive/MyDrive/데이터분석/타이타닉/data/submission.csv') # 답안지 파일
3. 자료 분석 - 아래의 함수들을 이용하여 자료를 분석한다.
- pd.DataFrame.head(), pd.DataFrame.tail()
데이터 프레임의 (위,아래)에서 부터 n개의 행을 보여주는 함수
n의 기본값(default)은 5
tarin.head() # 괄호 안에 숫자 입력시 원하는 만큼 행 확인가능
train.tail()
- pd.DataFrame.shape
데이터 프레임의 행의 개수와 열의 개수가 저장되어 있는 속성(attribute)
소괄호를 붙이지 않음
train.shape # 실행시 (891, 12) 출력됨
- pd.DataFrame.info()
데이터 셋의 column별 정보를알려주는 함수
비어 있지 않은 값은 (non-null)은 몇개인지?
column의 type은 무엇인지?
type의 종류 : int(정수), float(실수), object(문자열), 등등(date, ...)
5. Age 는 null 값이 177개, 10. Cabin은 null값이 687개 ....
- pd.DataFrame.describe()
숫자형 (int, float) column들의 기술 통계량을 보여주는 함수
기술통계량이란?
해당 column을 대표할 수 있는 통계값들을 의미
기술통계량 종류
count : 해당 column에서 비어있지 않은 값의 개수
mean : 평균
std : 표준편차
min : 최솟값 (이상치 포함)
25% (Q1) : 전체 데이터를 순서대로 정렬했을 때, 아래에서 부터 1/4 지점에 있는 값
50% (Q2) : 중앙값 (전체 데이터를 순서대로 정렬했을 때, 아래에서 부터 2/4 지점에 있는 값
75% (Q3) : 전체 데이터를 순서대로 정렬했을 때, 아래에서 부터 3/4 지점에 있는 값
max : 최댓값 (이상치 포함)
이상치 : 울타리 밖에 있는 부분을 이상치라고 정의함
아래쪽 울타리 : Q1 - 1.5 * IQR
위쪽 울타리 : Q3 + 1.5 * IQR
IQR = Q3 - Q1
- pd.Series.value_counts(), pd.Series.unique()
Series : 하나의 열
counts()
series 내 고유값들 각각의 개수를 보여주는 함수
가장 많이 나오는 고유값들 순서로 보여줍니다.
비어있는 값은 고려하지 않습니다
unique()
해당 series의 고유값들만 보여주는 함수
[1, 1, 1, 3] 이라는 시리즈가 있다면, unique() 함수 적용시 [1, 3]이 출력됩니다.
nan 값이 있을시 nan값도 포함하여 출력한다. (Not a Number)
출연하는 순서대로 나오기 때문에, 알파벳 순서 또는 오름차순으로 정렬되어 있지 않습니다.
이 외에도 pd.Series.plot(kind = "bar"), pd.Series.plot(kind = 'hist'), pd.DataFrame.plot(x,y,kind = 'scatter') 등의 데이터를 시각화 해주는 함수들도 다양히 있었습니다.
4. 데이터 전처리 (Data Cleansing & Pre-Processing)
◾ pd.Series.isna() - 데이터 결측치 여부 확인
결측치면 True, 아니면 False 반환
train.isna().sum() # True 값을 전부 더한 값 반환
'''
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
'''
◾ pd.DataFrame.fillna() - 결측치 채우기
결측치가 있는 걸 확인했다면 결측치를 채워주어야 모델 학습에 에러가 발생하지 않습니다.
결측치를 채우고자 하는 colum과 결측치를 대신하여 넣고자 하는 값을 명시해주어야 합니다.
범주형 변수일 경우, 최빈값으로 대체할 수 있습니다.
train['Age'].median() # train - Age 의 평균값 계산, 출력 값은 28 이었음
train['Age'] = train['Age'].fillna(28) # train - Age 의 null값(결측치)를 평균값(28)으로 채움
# test파일도 똑같이 진행
test['Age'].median()
test['Age'] = test['Age'].fillna(27)
◾ pd.Series.map() - 시리즈 내 값을 변환
모델 학습시 문자값을 받아들이지 못하므로 문자값을 INT값으로 변환해 줍니다.
# 성별을 남성은 0, 여성은 1 로 바꾸어줌
train['Sex'] = train['Sex'].map({'male':0, 'female':1})
# 배에 탑승한 위치값도 적절한 INT값으로 변경
train['Embarked'] = train['Embarked'].map({'S':0, 'C':1, 'Q':2})