내일배움캠프

[본캠프] 데이터기반 QA/QC 부트캠프 17일차

min0jun 2026. 6. 4. 19:49

1. 오늘 학습 목표

seaborn과 plotly 사용법


2. 오늘 학습 한 내용

2-1. seaborn이란?

  • Matplotlib을 기반으로 만들어진 통계 데이터 시각화 라이브러리이다.
  • 그래프를 직접 하나하나 그리는 Matplotlib과는 다르게 seaborn은 데이터 분석에 필요한 통계 시각화를 더 쉽고 아름답게 만들어 주는 고수준의 라이브러리이다.

2-1-1. seaborn의 특징

1. 간결한 코드

- 비교적 코드가 매우 간단하다.

sns.countplot(data=tips, x='day')
Seaborn의 장점은 확실히 코드가 짧다는 점이었다. 처음에는 “이렇게 간단하게 써도 되는 건가?” 싶었는데, 직접 실행해보니 알아서 빈도나 평균을 계산해서 그래프로 보여줬다. 초보자 입장에서는 그래프 문법보다 데이터의 의미에 더 집중할 수 있어서 좋았다.

 

 

2. 통계 시각화 기능 제공

예시)

  • Scatter Plot (산점도)
  • Bar Plot (평균 막대 그래프)
  • Count Plot (빈도 그래프)
  • Box Plot (박스 플롯)
  • Violin Plot (바이올린 플롯)
  • Heatmap (상관관계 히트맵)
  • Pair Plot (변수 관계 탐색)
  • Swarm Plot (개별 데이터 분포)
  • Joint Plot (관계 + 분포 동시 분석)

3. pandas와 호환이 가능

python sns.scatterplot(data=tips,x='total_bill',y='tip' )

 

2-1-2. seaborn 기본 설정

# Seaborn 설치
!pip install seaborn

# 한글 폰트 설정 (Windows/Mac)
import platform
if platform.system() == 'Darwin': # Mac
    plt.rc('font', family='AppleGothic')
elif platform.system() == 'Windows': # Windows
    plt.rc('font', family='Malgun Gothic')
    
# 마이너스 부호 깨짐 방지
plt.rc('axes', unicode_minus=False)

# 화질 선명하게 설정 (Retina 디스플레이 지원)
%config InlineBackend.figure_format = 'retina'


import seaborn as sns
import matplotlib.pyplot as plt

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

 

2-1-3. 다차원 산점도

# 다차원 산점도
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()

 

2-1-4. 빈도/평균 막대 그래프

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과 Bar Plot은 생김새가 비슷해서 처음에는 조금 헷갈릴 수 있을 것 같다. Count Plot은 개수를 세는 그래프이고, Bar Plot은 평균 같은 값을 비교하는 그래프라고 정리하니 훨씬 이해가 쉬웠다. 비슷해 보여도 “무엇을 비교하는 그래프인지”를 먼저 봐야겠다.

 

2-1-5. pairplot

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

 

2-1-6. 팔레트

  • 범주형(요일, 성별): Set2, pastel, husl, deep 등을 주로 사용
  • 연속형(금액, 점수): viridis, coolwarm, Blues 등을 주로 사용
fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# Case 1: 범주형 데이터 (요일별 색상 다르게) -> palette 사용
sns.barplot(data=tips, x='day', y='total_bill', palette='Set2', ax=ax[0])
ax[0].set_title('범주형 팔레트 (Set2)')

# Case 2: 연속형 데이터 (금액에 따라 색 진하게) -> palette="Blues"
# as_cmap=True는 최신 버전 경고 방지용 (없어도 동작은 함)
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='total_bill', palette='coolwarm', ax=ax[1])
ax[1].set_title('연속형 팔레트 (coolwarm)')

plt.show()

 

2-1-7. 추세선

  • 데이터의 추세(Trend)를 파악할 때 사용
  • 산점도 위에 회귀선(추세선)과 신뢰구간을 자동으로 그려줌
# 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()

추세선은 산점도만 봤을 때보다 방향성이 더 잘 보였다. 점들이 흩어져 있어도 선이 같이 들어가니까 전체적인 흐름을 파악하기 쉬웠다. QA/QC 데이터에서도 온도, 압력, 검사값 같은 변수와 불량률의 관계를 볼 때 유용하게 쓸 수 있을 것 같다.

 

2-1-8. joint plot (hexbin)

  • 산점도만 그리면 데이터가 뭉쳐서 안 보일 때가 있고, 히스토그램만 그리면 관계를 알기 힘드므로, 이 둘을 합쳐놓은 그래프이다.
# 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()

 

2-1-9. violin + swarm

  • 박스 플롯이나 바이올린 플롯은 요약된 정보만 보여주지만, Swarm Plot은 모든 데이터를 점으로 찍되 겹치지 않게 옆으로 펼쳐서 보여준다. 데이터 양이 적을 때(Tips 같은 경우) 분포를 확인하기 가장 좋다.
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()

 

2-2. plotly란?

  • 웹페이지나 대시보드에서 상호작용할 수 있는 차트이다.

 

2-2-1. Interactive Scatter Plot

import plotly.express as px
import plotly.io as pio
import seaborn as sns  # seaborn 불러오기
tips = sns.load_dataset("tips")  # tips 예제 데이터 불러오기
tips.head()  # 데이터 확인

# Seaborn과 문법이 거의 비슷합니다!
fig = px.scatter(
    tips,
    x="total_bill",
    y="tip",
    color="day",        # 색상 (Seaborn의 hue)
    symbol="sex",       # 모양 (Seaborn의 style)
    size="size",        # 크기
    hover_data=['time'], # 마우스 올렸을 때 추가로 보여줄 정보
    title="Interactive Tips Scatter Plot",
    width=1200, 
    height=600
)
fig.show()

이런 식으로 마우스를 올리면 상호작용 가능

마우스를 올렸을 때 추가 정보가 뜨는 기능이 생각보다 실용적이었다. 그래프 안에 모든 정보를 다 적어두면 지저분해질 수 있는데, 필요한 순간에만 정보를 보여주니까 훨씬 깔끔했다. 보기 좋은 시각화와 정보 전달을 둘 다 챙길 수 있는 방식이라고 느꼈다.

 

2-2-2. 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()

이런 식으로 클릭 상호작용 가능

Treemap은 항목별 비중을 사각형 크기로 보여줘서 꽤 직관적이었다. 숫자로만 보면 어느 항목이 큰지 바로 와닿지 않을 때가 있는데, 면적으로 보니까 차이가 훨씬 잘 보였다. 매출 구조나 공정별 비중처럼 전체 안에서 각 항목의 크기를 보고 싶을 때 잘 맞을 것 같다.

 

2-2-3. Sunburst

tips['day'] = tips['day'].astype(str)
tips['time'] = tips['time'].astype(str)
tips['sex'] = tips['sex'].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()

클릭으로 다양한 상호작용 가능

Sunburst는 처음 보면 조금 화려해서 어려워 보이지만, 계층 구조를 보여주는 데는 확실히 좋았다. 요일, 성별, 시간처럼 단계가 나뉘는 데이터를 원형으로 펼쳐 보여주니까 구조가 한눈에 들어온다. 단순 비교보다 데이터의 큰 흐름과 세부 구성을 같이 보여주고 싶을 때 유용해 보인다.

 

2-2-4. 애니메이션

tips_sorted = tips.sort_values("size")

# range_x, range_y를 고정해야 축이 흔들리지 않습니다.
fig = px.scatter(
    tips_sorted,
    x="total_bill",
    y="tip",
    color="sex",
    size="size",
    hover_name="day",
    animation_frame="size",  # 핵심: 이 컬럼을 기준으로 재생 버튼 생성
    range_x=[0, 60],         # x축 범위 고정
    range_y=[0, 12],         # y축 범위 고정
    title="테이블 인원수(Size) 변화에 따른 팁 패턴 애니메이션"
)

# 애니메이션 속도 조절 (천천히)
fig.layout.updatemenus[0].buttons[0].args[1]["frame"]["duration"] = 1000

fig.show()

테이블 인원 수에 따른 팁 패턴

 

애니메이션 그래프는 확실히 시선을 끄는 힘이 있다. 단순히 점이 찍힌 그래프보다, 값이 변하는 과정을 재생 버튼으로 볼 수 있어서 데이터 변화가 더 잘 느껴진다. 다만 너무 많이 쓰면 오히려 산만할 수 있으니, 변화 과정을 보여줄 필요가 있을 때만 쓰는 게 좋을 것 같다.

 

2-3. 기타 기능들

2-3-1. sweetviz

#sweetviz 설치
!pip install sweetviz

import sweetviz as sv
import seaborn as sns

tips = sns.load_dataset("tips")
report = sv.analyze(tips)
report.show_html("sweetviz_tips_report.html")

 

2-3-2. pygwalker

#pygwalker 설치
!pip install pygwalker

import pygwalker as pyg
import seaborn as sns

tips = sns.load_dataset("tips")
pyg.walk(tips)

VScode내에서 이런 식으로 실행 가능

 

Tip. plotly는 plt.show() 대신 fig.show()를 사용

나의 간단 소감

- 오늘은 Seaborn과 Plotly를 이용한 시각화 방법을 배웠다. 사실 바로 전 TIL에서 Matplotlib을 다뤘기 때문에 이번 내용도 어느 정도 이어지는 느낌이었다. 다만 오늘은 단순히 그래프를 그리는 것보다 그래프를 더 예쁘게, 더 직관적으로, 더 상호작용 가능하게 만드는 방법을 배운 느낌이 강했다.

Seaborn은 Matplotlib보다 코드가 간단해서 확실히 편했다. sns.countplot()처럼 한 줄만 작성해도 요일별 빈도 그래프가 그려지는 걸 보면서, “아 이래서 고수준 라이브러리라고 하는구나” 싶었다. 특히 산점도, 막대 그래프, pairplot, heatmap처럼 데이터 분석에서 자주 쓰는 그래프를 비교적 쉽게 만들 수 있다는 점이 좋았다.

Plotly는 Seaborn과는 또 다른 느낌이었다. Seaborn이 정적인 그래프를 깔끔하게 보여주는 느낌이라면, Plotly는 마우스를 올리거나 클릭하면서 데이터를 직접 탐색할 수 있다는 점이 굉장히 인상적이었다. 특히 Treemap, Sunburst, 애니메이션 그래프처럼 화면에서 직접 움직이거나 클릭해볼 수 있는 그래프는 블로그나 발표 자료에서도 훨씬 시선을 끌 수 있을 것 같다.

그리고 Sweetviz와 Pygwalker도 가볍게 다뤄봤는데, 데이터를 빠르게 훑어보거나 시각적으로 탐색할 때 꽤 유용해 보였다. 물론 모든 걸 이런 도구에만 맡기면 안 되겠지만, 처음 데이터 구조를 파악할 때는 시간을 많이 줄여줄 수 있을 것 같았다.

오늘 내용을 정리하면서 느낀 건, 시각화 도구마다 역할이 다르다는 점이다. Matplotlib은 기본기, Seaborn은 통계 시각화, Plotly는 인터랙티브 시각화에 강점이 있다. 앞으로 QA/QC 데이터를 다룰 때도 불량률 추이, 공정별 차이, 변수 간 관계를 어떤 방식으로 보여줄지 고민하면서 도구를 선택해야겠다. 아직은 문법이 조금씩 헷갈리지만, 그래도 이제는 “어떤 그래프를 왜 쓰는지”를 생각하면서 접근해야겠다는 감이 조금 생겼다.

 

개인과제는 해설강의 후 올릴 예정...!