탐색적 자료분석
데이터를 분석하는 기술적 접근은 많다.
그래서 방법론에 집중하다보면 데이터가 가진 본질적인 의미를 훼손할 수 있다 !
🔥 EDA → 데이터 그 자체만으로부터 인사이트를 얻어내는 접근법!
📌 EDA 과정에서는 다음과 같은 과정이 포함됨
🔎EDA Example - Titanic Problem 🔗
분석의 목적
변수 확인
Variable : 열 이름, Definition : 열에 대한 정보, Key : 숫자로 인코딩되어있는 경우 그 숫자가 무엇을 나타내는 지를 뜻함
survival : 생존 여부
pclass : 탑승 티켓의 등급
sex : 성별
age : 나이
sibsp : 형제자매나 배우자가 몇명이 타고 있는지
parch : 부모님이나 자식이 몇명이 타고 있는지
ticket : 티켓 번호
fare : 탑승객이 지불한 요금
cabin : 승무원 번호
embarked : 탑승한 항구
탐색적 데이터 분석을 통해 데이터를 통달해봅시다. with Titanic Data
# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 데이터 블러오기
# 동일 경로에 "train.csv"가 있는 경우
titanic_df = pd.read_csv("./train.csv")
# 상위 5개 데이터 확인하기
titanic_df.head(5)
# 각 Column의 데이터 타입 확인하기
titanic_df.dtypes
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
📌수치형 데이터 요약 보기
DataFrame.describe()
# 데이터 전체 정보를 얻는 함수 : .describe()
titanic_df.describe() # 수치형 데이터에 대한 요약만을 제공!
count 개수 / mean 평균 / std 표준편차 / min 최소 / Q 백분위 / max 최대
👉 데이터 살펴보기
📌
상관계수 확인
DataFrame.corr()
# 상관계수 확인!
titanic_df.corr()
👉 데이터 살펴보기
🔥 Correlation is NOT Causation
인과가 아니므로 높은 등급인 사람의 생존률이 높다고 무조건 단정하면 안됨!
📌
결측치 확인
DataFrame.isnull()
sum()
)를 이용하면 보기 편하다.# 결측치 확인
titanic_df.isnull().sum()
# Age, Cabin, Embarked에서 결측치 발견!
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
👉 결측치를 어떻게 처리할 지 정해야함!
# 생존자, 사망자 수는?
titanic_df['Survived'].value_counts()
0 549
1 342
Name: Survived, dtype: int64
# 생존자 수, 사망자 수를 Barplot으로 그려보기 sns.countplot()
sns.countplot(x='Survived', data=titanic_df)
plt.show()
# Pclass에 따른 인원 파악
titanic_df[['Pclass', 'Survived']].groupby(['Pclass']).count()
# Pclass 별 생존자 인원은?
titanic_df[['Pclass', 'Survived']].groupby(['Pclass']).sum()
# 전체 인원 대비 Pclass 별 생존자 비율은?
titanic_df[['Pclass', 'Survived']].groupby(['Pclass']).mean()
# 히트맵 활용
sns.heatmap(titanic_df[['Pclass', 'Survived']].groupby(['Pclass']).mean())
plt.show()
titanic_df.groupby(['Survived', 'Sex']).count()
# sns.catplot
sns.catplot(x='Sex', col='Survived', kind='count', data=titanic_df)
plt.show()
titanic_df.describe()['Age']
count 714.000000
mean 29.699118
std 14.526497
min 0.420000
25% 20.125000
50% 28.000000
75% 38.000000
max 80.000000
Name: Age, dtype: float64
# Suvived 1, 0 과 Age의 경향성
fig, ax = plt.subplots(1, 1, figsize=(10, 5))
sns.kdeplot(x=titanic_df[titanic_df['Survived'] == 1]['Age'], ax=ax)
sns.kdeplot(x=titanic_df[titanic_df['Survived'] == 0]['Age'], ax=ax)
plt.legend(['Survived', 'Dead'])
plt.show()
여기까지는 단일 요소와 Survived에 대한 단일 비교를 해보았다.
복합적인 요소에도 분석을 할 수 있다.
👇
sns.catplot(x='Pclass', y='Survived', kind='point', data=titanic_df)
plt.show()
hue 옵션을 추가하면 특정 컬럼을 기준으로 나눠서 파악하기 용이하다!
sns.catplot(x='Pclass', y='Survived', hue='Sex', kind='point', data=titanic_df)
plt.show()
그래프는 pclass 별 생존자에 대한 추정치를 나타냄
👉 pclass가 높을 수록 생존자인 비율이 더 높다!
# Age graph with Pclass
titanic_df['Age'][titanic_df.Pclass == 1].plot(kind='kde')
titanic_df['Age'][titanic_df.Pclass == 2].plot(kind='kde')
titanic_df['Age'][titanic_df.Pclass == 3].plot(kind='kde')
plt.legend(['1st class', '2nd class', '3rd class'])
plt.show()
👉 클래스가 높은 등급일수록 나이대가 높다!