내일배움 본캠프

[내일배움 본캠프]Seaborn 라이브러리

hyeon-ji 2026. 6. 4. 20:24

☆ To do list 

  • AI 진단퀴즈 5문제 풀기
  • 코드카타 1문제 풀기
  • 이력서 작성하기
  • 개인과제 진행하기(~lever 2)
  • TIL 작성 및 제출

🤖 에이타니 

● info() : 데이터의 전체 구조(행/열 개수, 데이터 타입, 결측치 등)를 파악하는 경우 사용한다.

import pandas as pd
df = pd.DataFrame({'A': [1, 2, None, 4], 'B': ['a', 'b', 'c', 'd']})
result = df.info()

# 컬럼 A는 3 non-null, 컬럼 B는 4 non-null로 표시되고 데이터 타입 정보가 출력된다.


● describe() : 수치형 데이터의 통계적 분포(평균, 표준편차, 분위수 등)를 확인하는 경우 사용한다.


🔐 CodeKata

 x만큼 간격이 있는 n개의 숫자

# x간격으로 n개의 숫자 출력하기
def solution(x, n):
    answer = []
    for i in range(1,n+1):
      answer.append(x * i)
      
    return answer

solution(2, 5)

# [2, 4, 6, 8, 10] 출력

💻 Python

▶ Seaborn

→ Matplotilb을 기반으로 만들어진 Python의 대표적인 통계 데이터 시각화 라이브러리이다. Seaborn 라이브러리는 다양한 통계 그래프를 제공한다.

 

Scatter Plot (산점도)

→ Matplotlib에서 Scatter를 구현할 때보다 코드를 간단하게 작성하여 더 많은 옵션을 부여할 수 있다.

plt.figure(figsize=(10, 6))

# x: 총 금액, y: 팁, hue: 흡연여부 (색상), style: 성별 (모양), size: 인원수 (크기)
sns.scatterplot(
    data=tips, 
    x='total_bill', 
    y='tip', 
    hue='smoker',   # 흡연 여부에 따라 색깔 다르게
    style='sex',    # 성별에 따라 모양 다르게 (O, X)
    size='size',    # 인원수에 따라 점 크기 다르게
    sizes=(20, 200) # 점 크기 범위 설정
)

plt.title("팁 데이터 다차원 분석 (Seaborn)")
plt.show()

 

ImPlot (회귀선이 있는 산점도)

→ 데이터 추세를 파악할 때 사용한다.

# scatter_kws={'s': 20}: 점 크기 조절
# ci=None: 신뢰구간 끄기 (켜려면 ci=95)
sns.lmplot(
    data=tips, 
    x='total_bill', 
    y='tip', 
    hue='smoker', # 흡연자/비흡연자 추세선 따로 그리기
    height=6
)

plt.title("총액과 팁의 추세선 (Linear Model Plot)")
plt.show()

 

Bar Plot (평균 막대그래프)

→ ' countplot '을 사용하여 범주형 데이터의 개수를 세고, ' barplot '을 이용하여 평균을 구할 수 있다.

더보기
fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# 1. 빈도 그래프 (Countplot)
# 알아서 요일별 개수를 세줍니다.
sns.countplot(data=tips, x='day', ax=ax[0], palette='pastel')
ax[0].set_title('요일별 데이터 개수 (Count Plot)')

# 2. 평균 막대 그래프 (Barplot)
# 알아서 요일별 '팁 평균'을 계산하고, 신뢰구간(검은 막대)까지 보여줍니다.
sns.barplot(data=tips, x='day', y='tip', ax=ax[1], palette='pastel')
ax[1].set_title('요일별 팁 평균 (Bar Plot)')

plt.tight_layout()
plt.show()

● Count Plot (빈도 그래프)

● Box Plot (박스 플롯)

● Violin Plot (바이올린 플롯)

더보기
fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# 1. 박스 플롯
sns.boxplot(data=tips, x='day', y='total_bill', hue='smoker', ax=ax[0], palette='Set2')
ax[0].set_title('Box Plot')

# 2. 바이올린 플롯 (split=True로 흡연/비흡연을 합쳐서 보여줌)
sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker', split=True, ax=ax[1], palette='Set2')
ax[1].set_title('Violin Plot (Split)')

plt.tight_layout()
plt.show()

 

● Heatmap (상관관계 히트맵)

더보기
# 상관계수 계산 (숫자형 데이터만)
corr = tips.corr(numeric_only=True)

plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title("변수 간 상관관계 히트맵")
plt.show()

 

● Pair Plot (변수 관계 탐색)

# 모든 수치형 변수의 관계를 보여줌 (hue로 성별 구분)
sns.pairplot(tips, hue='sex', palette='husl')
plt.show()

 

Swarm Plot (개별 데이터 분포)

→ Box Plot이나 Violin Plot은 요약된 정보만을 보여주지만, Swarm Plot은 모든 데이터를 겹치지 않는 점으로 찍어 옆으로 펼쳐 보여준다. 데이터 양이 적은 경우 분포를 확인하기 가장 좋은 방법이다.

plt.figure(figsize=(10, 6))

# 바이올린 플롯과 함께 그리면 금상첨화!
# 1. 바이올린으로 전체 윤곽을 잡고 (색상 연하게)
sns.violinplot(data=tips, x='day', y='total_bill', color='lightgray', inner=None)

# 2. 그 위에 겹쳐서 스웜 플롯으로 실제 데이터를 찍음
sns.swarmplot(data=tips, x='day', y='total_bill', size=4, color='black', alpha=0.7)

plt.title("요일별 결제 금액 분포 (Violin + Swarm)")
plt.show()

 

Joint Plot (관계 + 분포 동시 분석)

→ 산점도와 히스토그램을 합쳐놓은 그래프

# kind='hex': 데이터가 많은 곳을 육각형으로 진하게 표시 (벌집 모양)
# kind='reg'로 하면 회귀선도 그려준다.
sns.jointplot(
    data=tips, 
    x='total_bill', 
    y='tip', 
    kind='hex', 
    color='#4CB391',
    height=7
)

plt.suptitle("Joint Plot (Hexbin)", y=1.02) # 제목 위치 조정
plt.show()

 

▶ Plotly

→ 정적인 보고서를 넘어, 웹페이지나 대시보드에서 사용자와 상호작용하는 ' Interactive chart ' 차트이다.

 

반응형 산점도( Interactive Scatter)

→ 마우스를 올리면 해당 값에 대한 정보를 확인할 수 있다. 

 

● 트리맵(Treemap)과 선버스트(Sunburst) 

  Matplotlib으로 그리기 힘들었던 계층형 데이터를 완벽하게 시각화할 수 있다.

더보기

 트리맵(Treemap)

# path: 계층 순서 (요일 -> 시간 -> 성별)
# values: 사각형 크기 (총 금액)
fig = px.treemap(
    tips,
    path=['day', 'time', 'sex'], 
    values='total_bill',
    color='total_bill', # 금액에 따라 색상 진하게
    color_continuous_scale='RdBu',
    title="요일 > 시간 > 성별 매출 구조 (Treemap)"
)
fig.show()

 

선버스트(Sunburst) 

tips['time'] = tips['time'].astype(str)

# 전처리: None 대신 빈 문자열('')이나 특정 문자를 넣습니다.
tips.loc[tips['sex'] == 'Female', 'time'] = '(Unknown)' 

# 3. 선버스트 그리기
fig = px.sunburst(
    tips,
    path=['day', 'sex', 'time'], 
    values='total_bill',
    color='day',
    color_discrete_sequence=px.colors.qualitative.Pastel,
    title="고객층 상세 분석"
)

fig.show()

 

● 애니메이션 차트

→ 가상의 시나리오를 만들어 변화를 관찰할 수 있다. (ex. "손님 수(Size)가 1명인 테이블부터 6명인 테이블까지 순차적으로 보여주세요." )

 

▶ 그래프 시각화 시 주의할 점 

→ 강조하고 싶은 부분은 진한 색, 덜 강조하고 싶은 부분은 연한 색을 사용하는 것처럼, 그래프를 시각화할 시 디자인적으로나 한눈에 보기 좋은 분석 자료를 만들기 위해 색상을 유의하여 사용하는 것이 좋다.


matplotlib을 사용하여 시각화 자료를 만드는 것보다, seaborn을 활용하여 자료를 생성하는 것이 훨씬 더 코드 입력하기에 간단하고 더 다양하게 표현할 수 있다는 것을 배우며 많이 놀랐다. Python을 이용하여 시각화 자료를 만들어봐야 간단한 그래프를 그리는 정도가 다일 것이라고 생각했는데, 생각보다 다양한 그래프와 움직이는 그래프까지 만들어낼 수 있다는 부분이 신기했다.

오늘의 TIL에 전 시간에 알아보다가 만 회귀분석에 대해 작성하려고 했는데,,,

내가 작성하던 수시 채용 공고가 사라져서 너무 당혹스럽고 멘탈이 흔들려서 못했다.

남아있는 다른 직무로 지원하자고 마음을 다잡았지만 기분이 너무 좋지 않다..ㅡㅜ

내일 이어서 알아가 봐야겠다.