데이터 시각화 — matplotlib & seaborn 실습 정리

syeom·2026년 4월 28일
post-thumbnail

멀티캠퍼스 데이터분석 4월 28일 수업 내용 — matplotlib 기초, 그래프 종류, seaborn 히트맵, 파생변수 생성, 주석 추가


📌 목차

  1. matplotlib 기초 — 라인 그래프
  2. 그래프 옵션 — 색상, 선 종류, 제목, 축 이름
  3. 한글 폰트 설정 & 마이너스 기호 깨짐 방지
  4. 범례 추가 — legend()
  5. 막대 그래프 — bar / barh
  6. 산점도 그래프 — scatter
  7. drinks.csv 데이터 분석
  8. 파생변수 생성 — 총술소비량, 도수
  9. seaborn — 히트맵 & pairplot
  10. 주석 추가 — annotate()
  11. 그래프 파일로 저장 — savefig()

1. matplotlib 기초 — 라인 그래프

# !pip install matplotlib
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import platform

# y축 데이터만 입력 → x축은 0부터 1씩 증가 (기본값)
plt.plot([5, 4, 3, 2, 1])
plt.show()

# x축, y축 데이터 모두 입력 → 길이가 같아야 함
plt.plot([1, 2, 3, 4], [70, 50, 100, 90])
plt.show()


matplotlib 작업 흐름

plt (도화지 생성)
    ↓
plt.plot() / plt.bar() / plt.scatter()  — 그래프 추가
    ↓
plt.title() / plt.xlabel() / plt.legend() 등  — 옵션 설정
    ↓
plt.show()  — 결과 출력 후 도화지 초기화

💡 plt.show() 를 호출하면 도화지가 초기화됩니다.
Jupyter Notebook에서는 plt.show() 없이도 그래프가 출력됩니다.


2. 그래프 옵션 — 색상, 선 종류, 제목, 축 이름

x = [1, 2, 3, 4]
y = [70, 80, 100, 90]

# 선 종류 변경 (-- : 점선)
plt.plot(x, y, '--')
plt.show()

# 선 색상 변경 (r : 빨간색)
plt.plot(x, y, 'r')
plt.show()

# 색상 + 선 종류 동시 지정
plt.plot(x, y, 'r--')
plt.show()

# 하나의 도화지에 여러 그래프 추가
plt.plot(x, y)
plt.plot(x, [100, 60, 80, 40], 'r--')
plt.show()



선 색상 & 종류 기호

기호설명
r빨간색
g초록색
b파란색
k검은색
-실선 (기본값)
--점선
-.점-실선
:점점선
# 그래프 제목 및 축 이름 지정
plt.plot(x, y)
plt.title('그래프 제목')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

3. 한글 폰트 설정 & 마이너스 기호 깨짐 방지

matplotlib의 기본 폰트는 한글을 지원하지 않습니다.
OS에 따라 폰트를 다르게 설정해야 합니다.

import platform

# OS 확인 후 폰트 설정
if platform.system() == 'Darwin':
    # Mac
    plt.rc('font', family='AppleGothic')
else:
    # Windows
    plt.rc('font', family='Malgun Gothic')

plt.plot(x, y)
plt.title('그래프 제목')
plt.show()
# 마이너스(-) 기호 깨짐 방지
plt.rc('axes', unicode_minus=False)
# 또는
plt.rcParams['axes.unicode_minus'] = False

plt.plot(x, [-30, 0, -20, 50])
plt.show()


⚠️ 한글 폰트 설정을 하지 않으면 제목, 축 이름이 □□□ 로 깨집니다.
마이너스 기호도 폰트 설정 후 깨질 수 있으므로 unicode_minus=False 도 함께 설정하세요.


4. 범례 추가 — legend()

하나의 도화지에 데이터가 2개 이상일 때 범례로 구분합니다.

x  = [1, 2, 3]
y1 = [10, 6, 3]
y2 = [5, 8, 17]

plt.plot(x, y1)
plt.plot(x, y2)

# 범례 추가 — loc 매개변수로 위치 지정
plt.legend(['a', 'b'], loc='upper right')

plt.show()

legend loc 위치 옵션

위치
'upper right'우측 상단
'upper left'좌측 상단
'lower right'우측 하단
'lower left'좌측 하단
'center'중앙
'best'자동 (기본값)

5. 막대 그래프 — bar / barh

x  = [1, 2, 3]
y1 = [10, 6, 3]

# 수직 막대 그래프
plt.bar(x, y1)
plt.show()

# 수평 막대 그래프
plt.barh(x, y1)
plt.show()

# 막대 색상 & 너비 조정
plt.bar(x, y1, width=0.4, color=['red', 'green'])
plt.show()

# 특정 막대 색상만 변경
bar_graph = plt.bar(x, y1)
bar_graph[1].set_color('#A862A6')   # 2번째 막대 색상 변경 (Hex 코드 사용 가능)
plt.show()



💡 plt.bar() 의 반환값을 변수에 저장하면
bar_graph[인덱스].set_color(색상) 으로 특정 막대의 색상만 변경할 수 있습니다.


6. 산점도 그래프 — scatter

데이터의 분포도와 두 변수 간의 상관관계를 확인할 때 사용합니다.

# 랜덤 데이터 100개로 산점도 생성
x = np.random.random(100)
y = np.random.random(100)

plt.scatter(x, y)
plt.show()


7. drinks.csv 데이터 분석

데이터 로드 & 전처리

df = pd.read_csv('../csv/drinks.csv')

# 결측치 확인
df.isna().sum()

# continent 컬럼 결측치 → 'OT' (기타 대륙) 로 대체
df.fillna('OT', inplace=True)

상관계수 분석

# 맥주, 위스키, 와인, 순수알콜 간 상관계수 계산 (피어슨)
df.iloc[:, 1:-1].corr('pearson')


💡 상관계수 해석

  • 1에 가까울수록 → 강한 양의 상관관계
  • -1에 가까울수록 → 강한 음의 상관관계
  • 0에 가까울수록 → 상관관계 없음

맥주 소비량과 순수알콜량의 상관계수 ≈ 0.8 → 높은 양의 상관관계

# 상관계수가 높은 조합 — 산점도로 확인
plt.scatter(df['beer_servings'], df['total_litres_of_pure_alcohol'])
plt.show()

# 상관계수가 낮은 조합 — 산점도로 확인
plt.scatter(df['spirit_servings'], df['wine_servings'])
plt.show()



8. 파생변수 생성 — 총술소비량, 도수

컬럼명 변경

df.columns = ['국가', '맥주소비량', '위스키소비량', '와인소비량', '순수알콜', '대륙']

파생변수 추가

# 총술소비량 = 맥주 + 위스키 + 와인
df['총술소비량'] = df['맥주소비량'] + df['위스키소비량'] + df['와인소비량']

# sum(axis=1) 활용 — 행 방향 합계
df['총술소비량2'] = df.loc[:, '맥주소비량':'와인소비량'].sum(axis=1)

# 도수 = (순수알콜 / 총술소비량) × 100
df['도수'] = (df['순수알콜'] / df['총술소비량']) * 100
df['도수'] = df['도수'].fillna(0)   # 나눗셈 결측치(0/0) → 0 대체

대륙별 도수 평균 — 가장 독한 술을 먹는 대륙은?

df.loc[
    df['도수'] > 0,
    ['대륙', '도수']
].groupby('대륙').mean()

한국의 총술소비량 순위

# 총술소비량 내림차순 정렬
df.sort_values('총술소비량', ascending=False, inplace=True)
df.reset_index(drop=True, inplace=True)

# South Korea 인덱스 추출 → 순위 계산
korea_index = df.loc[df['국가'] == 'South Korea'].index[0]
korea_rank  = korea_index + 1
korea_value = df.loc[korea_index, '총술소비량']

rank() 함수 — 동점 처리 방식

df['총술소비량'].rank(ascending=False, method='min')
method 값설명
average동점자 순위의 평균 (기본값)
min동점자 중 낮은 순위로 지정 (스포츠 방식)
max동점자 중 높은 순위로 지정
first먼저 나온 데이터 순서대로
densemin과 동일, 다음 순위가 +1

9. seaborn — 히트맵 & pairplot

# !pip install seaborn
import seaborn as sns

corr = df.loc[:, '맥주소비량':'순수알콜'].corr('pearson')

plt.figure(figsize=(12, 8))

sns.heatmap(
    data      = corr.values,
    annot     = True,               # 수치 표시
    square    = True,               # 정사각형
    fmt       = '0.3f',             # 소수점 3자리
    annot_kws = {'size': 20},       # 글자 크기
    cbar      = False,              # 사이드바 제거
    cmap      = 'Greens',           # 색상 팔레트
    xticklabels = ['맥주', '위스키', '와인', '순수알콜'],
    yticklabels = ['맥주', '위스키', '와인', '순수알콜']
)
plt.show()
# pairplot — 모든 컬럼 조합의 산점도 + 분포도
sns.pairplot(
    df.loc[:, '맥주소비량':'순수알콜'],
    corner   = True,          # 중복 제거
    kind     = 'reg',         # 회귀선 추가
    plot_kws = {
        'line_kws': {'color': 'red'}
    }
)
plt.show()


sns.heatmap() 주요 매개변수

매개변수설명
data히트맵에 사용할 데이터
annot수치 표시 여부
square정사각형 표시 여부
fmt수치 포맷 ('0.3f' → 소수 3자리)
annot_kws수치 글자 스타일
cbar컬러바(사이드바) 표시 여부
cmap색상 팔레트 ('Greens', 'Blues', 'coolwarm' 등)
xticklabelsx축 눈금 이름
yticklabelsy축 눈금 이름

10. 주석 추가 — annotate()

그래프의 특정 데이터 포인트에 텍스트와 화살표로 설명을 추가합니다.

plt.figure(figsize=(20, 8))
bar_graph = plt.bar(df.index, df['총술소비량'])

# 한국 막대 색상 변경
bar_graph[korea_index].set_color('red')

plt.annotate(
    f"South Korea\nrank : {korea_rank}\n총술소비량 : {korea_value}",
    xy      = (korea_index, korea_value),           # 주석이 가리키는 좌표
    xytext  = (korea_index + 10, korea_value + 150), # 주석 텍스트 위치
    arrowprops = {
        'facecolor' : 'r',      # 화살표 안쪽 색상
        'edgecolor' : 'black',  # 화살표 외부 색상
        'headwidth' : 20,       # 화살표 머리 너비
        'headlength': 20,       # 화살표 머리 길이
        'width'     : 10,       # 화살표 꼬리 너비
        'shrink'    : 0.1       # 화살표와 xy/xytext 간 간격
    }
)
plt.show()

annotate() 주요 매개변수

매개변수설명
첫 번째 인자주석 텍스트
xy주석이 가리키는 데이터 좌표 (x, y)
xytext주석 텍스트가 표시될 위치 (x, y)
arrowprops화살표 스타일 딕셔너리

11. 그래프 파일로 저장 — savefig()

plt.savefig(
    'a.png',
    dpi          = 300,     # 해상도 (기본값: 100, 높을수록 고해상도)
    bbox_inches  = 'tight', # 여백 제거
    transparent  = False,   # 배경 투명 여부
    facecolor    = 'black'  # 배경 색상 (transparent=False 일 때 사용)
)
plt.show()

💡 savefig() 는 반드시 plt.show() 앞에 호출해야 합니다.
plt.show() 이후에는 도화지가 초기화되어 빈 파일이 저장됩니다.

savefig() 주요 매개변수

매개변수설명
fname저장할 파일 이름 (.png, .jpg, .svg 등)
dpi해상도 (기본값 100, PPT용은 300 권장)
bbox_inches'tight' → 여백 제거
transparentTrue → 배경 투명
facecolor배경 색상

📎 핵심 함수 요약

함수설명
plt.plot(x, y, 옵션)라인 그래프
plt.bar(x, y)수직 막대 그래프
plt.barh(x, y)수평 막대 그래프
plt.scatter(x, y)산점도
plt.title('제목')그래프 제목
plt.xlabel('이름')x축 이름
plt.ylabel('이름')y축 이름
plt.legend(['a','b'])범례 추가
plt.figure(figsize=(w,h))도화지 크기 설정
plt.rc('font', family='폰트')폰트 설정
plt.rc('axes', unicode_minus=False)마이너스 기호 깨짐 방지
plt.annotate(텍스트, xy, xytext, arrowprops)주석 추가
plt.savefig('파일명', dpi=300)그래프 이미지로 저장
plt.show()그래프 출력 (도화지 초기화)
df.corr('pearson')피어슨 상관계수 계산
sns.heatmap(data, annot, cmap)히트맵
sns.pairplot(df, kind='reg')산점도 + 분포도 행렬
df.sort_values(컬럼, ascending=False)내림차순 정렬
df.reset_index(drop=True)인덱스 초기화
Series.rank(method='min')순위 생성
round(값, 소수점)반올림
profile
공부 기록

0개의 댓글