데이터 분포를 요약하는 박스 플롯(Box Plot) 위에 실제 개별 데이터 포인트를 표시하면, 통계적 요약과 실제 관측값을 동시에 확인할 수 있어 훨씬 직관적인 시각화가 가능합니다. 이 글에서는 Seaborn의 boxplot()과 swarmplot()을 함께 사용하는 방법을 소개합니다.
박스 플롯과 스웜 플롯이란?
Seaborn의 박스 플롯은 카테고리별로 데이터의 분포(중앙값, 사분위수, 이상치 등)를 보여주는 상자 그림을 그리는 기능으로, seaborn.boxplot() 함수를 사용합니다.
스웜 플롯(Swarm Plot)은 데이터 포인트들이 서로 겹치지 않도록 배치된 범주형 산점도입니다. 각 관측값이 하나의 점으로 표현되므로 데이터의 실제 분포와 밀도를 파악하기 좋으며, seaborn.swarmplot() 함수를 사용합니다.
준비: 필요한 라이브러리 임포트
먼저 필요한 라이브러리를 임포트합니다.
import seaborn as sb import pandas as pd import matplotlib.pyplot as plt
CSV 파일에서 데이터 불러오기
이번 예제에서는 크리켓 선수 정보가 담긴 CSV 파일(Cricketers.csv)을 사용합니다. Pandas의 read_csv()로 파일을 읽어 DataFrame으로 만듭니다.
dataFrame = pd.read_csv("C:\\Users\\amit_\\Desktop\\Cricketers.csv")박스 플롯 위에 스웜 플롯 그리기
핵심은 두 함수에 동일한 x축과 y축 컬럼을 지정하는 것입니다. 먼저 boxplot()으로 박스 플롯을 그린 뒤, 같은 축 위에 swarmplot()을 겹쳐 그리면 됩니다. 이때 color 매개변수에 어두운 색상(예: ".25")을 지정하면 박스 위에서도 포인트가 잘 보입니다.
sb.boxplot(x='Role', y='Age', data=dataFrame) sb.swarmplot(x="Role", y="Age", data=dataFrame, color=".25")
전체 예제 코드
다음은 처음부터 끝까지 실행 가능한 전체 코드입니다.
import seaborn as sb
import pandas as pd
import matplotlib.pyplot as plt
# CSV 파일에서 Pandas DataFrame으로 데이터 로드
dataFrame = pd.read_csv("C:\\Users\\amit_\\Desktop\\Cricketers.csv")
# 박스 플롯 그리기
sb.boxplot(x='Role', y='Age', data=dataFrame)
# 박스 플롯 위에 스웜 플롯 겹쳐 그리기
sb.swarmplot(x="Role", y="Age", data=dataFrame, color=".25")
# 화면에 표시
plt.show()실행 결과
위 코드를 실행하면 역할(Role)별 나이(Age) 분포를 나타내는 박스 플롯 위에, 개별 선수들의 나이 데이터 포인트가 겹치지 않게 표시된 결과를 확인할 수 있습니다.
참고 팁
카테고리가 많거나 데이터 포인트가 많아 점이 좁게 몰릴 경우, dodge=True 옵션을 활용하거나 그림 크기를 조절하면 가독성을 높일 수 있습니다. 또한 대량의 데이터에서는 스웜 플롯 대신 stripplot()을 사용하는 것이 렌더링 속도 면에서 유리할 수 있습니다.