logo

[데이터 시각화 소개] 상자-수염 그림

 

상자-수염 그림(Box-and-Whisker Plot)

 

상자-수염 그림이란?

상자-수염 그림(Box-and-Whisker Plot)은 1977년에 존 튜키(John Tukey)에 의해 소개된 데이터 시각화 방법으로, 수치 데이터를 요약하여 표현하는 그래프입니다. 이는 한 눈에 중앙값, 사분위수, 이상치 등 데이터의 중심 경향성과 분포를 파악할 수 있게 해줍니다.

상자-수염 그림은 이름에서도 알 수 있듯이 '상자(Box)'와 '수염(Whisker)'의 두 부분으로 구성됩니다. 상자는 하단 사분위수(Q1, 25%)부터 상단 사분위수(Q3, 75%)까지의 범위를 나타내며, 상자 내부에 그려진 선은 중앙값(Median)을 나타냅니다. 수염은 상자의 외부로 연장되는 선으로, 일반적으로 데이터의 최소값과 최대값 또는 상하단 사분위수에서 1.5 IQR(Interquartile Range, Q3-Q1) 범위를 초과하지 않는 데이터까지 표현됩니다. 이를 통해 데이터의 분산, 이상치의 존재 등을 간단히 파악할 수 있습니다.

 

상자-수염 그림의 용도와 장점

상자-수염 그림은 다음과 같은 용도와 장점을 가지고 있습니다:

  1. 데이터의 분포 확인: 데이터의 중심 경향, 분산, 이상치 등을 간편하게 파악할 수 있습니다.
  2. 이상치 탐지: 데이터에서 일반적인 범위를 벗어난 극단적인 값들을 식별할 수 있습니다.
  3. 여러 그룹의 데이터 비교: 여러 그룹의 데이터 분포를 직관적으로 비교하고 분석할 수 있어, 실험 결과 분석이나 여러 카테고리 간의 비교 시 유용합니다.
  4. 간결함: 많은 양의 정보를 담고 있으면서도 비교적 단순한 구조로 되어 있어 이해하기 쉽습니다.
 

예제 코드 (Python & seaborn)

다음은 Python의 seaborn 라이브러리를 사용하여 기본적인 상자-수염 그림을 그리는 예제 코드입니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 샘플 데이터셋 로드
tips = sns.load_dataset("tips")

# 'day' 별로 'total_bill'의 분포를 상자-수염 그림으로 시각화
sns.boxplot(x="day", y="total_bill", data=tips)

# 그래프 제목 설정
plt.title("Box-and-Whisker Plot of Total Bill by Day")

# 그래프 표시
plt.show()

이 코드는 seaborn 내장 데이터셋인 tips를 사용하여, 요일(day) 별 총 청구 금액(total_bill)의 분포를 상자-수염 그림으로 시각화합니다. 이러한 방식으로 복잡한 데이터셋의 특성을 직관적으로 파악하고, 여러 그룹 간의 비교를 용이하게 할 수 있습니다.


상자-수염 그림은 통계 데이터를 시각적으로 표현하는 매우 유용한 방법입니다. 이 그림은 데이터의 중앙값, 분포, 분산 정도 및 이상치를 한눈에 볼 수 있게 해줍니다. 여기에는 여러 통계량이 포함되며, 각각의 의미와 계산 방법에 대해 알아보겠습니다. 또한 Python에서 seaborn 라이브러리를 이용하여 이를 어떻게 시각화하는지에 대한 예를 제공하겠습니다.

 

최소값과 최대값

상자-수염 그림에서 최소값(minimum)과 최대값(maximum)은 데이터의 범위를 나타냅니다. 이 값들은 일반적으로 "수염"의 끝에 위치하며, 데이터의 전체 범위를 나타냅니다.

 

사분위수

사분위수(quartiles)는 데이터를 네 등분한 값입니다. 상자-수염 그림에서는 다음과 같이 표현됩니다.

  • Q1 (제1사분위수): 중앙값의 하위 50% 데이터의 중앙값.
  • Q2 (제2사분위수 또는 중앙값): 전체 데이터의 중앙값.
  • Q3 (제3사분위수): 중앙값의 상위 50% 데이터의 중앙값.

이 세 개의 선은 상자의 하단, 중앙, 상단에 해당하며, 데이터 분포의 중간을 나타냅니다.

 

IQR (Interquartile Range)

IQR은 제3사분위수에서 제1사분위수를 뺀 값으로, 상자의 길이와 같습니다. 이 값은 데이터의 중앙 50% 범위를 나타내며, 분산의 정도를 보여 줍니다.

 

이상치 (Outliers)

이상치는 나머지 데이터와 현저하게 동떨어진 데이터 포인트입니다. 상자-수염 그림에서 이상치는 보통 점으로 표시되며, 다음 공식을 사용하여 계산됩니다.

  • 아래 이상치: Q1 - 1.5 * IQR 이하
  • 위 이상치: Q3 + 1.5 * IQR 이상

이상치는 데이터의 특이한 변동을 나타내며 분석에서 제외되기도 합니다.

 

예시 코드: seaborn을 사용한 상자-수염 그림 그리기

Python의 seaborn 라이브러리를 사용하여, 위에서 설명한 통계량을 포함하는 상자-수염 그림을 그립니다. 다음은 예시 코드입니다.

import seaborn as sns
import matplotlib.pyplot as plt

# 예시 데이터셋 로드
tips = sns.load_dataset('tips')

# 상자-수염 그림 생성
sns.boxplot(x='day', y='total_bill', data=tips)

plt.title('Total Bill Boxplot by Day')
plt.xlabel('Day')
plt.ylabel('Total Bill')
plt.show()

이 코드는 seaborn의 내장된 데이터셋 중 하나인 'tips'를 사용하여, 요일별 총 청구 금액의 분포를 상자-수염 그림으로 시각화합니다. 이 그림에서는 각 요일의 최소값, 최대값, 사분위수, IQR, 이상치를 볼 수 있습니다.


 

상자-수염 그림 해석하기

상자-수염 그림(box plot 또는 box-and-whisker plot)은 데이터의 분포를 시각적으로 요약하는 효과적인 방법입니다. 주로 최댓값, 최솟값, 중앙값, 사분위수 등의 기본적인 통계량을 표현합니다. 이를 통해 데이터의 분포, 이상치, 그룹 간 비교 등을 직관적으로 이해할 수 있습니다.

 

데이터 분포 이해하기

상자-수염 그림을 통해 우리는 데이터 분포의 중심, 변동성, 비대칭도(왜도)를 이해할 수 있습니다. 상자의 길이(지름)는 데이터의 산포도를 보여주며, 상자 내에 있는 선(중앙값)의 위치는 데이터가 얼마나 비대칭인지 알려줍니다. 또한, 수염의 길이는 최대값과 최솟값의 범위를 나타내며, 이를 통해 데이터의 일반적인 분포를 파악할 수 있습니다.

 

이상치 식별하기

상자-수염 그림은 이상치를 식별하기에 탁월한 도구입니다. 일반적으로 1사분위수와 3사분위수 사이 거리의 1.5배 범위를 넘어가는 데이터 포인트들은 이상치로 간주됩니다. 이상치는 그래프 상에서 개별적인 점으로 표시되어, 데이터가 정규 분포를 따르지 않거나, 또는 오류, 특이한 사건 등으로 인해 발생한 특별한 값을 식별할 수 있게 합니다.

 

그룹 간 비교하기

다양한 그룹 또는 조건별로 상자-수염 그림을 나란히 표시함으로써, 그룹 간 분포 차이를 비교할 수 있습니다. 이는 중앙값, 분포 범위, 이상치 등을 한눈에 비교하게 해주어, 데이터를 그룹별로 체계적으로 분석하는 데 매우 유용합니다.

 

상자-수염 그림의 변형과 확장

노티플롯 (Notched Box Plot)

노티플롯은 중앙값 주변에 노치(홈)를 표시하여 중앙값의 신뢰 구간을 나타냅니다. 이는 두 그룹의 중앙값 차이가 통계적으로 유의한지 여부를 간략하게 보여줄 때 유용합니다.

바이올린 플롯 (Violin Plot)

바이올린 플롯은 상자-수염 그림에 커널 밀도 추정(KDE)을 더한 것으로, 데이터 분포의 모양을 더욱 세밀하게 파악할 수 있습니다. 바이올린 플롯으로, 우리는 데이터의 밀도를 시각적으로 평가할 수 있습니다.

그룹별 박스플롯

다른 변수에 따른 데이터 그룹을 나타내기 위해 그룹별 박스플롯을 사용할 수 있습니다. 이는 각 그룹의 데이터 분포를 직관적으로 비교할 수 있는 방법을 제공합니다.

조건부 박스플롯

조건에 따른 데이터의 분포를 보여주기 위해 seaborn 같은 라이브러리는 조건부 박스플롯을 제공합니다. 이를 사용하여, 데이터의 하위 집단 간 비교를 더욱 용이하게 할 수 있습니다.

 

예시 코드: Seaborn을 이용한 상자-수염 그림 그리기

Seaborn 라이브러리를 활용하여, 간단한 상자-수염 그림을 그릴 수 있습니다. 아래 코드는 seaborn을 이용하여 데이터셋의 분포를 시각화하는 예제입니다.

# 필요한 라이브러리를 불러옵니다.
import seaborn as sns
import matplotlib.pyplot as plt

# Seaborn 내장 데이터셋을 불러옵니다.
tips = sns.load_dataset("tips")

# 상자-수염 그림을 그립니다.
sns.boxplot(x="day", y="total_bill", data=tips)

# 그래프를 화면에 표시합니다.
plt.title("Box plot of total bill by day")
plt.show()

이 코드는 'tips' 데이터셋에서, 요일별(total_bill) 지불 금액의 분포를 상자-수염 그림으로 나타냅니다. 이를 통해 각 요일 간 지불 금액의 중앙값, 분포, 이상치 등을 한눈에 비교할 수 있습니다.

Previous
Python 및 Matplotlib 기초