ViolinPlot(Matplotlib Document) 은 데이터의 분포를 시각화하는 그래프로, 박스플롯(Box Plot)과 커널 밀도 추정(KDE, Kernel Density Estimation)을 결합한 형태입니다.
데이터가 많은 부분은 그래프가 넓게, 데이터가 적은 부분은 좁게 표현되어 데이터의 분포와 패턴을 직관적으로 이해할 수 있습니다. 박스플롯(Box Plot)과 유사하지만, 데이터의 밀도 분포를 대칭적으로 표현하는 것이 특징입니다.
가우시안 커널 밀도 추정(KDE)을 사용하여 데이터의 확률 밀도 함수(PDF, Probability Density Function)를 시각화합니다.
장점
- 데이터 분포를 직관적으로 확인 가능
- 박스플롯보다 데이터의 전체적인 형태와 밀도 분포를 더 잘 보여줌.
- 예를 들어, 데이터가 한쪽으로 치우쳐 있는지(비대칭성), 여러 개의 봉우리가 있는지(다중모드 분포) 등을 쉽게 확인할 수 있음.
- 극단값(Outlier) 제거 없이 자연스럽게 표현
- 박스플롯과 달리, 이상치(Outlier)를 따로 표기하지 않고 밀도로 표현하기 때문에 노이즈 제거 없이 데이터 패턴을 자연스럽게 확인할 수 있음.
- 박스플롯보다 더 많은 정보 제공
- 박스플롯은 최소값, 1사분위수, 중앙값, 3사분위수, 최대값만 보여주지만, 바이올린 플롯은 밀도 분포 전체를 시각적으로 표현.
단점
- 데이터 개별 값을 직접 확인하기 어려움
- 데이터의 분포를 보기에는 좋지만, 개별 데이터 포인트를 직접 확인하기는 어려움.
- 이를 보완하려면 스웜플롯(Swarm Plot)과 함께 사용하는 것이 좋음.
- 커널 밀도 추정(KDE) 방식이 부정확할 수도 있음
- 커널 밀도 추정이 데이터를 매끄럽게 보이도록 하는데, 샘플 크기가 적으면 부정확한 형태가 나올 가능성이 있음.
- 비교적 복잡한 해석이 필요함
- 박스플롯은 단순한 통계값(중앙값, 사분위수 등)만 보기 때문에 해석이 쉬운 반면, 바이올린 플롯은 분포의 형태를 해석하는 능력이 필요함.
Violinplot Code
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(10)
data = [np.random.normal(0, std, 100) for std in range(1, 5)]
plt.figure(figsize=(10, 6))
plt.violinplot(data, showmeans=True, showmedians=True)
"""
showmeans : mean
showmedians : median
"""
plt.xlabel('Group')
plt.ylabel('Value')
plt.title('Violin Plot Example')
plt.grid(True) # Add grid for better visualization
plt.show()
주로 사용되는 곳
- 데이터 분포 비교
- 여러 그룹의 데이터가 있을 때 분포 형태를 비교하는 데 사용됨.
- 예: 서로 다른 실험군 간 데이터 비교, 지역별 온도 분포 비교, 제품별 고객 만족도 비교 등.
- 박스플롯보다 정교한 데이터 분석이 필요한 경우
- 박스플롯이 단순한 요약을 제공하는 반면, 보다 세밀한 분포를 보고 싶은 경우 Violin Plot이 더 적합.
- 예: 생물학적 실험 결과 분석, 주식 시장 변동성 비교 등.
- 다중모드(Multimodal) 분포 확인
- 데이터가 한 개의 중심이 아닌 여러 개의 중심(봉우리)을 가지는 경우 박스플롯으로는 확인하기 어려움.
- Violin Plot은 다중모드 분포를 명확하게 시각화할 수 있음.
데이터 분포 비교, 다중모드 분포 확인, 박스플롯보다 정밀한 분석이 필요한 경우 주로 사용하나 적은 샘플에서는 부정확한 밀도 분포가 나올 수 있고, 개별 데이터 확인이 힘드니 주의가 필요합니다.