(파이썬-Matplotlib) 시각화 튜토리얼 - 히스토그램

Page content

강의 홍보

히스토그램

히스토그램 그래프는 연속형 변수의 분포를 그리는 데 사용된다. 연속형 변수 값은 필요한 빈(=bin) 수로 분활되어 x축에 표시되며, 각 빈에 포함되는 값의 카운트는 y축에 표시된다. y축에는 카운트 대신 총량의 백분율을 표시할 수 있으며, 이 경우 확률 분포를 나타내며, 이러한 그래프는 통계 분석에 사용된다.

(1) 라이브러리 불러오기

필요한 모듈을 불러온다.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  import pandas.util.testing as tm

(2) 데이터 생성

이번에는 seaborn 패키지 내 tips 데이터를 활용한다.

titanic = sns.load_dataset('titanic')

위 데이터에서 age을 추출하여 객체로 저장한다.

age = titanic['age']

(3) 그래프 구현

연령대를 히스토그램으로 기본 그래프를 시각화 한다.

nbins = 21
plt.hist(age, bins = nbins)
plt.show()
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:839: RuntimeWarning: invalid value encountered in greater_equal
  keep = (tmp_a >= first_edge)
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:840: RuntimeWarning: invalid value encountered in less_equal
  keep &= (tmp_a <= last_edge)

png

연령대를 히스토그램으로 기본 그래프를 시각화 한다. 축의 라벨과 제목을 추가한다.

nbins = 21
plt.hist(age, bins = nbins)
plt.xlabel("Age")
plt.ylabel("Frequency")
plt.title("Distribution of Aae in Titanic")
plt.show()
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:839: RuntimeWarning: invalid value encountered in greater_equal
  keep = (tmp_a >= first_edge)
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:840: RuntimeWarning: invalid value encountered in less_equal
  keep &= (tmp_a <= last_edge)

png

이번에는 평균을 추가하는 그래프를 작성한다.

nbins = 21
plt.hist(age, bins = nbins)
plt.xlabel("Age")
plt.ylabel("Frequency")
plt.title("Distribution of Aae in Titanic")
plt.axvline(x = age.mean(), linewidth = 2, color = 'r')
plt.show()
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:839: RuntimeWarning: invalid value encountered in greater_equal
  keep = (tmp_a >= first_edge)
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:840: RuntimeWarning: invalid value encountered in less_equal
  keep &= (tmp_a <= last_edge)

png

(4) 히스토그램과 최적의 정규분포

  • y축에서는 빈도를 표시하는 대신 밀도=1을 plt.hist()로 지정하여 각각의 빈(=bins)로 지정하여 각각의 빈에 age목록의 모든 항목 합계의 백분율을 표시할 수 있다. 또한 이 데이터의 평균 및 표준 편차를 사용하여 근사 정규 분포를 그래프로 표시하여 이 분포가 정규 분포를 얼마나 잘 다르는지 확인할 수 있다.
mu = age.mean()
sigma = age.std()

nbins = 21
n, bins, patches = plt.hist(age, bins = nbins, density = 1)
plt.xlabel("Age")
plt.ylabel("Frequency")
plt.title("Distribution of Aae in Titanic")
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-0.5 * (1 / sigma * (bins - mu))**2))
plt.plot(bins, y, '--')
plt.show()
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:839: RuntimeWarning: invalid value encountered in greater_equal
  keep = (tmp_a >= first_edge)
/usr/local/lib/python3.6/dist-packages/numpy/lib/histograms.py:840: RuntimeWarning: invalid value encountered in less_equal
  keep &= (tmp_a <= last_edge)

png

  • 30세 이전의 히스토그램은 최적의 선과 일치하지 않는 것을 확인할 수 있지만, 30세 이후에는 제법 잘 맞는 것처럼 확인되고 있는 확인할 수 있다.