[머신러닝&딥러닝] 타이타닉 데이터(Titanic Data)
타이타닉 데이터(Titanic Data)
타이타닉 데이터 링크
import numpy as np
import pandas as pd
df = pd.read_csv("https://bit.ly/fc-ml-titanic")
df
타이타닉 데이터셋을 출력한 결과
타이타닉 데이터셋 컬럼명
- PassengerId: 승객 아이디
- Survived: 생존 여부(0: 사망, 1: 생존)
- Pclass: 좌석 등급
- Name: 이름
- Sex: 성별
- Age: 나이
- SibSp: 형제, 자매, 배우자 수
- Parch: 부모, 자식 수
- Ticket: 티켓 번호
- Fare: 요금
- Cabin: 선실
- Embarked: 탑승 항구
해당 타이타닉 데이터를 그대로 사용할 수 없어 데이터 전처리를 해줘야한다.
여기서 데이터 전처리란
- 데이터 정제 작업을 뜻
- 필요없는 데이터를 삭제하고, null값이 있는 행을 처리, 정규화/표준화 등의 많은 작업들이 포함된다.
- 머신러닝, 딥러닝 실무에서 전처리가 50% 이상의 중요도를 차지함
독립변수와 종속변수 나누기
- 타이타닉 데이터의 종속변수는 생존 여부이다.
- 독립변수는 종속변수를 제외한 나머지가 독립변수이며 여기서는 [좌석등급, 성별, 나이, 요금] 총 4가지이다.
- 여기서 독립변수를 선정한 기준은 생존여부에 관련이 있을거같은 컬럼들을 독립변수로 선정해주었다.
feature = ["Pclass", "Sex", "Age", "Fare"] # 독립변수
label = ["Survived"] # 종속변수
df[feature].head()
종속변수를 찍었을때 나오는 결과이다 0 => 사망, 1 => 생존이다.
df[label].head()
.value_counts()
value_counts는 데이터프레임 컬럼당 value의 개수를 알려주는 함수이다.
df[label].value_counts()
Survived
0 549
1 342
dtype: int64
결측치 처리
df.info()
.info() 함수를 이용하여 데이터프레임의 정보를 확인한다.
df.isnull().sum()
isnull() 함수를 이용하면 값이 null값을 찾을 수 있다. 위 코드에서는 sum()함수를 사용하여 각 컬럼별 null의 합을 구해주었다.
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
위에 데이터를 확인해보면 Age에 Null 값이 177개가 있는것을 확인할 수 있다.
그래서 Age에 null 값을 변경해주어야한다.
해당 데이터에서는 0살이나 데이터를 아예 없애는것보다 평균 나이를 구해서 데이터를 삽입해주는게 더 좋기 때문에 평균나이로 대체해준다.
df["Age"] = df["Age"].fillna(df["Age"].mean())
df
.fillna() 함수는 기본적으로 인플레이스연산이 아니기때문에 df['컬럼명']에 직접 대입해주거나 inplace=True 옵션을 추가 입력해줘야한다.
라벨 인코딩(Lable Encoding)
문자(Categorical)를 수치(Numerical)로 변환해주는 것
예를 들어 여자는 0 남자는 1, A형 0 B형 1 C형 2... 등으로 변환해주는것을 라벨 인코딩이라고 한다.
하지만 혈액형같은 경우에는 라벨인코딩으로 해줬을 경우 데이터가 애매해질 수 있다..... 위는 단순 예시..
라벨 인코딩을 해주는 이유는 머신러닝에서는 str 타입을 넣을 수 없기때문에 모두 int나 float 형식으로 변경해주어야한다.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 891 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
해당 데이터프레임의 info를 보면 sex가 object형식인걸 확인할 수 있다. 학습시키기 위해서는 int나 float 형식으로 변경해줘야해서 해당 컬럼을 라벨 인코딩을 해줘야한다.
# 람다로 적용하는 방법
df["Sex"] = df["Sex"].apply(lambda x: 1 if x == "male" else 0)
# 함수로 만들어서 apply로 적용하는 방법
def convert_sex(data):
if data == "male":
return 1
elif data == "female":
return 0
df["Sex"] = df["Sex"].apply(convert_sex)
위 코드를 이용하여 라벨 인코딩을 해준다.
라벨인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
LabelEncoder 객체를 생성해준다 라벨인코딩은 알파벳 순서대로 진행된다.
embarked = le.fit_transform(df['Embarked'])
embarked
원 핫 인코딩(One Hot Encoding)
독립적인 데이터는 별도의 컬럼으로 분리하고 각각 컬럼에 해당 값에만 1, 나머지는 0값으로 갖게 하는 방법
df=pd.get_dummies(df, columns=['Embarked'])