EDA와 시각화

데이터 분석
공개

2024년 12월 30일

EDA(Exploratory Data Analysis)

: 데이터의 특징과 데이터에 내재된 관계를 알아내기 위해 그래프와 통계적 분석 방법을 활용하여 탐구하는 것

주제

  1. 저항성 강조: 부분적 변동(이상치 등)에 대한 민감성 확인
  2. 잔차 계산
  3. 자료변수의 재표현: 변수를 적당한 척도로 바꾸는 것
  4. 그래프를 통한 현시성

막대 그래프

범주형 데이터를 요약하고 시각적으로 비교하는 데 활용

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

wine_load = load_wine()
wine = pd.DataFrame(wine_load.data, columns=wine_load.feature_names)
wine_load
wine['Class'] = wine_load.target
wine['Class'] = wine['Class'].map({0: 'class_0', 1: 'class_1', 2: 'class_2'})

wine_type = wine['Class'].value_counts()
wine_type
Class
class_1    71
class_0    59
class_2    48
Name: count, dtype: int64
# 수직 막대
plt.bar(wine_type.index, wine_type.values, width=0.8, bottom=None, align = 'center')
plt.show()

# 수평 막대
plt.barh(wine_type.index, wine_type.values, height=0.8, left=None, align = 'center')
plt.show()

각 범주의 값의 갯수 차이가 극단적인지 확인한다. 극단적일 경우, 전처리 과정에서 업/다운 샘플링 등을 통해 갯수가 유사해지도록 조정해야한다.

히스토그램

연속형 데이터의 분포를 확인하는 데 활용

plt.title('Wine alcohol histogram')
plt.hist('alcohol', bins=8, range=(11, 15), color='purple', data=wine)
plt.show()

box plot

수치형 변수의 분포를 확인하는 그래프

from sklearn.datasets import load_iris

iris_load = load_iris()
iris = pd.DataFrame(iris_load.data, columns=iris_load.feature_names)
iris['class'] = iris_load.target
iris['class'] = iris['class'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})

plt.boxplot(iris.drop(columns='class'))
plt.show()

import seaborn as sns

sns.boxplot(x="class", y="sepal width (cm)", data=iris)
plt.show()

산점도

두 개의 수치형 변수분포와 관계를 확인하는 그래프

plt.title('iris scatter')
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')

plt.scatter('sepal length (cm)', 'sepal width (cm)', data=iris, alpha=0.5)
plt.show()

sns.scatterplot(x='sepal length (cm)', y='sepal width (cm)', hue='class', data=iris, style='class')
plt.show()

선그래프

수평 / 수직 선

plt.hlines(y=-6, xmin=-10, xmax=10, colors='red', linestyles='solid')
plt.vlines(x=0, ymin=-10, ymax=10, colors='blue', linestyles='dashed')

함수식

def linear_func(x):
    return 2*x + 1

X = iris['sepal length (cm)']
plt.plot(X, linear_func(X), c='red')
plt.show()

회귀선

import numpy as np

X, Y = iris['sepal length (cm)'], iris['sepal width (cm)']
plt.scatter(X, Y, alpha=0.5)
a, b = np.polyfit(X, Y, 1)
plt.plot(X, a*X + b, c='red')
plt.show()

2차 이상의 그래프는 X값에 대하여 정렬해야 한다.

iris2 = iris.sort_values(by='sepal length (cm)')
X, Y = iris2['sepal length (cm)'], iris2['petal length (cm)']
b2, b1, b0 = np.polyfit(X, Y, 2)
plt.scatter(X, Y, alpha=0.5)
plt.plot(X, b0 + b1*X + b2*X**2, color='red')
plt.show()

꺾은선

plt.plot('sepal length (cm)', 'petal length (cm)', data=iris2)
plt.show()

상관관계 시각화

산점도 행렬

from pandas.plotting import scatter_matrix

scatter_matrix(iris, alpha=0.5, figsize= (8, 8), diagonal='hist')
plt.show()

sns.pairplot(iris, diag_kind='auto', hue='class')
plt.show()

상관계수 행렬 그래프

iris_corr = iris.drop(columns='class').corr(method='pearson')
sns.heatmap(iris_corr, xticklabels=iris_corr.columns, yticklabels=iris_corr.columns, cmap="RdBu_r", annot=True)

Pandas Profiling

# from pandas_profiling import ProfileReport
#
# ProfileReport(iris)
맨 위로