Kaggle 타이타닉 필사 데이터셋 탐색
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: >
msno.matrix: missingno 라이브러리의 matrix 함수는 결측값을 행렬(matrix)형태로 시각화하는 기능을 제공합니다. 결측값이 있는 위치는 흰색으로 표시되고, 결측값이 없는 위치는 검은색으로 표시됩니다.
msno.bar(df = df_train.iloc[:, :], figsize = (8, 8), color = (0.8, 0.5, 0.2))
<Axes: >
msno.bar(df = df_test.iloc[:, :], figsize = (8, 8), color = (0.8, 0.5, 0.2))
<Axes: >
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()
explode = [0, 0.1]는 두 번째 파이 조각을 조금 떨어뜨려서 강조하는 역할을 합니다.
autopct = ‘%1.1f%%’는 파이 조각 위에 백분율 값을 표시하는 역할을 합니다.
shadow = True는 그림에 그림자 효과를 추가합니다.
- 죽은 사람이 많습니다.
- 38.4%가 살아남았습니다.
- target label의 분포가 제법 균일(balanced)합니다.
댓글남기기