본문 바로가기
AI Research/Data Analysis

[데이터 분석] EDA(Exploratory Data Analysis)

by ga.0_0.ga 2023. 3. 5.
728x90
반응형

▶ EDA(Exploratory Data Analysis)란?

탐색적 데이터 분석입니다. 데이터 분석에 있어서 매우 중요한 초기 분석 단계입니다. 쉽게 말해서 데이터가 어떤 형태를 띄고 있는지 견적을 내는 일이다라고 할 수 있습니다. 이 단계가 중요한 이유는 데이터의 특성을 알아야 해결하고자 하는 문제의 해결 방법을 탐색해 볼 수 있기 때문입니다.

간단히 설명하자면, EDA란!

- 시각화를 통해 패턴을 발견하고,

- 데이터의 특성을 확인하고,

- 통계와 그래픽을 통해 가설을 검정하는 과정을 통해 데이터에 대해 알아보는 것입니다.

▶ EDA의 목적

EDA의 목적은 아래와 같습니다.

- 시각화와 통계를 사용해 데이터를 이해하고 살펴볼 수 있습니다.

- 도출하고자 하는 결과의 기본이 되는 가설에 접근하고 가설을 검증할 수 있습니다.

- 가설을 세우기 전 데이터를 이해할 수 있습니다.

=> 가장 궁극적인 목적은 데이터가 어떻게 만들어졌는지에 대한 직관적 발전입니다.

▶ EDA의 대상

EDA의 목표라고 할 수 있는 데이터는 두 가지로 분류할 수 있습니다.

1. Univariate(일변량)

EDA를 통해 파악하려는 변수가 1개인 경우를 말합니다. 데이터를 설명하고 그 안에 어떤 패턴이 존재하는지 찾는 것이 주요 목적입니다.

2. Multi-variate(다변량)

EDA를 통해 파악하려는 변수가 여러개인 경우를 말합니다. 여러 변수들이 어떤 관계를 갖는지 살펴 보는 것이 주요 목적입니다. 여러 변수를 동시에 보기 전에 개별 데이터를 먼저 파악해야 오류 발생을 낮출 수 있습니다.

▶ EDA의 종류

크게 두 가지로 분류할 수 있습니다.

1. Graphic(시각화)

그래프, 그림을 이용해 데이터를 확인하는 방법입니다.

2. Non-Graphic(비시각화)

그래픽적 요소를 사용하지 않고, 주로 summary-statistics를 통해 데이터를 확인하는 방법입니다.

=> 데이터를 graphic EDA를 통해 시각화하여 확인하면 한눈에 파악할 수 있습니다. 반면에 non-graphic한 방법을 선택한다면 정확한 값을 확인해볼 수 있습니다.

▶ EDA의 유형

위에서 설명한 대상과 종류에 따라 4가지로 나눌 수 있습니다.

1. Uni-Non Graphic(일변량 비시각화)

주어진 데이터의 분포를 확인하는 것이 주목적입니다. Numeric data 인지, Categorical data인지에 따라 확인할 수 있는 것들이 조금 다릅니다.

- Numeric data

Center(Mean, Median, Mod),

Spread(Variance, SD, IQR, Range)

Modality(Peak)

Shape(Tail, Skewness, Kurtosis)

Outliers

- Categorical data

Occurence

Frequency

Tabulation

2. Uni-Graphic(일변량 시각화)

주어진 데이터를 전체적으로 살펴보는 것이 주목적입니다. Histogram, Pie chart, Stem-leaf plot, Boxplot, QQplot(데이터의 실제 분포와 이론상 분포가 일치하는지 확인하는 방법) 등이 있습니다.

3. Multi-Non Graphic(다변량 비시각화)

주어진 둘 이상의 변수 사이의 관계를 확인하는 것이 주 목적입니다. Cross-Tabulation(Categorical data에 사용), Cross-Statistics(Numerical data에 사용, Correlation, Covariance) 등을 사용합니다.

4. Multi-Graphic(다변량 시각화)

주어진 둘 이사의 변수 사이의 관계를 전체적으로 살펴보는 것이 주목적입니다.

- Categorical data와 Numeric data 로 Multi-Graphic 으로 EDA를 한다면, Boxplots, Stacked bar, Parallel Coordinate, Heatmap등으로 나타낼 수 있습니다.

- Numeric data와 Numeric data 로 Multi-Graphic 으로 EDA를 한다면, Scatter Plot등으로 나타낼 수 있습니다.

▶ EDA를 잘 하려면?

- raw data의 description, dictionary를 통해 각 데이터의 행과 열의 의미를 이해해야 합니다.

- 결측치를 잘 처리할 수 있어야 하며, 추가적인 데이터 필터링 기술이 필요합니다.(범주형 데이터를 수치형 데이터로 변환)

- 쉽게 시각화 할 수 있는 기술이 있어야 합니다.

▶ EDA 직접 해보기

미국 성인 인구조사 데이터 셋을 이용한 소득 예측 데이터를 이용해 kaggle에서 직접 EDA를 해보았습니다. EDA후 모델 훈련, 예측까지 해보겠습니다. 코드는 이곳에서 확인할 수 있습니다.

- 필요 라이브러리 import 및 데이터 읽어오기

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

train = pd.read_csv('train.csv')

 

- 전체 데이터 살펴 보기

train.head()

- 전체 데이터의 통계치 살펴보기

train.describe()

- Null 데이터 확인하기

import missingno as msno
msno.matrix(train) ##null 데이터 확인

- 'age' 열 밀도 함수로 확인하기

sns.kdeplot(train['age'])

- 'workclass' 확인하기

fig, ax= plt.subplots(1,1,figsize=(12,5))
sns.countplot(data=train, x='workclass', ax=ax)
plt.show()

-'race'와 'sex' 사이의 관계 살펴보기

fig, ax= plt.subplots(1,1,figsize=(12,5))
sns.countplot(data=train, x='race', ax=ax, hue='sex')
plt.show()

- 모델에 적합한 input만들기

모델을 통해 예측해야하는 'income' 에 대한 feature는 따로 인코딩하여 저장하겠습니다. '>50K'와 '<=50K'를 각각 1과 0으로 바꿔주겠습니다.

train['income'] = (train['income'] != '<=50K').astype(int)

 

- 'race'와 'sex'에 따른 income의 평균 피벗 테이블로 나타내기

race로 먼저 묶고, sex로 묶은 다음 평균을 낸것입니다.

train.groupby(['race', 'sex'])[['income']].mean().style.background_gradient(cmap='Purples')

위와 동일한 내용을 pandas를 이용해 해보겠습니다.

pd.pivot_table(train, columns='sex', index='race', values='income',aggfunc='mean')

- 데이터의 분포 확인하기

fig, ax=plt.subplots(1,1, figsize=(10,6))
sns.boxplot(data=train, x='race', y='age', hue='sex')

sns.violinplot(data=train, x='race', y='age')

 

 

- numeric data에 대한 상관 계수( 두 변수 사이의 통계적 관계)를 표와 heatmap으로 확인해보기

train.corr() ## 상관계수(숫자형 데이터)
train.corr().style.background_gradient(cmap='coolwarm')

# 다양한 heapmap
sns.heatmap(corr)
sns.heatmap(corr, square=True, linecolor='white', linewidth='0.1', cmap='coolwarm',
           vmax=1.0, vmin=-1.0)

 

from category_encoders.ordinal import OrdinalEncoder
LE_encoder = OrdinalEncoder(list(train.columns))# 모든 컬럼에 대해 인코딩 진행
train_le = LE_encoder.fit_transform(train, target)
test_le = LE_encoder.transform(test)

 

- 모델 학습하기

Decision Tree를 이용해 학습 해보겠습니다.

from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier()
dt_clf.fit(train_le, target)

 

- 테스트 셋을 이용해 예측하기

dt_clf.predict(test_le)

 

 

참고 : https://velog.io/@yuns_u/EDA-Exploratory-Data-Analysis

728x90
반응형

댓글