이 글에서는 Python의 Seaborn 라이브러리를 사용하여 다양한 막대 그래프를 그리는 방법을 설명하겠습니다. 기본 막대 그래프부터 수평 막대, 그룹별, 에러바, 누적 및 100% 누적 바 그래프까지 다룹니다. 각 예시에는 코드가 포함되어 있고, 깃허브에 full 코드를 업로드해두었습니다.
저번 시간에는 Matplotlib 라이브러리를 활용해서 아래 목차에 해당하는 그래프를 그리는 방법에 대해서 다루었습니다. Seaborn 같은 경우엔 대부분 Matplotlib보다 훨씬 간단하게 그래프를 표현할 수 있기 때문에 Seaborn 라이브러리도 충분히 익혀두는 것을 추천드립니다.
목차
5. errorbar 그리기
6. 누적 바 차트 그리기
1. Seaborn 기본 막대 그래프 그리기
우선 seaborn 라이브러리를 불러옵니다.
import seaborn as sns
Seaborn의 'barplot' 함수에 x축과 y축에 들어갈 데이터를 각각 넣어주면, 단 몇 줄의 코드로 깔끔한 막대 그래프를 생성할 수 있습니다.
# 데이터
labels = ['A', 'B', 'C', 'D']
values = [3, 7, 1, 9]
# 시각화
sns.barplot(x=labels, y=values)
2. 수평 막대 그래프 그리기
seaborn에서 수평 막대 그리는 방법은 orient라는 매개변수를 활용하는 것입니다. orient의 속성값으로는 'v'와 'h'로 총 2가지 종류가 있으며, 'v'는 수직 막대 그래프를, 'h'는 수평 막대 그래프를 그립니다.
sns.barplot(x=values, y=labels, orient='h')
3. 다중 그룹 데이터 비교하기
다중 그룹 데이터를 비교하기 위해 아래와 같이 2개의 그룹으로 나뉜 데이터를 생성해 보겠습니다.
import pandas as pd
import numpy as np
# 데이터 프레임 생성
# 데이터 생성
data = {
'Labels': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'],
'Values': [3, 2, 7, 6, 9, 4, 5, 8],
'Group': ['Group 1', 'Group 2', 'Group 1', 'Group 2', 'Group 1', 'Group 2', 'Group 1', 'Group 2']
}
df = pd.DataFrame(data)
다중 그룹의 데이터를 비교할 경우, 서브플롯을 활용하여 그룹별로 별도의 막대 그래프를 그릴 수 있습니다. 이때 'data' 매개변수에는 데이터프레임이 들어가야 합니다.
plt.figure()
plt.subplot(2,1,1)
sns.barplot(data=df[df['Group'] == 'Group 1'], x='Labels', y='Values')
plt.subplot(2,1,2)
sns.barplot(data=df[df['Group'] == 'Group 2'], x='Labels', y='Values')
plt.show()
4. 다중 그룹 하나의 그래프에 담기
Seaborn의 'hue' 매개변수를 활용하면, 여러 그룹의 데이터를 하나의 그래프에 색상으로 구분하여 표시할 수 있습니다. 이를 통해 다양한 그룹의 차이를 한눈에 파악할 수 있습니다.
plt.figure(figsize=(9,6))
sns.barplot(data=df, x='Labels', y='Values', hue='Group')
5. errorbar 그리기
Seaborn barplot 함수는 기본적으로 오차 막대(errorbar)를 그려 데이터의 신뢰구간을 표현합니다. 이는 데이터의 신뢰성을 판단하는데 도움이 됩니다. Matplotlib는 표준편차 값을 직접 구해서 'yerr'이라는 매개변수에 값을 넣어줘야 하는 것과 비교한다면 정말 간편한 기능을 가지고 있다는 것을 알 수 있습니다.
sns.barplot(data=df, x='Labels', y='Values')
6. 누적 바 차트 그리기
누적 막대 그래프는 여러 그룹의 데이터를 하나의 막대에 쌓아 표시합니다. 이를 통해 전체적인 분포뿐만 아니라 각 그룹 간의 상대적인 크기도 쉽게 비교할 수 있습니다. 이때, 두 번째 막대 그래프에서 'bottom ' 매개 변수에 첫 번째 막대 그래프의 값을 입력해주어야 합니다.
# 그래프 그리기
plt.figure()
# Value1을 기반으로 첫 번째 막대 그리기
sns.barplot(data=df[df['Group'] == 'Group 1'], x='Labels', y='Values', label='Group 1', color='b')
# Value1 + Value2를 기반으로 두 번째 막대 그리기 (누적)
sns.barplot(data=df[df['Group'] == 'Group 2'], x='Labels', y='Values', label='Group 2', color='r', bottom=df[df['Group'] == 'Group 1']['Values'])
plt.legend()
plt.show()
7. 100% 누적 바 차트 그리기
각 그룹 내에서 상대적인 크기가 중요한 경우, 100% 누적 바 차트를 사용하면 효과적입니다. 이때, 값의 비율을 직접 구해야 하기 때문에 아래와 같이 코드가 조금 길어집니다.
# Calculate total values for each label to normalize to 100%
total_values = df.groupby('Labels')['Values'].sum().reset_index()
total_values.columns = ['Labels', 'Total_Values']
# Merge the total_values to the original dataframe
df = pd.merge(df, total_values, on='Labels')
# Normalize the Values to percentage
df['Values_Percentage'] = (df['Values'] / df['Total_Values']) * 100
# Create the plot
plt.figure()
# Plot for Group 1
sns.barplot(data=df[df['Group'] == 'Group 1'], x='Labels', y='Values_Percentage', label='Group 1', color='b')
# Plot for Group 2 (stacked)
bottom_values = df[df['Group'] == 'Group 1']['Values_Percentage'].reset_index(drop=True)
sns.barplot(data=df[df['Group'] == 'Group 2'], x='Labels', y='Values_Percentage', label='Group 2', color='r', bottom=bottom_values)
plt.ylabel('Percentage')
plt.legend()
plt.show()
1) 총 값 계산 : 먼저 각 레이블 ('A', 'B', 'C', 'D')에 대한 총값을 계산합니다. 이는 각 레이블에 대한 모든 그룹의 값을 합산한 것입니다.
2) 원래 데이터프레임에 총 값 병합 : 계산한 총 값을 원래의 데이터 프레임에 병합합니다. 이렇게 하면 각 행에 총값이 추가되어, 뒤이어 진행할 정규화 작업에 사용할 수 있습니다.
3) 값을 퍼센트로 정규화 : 각 값을 해당 레이블의 총값으로 나눈 후 100을 곱해 퍼센트로 변환합니다. 이를 통해 각 그룹 내에서의 상대적 비율 값을 얻을 수 있습니다.
4) 그래프 그리기 : 정규화된 값을 이용해 누적 바 차트를 그립니다. 먼저 'Group 1'에 대한 막대를 그린 다음, 그 위에 'Group 2'에 대한 막대를 누적합니다.
이렇게 하면, 각 레이블에 대해 'Group 1'과 'Group 2'의 상대적 비율을 한눈에 볼 수 있는 100% 누적 바 차트가 완성됩니다.
결론
다중 그룹을 비교하는 막대 그래프를 그리거나, 신뢰구간을 표시하는 막대 그래프를 그리고 싶은 경우엔 Matplotlib보다는 Seaborn을 활용하자!
여기까지 Seaborn 막대 그래프 7가지 종류 그리는 방법에 대해서 알아보았습니다. 위에서 다룬 예시 그래프에 대한 full 코드는 깃허브에 업로드해 두었으니, 다운로드 받아서 공부해 보시길 바랍니다 :) 추가적으로 복잡한 그래프를 그려야 하는데, 직접 하기에는 어렵고 시간이 부족하신 분들은 외주를 맡기는 방법도 있으니 참고 바랍니다!
'데이터분석 > Seaborn, matplotlib' 카테고리의 다른 글
Matplotlib 막대 그래프 그리는 7가지 방법(errorbar, 100% 누적 바 등) (0) | 2023.10.16 |
---|---|
Matplotlib Subplot 활용해서 그래프 여러개 그리는 3가지 방법 (0) | 2023.10.12 |
데이터 시각화를 하는 이유, 좋은 시각화 핵심 법칙 (0) | 2023.10.11 |
plt.legend 옵션으로 그래프 범례 모양 커스터마이즈하기 (0) | 2023.10.10 |
댓글