1. 오늘 학습 목표

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)

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 데이터를 다룰 때도 불량률 추이, 공정별 차이, 변수 간 관계를 어떤 방식으로 보여줄지 고민하면서 도구를 선택해야겠다. 아직은 문법이 조금씩 헷갈리지만, 그래도 이제는 “어떤 그래프를 왜 쓰는지”를 생각하면서 접근해야겠다는 감이 조금 생겼다.
개인과제는 해설강의 후 올릴 예정...!
'내일배움캠프' 카테고리의 다른 글
| [본캠프] 데이터기반 QA/QC 부트캠프 19일차 (0) | 2026.06.08 |
|---|---|
| [본캠프] 데이터기반 QA/QC 부트캠프 18일차 (1) | 2026.06.05 |
| [본캠프] 데이터기반 QA/QC 부트캠프 16일차 (1) | 2026.06.02 |
| [본캠프] 데이터기반 QA/QC 부트캠프 15일차 (0) | 2026.06.01 |
| [본캠프] 데이터기반 QA/QC 부트캠프 14일차 (0) | 2026.05.29 |