타이타닉 생존 data를 이용한 Model stacking (1)_데이터 전처리편
Project Process 별 자료 (총 3편)
타이타닉 생존 data를 이용한 Model stacking _결과 요약
타이타닉 생존 data를 이용한 Model stacking (1)_데이터 전처리편
타이타닉 생존 data를 이용한 Model stacking (2)_데이터 모델링편
데이터 분석 목적
- 승객의 생존 여부 외 추가 데이터를 이용하여 어떤 변수가 생존에 영향을 미치는지 알아보기 위함
- 멋쟁이 사자처럼 강의 내 팀 프로젝트 진행 내용
데이터 파악
- 데이터 column 별 의미
- PassengerId : 승객 별 고유 ID
- Survived : 생존 여부(0 = 사먕, 1 = 생존) -> Y 값을 사용 예정
- pclass : 객실 등급 (1 = 1st, 2 = 2nd, 3 = 3rd)
- sibsp : 함께 탑승한 본인 제외 형제자매배우자 수
- name : 승객 이름
- sex : 성별
- age : 나이
- parch : 함께 탑승한 본인 제외 부모 및 자녀의 수
- ticket : 티켓 구매 번호
- fare : 티켓 가격
- cabin : 승무원 여부
- embarked : 승선한 항구 이름 (C = Cherbourg, Q = Queenstown, S = Southampton)
데이터 확인 및 분류 항목 추가
- 객실 등급에 따른 티켓 가격 차이에 따른 정확한 티켓 가격 산정 후 추가
- pclass와 fare를 비교한 결과 동일 객실 등급에도 가격 차이가 많이 발생한 것으로 확인
- pclass와 ticket, fare 를 Groupby로 묶어서 비교한 결과 동일 티켓 번호 확인
- ticket counts 열을 추가하여 동일한 ticket 항목의 수 집계
- fare을 ticket counts로 나누어 정확한 티켓 가격 집계
(Fare per ticket 열 추가)
- 단체 항목 추가
- 지인 / 가족과 함께 온 경우 그룹으로 확인하여 추가
- 지인의 경우, ticket에 있는 티켓의 번호가 동일한 사람들을 지인으로 추정함
(ticket counts 항목이 1 이상이면 지인으로 추정) - 가족의 경우, sibsp와 parch가 1 이상일 경우 그룹으로 산정함
- group 열을 추가하고, ticket counts와 sibsp와 parch 합이 1 이상일 경우 그룹으로 온 것으로 판단
(혼자 왔을 경우, 위 항목들은 0으로 집계됨.)
결측치 Data 추가
- 결측치 존재 여부 확인
- age, cabin, embarked 3가지 항목에서 결측치 확인
- age 열의 경우, 결측치가 전체의 20% 이므로 잔여 데이터로 추정 가능할 것으로 판단
- cabin 열의 경우, 결측치가 전체이 77%를 차지, 잔여 데이터로 추정이 불가능할 것으로 판단 -> 제거 진행
- embarked 열의 경우, 2개의 data만 결측된 것으로 확인 -> 상관 계수 확인 후 결정 예정
- age 결측치 채우기
-
이름 사이에 있는 계급 호칭들이 나이와 연관이 있다고 판단함
(군 고위직 및 미혼 기혼 여부, 고령자 및 어린 아이에만 쓰는 호칭은 나이 추정에 영향이 있다고 판단) -
name 항목 내 계급 호칭만 별로 분리작업 진행
-
계급 호칭에 따라 군인 여부(Military) / 귀족 여부(Nobility) / 나이에 따른 호칭(est_age)에 대한 열을 추가하고 분류 작업 진행
- 위 Data를 이용하여 age열 결측치 추가를 위한 회귀분석 진행
(8개 모델 중 MSE가 가장 낮은 모델을 이용하여 결측치 추가)# 1. Age 열 결측치 채우기 # Age 결측치를 채워주는 방법으로, 가지고있는 714개의 데이터 바탕 -> 여러 회귀 모델을 돌려 # -> MSE값이 가장 낮은 모델로 얻은 예측치 -> 결측치 값 추가 import numpy as np from sklearn import linear_model from sklearn import svm from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split x_data_withAge = x_data[x_data['Age'].notna()] # age 값이 있는 행만 추린 df classifiers = [ svm.SVR(), linear_model.SGDRegressor(), # MSE < 1. MSE가 가장 작게 나옴. linear_model.BayesianRidge(), linear_model.LassoLars(), linear_model.ARDRegression(), linear_model.PassiveAggressiveRegressor(), linear_model.TheilSenRegressor(), linear_model.LinearRegression()] X = np.array(x_data_withAge[x_data_withAge.columns.difference(['Age'])]) # Age를 제외한 모든 열 y = np.array(x_data_withAge['Age']) X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=0) for item in classifiers: print(item) model = item model.fit(X_train, y_train) print('MSE(Training data) : ', mean_squared_error(model.predict(X_train), y_train))
- 분석 결과 선형회귀 모형이 MSE가 가장 낮게 나와 해당 모델을 이용하여 결측치 추가
clf = classifiers[-1] age_pred = clf.predict(x_data[x_data.columns.difference(['Age'])]) x_data['Age'].fillna(pd.Series(age_pred.flatten()), inplace=True)
-
데이터 전치리 과정 중 느낀 점
- 팀 프로젝트 기간 중 주말 제외한 3일 중 2일을 데이터 전처리에 사용함
- 최종 모델 구현하기 전 데이터 전처리 작업이 중요하고 많은 시간이 소요되는 것을 깨달음
- 시간이 부족하여 팀 내 논의했던 다양한 방법을 시도하지 못하여 아쉬움이 남았음
데이터 전처리 진행 시 제안 사항
- Age 결측값 추정 시 여러 방법에 대해 논의를 진행함
- 하기 Age 관련 상관계수를 확인해보면 계급 호칭에 따른 나이 분류가 영향이 큰 것을 확인할 수 있음(약 0.45)
- 결측값 항목의 Data를 확인해보면 일부 계급 호칭만 포함되어 있음
- 해당 계급 호칭이 들어간 Data만 이용하여 나이를 추정하면 정확도를 높힐 수 있을 것으로 판단함