데이터 분석을 공부하면서 가장 중요한 것 중 하나는 "데이터를 어떻게 시각화해서 통찰력을 얻느냐"입니다. 오늘은 파이썬의 대표적인 시각화 라이브러리인 Matplotlib의 핵심 개념과 스타일링 방법을 정리하고, 실제 Kaggle의 Online Retail 데이터를 분석하며 시각화까지 연결하는 과정을 기록해 봅니다.
Matplotlib 기초
Matplotlib은 파이썬에서 데이터를 시각화하는 데 가장 널리 사용되는 강력한 라이브러리입니다. 선 그래프, 막대 그래프, 산점도 등 기본적인 그래프부터 복잡한 3D 플롯까지 지원하며, NumPy 및 Pandas와 완벽하게 호환됩니다.
1. 설치 및 기본 구조
먼저 라이브러리를 설치하고 기본 구조를 이해해야 합니다.
pip install matplotlib
Matplotlib의 그래프는 크게 세 가지 요소로 구성됩니다.
- Figure: 전체 그림을 담는 도화지
- Axes: 하나의 서브 그래프 (보통 x축, y축 포함)
- Axis: x축과 y축 자체
2. 기본적인 그래프 그리기
가장 많이 사용하는 pyplot 모듈을 이용한 기본 예제입니다.
import matplotlib.pyplot as plt
import numpy as np
# 1. 리스트 하나만 넣으면 Y축 데이터로 인식 (X축은 자동 생성)
plt.plot([1, 2, 3, 4])
plt.show()
# 2. X축, Y축 데이터 모두 지정
plt.plot([1, 2, 3, 4], [1, 2, 3, 4])
plt.show()
# 3. NumPy 배열 활용
data = np.arange(1, 100)
plt.plot(data)
plt.show()

3. 한글 폰트 설정 (Colab 환경)
한글이 포함된 그래프를 그릴 때 글자가 깨지는 현상을 방지하기 위해 폰트 설정이 필수입니다.
# 폰트 설치 및 캐시 삭제 (설치 후 런타임 재시작 필요할 수 있음)
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
# 한글 폰트 지정
plt.rc('font', family='NanumBarunGothic')
4. 그래프 스타일링 (심화)
그래프의 가독성을 높이기 위해 제목, 축 라벨, 마커, 범례 등을 설정하는 방법입니다.
plt.figure(figsize=(15, 10))
plt.title('마커설정', fontsize=30)
# 다양한 스타일 적용
# color: 색상, marker: 점 모양, linestyle: 선 모양, ms: 마커 크기
plt.plot(np.arange(10), np.arange(10), color='deepskyblue', marker='o', linestyle='-.')
plt.plot(np.arange(10), np.arange(10)*2, color='deeppink', marker='v', linestyle='--')
plt.plot(np.arange(10), np.arange(10)*3, color='gold', marker='*', ms=10, linestyle='')
# 범례 표시 (위치: 우측 하단, 3열로 배치)
plt.legend(['10', '10x2', '10x3'], fontsize=15, loc='lower right', ncol=3)
# 축 범위 및 눈금 설정
plt.xlim(0, 12)
plt.ylim(0, 30)
# 눈금 라벨 회전 (글자가 겹칠 때 유용)
plt.xticks(rotation=30)
plt.yticks(rotation=30)
plt.savefig('my_plot.png') # 이미지 파일로 저장
plt.show()

5. 막대 그래프와 객체 지향 인터페이스
Pandas 데이터프레임과 subplots를 활용하여 더 깔끔하게 그래프를 그리는 방법입니다.
import pandas as pd
# 데이터 준비
x = ['파이썬', '웹개발', '데이터분석', '머신러닝', '딥러닝', '컴퓨터비전']
y = [95, 70, 75, 60, 50, 30]
df = pd.DataFrame({"과목":x, "점수":y})
# 객체 지향 방식 (Figure와 Axes 활용)
fig, ax = plt.subplots(figsize=(5, 4))
ax.bar(df["과목"], df["점수"])
# 라벨 및 타이틀 설정
ax.set_xlabel("과목", fontsize=12)
ax.set_ylabel("점수", fontsize=12)
ax.set_title("코리아 학생 점수", fontsize=20)
ax.set_xticks(range(len(df.index))) # 눈금 위치 고정
plt.tight_layout() # 레이아웃 자동 정렬
plt.show()

실전 프로젝트: Online Retail 데이터 분석
이론을 익혔으니 실전 데이터를 다뤄봅니다. Kaggle의 Online Retail II 데이터셋을 활용해 실제 매출 데이터를 분석하고 시각화해 보았습니다.
1. 데이터 로드 및 전처리
데이터를 불러온 후, 분석에 방해가 되는 결측치와 이상치를 제거합니다.
# 데이터 로드 (Kaggle API 활용 가정)
import pandas as pd
retail = pd.read_csv('/content/online_retail_II.csv')
# 전처리 1: 회원 정보가 없는 데이터 제거
retail = retail[pd.notnull(retail['Customer ID'])]
# 전처리 2: 취소 주문(수량<=0) 및 가격 오류(가격<=0) 제거
retail = retail[retail['Quantity'] >= 1]
retail = retail[retail['Price'] > 0]
# 파생변수 생성: 총 매출(CheckoutPrice) = 가격 * 수량
retail['CheckoutPrice'] = retail['Price'] * retail['Quantity']
retail['InvoiceDate'] = pd.to_datetime(retail['InvoiceDate'])
2. 국가별 매출 분석 (Revenue By Country)
어떤 나라에서 매출이 가장 많이 발생하는지 groupby와 막대 그래프로 확인합니다.
# 국가별 매출 집계
rev_by_countries = retail.groupby('Country')['CheckoutPrice'].sum().sort_values()
# 시각화
fig, ax = plt.subplots(figsize=(20, 10))
ax.bar(rev_by_countries.index, rev_by_countries.values)
ax.set_xlabel('Country', fontsize=12)
ax.set_ylabel('Revenue', fontsize=12)
ax.set_title('Revenue By Country', fontsize=15)
ax.set_xticklabels(rev_by_countries.index, rotation=45)
plt.tight_layout()
plt.show()

3. 월별 매출 분석 (Revenue By Month)
날짜 데이터에서 '년-월'을 추출하여 월별 매출 추이를 살펴봅니다.
# 년-월 추출 함수
def extract_month(date):
month = str(date.month)
if date.month < 10:
month = '0' + month
return str(date.year) + month
# 월별 그룹화 및 집계
rev_by_month = retail.set_index('InvoiceDate').groupby(extract_month)['CheckoutPrice'].sum()
# (그래프 그리는 코드는 위와 유사하여 생략, 결과 확인)
plot_bar(rev_by_month, 'Month', 'Revenue', 'Revenue By Month')

4. 요일 및 시간대별 분석
마케팅 전략 수립을 위해 고객이 주로 주문하는 요일과 시간을 분석합니다.
# 요일별 매출 분석
import numpy as np
rev_by_dow = retail.set_index('InvoiceDate').groupby(lambda date: date.dayofweek)['CheckoutPrice'].sum()
DAY_OF_WEEK = np.array(['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'])
rev_by_dow.index = DAY_OF_WEEK[rev_by_dow.index]
plot_bar(rev_by_dow, 'DOW', 'Revenue', "Revenue By DOW")
# 시간대별 매출 분석
rev_by_hour = retail.set_index("InvoiceDate").groupby(lambda date: date.hour)['CheckoutPrice'].sum()
plot_bar(rev_by_hour, "Hour", "Revenue", "Revenue By Hour")

마무리
이번 학습을 통해 Matplotlib의 다양한 스타일링 옵션을 익히고, 이를 실전 데이터 분석에 적용해 보았습니다. 데이터를 단순히 표로 보는 것보다 그래프로 시각화했을 때, 국가별 격차나 시간대별 패턴이 훨씬 명확하게 보인다는 것을 확인할 수 있었습니다.
앞으로도 데이터 전처리 능력과 시각화 스킬을 함께 키워나가야겠습니다!
'개념 정리 step1 > 데이터 분석' 카테고리의 다른 글
| [데이터 분석] 저가 커피 프랜차이즈는 정말 스타벅스 옆에 입점할까? (feat. Haversine) (0) | 2025.12.10 |
|---|---|
| [Python] Selenium을 활용한 웹 크롤링 (0) | 2025.12.05 |
| [Python] 웹 크롤링 개념 정리와 데이터 수집 해보기 (0) | 2025.12.04 |
| [Python] 데이터 분석 기초 Pandas (2) (0) | 2025.12.04 |
| [Python] 데이터 분석의 기초 Numpy, Pandas(1) (0) | 2025.12.03 |