머신러닝&딥러닝

[머신러닝&딥러닝] 타이타닉 데이터(Titanic Data)

거북이07 2023. 12. 29. 17:21

타이타닉 데이터(Titanic Data)

타이타닉 데이터 링크

https://bit.ly/fc-ml-titanic

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'])