logo

[데이터 시각화 소개] 히스토그램

 

데이터 분포의 중요성

데이터 분석에서 분포의 이해는 본질적으로 중요합니다. 분포를 통해 데이터셋의 전반적인 형태를 파악하고, 데이터 내 패턴, 추세, 이상점 같은 핵심적인 특성을 식별할 수 있습니다. 이러한 정보는 데이터 전처리, 모델 선택 및 훈련 과정에 필요한 가정을 설정하는 데 사용됩니다.

예를 들어, 많은 통계적 방법과 머신러닝 알고리즘은 데이터가 정규 분포를 따른다는 가정 하에 최적화되어 있습니다. 따라서 데이터의 분포를 파악하는 것은 적절한 데이터 변환 기법을 적용하거나, 적합한 모델을 선택하는 데 있어 필수적입니다.

 

분포를 통해 얻을 수 있는 인사이트

분포는 데이터의 범위, 중앙값, 분산, 치우침(skewness), 첨도(kurtosis) 같은 통계적 특성을 이해하는 데 도움을 줍니다. 이러한 정보는 다음과 같은 인사이트를 제공합니다.

  • 중앙값과 평균 비교: 데이터가 얼마나 치우쳐 있는지 알 수 있습니다.
  • 변동성: 데이터 포인트들이 얼마나 퍼져 있는지 이해할 수 있고, 이를 통해 데이터의 일관성을 평가할 수 있습니다.
  • 이상점의 식별: 데이터에서 일반적인 경향에서 벗어나는 값들을 식별할 수 있습니다.
  • 데이터의 경향성 이해: 데이터가 특정 경향을 보인다면, 예를 들어 시간에 따라 증가하거나 감소하는 경향을 보인다면, 이런 정보를 통해 미래를 예측할 수 있는 통찰력을 얻을 수 있습니다.
 

변수 유형: 연속형 vs 범주형

데이터 분포를 이야기할 때는 변수의 유형을 이해하는 것이 중요합니다. 변수는 크게 연속형과 범주형으로 나눌 수 있습니다.

  • 연속형 변수: 이는 어떤 구간 안의 모든 값을 취할 수 있는 수치형 데이터를 의미합니다. 예를 들어, 사람의 키나 무게, 온도 등이 여기에 해당합니다.
  • 범주형 변수: 이는 특정한 범주나 그룹에 속하는 데이터입니다. 예를 들어, 성별(남, 여), 혈액형(A, B, AB, O) 등이 있습니다.
 

사례: 분포 시각화하기

이제 Python의 seaborn 라이브러리를 사용하여 연속형 변수의 분포를 시각화하는 예시를 살펴보겠습니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터셋 불러오기
penguins = sns.load_dataset("penguins")

# 연속형 변수 'body_mass_g'의 분포 히스토그램
sns.histplot(data=penguins, x="body_mass_g", kde=True)  # KDE(커널 밀도 추정) 플롯 추가
plt.title('펭귄의 체중 분포')
plt.xlabel('체중(g)')
plt.ylabel('빈도')
plt.show()

이 코드는 seaborn에서 제공하는 펭귄 데이터셋을 사용하여 펭귄의 체중 분포를 히스토그램으로 시각화하는 예시입니다. kde=True 옵션은 커널 밀도 추정을 함께 표시하여, 분포의 형태를 더 부드럽게 이해할 수 있도록 합니다.

이런 분석과 시각화를 통해 데이터가 어떻게 분포하고 있는지에 대한 심층적인 이해를 가질 수 있으며, 이는 데이터 분석 및 모델링 과정에서 매우 중요한 단계입니다.


 

히스토그램이란?

히스토그램은 데이터의 분포를 나타내는 그래프 형태로, 데이터셋 내 변수의 빈도 분포를 세로 막대 형태로 시각화합니다. 각 막대(bins)는 데이터의 구간을 나타내며, 막대의 높이는 해당 구간에 속하는 데이터의 개수(빈도수)를 표현합니다. 히스토그램을 통해 데이터의 분포 형태, 중심 경향성, 변동성, 이상치 유무 등을 직관적으로 파악할 수 있습니다.

 

히스토그램 생성 과정

히스토그램을 생성하기 위한 기본 단계는 다음과 같습니다.

  1. 데이터의 최소값과 최대값을 결정합니다.
  2. 결정된 값 사이를 일정한 크기의 구간(bin)으로 나눕니다.
  3. 각 구간에 속하는 데이터 수(빈도수)를 계산합니다.
  4. 각 구간의 데이터 수에 따라 막대의 높이를 결정하여 그래프를 그립니다.
 

빈(bin)의 크기와 개수 설정하기

히스토그램의 정확성과 해석은 적절한 bin의 크기와 개수에 크게 의존합니다. 너무 많은 bins는 데이터를 과하게 세분화하여 패턴을 파악하기 어렵게 만들 수 있고, 너무 적은 bins는 데이터의 중요한 세부 사항을 숨길 수 있습니다. 적절한 bin의 크기와 개수를 설정하는 것은 데이터의 특성과 분석 목적에 따라 달라질 수 있으며, 실험적으로 최적의 값을 찾는 것이 일반적입니다.

 

히스토그램 해석하기

히스토그램을 해석할 때는 다음과 같은 요소에 주목합니다:

  • 분포 형태: 히스토그램의 형태는 정규 분포, 왜곡 분포(왼쪽 또는 오른쪽으로 기울어짐), 이중 분포 등 다양할 수 있습니다.
  • 중심 경향성: 분포의 가장 높은 부분은 데이터의 중심 경향성을 나타냅니다.
  • 변동성: 히스토그램의 너비는 데이터의 변동성을 나타냅니다. 넓은 히스토그램은 높은 변동성을, 좁은 히스토그램은 낮은 변동성을 시사합니다.
  • 이상치: 분포의 가장자리에 별도로 위치한 작은 막대는 이상치를 나타낼 수 있습니다.
 

Python에서 seaborn을 사용한 히스토그램 그리기 예제

Python의 seaborn 라이브러리는 데이터 시각화에 유용한 라이브러리 중 하나로, 히스토그램을 비롯한 다양한 그래프를 손쉽게 그릴 수 있게 해줍니다. 아래는 seaborn을 활용하여 히스토그램을 그리는 간단한 예시 코드입니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 데이터 불러오기(예시: seaborn 라이브러리의 내장 데이터셋 사용)
data = sns.load_dataset('iris')

# 'sepal_length' 컬럼에 대한 히스토그램 그리기
sns.histplot(data=data, x='sepal_length', bins=20, kde=True)

# KDE(Kernel Density Estimate) 함께 표시하기 위해 kde=True 로 설정
# KDE는 데이터 분포의 부드러운 추정 곡선을 함께 그려주어, 데이터의 분포 형태를 더욱 잘 파악할 수 있게 해줍니다.

plt.title('Sepal Length Histogram')
plt.xlabel('Sepal Length')
plt.ylabel('Frequency')
plt.show()

이 코드는 iris 데이터셋의 'sepal_length' 특성에 대한 히스토그램을 그리고, KDE 곡선을 함께 표시합니다. bins=20은 데이터를 20개의 구간으로 나누어 히스토그램을 그리겠다는 의미입니다.


 

커널 밀도 추정(KDE)

커널 밀도 추정(Kernel Density Estimation, KDE)은 데이터의 분포를 매끄러운 형태로 추정하는 데 사용되는 비모수적 방법입니다. 이는 연속적인 확률 밀도 함수(PDF)를 추정하기 위해 사용됩니다. KDE는 데이터 포인트 각각에 대해 커널이라고 불리는 무게 함수를 적용하고, 이들을 모두 합쳐 전체 데이터 세트에 대한 확률 밀도 함수를 추정합니다.

 

KDE의 기본 원리

KDE에서 중요한 개념은 커널입니다. 커널은 각 데이터 포인트 주위에 놓이는 무게 함수로서, 이 함수들의 합으로 전체 데이터 세트의 확률 밀도를 추정합니다. 가장 널리 사용되는 커널 함수는 가우시안(정규 분포) 커널입니다.

KDE의 수학적 정의는 다음과 같습니다:

f^(x)=1Ni=1N1hK(xxih) \hat{f}(x) = \frac{1}{N}\sum_{i=1}^{N}\frac{1}{h}K\left(\frac{x-x_i}{h}\right)

여기서 f^(x) \hat{f}(x) x x 에서의 추정된 확률 밀도, xi x_i i i 번째 데이터 포인트, h h 는 밴드폭, K K 는 커널 함수, 그리고 N N 은 데이터 포인트의 수를 나타냅니다.

 

KDE의 시각화

Seaborn 라이브러리는 KDE를 시각화하는 데 있어 강력한 도구를 제공합니다. 아래 예제는 Seaborn을 활용한 KDE 시각화 방법을 보여줍니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 임의의 데이터 생성
data = sns.load_dataset('iris')['petal_length']

# KDE 플롯 생성
sns.kdeplot(data, bw_adjust=0.5) # bw_adjust를 조정하여 밴드폭 변경 가능
plt.show()
 

히스토그램 vs KDE

히스토그램은 데이터를 구간별로 나누어 각 구간에 속하는 데이터 포인트의 수를 막대로 표시하는 방법입니다. 반면, KDE는 모든 데이터 포인트에 커널 함수를 적용하여 연속적이고 매끄러운 확률 밀도 함수를 추정합니다. 히스토그램은 데이터의 이산적인 분포를 보여주는 반면, KDE는 연속적인 분포를 추정합니다.

 

KDE의 매개변수 조정(밴드폭)

KDE에서 가장 중요한 매개변수는 밴드폭 h h 입니다. 밴드폭은 커널 함수의 폭을 결정하며, 이는 곧 추정된 확률 밀도 함수의 매끄러움을 결정합니다. 밴드폭이 너무 작으면 과적합(오버피팅)하여 너무 많은 노이즈를 포착할 수 있으며, 밴드폭이 너무 크면 과소적합(언더피팅)하여 데이터의 중요한 특성을 놓칠 수 있습니다.

Seaborn의 kdeplot 함수에서는 bw_adjust 매개변수를 통해 밴드폭을 조정할 수 있습니다. bw_adjust가 1보다 클 경우 밴드폭이 증가하며, 1보다 작을 경우 밴드폭이 감소합니다. 적절한 밴드폭을 선택하는 것은 데이터의 특성과 분석 목적에 따라 달라질 수 있습니다.

Previous
상자-수염 그림