본문 바로가기
데이터 분석/시각화

[Matplotlib Tip] 2. numpy.histogram을 이용하여 히스토그램 그리기

by 부자 꽁냥이 2021. 6. 12.

안녕하세요~ 꽁냥이에요. 히스토그램을 그릴 때 각 범주별로 또는 각 그룹별로 히스토그램을 한 곳에 겹쳐 그려 야한 경우가 있습니다. 아래처럼 말이죠

 

 

위 그림에서 알 수 있듯이 초록색과 주황색 히스토그램이 겹쳐져 알아보기 어렵습니다. 이때 히스토그램의 겹침 현상을 완화하여 분포를 한눈에 보기 쉽게 하는 방법이 있는데요. numpy.histogram 함수를 사용하면 해결할 수 있습니다. Matplotlib을 이용하여 히스토그램을 그리는 방법은 아래와 같이 포스팅해두었으니 참고하시면 됩니다.

 

[히스토그램(Histogram)] 1. Matplotlib을 이용하여 히스토그램 그리기.

[히스토그램(Histogram)] 2. Matplotlib을 이용하여 히스토그램 여러 개 그리기.


   numpy.histogram을 이용하여 히스토그램 그리기

먼저 이번 포스팅에서 필요한 모듈을 임포트하고 사용할 데이터를 만들어줍니다.

 

import matplotlib.pyplot as plt
import numpy as np

from random import choices
from scipy.stats import norm

 

data = dict()
keys = ['A','B','C']
sizes = [100, 200, 500]
for i, key in enumerate(keys):
    if key == 'A':
        data[key] = norm.rvs(50, 6, size=sizes[i])
    elif key == 'B':
        data[key] = norm.rvs(25,5, size=sizes[i])
    else:
        data[key] = norm.rvs(20, 4, size=sizes[i])

 

먼저 비교를 위해 일반적인 Matplotlib을 이용하여 히스토그램을 그려봅니다. 이에 대한 설명은 여기에 포스팅에서 해두었으니 따로 설명하지 않겠습니다.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

for k,v in data.items():
    plt.hist(v, 15, alpha=0.75, edgecolor='k', label=k)
    
plt.legend()
plt.show()

 

 

이제 numpy.histogram을 이용한 히스토그램을 그려봅시다. 아래 코드를 살펴볼게요.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

for k,v in data.items():
    bins = np.linspace(min(v), max(v), 15)
    hist, _ = np.histogram(v, bins)
    plt.plot(bins[:-1], hist, label=k)
    
plt.legend()
plt.show()

 

line 5

계급(도수를 계산할 구간)을 설정합니다.

 

line 6

numpy.histogram 함수는 첫번째 인자에 숫자형 데이터 배열, 두 번째 인자에 도수를 계산할 계급을 입력값으로 받게 되어 있습니다. 이 함수는 2개의 배열을 리턴하는데 하나는 도수 배열, 다른 하나는 계급입니다. 계급의 경우 함수의 두 번째 입력값과 동일합니다. 따라서 여기서는 언더바 '_'를 통하여 무시해줍니다.

 

line 7

기존에 Matplotlib에서 hist를 이용하여 히스토그램을 그렸던 것과 달리 여기에서는 plot을 이용합니다. 이때 x값은 계급이 되고 y값은 도수가 됩니다. 이때 계급은 도수보다 원소가 하나 많기 때문에 계급의 맨 마지막 값은 제외해줍니다.

 

이제 코드를 실행하여 결과를 확인해볼게요~ 

 

 

히스토그램이 라인으로 그려지는 것을 알 수 있습니다. 이는 히스토그램에서 막대의 중앙부분을 선으로 이어서 만든 것과 동일하다고 보면 됩니다. numpy.histogram을 사용하면 히스토그램이 선으로 그려지기 때문에 영역이 겹친다 해도 알아보기 쉽습니다. 또한 분포 형태 또한 유지하고 있어 각 범주별로 분포를 보는 데에 문제가 없게 되지요.

 

물론 Matplotlib을 이용해서 겹치는 영역 문제를 해결할 수 있습니다. 아래와 같이 histtype를 'step'으로 설정해주면 히스토그램 테두리만 그려지게 되고 numpy.histogram을 이용했을 때와 마찬가지로 영역 겹침 문제가 해결됩니다.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
i = 0
for k,v in data.items():
    plt.hist(v, 15, histtype='step', alpha=0.75,  label=k)
    i += 1
plt.legend()
plt.show()

 


이번 포스팅에서는 numpy.histogram을 이용하여 히스토그램을 그리는 방법을 알아보았습니다. 이때 numpy.histogram은 하나의 히스토그램을 그릴 때에는 굳이 사용하지 않아도 되고요. 히스토그램 여러개 그리는 경우에 발생할 수 있는 영역 겹침 문제를 해결하기 위해 numpy.histogram을 사용할 수 있습니다. numpy.histogram을 이용하는 방법은 꽁냥이의 회사 동료가 알려줘서 알게 되었습니다. 그 동료분께 감사의 인사를 전하며 이번 포스팅은 마치겠습니다. 부디 도움이 되셨으면 합니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 


댓글


맨 위로