데이터 시각화의 화가: Seaborn

Seaborn: 고급 데이터 시각화를 위한 Python 라이브러리

Seaborn은 Matplotlib를 기반으로 만들어진 Python 데이터 시각화 라이브러리로, 통계적 데이터 시각화에 초점을 맞추고 있습니다. Seaborn은 Matplotlib보다 직관적이고 간결한 코드로 고급 시각화를 제공하며, 데이터를 이해하고 분석하는 데 유용합니다.


주요 특징

  1. 쉽고 직관적인 시각화: 복잡한 그래프도 간단한 명령어로 생성 가능.
  2. 내장된 통계 기능: 히트맵, 분포 플롯, 회귀선 등 통계적 분석을 위한 그래프 지원.
  3. Pandas와의 호환성: Pandas DataFrame을 바로 입력받아 시각화 가능.
  4. 스타일링: 기본적으로 세련된 그래프 스타일 제공.

기본 사용법

설치

pip install seaborn

예제 데이터셋

Seaborn은 샘플 데이터셋을 제공합니다. 예를 들어 tips 데이터셋은 팁과 식사비용, 성별, 요일 등의 데이터를 포함하고 있습니다.

import seaborn as sns
import matplotlib.pyplot as plt

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

Seaborn의 주요 그래프 예제

예제 1: 히스토그램 (Distribution Plot)

# 데이터 분포 시각화
sns.histplot(tips['total_bill'], kde=True, color='blue')

# 제목 설정
plt.title('Distribution of Total Bill')
plt.xlabel('Total Bill')
plt.ylabel('Frequency')

# 그래프 출력
plt.show()

결과

히스토그램과 커널 밀도 추정(KDE) 곡선이 함께 출력됩니다.


예제 2: 상관관계 히트맵 (Heatmap)

# 상관관계 계산
correlation = tips.corr()

# 히트맵 생성
sns.heatmap(correlation, annot=True, cmap='coolwarm')

# 제목 설정
plt.title('Correlation Heatmap')

# 그래프 출력
plt.show()

결과

숫자형 변수들 간의 상관관계를 히트맵으로 시각화합니다. 상관계수는 셀 안에 숫자로 표시됩니다.


예제 3: 박스 플롯 (Box Plot)

# 요일별 총 금액 분포
sns.boxplot(x='day', y='total_bill', data=tips, palette='pastel')

# 제목 설정
plt.title('Box Plot of Total Bill by Day')

# 그래프 출력
plt.show()

결과

요일별로 총 금액(total_bill)의 분포를 박스 플롯으로 보여줍니다.


예제 4: 산점도 (Scatter Plot)와 회귀선

# 산점도와 회귀선 추가
sns.lmplot(x='total_bill', y='tip', data=tips, aspect=1.5)

# 제목 설정
plt.title('Scatter Plot with Regression Line')

# 그래프 출력
plt.show()

결과

total_bill과 tip 간의 관계를 산점도로 나타내며, 데이터의 경향을 보여주는 회귀선이 추가됩니다.


예제 5: 범주형 데이터의 막대 그래프

# 성별에 따른 평균 팁 금액
sns.barplot(x='sex', y='tip', data=tips, ci='sd', palette='muted')

# 제목 설정
plt.title('Average Tip by Gender')

# 그래프 출력
plt.show()

결과

성별에 따른 평균 팁 금액을 막대 그래프로 나타냅니다.


예제 6: 페어 플롯 (Pair Plot)

# 모든 변수 간 관계 시각화
sns.pairplot(tips, hue='sex', palette='cool')

# 그래프 출력
plt.show()

결과

숫자형 변수들 간의 산점도와 히스토그램을 한 번에 시각화합니다. 성별로 색상을 구분합니다.


예제 7: 카테고리 플롯 (Cat Plot)

# 요일별 팁 금액의 분포를 박스 플롯으로 시각화
sns.catplot(x='day', y='tip', hue='sex', kind='box', data=tips, palette='Set2')

# 제목 설정
plt.title('Tip Amount by Day and Gender')

# 그래프 출력
plt.show()

결과

요일별 팁 금액의 분포를 성별로 구분하여 박스 플롯으로 나타냅니다.


Seaborn의 주요 기능

  1. 고급 시각화: 분포 플롯, 박스 플롯, 히트맵 등 복잡한 그래프를 쉽게 생성.
  2. 통계적 시각화 지원: 데이터의 분포, 경향성, 상관관계 등 분석에 적합.
  3. 스타일링: 기본 스타일 외에 다양한 테마(sns.set_theme()) 제공.
  4. 간단한 커스터마이징: 색상 팔레트, 플롯 크기, 축 레이블 등 간편하게 조정 가능.

참고 자료


정리

Seaborn은 통계적 데이터 시각화를 쉽게 구현할 수 있는 라이브러리로, 데이터를 빠르게 분석하고 이해하는 데 유용합니다. Pandas와 함께 사용하면 데이터 분석 작업을 훨씬 간단하고 효율적으로 진행할 수 있습니다.

실습 예제

import seaborn as sns

import matplotlib.pyplot as plt

import imageio

import os

import pandas as pd

import numpy as np

# GIF 파일이 저장될 폴더 생성 (선택적)

gif_folder = “seaborn_gifs”

os.makedirs(gif_folder, exist_ok=True)

# 샘플 데이터 생성

np.random.seed(42)  #결과 동일하게

data = pd.DataFrame({‘x’: np.random.rand(100), ‘y’: np.random.rand(100), ‘category’: np.random.choice([‘A’, ‘B’, ‘C’], 100)})

filenames = []

for i in range(10):  # 10개의 프레임 생성

    plt.figure(figsize=(8, 6))  # 각 플롯의 크기 설정

    # Seaborn 플롯 생성 (다양한 플롯 시도)

    if i < 3:

        sns.scatterplot(x=’x’, y=’y’, hue=’category’, data=data, alpha=0.5, s=i*20+20) # 점 크기 변화

        plt.title(f”Scatter Plot – Frame {i+1}”)

    elif i < 6:

        sns.kdeplot(x=’x’, y=’y’, hue=’category’, data=data, fill=True, alpha = (i-2)*0.2) # alpha 값 변화

        plt.title(f”KDE Plot – Frame {i+1}”)

    else:

        sns.histplot(data=data, x=’x’, hue = ‘category’, multiple=”stack”, alpha=0.7)

        plt.title(f”Hist Plot – Frame {i+1}”)

    filename = os.path.join(gif_folder, f’frame_{i}.png’)

    plt.savefig(filename)

    filenames.append(filename)

    plt.close() # 메모리 관리 중요

# GIF 생성

with imageio.get_writer(os.path.join(gif_folder,’seaborn_animation.gif’), mode=’I’, duration=2) as writer: # duration 프레임 간 시간 간격

    for filename in filenames:

        image = imageio.v2.imread(filename)

        writer.append_data(image)

# 생성된 PNG 파일 삭제 (선택적)

for filename in set(filenames):

    os.remove(filename)

print(f”GIF 저장 완료: {os.path.join(gif_folder,’seaborn_animation.gif’)}”)

예제코드 실행 :  duration 사용

GIF 생성시 Duration 옵션이 제대로 안먹힐 경우 FPS(초당 프래임수로 조정)

with imageio.get_writer(os.path.join(gif_folder,’seaborn_animation.gif’), mode=’I’, fps=2) as writer: # FPS 초당 프레임 수

예제코드 FPS 사용