EDA (Exploratory Data Analysis)

탐색적 자료분석

 

데이터를 분석하는 기술적 접근은 많다.
그래서 방법론에 집중하다보면 데이터가 가진 본질적인 의미를 훼손할 수 있다.

 

EDA \(\rightarrow\) 데이터 그 자체만으로부터 인사이트를 얻어내는 접근법

 

EDA 과정에서는 다음과 같은 과정이 포함됨

  • 시각화 과정
  • 통계적 수치 (통계학)
  • 자료를 담는 numpy, pandas

 

 


EDA의 Process

  1. 분석의 목적과 변수 확인
    • 분석의 목적 : 분석 후 결과에 대한 의미 도출
    • 변수 확인 : 각 컬럼들이 어떤 의미를 가지며 어떤 타입을 가지고 있고, 분석하는 데에 적절한지 확인
  1. 데이터 전체적으로 살펴보기
    • 데이터간의 상관관계, 결측치(NA), 데이터의 사이즈(일반화하기에 적절히 큰지) 파악
  1. 데이터의 개별 속성 파악하기
    • 각 데이터의 개별 속성 (같은 값이어도 어느 컬럼에 들어가 있냐에 따라 달라짐) 파악

 

 

 


EDA Example - Titanic Problem

 

분석의 목적과 변수 확인

  • 분석의 목적
    • 데이터에는 탑승색 정보와 그 사람의 생존 여부가 들어있다.
    • 그렇다면, 살아남은 사람들은 어떤 특징을 가지고 있을까?
  • 변수 확인
    • Variable : 열 이름
    • Definition : 열에 대한 정보
    • key : 숫자로 인코딩되어있는 경우 그 숫자가 무엇을 나타내는 지를 뜻함

 

  1. Survived : 생존 여부 (0=Dead, 1=Survived)
  2. Pclass : 탑승 티켓의 등급 (1=1st, 2=2nd, 3=3rd)
  3. Sex : 성별
  4. Age : 나이
    • Variable Notes - 1살보다 어리면 분수로, 추정치라면 xx.5로 표현됨
  5. SibSp : 형제자매나 배우자가 몇명이 타고 있는지
  6. Parch : 부모님이나 자식이 몇명이 타고 있는지
  7. Ticket : 티켓 번호
  8. Fare : 탐승객이 지불한 요금
  9. Cabin : 승무원 번호
  10. Embarked : 탐승한 항구

 

 


Exploratory Data Analysis

탐색적 데이터 분석을 통해 데이터를 통달해봅시다.

  1. 라이브러리 준비
  2. 분석의 목적과 변수 확인
  3. 데이터 전체적으로 살펴보기
  4. 데이터의 개별 속성 파악하기

 

 

 

0. 라이브러리, 데이터 준비

# 라이브러리 불러오기

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")

 

 

 

 

1. 분석의 목적과 변수 확인

  • 타이타닉 호에서 생존한 생존자들은 어떤 사람들일까?
# 상위 5개 데이터 확인하기

titanic_df.head(5)
  • Cabin 에 결측치(NA)가 존재하는 것에 유의
    • 결측치가 의미하는 바에 따라 처리해주어야 함

 

 

 

 

2. 데이터 전체적으로 살펴보기

 

수치형 데이터 요약 보기

  • DataFrame.describe()
  • 수치형 데이터만 요약해주기 때문에 Name, Ticket 와 같은 object 자료형은 제공하지 않는다.

count(개수), mean(평균), std(표준편차), min(최소), Q(백분위), max(최대)

 

  • PassengerId
    • 인덱스이기 때문에 큰 의미없다
  • Survived
    • 0, 1로 구성되어있는 이진데이터
    • (가설) 평균이 0.5보다 작기 때문에 생존하지 못한 사람이 더 많을 것이다.
  • Pclass
    • 범주형 데이터이기 때문에 큰 의미를 가지지 않는다.
  • Age
    • 평균 29.5, 표준편차 14.5, 최소나이 0.4, 최대나이 80
  • SibSp
    • 최대 8
  • Parch
    • 최대 6
  • Fare
    • (가설) 평균 32.2, 표준편차 49인데, 최소가 0이고 최대가 512인 것은 차이가 너무 크므로 이상점(outlier)라고 볼 수 있다

 

 

 


상관관계 확인

  • DataFrame.corr()
  • \(x_1\)과 \(x_2\)의 상관관계

 

  • Pclass - Fare
    • 높은 등급일수록 요금이 비쌀 수 있다.
  • Pclass - Survived
    • 높은 등급의 사람들의 생존율이 더 높을 수 있다.

주의) Correlation is NOT Causation

  • 상관성 : A up, B up, ...
    상관성이 높게 나온다하더라도 인과성이 성립하는 것은 아니다.
  • 인과성 : A -> B (원인과 결과)
    인과성을 증명하는 것은 어려운 일

 

 


결측치 확인

  • DataFrame.isnull()
  • 통계함수(sum())를 이용하면 보기 편하다

\(\Rightarrow\)결측치를 어떻게 처리할 지 정해야 함

  • 특정 값으로 대체할지
  • 하나의 데이터로 판단할지
  • 제거할지

 

 

 

 

3. 데이터의 개별 속성 파악하기


I. Survived column

 

 


II. Pclass

 

 


III. Sex

 

 


IV. Age

 

 

 

 

 

Appendix

 

I. Sex + Pclass VS Survived

  • 복잡한 요소를 표현할 때에는 catplot을 많이 사용
    hue 옵션을 추가하면 특정 컬럼을 기준으로 나눠서 파악하기 용이

그래프는 pclass 별 생존자에 대한 추정치를 나타냄

\(\Rightarrow\) pclass가 높을 수록 생존자인 비율이 더 높다!

 

 

 


II. Age+Pclass VS Survived

\(\Rightarrow\) 클래스가 높은 등급일수록 나이대가 높다!

 

 

 

정리)

  1. 데이터를 뽑아봅시다.
    • 각 데이터는 어떤 자료형을 가지고 있나요?
    • 데이터에 결측치는 없나요? -> 있다면 이를 어떻게 메꿔줄까요?
    • 데이터의 자료형을 바꿔줄 필요가 있나요? -> 범주형의 One-hot encoding
  2. 데이터의 대한 가설을 세워봅시다.
    • 가설은 개인의 경험에 의해서 도출되어도 상관이 없습니다.
    • 가설은 명확할 수록 좋습니다. ex) Titanic Data에서 Survived 여부와 성별에는 상관관계가 있다.
  3. 가설을 검증하기 위한 증거를 찾아봅시다.
    • 이 증거는 한 눈에 보이지 않을 수 있습니다. 우리가 다룬 여러 Technique를 써줘야합니다.
    • `.groupby()` 를 통해서 그룹화된 정보에 통계량을 도입하면 어떨까요?
    • `.merge()` 를 통해서 두 개 이상의 DataFrame을 합치면 어떨까요?
    • 시각화를 통해 일목요연하게 보여주면 더욱 좋겠죠?