251125_BootCamp Day 27_데이터 분석 기초 프로젝트 (4)

2025. 11. 25. 20:59TIL

Seaborn barplot 공부

데이터 분석 과정에는 다양한 plot을 그리게 되는데, 미감적으로 깔끔한 plot을 추구하다 보니 matplotlib보다는 seaborn을 더 많이 사용하게 되는 것 같다. seaborn이 matplotlib보다 미각적으로 훨씬 다양한 옵션을 제공하고 더 쓰기 편하다.

그런데 seaborn에 대해서는 많이 배운 적이 없다보니, 제대로 된 barplot 하나 그리는 게 어렵다. bar 색깔도 예쁘게 설정해보고 싶고, bar마다 값도 표기하고 싶고..여러가지 옵션을 넣은 그래프를 그리고 싶은데 그냥 막 하는 것보다는 공부를 좀 하고 그리는 게 낫다 싶어, barplot에 대해 공부를 하게 되었다.

 

Seaborn barplot의 특징

Seaborn barplot은 pivot table보다는 데이터프레임 그 자체를 쓰는 것이 더 편하다. estimator라는 parameter를 활용해 각 컬럼별 계산 (평균, 합계, 최대값, 최소값, 개수)을 자동으로 수행해 준다.

barplot에는 x, y, 그리고 hue를 설정할 수 있다. x는 가로축에 놓을 변수, y는 세로축에 놓을 변수, hue는 x, y축에 있는 2차원 데이터를 구분하는 기준이다. 즉 x를 이용해 그룹화된 데이터를 hue를 이용해 한 번 더 그룹화할 수 있고, 이 결과를 자동으로 estimator가 계산한다.

 

Seaborn barplot의 예시

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset("penguins")

sns.barplot(
    data=df,
    x='species', 
    y='flipper_length_mm',
    hue='sex',
    
    # 1. 통계 옵션 (평균 대신 합계, 오차막대는 표준편차)
    estimator='sum',      
    errorbar='sd',        
    
    # 2. 디자인 및 정렬 옵션
    palette='pastel',     # 색상 테마
    order=['Gentoo', 'Chinstrap', 'Adelie'], # X축 순서 내 마음대로
    hue_order=['Male', 'Female'] # 범례 순서 지정
)

plt.title("Sum of Flipper Length by Species")
plt.show()

seaborn의 example dataset인 penguins를 불러와 barplot을 만들어보았다.

data : plot을 그릴 dataframe을 지정한다.

x : x축으로 지정할 변수

y : y축으로 지정할 변수hue : x축과 y축 상에 놓은 값들을 어떻게 구분할 것인가?         seaborn의 핵심 기능으로, hue를 사용하지 않으면 seaborn을 쓰는 의미가 별로 없는 것 같다 (개인적인 생각).
         hue를 써야 미감적으로 더 예쁜 그래프를 그릴 수도 있고, seaborn의 다양한 기능을 제대로 활용할 수가 있다.
estimator : 계산법 (mean, sum, max, min, count 등)errorbar : 에러바를 사용할지 말지 설정할 수 있다. DataFrame 원본을 사용하지 않는 경우는 쓰기 어렵다.palette : seaborn의 꽃 중 하나인 색상 지정. 제공되는 palette 옵션 뿐만 아니라 커스터마이징도 가능하다.order : x축을 어떤 순서로 나타낼 것인지           리스트 설정에 따라 다양한 순서 지정이 가능하다.

# 컬럼의 고유값을 추출해 리스트로 저장하는 방법
species_list = df['species'].unique().tolist()
# 컬럼의 고유값을 추출해 정렬된 리스트로 저장하는 방법
sorted_list = sorted(df['species'].unique(), reverse=True)
# 데이터가 많은 순서대로 컬럼의 고유값을 추출하는 방법
freq_order = df['species'].value_counts().index.tolist()
# x축의 값을 기준으로 오름차순 정렬하는 방법
my_order = df.groupby('species')['bill_depth_mm'].mean().sort_values().index

hue_order : hue가 나타날 순서를 지정. ['Male', 'Female']에서 ['Female', 'Male']로 바꾸면 Female 값들이 먼저 나오게 된다.

위 코드를 실행하면 다음과 같은 그래프를 얻을 수 있다.

 

그래프에 bar의 값 표시하기

fig, axes=plt.subplots(1, 3, figsize=(18, 6))
cols = ['bill_depth_mm', 'bill_length_mm', 'flipper_length_mm']
titles = ['Bill Depth', 'Bill Length', 'Flipper Length']

for i, col in enumerate(cols):
    ax = axes[i]
    sns.barplot(ax=ax,
                data=df,
                x='species',
                y=col,
                hue='sex',
                errorbar=None,
                palette='Set2')
    ax.set_title(f"Mean {titles[i]}")
    for container in ax.containers:
        ax.bar_label(container, fmt='%.1f', padding=3, fontsize=10, label_type='center')

plt.tight_layout()
plt.savefig('penguin_stats.png', dpi=300, bbox_inches='tight', transparent=True)
plt.show()

barplot의 bar마다 해당하는 값을 표기하고 싶을 때는 반복문을 이용해야 한다.

seaborn은 직접적으로 bar에 값을 표기하는 parameter를 지정하지는 않지만, containers라는 메서드와 bar_label을 사용하면 원하는 결과를 얻을 수 있다. containers는 barplot의 각 bar를 의미한다.

반복문을 이용해 barplot에 있는 모든 container마다 bar_label 함수로 각 container별 값을 present하도록 설정할 수 있다.