[matplotlib] 히스토그램

  • 시각화

파이썬 시각화 라이브러리 matplotlib으로 히스토그램 그리는 방법을 정리했다.

히스토그램 그리기

수치로 된 값이 많을 때 평균, 표준편차 같은 통계치를 확인하는 것보다는 히스토그램을 그려서 그 분포를 직관적으로 보는 게 좋을 때가 있다. 히스토그램은 특정 범위(계급 구간) 안에 있는 값의 개수를 나타낸다.

히스토그램은 plt.hist()으로 그릴 수 있다. 이때 값의 범위는 기본적으로 최대값/최소값을 기준으로 총 10개 계급 구간을 동일하게 나누도록 정해진다. 

만약 최소값/최대값을 바꾸거나 계급 구간의 개수를 늘리고 싶다면 rangebins를 통해 직접 설정할 수 있다.

예를 들어 위 예제에서 66 이상 69 미만의 값만 총 40개 구간으로 나눠서 보고 싶다면 이렇게 하면 된다.

plt.hist(dataset, range=(66,69), bins=40)

히스토그램 겹쳐 그리기

히스토그램을 여러개 그리고 싶을 때도 있다. 예를 들면 이렇게.

그런데 이걸 겹쳐 그리면 하나의 항목이 다른 항목을 덮어버리게 된다.

그래서 투명도를 설정하거나 테두리만 그리는 등 히스토그램 유형(스타일)을 통해 해결해야 한다.


1) 투명도

alpha값을 0에서 1사이로 넣어주면 된다.

plt.hist(a, range=(55, 75), bins=20, alpha=0.5)
plt.hist(b, range=(55, 75), bins=20, alpha=0.5)

2) 유형/스타일

histtype을 통해 히스토그램의 서식이나 스타일을 결정할 수 있다. 'bar', 'barstacked', 'step', 'stepfilled' 중 하나를 넣으면 된다. 아무것도 적지 않았을 때 기본값은 당연히 bar다.

step은 히스토그램에 테두리를 그리는 방식을 의미한다. 그려보면 이렇다.

plt.hist(a, range=(55, 75), bins=20, histtype='step')
plt.hist(b, range=(55, 75), bins=20, histtype='step')

테두리를 더 두껍게 하고 싶다면 plt.hist() 괄호 안에서 linewidth=2와 같은 식으로 선 두께를 지정하면 된다.


3) 정규화

(일반적인 상황은 아니지만) 히스토그램은 데이터의 분포를 보기 위함인데, 여러 데이터 세트의 분포를 동시에 확인하기 위해 히스토그램을 겹쳐 그리면 애초에 샘플 데이터의 양이 달라서 터무니 없이 보일 수도 있다. 예를 들면 이렇게.

이럴 땐 normed=True를 넣어주어 정규화를 하면 해결이 가능하다. 여기서 말하는 정규화전체 데이터 개수 중에 해당 구간의 값 개수가 차지하는 비율로 변환하는 것을 말한다.

plt.hist(a, range=(55, 75), bins=20, alpha=0.5, normed=True)
plt.hist(b, range=(55, 75), bins=20, alpha=0.5, normed=True)

추천 글

댓글 남기기