4 분 소요

본 게시물은 데이터 시각화에 대한 내용을 소개한다.

1. Bar plot

범주형 데이터를 요약하고, 시각적으로 비교함

data_cnt = data['target'].value_counts()
plt.bar(x, height, width=0.8, bottom=None, align='center', data=None)
  • x: category와 그에 해당하는 데이터
  • align: x 좌표에 대한 막대 정렬

😗 데이터 불러오기

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['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

📍Bar plot 그리기

📌 barbarh의 차이에 대해 확인

plt.bar(wine_type.index, wine_type.values, width=0.5, bottom=None, align='center')

plt.barh(wine_type.index, wine_type.values, height=0.5, left=None, align='edge')

2. Histogram

연속형 자료에 대한 도수분포표를 시각화

plt.hist('column_name', bins=None, range=None, density=False, data=df)
  • bins: 히스토그램의 구간의 개수 정의
  • range: bin의 상한값과 하한값 형태로 선언, 예를들어 (x.min(), x.max()) 이렇게 설정 가능
  • density: True면 확률밀도함수를 그리고 반환

👀 확률밀도함수

연속 확률 변수의 분포를 나타며, 범위에 대한 확률을 나타내는 함수

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

3. Box plot

사분위수를 이용해 수치형 변수의 값의 분포를 확인

3.1 IQR

  • 제 3분위수와 제 1분위수의 차
  • 중앙 50%의 데이터들이 퍼진 정도 ☞ 데이터가 퍼진 정도를 표현하는 지표

3.2 수염

  • 1.5 * IQR 범위인 Q1 - 1.5 * IQR 부터 Q3 + 1.5 * IQR 까지의 범위를 수염으로 지정 (1.5가 아닌 다른 값으로도 사용 가능)
  • 수염을 벗어나는 값은 이상치로 판단

😗 데이터 불러오기

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

iris = load_iris()
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
iris['class'] = load_iris().target
iris['class'] = iris['class'].map({0:'Setosa', 1:'Versicolour', 2:'Virginica'})

📍Box plot 그리기

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

  • 각 box는 컬럼들의 데이터를 의미함

📍 개별 Box plot 그리기

plt.boxplot(iris['sepal width (cm)'], whis=1.5)
plt.title('sepal width (cm)')
plt.show()

  • whis는 수염을 그리기 위한, IQR에 곱해지는 값

📍 Category 컬럼에 대한 Box plot

iris[['sepal width (cm)', 'class']].boxplot(by='class')
plt.show()

  • by에는 category 컬럼이 들어감
  • category 컬럼에 따른 다른 컬럼의 값 차이

📍 Seaborn 사용

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

3.3 주의점

  • Box plot에 여러 컬럼을 포함하여 그릴 때, 범위를 확인해 주어야 함
  • 컬럼들의 scale이 다르면 눈에 잘 안들어올 수 있음

4. Scatter plot

두 변수에 대해 관계의 유형과 강도를 판단하는 그래프

4.1 관계의 유형

  • 점들이 흩어져 있는 모양을 보고 판단

4.2.관계의 강도

  • 데이터가 적합선에 얼마나 가깝게 모여 있는지 보고 판단

😗 데이터 불러오기

import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
iris = load_iris()
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
iris["class"] = load_iris().target
iris["class"] = iris["class"].map({0:'Setosa', 1:'Versicolour', 2:'Virginica'})

📍Scatter plot 그리기

plt.title('iris scatter') 
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)') 
plt.scatter (x = iris['sepal length (cm)'], y = iris['sepal width (cm)'], 
alpha = 0.5)
plt.show()

📍Seaborn 사용

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

5. Line plot

5.1 수평 & 수직 그래프

그래프에 한계점, 평균값 등을 표시하기 위해 사용

# 수평선은 hliens()
plt.hlines(y, xmin, xmax, colors=None, linestyles='solid')
# 수직선은 vlines()
plt.hlines(x, ymin, ymax, colors=None, linestyles='solid')

📍수평 & 수직 그래프 그리기

import matplotlib.pyplot as plt
plt.hlines(-6, -10, 10, color='grey')
plt.hlines(-2, -10, 10, color='green')
plt.hlines(2, -10, 10, color='orange')
plt.hlines(6, -10, 10, color='red')
plt.vlines(-6, -10, 10, linestyles='solid')
plt.vlines(-2, -10, 10, linestyles='dashed')
plt.vlines(2, -10, 10, linestyles='dashdot')
plt.vlines(6, -10, 10, linestyles='dotted')
plt.show()

5.2 회귀선 그래프

📍1차 회귀선 그래프 그리기

import numpy as np

X, Y = iris['sepal length (cm)'], iris['petal length (cm)']
b1, b0 = np.polyfit(X, Y, 1)
plt.scatter(x = X, y = Y, alpha = 0.5)
plt.plot(X, b1*X + b0, color='red')
plt.show()

📍2차 회귀선 그래프 그리기

# 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 = X, y = Y, alpha = 0.5)
plt.plot(X, b0 + b1*X + b2*X**2, color='red')
plt.show()

5.3 꺾은선 그래프

시간의 변화에 따라 값이 지속적으로 변화할 때 흐름을 파악

📍꺾은선 그래프 그리기

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

📍category별 꺾은선 그래프 그리기

plt.plot ('sepal length (cm)', 'petal length (cm)', data =iris2.loc[iris2['class'] == 'Setosa'])
plt.plot ('sepal length (cm)', 'petal length (cm)', data =iris2.loc[iris2['class'] == 'Versicolour'])
plt.plot ('sepal length (cm)', 'petal length (cm)', data =iris2.loc[iris2['class'] == 'Virginica'])
plt.legend(iris2['class'].unique())
plt.show()

6. 상관관계 시각화

6.1 산점도 행렬

두 개 이상의 변수가 있는 데이터에서 변수들 간의 산점도를 그림
변수들간의 관계를 수량화 하여 제공하지 않지만, 실제 데이터의 분포를 파악할 수 있으며 2차원 이상의 관계가 존재하는지 여부도 파악 가능

6.2 산점도 행렬 해석 방법

  • 대각선의 히스토그램을 통해 이상치를 확인함
  • 종속변수와 설명변수 간의 관계를 파악
  • 종속변수가 수치형일 경우 직선 상관관계를 비교
  • 종속변수가 범주형일 경우 잘 구분하는 변수를 파악
  • 설명변수간의 직선 함수관계를 파악하여 다중공선성 문제를 파악 ☞ 설명변수 끼리의 강한 상관관계가 있는지

👀 다중공선성

회귀분석에서 설명변수간의 강한 선형관계가 있을 때 발생하는 문제로 설명변수끼리 상호작용하거나 중복적으로 영향을 미치는 상황
결과해석 및 회귀계수 추정이 불안정해지는 문제를 야기함

😗 데이터 불러오기

import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
from sklearn.datasets import load_iris
iris = load_iris()
iris = pd.DataFrame(iris.data, columns=iris.feature_names)
iris['Class'] = load_iris().target
iris['Class'] = iris['Class'].map({0:'Setosa', 1:'Versicolour', 2:'Virginica'})

📍 산점도 행렬 그리기

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

📍 seaborn 사용

import seaborn as sns
# diag_kind -> (auto, hist, kde)
sns.pairplot(iris, diag_kind = 'auto', hue = 'Class')
plt.show()

👀 KDE 그래프

커널밀도추정은 히스토그램과 같은 Non-parametric 밀도 추정 방법중 하나이다.
bin의 크기와 시작 및 종료 위치에 따라 그래프가 달라지는 히스토그램의 문제점을 개선한 방법으로, 커널함수를 사용해 분포를 smooth하게 한다.

7. 상관계수 행렬 시각화

📍상관계수 그래프 그리기

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)
plt.show()

댓글남기기