내일배움캠프

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

min0jun 2026. 6. 2. 20:32

1. 오늘 학습 목표

- Matplotlib을 이용해 시각화하기

사실 이미 배웠지만 복습한다는 마음으로?ㅋㅋㅋㅋㅋㅋ

2. 오늘 학습 한 내용

Matplotlib이란?

  • 명령어 스타일로 동작하는 함수의 모음이다. 각각의 함수를 사용해서 간편하게 그래프를 만들고 변화를 줄 수 있다.
    예를 들어, 그래프를 만들고, 몇 개의 선을 표현하고, 레이블로 꾸미는 등...
처음에는 Matplotlib이라고 해서 뭔가 엄청 어려운 시각화 도구인가 싶었는데, 막상 배워보니 결국 “파이썬으로 그래프를 그리게 해주는 도구”라고 생각하면 조금 편했다. 물론 뒤로 갈수록 fig, ax, subplots 같은 친구들이 등장하면서 살짝 정신이 아득해지긴 한다. 그래도 그래프를 직접 띄워보니까 왜 이걸 배우는지는 바로 이해됐다.

2-1. 그래프 그리기

기본 그래프

기본 그래프는 사실 코드만 보면 그렇게 길지 않다. 그런데 처음에는 plt.plot() 안에 들어가는 값들이 무슨 역할을 하는지 헷갈렸다. 그냥 외우려고 하면 더 복잡한데, 직접 실행해서 그래프가 나오는 걸 보니 “아, 이 값들이 x축과 y축으로 들어가는구나” 하고 조금 감이 잡혔다.

그래프 스타일 지정하기

 

레이블 사용

 

기타 기능들 - 여백 지정하기, 폰트(스타일) 설정하기, 위치 지정하기, 이미지 저장하기

처음에는 그래프만 그리면 끝이라고 생각했는데, 막상 배우다 보니 그래프 크기, 범례, 격자, 색상 같은 요소들이 생각보다 중요했다. 작은 설정 하나 차이인데 결과물을 보면 확실히 더 정리된 느낌이 난다. 역시 디테일이 사람을 은근히 괴롭힌다.

2-2. 그래프의 유형

그래프 종류는 지난 TIL에서도 한 번 정리했지만, 이번에는 조금 더 다양한 그래프를 다뤘다. 선 그래프나 막대 그래프처럼 익숙한 친구들도 있지만, 바이올린 플롯이나 트리맵처럼 처음 보면 “이건 뭐지?” 싶은 그래프도 있었다. 그래도 각각의 그래프가 어떤 상황에서 쓰이는지 생각하면서 보니까 조금씩 구분이 됐다.
  • Violin Plot(바이올린 플롯)
# 바이올린 플롯

fig, ax = plt.subplots()

# 팁 금액의 분포를 바이올린 모양으로 그리기
# vert=False: 가로로 눕히기 (보기 편함)
dataset = [tips[tips['sex']=='Male']['tip'], tips[tips['sex']=='Female']['tip']]

# Matplotlib의 violinplot은 데이터를 리스트 형태로 묶어서 넣어줘야 합니다.
ax.violinplot(dataset, vert=False, showmeans=True)

# y축 눈금 라벨 설정 (0번 인덱스가 아니라 1번부터 시작함에 주의)
ax.set_yticks([1, 2])
ax.set_yticklabels(['Male', 'Female'])

ax.set_title("성별 팁 금액 분포 (Violin Plot)")
ax.set_xlabel("Tip")
plt.show()

바이올렛 플롯

 

  • Treemap(트리맵)
# 트리맵

# 1. 라이브러리 설치 및 임포트 (Matplotlib 보조 도구)
!pip install squarify
import squarify

# 2. 데이터 준비 (요일별 빈도수)
day_counts = tips['day'].value_counts()

# 3. 시각화
fig, ax = plt.subplots(figsize=(8, 6))

# sizes: 사각형 크기 (데이터 값)
# label: 사각형 안에 들어갈 이름
# alpha: 투명도 (0~1)
squarify.plot(sizes=day_counts.values, label=day_counts.index, 
              alpha=0.7, color=['red', 'green', 'blue', 'orange'], ax=ax)

# 트리맵은 축(x, y)이 필요 없으므로 제거합니다.
ax.axis('off') 
ax.set_title("요일별 방문 빈도 (Treemap)")

plt.show()

트리맵

 

  • Heatmap(히트맵)
# 히트맵

# 1. 상관관계 계산 (숫자 데이터만)
corr = tips.corr(numeric_only=True)

# 2. 시각화
fig, ax = plt.subplots()
im = ax.imshow(corr, cmap='coolwarm') # cmap: 색상 테마 (파랑~빨강)

# 3. 꾸미기 (축 눈금 설정)
# 눈금 개수(0,1,2)와 이름(total_bill, tip...)을 맞춰줍니다.
ax.set_xticks(np.arange(len(corr.columns)))
ax.set_yticks(np.arange(len(corr.columns)))
ax.set_xticklabels(corr.columns)
ax.set_yticklabels(corr.columns)

# 컬러바(범례) 추가
plt.colorbar(im)
ax.set_title("변수 간 상관관계 (Heatmap)")
plt.show()

히트맵

- 바이올린 플롯은 처음 봤을 때 이름도 생소하고 모양도 낯설었다. 그런데 분포를 한눈에 볼 수 있다는 점에서 단순 평균보다 더 많은 정보를 보여주는 그래프라는 생각이 들었다. 특히 데이터가 어느 구간에 몰려 있는지 보고 싶을 때 유용할 것 같다.


- 트리맵은 사각형 크기로 비중을 보여주는 방식이라 생각보다 직관적이었다. 숫자로만 보면 어느 항목이 큰지 바로 와닿지 않을 때가 있는데, 사각형 크기로 보니까 비율 차이가 훨씬 잘 보였다. 다만 항목이 너무 많아지면 조금 정신없을 수도 있겠다는 생각도 들었다.


- 히트맵은 색으로 관계나 정도를 보여주는 그래프라서 눈에 잘 들어왔다. 특히 상관관계를 볼 때 숫자 표만 보면 딱딱한데, 색으로 표현하니까 어떤 값끼리 관계가 강한지 빠르게 확인할 수 있었다. QA/QC 데이터에서도 변수 간 관계를 볼 때 꽤 자주 쓰일 것 같다.

 

2-3. plt vs ax

둘을 쉽게 설명한 예시

 

방식 1. pyplot 스타일(자동모드): pyplot 인터페이스/상태 기반 인터페이스 (State Based Interface)

 

방식 2. 객체 지향 스타일(수동모드): 객체 지향 인터페이스 (Object Oriented Interface)

 

방식 2-1. (심화) subplot 여러 그래프 그리기 예시

# 1. 도화지(fig) 하나에 축(axes) 2개를 나란히 생성 (1행 2열)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))

# 2. 첫 번째 그래프 (왼쪽: axes[0]) 그리기
axes[0].bar(day_counts.index, day_counts.values, color='orange')
axes[0].set_title("1. 요일별 손님 수 (Bar)")
axes[0].set_xlabel("요일")

# 3. 두 번째 그래프 (오른쪽: axes[1]) 그리기
axes[1].scatter(tips['total_bill'], tips['tip'], color='blue', alpha=0.5)
axes[1].set_title("2. 금액과 팁의 관계 (Scatter)")
axes[1].set_xlabel("결제 금액")

# 4. 그래프끼리 겹치지 않게 간격 자동 조절 (필수!)
plt.tight_layout()
plt.show()

 

 

방식 3. Matplotlib Wrapper

 

예시)

# 요일별 빈도수 계산 후 바로 그리기
# rot=0: x축 글자 똑바로(0도) 표시
tips['day'].value_counts().plot(kind='bar', figsize=(6, 4), color='orange', rot=0)

plt.title("요일별 데이터 개수 (Pandas Plot)")
plt.show()

#################################객체 지향형과 비교#################################
avg_tip = tips.groupby('day')['tip'].mean()

ax = avg_tip.plot(kind='bar', figsize=(6, 4), color='teal', rot=0)

ax.set_title("요일별 평균 팁 (Pandas + Matplotlib 혼합)")
ax.set_xlabel("요일 (Day)")
ax.set_ylabel("평균 팁 ($)")

ax.axhline(avg_tip.mean(), color='red', linestyle='--', label='전체 평균')
ax.legend()

plt.show()

 

수업을 들을 때는 이해한 것 같았는데, 과제로 혼자 해보면 또 느낌이 달라진다. 데이터 전처리, 결측치 처리, 날짜 데이터 변환, 불량률 계산까지 하나씩 보면 배운 내용인데, 막상 직접 순서를 잡으려면 손이 바로 움직이지는 않았다. 그래도 이렇게 직접 막혀봐야 뭐가 부족한지 확실히 보이는 것 같다.

그리고 그 외 많이 쓰는 그래프의 유형들은 바로 직전 TIL에 작성되어 있으니, 그곳에서 만나요~

3. 오늘의 과제 - 파이썬 개인과제 LV. 1

  • 문제 1-1: 데이터 전처리

 

  • 1-2: 결측치 처리

 

  • 1-3: 날짜 데이터 전처리

 

  • 1-4: 불량률 계산


나의 간단 소감

 

- 오늘은 Matplotlib을 이용해서 그래프를 그리는 방법을 다시 정리했다. 사실 시각화 자체는 바로 직전 TIL에서도 다뤘기 때문에 어느 정도 복습하는 느낌으로 시작했는데, 이번에는 plt와 ax의 차이, 그리고 객체 지향 방식까지 같이 보면서 조금 더 깊게 들어간 느낌이었다.

 

처음에는 plt.plot()처럼 간단하게 그래프를 그리는 방식이 훨씬 편하게 느껴졌다. 코드도 짧고 결과도 바로 나오기 때문에 초보자 입장에서는 확실히 접근하기 좋았다. 그런데 여러 그래프를 한 화면에 배치하거나, 그래프마다 세부 설정을 다르게 주려면 fig, ax를 사용하는 객체 지향 방식이 더 필요하다는 것도 알게 됐다.

 

특히 plt와 ax는 처음 보면 둘 다 그래프를 그리는 코드라서 헷갈리기 쉬웠다. 그래도 오늘 정리하면서 plt는 빠르게 그래프를 그리는 방식, ax는 도화지와 축을 직접 만들어서 세밀하게 조정하는 방식이라고 생각하니 조금 이해가 쉬워졌다.

아직 완전히 익숙하진 않지만, 앞으로 그래프를 여러 개 그리거나 프로젝트 발표용 시각화를 만들 때는 ax 방식도 계속 연습해야겠다.

 

그리고 바이올린 플롯, 트리맵, 히트맵처럼 다양한 그래프를 보면서 데이터에 따라 어울리는 시각화 방식이 다르다는 것도 다시 느꼈다. 단순히 그래프를 많이 아는 것보다, 내가 가진 데이터를 어떤 방식으로 보여줘야 가장 잘 전달될지 고민하는 게 더 중요해 보였다.

 

QA/QC 직무를 준비하는 입장에서 시각화는 꽤 실용적인 도구라고 생각한다. 불량률 추이, 검사값 분포, 공정별 차이, 변수 간 상관관계 같은 내용을 그래프로 표현할 수 있다면 문제를 더 빠르게 찾고 설명하는 데 도움이 될 것 같다. 아직은 코드가 중간중간 헷갈리지만, 오늘 배운 내용을 계속 복습하면서 그냥 그리는 그래프가 아니라 설명할 수 있는 그래프를 만드는 연습을 해야겠다.