
멀티캠퍼스 데이터분석 4월 28일 수업 내용 — matplotlib 기초, 그래프 종류, seaborn 히트맵, 파생변수 생성, 주석 추가
# !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()


plt (도화지 생성)
↓
plt.plot() / plt.bar() / plt.scatter() — 그래프 추가
↓
plt.title() / plt.xlabel() / plt.legend() 등 — 옵션 설정
↓
plt.show() — 결과 출력 후 도화지 초기화
💡
plt.show()를 호출하면 도화지가 초기화됩니다.
Jupyter Notebook에서는plt.show()없이도 그래프가 출력됩니다.
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()
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도 함께 설정하세요.
하나의 도화지에 데이터가 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()

| 값 | 위치 |
|---|---|
'upper right' | 우측 상단 |
'upper left' | 좌측 상단 |
'lower right' | 우측 하단 |
'lower left' | 좌측 하단 |
'center' | 중앙 |
'best' | 자동 (기본값) |
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(색상)으로 특정 막대의 색상만 변경할 수 있습니다.
데이터의 분포도와 두 변수 간의 상관관계를 확인할 때 사용합니다.
# 랜덤 데이터 100개로 산점도 생성
x = np.random.random(100)
y = np.random.random(100)
plt.scatter(x, y)
plt.show()

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


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, '총술소비량']

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


| 매개변수 | 설명 |
|---|---|
data | 히트맵에 사용할 데이터 |
annot | 수치 표시 여부 |
square | 정사각형 표시 여부 |
fmt | 수치 포맷 ('0.3f' → 소수 3자리) |
annot_kws | 수치 글자 스타일 |
cbar | 컬러바(사이드바) 표시 여부 |
cmap | 색상 팔레트 ('Greens', 'Blues', 'coolwarm' 등) |
xticklabels | x축 눈금 이름 |
yticklabels | y축 눈금 이름 |
그래프의 특정 데이터 포인트에 텍스트와 화살표로 설명을 추가합니다.
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()

| 매개변수 | 설명 |
|---|---|
| 첫 번째 인자 | 주석 텍스트 |
xy | 주석이 가리키는 데이터 좌표 (x, y) |
xytext | 주석 텍스트가 표시될 위치 (x, y) |
arrowprops | 화살표 스타일 딕셔너리 |
plt.savefig(
'a.png',
dpi = 300, # 해상도 (기본값: 100, 높을수록 고해상도)
bbox_inches = 'tight', # 여백 제거
transparent = False, # 배경 투명 여부
facecolor = 'black' # 배경 색상 (transparent=False 일 때 사용)
)
plt.show()
💡
savefig()는 반드시plt.show()앞에 호출해야 합니다.
plt.show()이후에는 도화지가 초기화되어 빈 파일이 저장됩니다.
| 매개변수 | 설명 |
|---|---|
fname | 저장할 파일 이름 (.png, .jpg, .svg 등) |
dpi | 해상도 (기본값 100, PPT용은 300 권장) |
bbox_inches | 'tight' → 여백 제거 |
transparent | True → 배경 투명 |
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(값, 소수점) | 반올림 |