머신러닝 과정
1. 문제정의 : 프로젝트 목적, 어떤 모델을 만들지?, 지도학습 vs 비지도학습
2. 데이터 수집
3. 데이터 전처리 : 분석 전에 깔끔하게 만들어 줌(이상치 제거, 결측치 처리...)
4. 탐색적 데이터 분석 : 컬럼(변수)간의 관계 확인, 기술통계량
5. 모델 선택 및 학습
6. 모델 예측 및 평가
7. 모델을 가지고 서비스화(웹,앱)
목표
생존자/사망자 예측하는 모델을 만들어보자
머신러닝 모델 종류는 여러가지지만 tree모델 사용해보자
머신러닝 전체 과정을체험해보자
kaggle 경진대회에 참여해서 순위를 확인해보자
데이터 수집
- kaggle 사이트로부터 train, test, submission 다운로드
- train : 학습 시키기 위한 데이터
- test : 학습이 잘 됐는지 예측해보기 위한 데이터
- submission : kaggle에 제출할 답안지
Kaggle 사이트에 접속 후 Search에 titanic을 검색해주자
빨간네모 클릭 후
Data 탭에서 Download All 클릭해서 타이타닉 데이터를 받아오자
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns # 시각화 라이브러리(모듈)
방금 받아온 타이타닉 데이터 불러온 후 확인해보기 (인덱스를 PassengerId로 지정 해 주자)
# train = pd.read_csv('경로 및 파일명')
train = pd.read_csv('./titanic/train.csv',index_col='PassengerId')
train.shape
train
891개의행과 11개의 컬럼으로 구성된 것을 확인할 수 있다.
# Sibsp : 배우자 + 형제자매 수
# Parch : 부모 + 자식 수
# Cabin : 객실(층, 몇번방)
# Embarked : 승선항
test = pd.read_csv('./titanic/test.csv',index_col = 'PassengerId')
display(test.head())
test.shape
이번에는 상위 5개만 출력 해 보자
display : 출력함수로 본래 가지고 있는 형태를 그대로 출력 print와 유사하나 다르다.
데이터 전처리 및 데이터 탐색
- 결측치 확인
train.info()
test.info()
- train : Age, Cabin, Embarked null값 존재
- test : # Age, Fare, Cabin null값 존재
train-Embarked 결측치 처리(채우기)
# 사람들이 가장 많이 승선한 항을 찾아 결측치 값으로 처리
# train 기준으로 살펴보기 : 학습용 데이터 기준으로 살펴봐야함, 머신러닝 모델의 학습 영향을 주기 때문
# 가장많이 승선한 항 : S
train['Embarked'].value_counts()
# boolean indexing을 통해서 Embarked에 결측치가 있는 행 확인
train[train['Embarked'].isnull()]
# 널값을 채워보자
# fillna('채울값'): 1. 결측치 자리 찾기 2. 결측치 있으면 채우기
train['Embarked'] = train['Embarked'].fillna('S')
train[train['Embarked'].isnull()]
# 상관관계 확인하는 함수 : corr()
# 상관계수 출력
# 상관계수 -1~1 :-1,1 상관관계가 높음/ 0 상관관계가 낮음
# Pclass가 Fare컬럼이랑 가장 상관관계가 높다
# 제외된 컬럼들은 알파벳이 포함 돼 있어서 숫자연산 불가능
train.corr()
# fare를 기준으로
train.corr()['Fare']
# fare를 기준으로 절댓값 내림차순
train.corr()['Fare'].abs().sort_values(ascending= False)
# Pclass를 기준으로 평균 요금 조회
train[['Pclass','Fare',]].groupby('Pclass').mean()
# 성별 컬럼까지 연관해서 기술통계량 확인
train[['Pclass','Fare','Sex']].groupby(['Pclass','Sex']).mean()
# test - Fare 결측치 있는 행 확인하기
test[test['Fare'].isnull()]
# 값 채워보기 - 3등급 남성 : 12.661633
test['Fare'] = test['Fare'].fillna(12.661633)
Age 결측치 처리(채우기)
- 다른 컬럼과의 상관관계를 확인 후 결측치를 채워보자
- corr() 함수를 이용해보자
# train 기준으로 살펴보기
train.corr()['Age'].abs().sort_values(ascending=False)
#Pclass 컬럼이 상관관계가 가장 높음 -> 등급으로 그룹화하여 나이의 평균값 확인
gb1 = train[['Age','Pclass','Sex']].groupby(['Pclass','Sex']).mean()
# 멀티인덱스
gb1
# 멀티인덱스 인덱싱 하는 방법
gb1.loc[(3,'female')]
# train - Age 컬럼 결측치 행 모두 확인하기
train[train['Age'].isnull()]
# 데이터에 복잡한 처리를 하는 함수 연결하는 기능(함수) : apply
1. 사용자 정의 함수 : 복잡한 처리
2. 대상 데이터와 apply를 통해 연결
3. 처리가 완료된 데이터를 실제에 반영함(초기화)
# row 행단위로 처리하게 만드는 함수
# 결측치가 있을 때 처리하는 조건문
def fill_age(row):
if np.isnan(row['Age']):
return gb1.loc[(row['Pclass'],row['Sex'])]
# 없으면 숫자값 그대로 반환 조건문
else :
return row['Age']
# apply 함수 이용해서 fill_age 함수 적용하기
train['Age'] = train.apply(fill_age, axis=1).astype('int64')
train.info()
# fill_age 함수 이용해서 test 데이터 나이 결측치 처리
# age 컬럼과 상관관계 확인하기
test.corr()['Age']
test['Age'] = test.apply(fill_age,axis=1).astype('int64')
test.info()
Cabin 결측치 처리(채우기)
# Cabin에 어떤 값이 들어있는지 확인
train['Cabin'].unique()
# nan 결측치
# EX) C85 (C층,85번째 방)
# 임의로 'M' 값으로 결측치 채우기
train['Cabin'] = train['Cabin'].fillna('M')
test['Cabin'] = test['Cabin'].fillna('M')
# 알파벳만 추출해보자
train['Cabin'] = train['Cabin'].str[0]
train['Cabin']
test['Cabin'] = test['Cabin'].str[0]
test['Cabin']
데이터 탐색
- train 데이터를 기준으로 탐색 : 모델 학습에 도움이 되는 데이터이기 때문
- test를 탐색하는 것은 모델 일반화에 도움이 되지 않음
범주형 데이터 시각화
- Cabin 시각화
- Cabin 컬럼과 생존/사망의 관계 확인핸보기
train_cabin = train[['Cabin','Survived','Name']].groupby(['Cabin','Survived']).count()
train_cabin
# sns 라이브러리로 시각화
- > M층에서는 상대적으로 사망율이 높음
sns.countplot(data = train, x = 'Cabin', hue = 'Survived')
Pclass 시각화
- 승객 등급과 사망/생존 관계 확인해보기
-> 등급이 높을수록 생존율이 높음
sns.countplot(data = train, x = 'Pclass', hue = 'Survived')
Cabin과 Pclass 시각화
- M층에서 왜 사람이 많이 죽었는지 확인해보기
- 등급과 연관이 있는 것인지 확인해보기
- > M층에서 사망율이 높은 이유는 승객의 등급이 3등급인 사람이 많이 있었음
sns.countplot(data = train, x = 'Cabin', hue = 'Pclass')
Sex,Embarked 시각화
- 성별이 사망/생존과 얼마나 연관이 있는지 확인
sns.countplot(data = train, x = 'Sex', hue = 'Survived')
- 승선항이 사망/생존과 얼마나 연관이 있는지 확인
sns.countplot(data = train, x = 'Embarked', hue = 'Pclass')
수치형 데이터 시각화
- Age컬럼 생존/ 사망 관계 확인하기
# 바이올린 플롯
plt.figure(figsize=(15,5))
sns.violinplot(data=train, x ='Sex', y = 'Age', hue = 'Survived', split = True)
# y값 범위 지정해주기 ylim(시작범위,끝범위)
plt.ylim(0,80)
# 남자아이일 경우에 생존율이 높음
# 여자아이일 경우에 사망율이 높음
train['Age'].describe()
Fare 시각화
# Fare 요금의 기술통계량, 확인해보기!
# 일반적인 사람들은 중앙값 기준으로 14정도 내고 승선했을 것 (= 대푯값)
# 평균이 대표가 될 수 없는 이유 512라는 큰값의 영향을 받았을 수 있기 때문
train['Fare'].describe()
# 바이올린 플롯
plt.figure(figsize=(15,5))
sns.violinplot(data=train, x ='Sex', y = 'Fare', hue = 'Survived', split = True)
# y값 범위 지정해주기 ylim(시작범위,끝범위)
plt.ylim(0,512)
# 성별에 상관없이 요금이 낮을수록 사망율이 높음
'Machine Learning' 카테고리의 다른 글
[Machine Learning] Colab사용 OpenCV 실습 (0) | 2022.07.20 |
---|---|
[Machine Learning] 손글씨데이터 활용 분류 실습 (0) | 2022.07.20 |
[Machine Learning] 타이타닉 데이터 활용하여 생존/사망 분류 실습02 (0) | 2022.07.19 |
[Machine Learning] Pandas와 Matplotlib을 사용해서 카카오톡 대화 전처리 실습 (0) | 2022.07.12 |