[Python] Matplotlib 정리 & 데이터 분석 (Online Retail)

2025. 12. 9. 16:24·개념 정리 step1/데이터 분석

데이터 분석을 공부하면서 가장 중요한 것 중 하나는 "데이터를 어떻게 시각화해서 통찰력을 얻느냐"입니다. 오늘은 파이썬의 대표적인 시각화 라이브러리인 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
'개념 정리 step1/데이터 분석' 카테고리의 다른 글
  • [데이터 분석] 저가 커피 프랜차이즈는 정말 스타벅스 옆에 입점할까? (feat. Haversine)
  • [Python] Selenium을 활용한 웹 크롤링
  • [Python] 웹 크롤링 개념 정리와 데이터 수집 해보기
  • [Python] 데이터 분석 기초 Pandas (2)
고니3000원
고니3000원
프로젝트의 구현 과정과 기술적 노하우를 담았습니다. AI 모델 연구와 매일의 학습 기록을 차곡차곡 공유하고 있습니다. [ 매너 & 태도 ] * 항상 겸손해라.
늘 자신을 낮추고 겸손함을 잃지 마라.
 * 나이 불문 예의를 지켜라.
나이와 지위를 막론하고, 누구에게나 변함없는 예의를 갖추어라.
 * 행복하겠다는 생각을 버려야 행복하다.
행복에 대한 강박과 집착을 내려놓을 때, 비로소 진정한 행복이 찾아온다.
 [ 리더십 & 실행 ] * 통찰력, 결단력,
  • 고니3000원
    곤이의 공부 블로그
    고니3000원
  • 전체
    오늘
    어제
    • 분류 전체보기 (212) N
      • 1. AI 논문 + 모델 분석 (21)
        • AI 논문 분석 (13)
        • AI 모델 분석 (8)
      • 2. 자료구조와 알고리즘 (16)
        • 2-1 자료구조와 알고리즘 (13)
        • 2-2 강화학습 알고리즘 (3)
      • 3. 자습 & 메모(실전, 실습, 프로젝트) (27)
        • 3-1 문제 해석 (4)
        • 3-2 메모(실전, 프로젝트) (14)
        • 3-3 배포 실전 공부 (7)
        • 3-4 최신 기술 분석 (2)
      • 4. [팀] 프로젝트 및 공모전 (31)
        • 4-1 팀 프로젝트(메모, 공부) (1)
        • 4-2 Meat-A-Eye (6)
        • 4-3 RL-Tycoon-Agent (3)
        • 4-4 구조물 안정성 물리 추론 AI 경진대회(D.. (4)
        • 4-5 AgentShield(보안 플랫폼) (17)
      • 5. [개인] 프로젝트 및 공모전 (21) N
        • 4-1 귀멸의칼날디펜스(자바스크립트 활용) (5)
        • 4-2 바탕화면 AI 펫 프로그램 (4)
        • 4-3 개인 프로젝트(기타) (3)
        • 4-4 공모전 (5) N
        • 4-5 나만의 로컬 LLM 멀티 에이전트 구축 (4)
      • 개념 정리 step1 (32)
        • Python 기초 (7)
        • DBMS (1)
        • HTML | CSS (3)
        • Git | GitHub (1)
        • JavaScript (5)
        • Node.js (5)
        • React (1)
        • 데이터 분석 (6)
        • Python Engineering (3)
      • 개념 정리 step2 (60)
        • Machine | Deep Learning (15)
        • 멀티모달(Multi-modal) (23)
        • 강화 학습 (10)
        • AI Agent (9)
        • 메디컬 이미지 (3)
      • 개인 공부 - 내가 공부하고 싶은 모든 것 (2)
        • 1. 인프라 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Notion-포트폴리오
    • Github
  • 공지사항

    • ‘박영곤’ 나의 핵심 가치
  • 인기 글

  • 태그

    pandas
    자바스크립트
    파이썬
    transformer
    llm
    Vision
    paddleocr
    OCR
    API
    RAG
    Ollama
    Lora
    프로젝트
    자료구조
    ViT
    인공지능
    보안
    Python
    논문 리뷰
    구현
    학습
    github
    Ai
    데이터분석
    Agent
    알고리즘
    전처리
    강화학습
    파인튜닝
    공모전
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고니3000원
[Python] Matplotlib 정리 & 데이터 분석 (Online Retail)
상단으로

티스토리툴바