4 분 소요

1. 개요

앞으로 머신러닝 및 딥러닝 등을 공부하기 위해서 Kaggle로 공부하는 것 역시 필수라고 생각합니다. 저는 그랜드마스터인 이유한님의 커리큘럼을 따라서 공부해보려고 합니다. 해당 사이트에서 공부를 진행했습니다.
https://kaggle-kr.tistory.com/17?category=868316

먼저 캐글에서 유명한 타이타닉 대회를 공부하려고 합니다. 타이타닉에 탑승한 사람들의 신상정보를 활용하여, 승선한 사람들의 생존여부를 예측하는 모델을 생성하는 것을 연습해보겠습니다.

2. 라이브러리 설치

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use('seaborn')
sns.set(font_scale = 2.5)

import missingno as msno

import warnings
warnings.filterwarnings('ignore')

%matplotlib inline
C:\Users\82104\AppData\Local\Temp\ipykernel_26364\3871244946.py:6: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
  plt.style.use('seaborn')

plt.style.use(‘seaborn’): matplotlib의 스타일은 seaborn 스타일로 설정합니다. seaborn 스타일은 그래프의 색상 팔레트와 기본적인 스타일을 조정하여 시각적으로 더 매력적이고 현대적인 그래프를 만들어줍니다.

sns.set(font_scale = 2.5): 이 코드는 seaborn의 설정을 변경합니다. font_scale 매개변수를 2.5로 설정하여 폰트 크기를 조정합니다.

import missingno as msno: missingno는 결측 데이터 시각화에 사용되는 파이썬 라이브러리입니다. 사용하면 데이터셋에서 결측 데이터의 패턴과 분포를 시각화하여 데이터의 누락 여뷰를 파악할 수 있습니다.

%matplotlib inline: Jupyter Notebook과 같은 환경에서 그래프를 인라인(inline)으로 표시하도록 설정하는 매직 명령어입니다. 이 설정을 사용하면 그래프가 코드 셀 아래 바로 나타며, 별도의 창이나 탭을 열지 않고도 그래프를 바로 확인할 수 있습니다.

3. 데이터셋 확인

파이썬에서 테이블화 된 데이터를 다루는 데 가장 최적화되어있으며, 많이 쓰는 라이브러리는 pandas입니다.
우리는 pandas를 사용하여 데이터셋의 간단한 통계적 분석부터 복잡한 처리들을 간단한 메소드를 사용해 해낼 수 있습니다.

df_train = pd.read_csv(r'C:\Users\82104\OneDrive\바탕 화면\kaggle\Transcription\titanic\data\train.csv')
df_test = pd.read_csv(r'C:\Users\82104\OneDrive\바탕 화면\kaggle\Transcription\titanic\data\test.csv')
df_train.head()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

다루는 문제에서 feature는 Pclass, Age, SibSp, Parch, Fare이며, 예측하려는 target label은 Survived입니다.

df_train.describe()
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200

pandas dataframe에는 describe() 메소드가 있는데, 이를 쓰면 각 feature가 가진 통계치들을 반환해줍니다.

df_train.describe()
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
  • 테이블에서 보다시피, Passenger ID 숫자와 다른 null data가 존재하는 열(feature)가 있습니다.
  • 좀 더 보기 편하게 그래프로 시각화해서 살펴보겠습니다.

4. Null data check

# 각 열마다 결측값의 백분율을 계산하고 출력
for col in df_train.columns:
    msg = 'column: {:>10}\t Percent of NaN value: {:.2f}%'.format(col, 100 * (df_train[col].isnull().sum()/df_train[col].shape[0]))
    print(msg)
column: PassengerId	 Percent of NaN value: 0.00%
column:   Survived	 Percent of NaN value: 0.00%
column:     Pclass	 Percent of NaN value: 0.00%
column:       Name	 Percent of NaN value: 0.00%
column:        Sex	 Percent of NaN value: 0.00%
column:        Age	 Percent of NaN value: 19.87%
column:      SibSp	 Percent of NaN value: 0.00%
column:      Parch	 Percent of NaN value: 0.00%
column:     Ticket	 Percent of NaN value: 0.00%
column:       Fare	 Percent of NaN value: 0.00%
column:      Cabin	 Percent of NaN value: 77.10%
column:   Embarked	 Percent of NaN value: 0.22%
for col in df_test.columns:
    msg = 'column: {:>10}\t Percent of NaN value: {:.2f}%'.format(col, 100 * (df_test[col].isnull().sum()/df_test[col].shape[0]))
    print(msg)
column: PassengerId	 Percent of NaN value: 0.00%
column:     Pclass	 Percent of NaN value: 0.00%
column:       Name	 Percent of NaN value: 0.00%
column:        Sex	 Percent of NaN value: 0.00%
column:        Age	 Percent of NaN value: 20.57%
column:      SibSp	 Percent of NaN value: 0.00%
column:      Parch	 Percent of NaN value: 0.00%
column:     Ticket	 Percent of NaN value: 0.00%
column:       Fare	 Percent of NaN value: 0.24%
column:      Cabin	 Percent of NaN value: 78.23%
column:   Embarked	 Percent of NaN value: 0.00%
  • Train, Test set에서 Age(둘 다 약 20%), Cabin(둘 다 약 80%), Embarked(Train만 0.22%) null data 존재하는 것을 볼 수 있습니다.
  • MSNO라는 라이브러리를 사용하면 null data의 존재를 더 쉽게 볼 수 있습니다.
msno.matrix(df = df_train.iloc[:, :], figsize = (8, 8), color = (0.8, 0.5, 0.2))
<Axes: >

2023-06-20-titanic-1_16_1

msno.matrix: missingno 라이브러리의 matrix 함수는 결측값을 행렬(matrix)형태로 시각화하는 기능을 제공합니다. 결측값이 있는 위치는 흰색으로 표시되고, 결측값이 없는 위치는 검은색으로 표시됩니다.

msno.bar(df = df_train.iloc[:, :], figsize = (8, 8), color = (0.8, 0.5, 0.2))
<Axes: >

2023-06-20-titanic-1_18_1

msno.bar(df = df_test.iloc[:, :], figsize = (8, 8), color = (0.8, 0.5, 0.2))
<Axes: >

2023-06-20-titanic-1_19_1

5. Target label 확인

target label이 어떤 distribution을 가지고 있는지 확인해봐야 합니다.
지금 같은 binary classification 문제의 경우, 1과 0의 분포가 어떠냐에 따라 모델의 평가 방법이 달라질 수 있습니다.

f, ax = plt.subplots(1, 2, figsize = (18, 8))

df_train['Survived'].value_counts().plot(kind = 'pie', explode = [0, 0.1], autopct = '%1.1f%%', ax = ax[0], shadow = True)
ax[0].set_title('Pie plot - Survived')
ax[0].set_ylabel('')

sns.countplot(x = 'Survived', data = df_train, ax = ax[1])
ax[1].set_title('Count plot - Survived')

plt.show()

2023-06-20-titanic-1_21_0

explode = [0, 0.1]는 두 번째 파이 조각을 조금 떨어뜨려서 강조하는 역할을 합니다.
autopct = ‘%1.1f%%’는 파이 조각 위에 백분율 값을 표시하는 역할을 합니다.
shadow = True는 그림에 그림자 효과를 추가합니다.

  • 죽은 사람이 많습니다.
  • 38.4%가 살아남았습니다.
  • target label의 분포가 제법 균일(balanced)합니다.

댓글남기기