6장: Python으로 데이터 시각화하기¶
숫자를 그림으로 — Claude Code로 차트 만들기
목차¶
1. 데이터 시각화란?¶
한 줄 정의¶
숫자와 데이터를 그림(차트)으로 바꿔서 한눈에 보이게 만드는 것
왜 필요한가요?¶
숫자로만 보면:
005930: 87200, 88100, 85600, 91000, 89400, 93200, 91800
차트로 보면:
94000 ┤ ●
92000 ┤ ●────╯
90000 ┤ ● ●────╯
88000 ┤ ●────╯
86000 ┤────╯
└─────────────────────────────────────
월 화 수 목 금 월 화
→ 한 번 하락 후 강한 반등이 한눈에 보임
어디에 쓰나요?¶
| 분야 | 활용 예 |
|---|---|
| 주식·투자 | 주가 변화, 종목 비교, 섹터 비중 |
| 업무·보고서 | 매출 추이, 부서별 실적 |
| 데이터 분석 | 패턴 발견, 이상값 탐지 |
| 일상 | 운동 기록, 지출 분석 |
2. 어떤 도구를 쓰나요?¶
Python 시각화 라이브러리 3종¶
matplotlib → 가장 기본. 모든 차트의 기초
↓
pandas → 엑셀처럼 데이터를 다루고, 바로 차트로
↓
plotly → 마우스로 조작하는 인터랙티브 차트
비교표¶
| 라이브러리 | 난이도 | 특징 | 언제 쓰나 |
|---|---|---|---|
| matplotlib | ★★☆ | 세밀한 제어 가능 | 기본 차트, 저장용 |
| pandas | ★☆☆ | 데이터 정리 + 시각화 한 번에 | CSV·엑셀 데이터 다룰 때 |
| plotly | ★★☆ | 마우스로 확대·축소 가능 | 웹에 올리거나 인터랙티브하게 |
3. 환경 준비¶
패키지 설치¶
터미널에서 실행:
pip install matplotlib pandas plotly
프로젝트 폴더 만들기¶
mkdir data-viz
cd data-viz
claude
Claude Code에 준비 요청¶
data-viz 폴더에서 Python 데이터 시각화 연습을 시작할거야.
빈 파일 3개 만들어줘:
- basic_charts.py (기본 차트 연습)
- stock_chart.py (주식 데이터 시각화)
- interactive.py (plotly 인터랙티브 차트)
4. 기본 차트 4종¶
4-1. 선 그래프 (Line Chart)¶
언제: 시간에 따른 변화를 볼 때 (주가, 매출 추이 등)
Claude Code에 요청:
basic_charts.py에 선 그래프를 그려줘.
삼성전자 주가 데이터 (임의 생성):
날짜: 5월 1일 ~ 5월 10일 (평일만)
주가: 87200, 88100, 85600, 91000, 89400, 93200, 91800
matplotlib으로 그려줘.
제목은 "삼성전자 5월 주가", X축은 날짜, Y축은 주가(원).
결과 예시:
삼성전자 5월 주가
94000 ┤ ●
92000 ┤ ●────╯
90000 ┤ ● ●────╯
88000 ┤ ●────╯
86000 ┤────╯
└─────────────────────────────────────
5/1 5/2 5/3 5/4 5/5 5/8 5/9
4-2. 막대 그래프 (Bar Chart)¶
언제: 여러 항목을 비교할 때 (종목별 수익률, 카테고리별 건수 등)
Claude Code에 요청:
basic_charts.py에 막대 그래프를 추가해줘.
백테스트 결과 D+7 수익률 데이터:
종목: SK하이닉스, 한미반도체, 두산에너빌리티, 레인보우로보틱스, 대한광통신
수익률(%): 12.4, 14.7, 14.6, 9.0, 14.5
막대 색은 양수면 빨간색, 제목은 "뉴스봇 백테스트 D+7 수익률"
결과 예시:
뉴스봇 백테스트 D+7 수익률
15% ┤ ████ ████ ████ ████
12% ┤ ████ ████ ████ ████ ████
9% ┤ ████ ████ ████ ████ ████
0% ┼──────────────────────────────
SK하이 한미반 두산 레인보 대한광
4-3. 원형 그래프 (Pie Chart)¶
언제: 전체에서 각 항목의 비율을 볼 때 (포트폴리오 비중 등)
Claude Code에 요청:
basic_charts.py에 원형 그래프를 추가해줘.
가상의 포트폴리오 구성:
종목: SK하이닉스, 두산에너빌리티, 대한광통신, 레인보우로보틱스, 현금
비중(%): 30, 20, 20, 15, 15
제목은 "포트폴리오 구성 비중"
각 항목에 퍼센트 표시해줘.
4-4. 산점도 (Scatter Plot)¶
언제: 두 데이터가 관계가 있는지 볼 때
Claude Code에 요청:
basic_charts.py에 산점도를 추가해줘.
가상 데이터로 "뉴스 건수 vs 다음날 주가 변동률" 관계를 보여줘.
뉴스 건수: 1~20 (임의 생성)
주가 변동률: 뉴스 건수에 비례하되 노이즈 추가
제목은 "뉴스 건수와 다음날 주가 변동률의 관계"
한 파일에서 모두 보기¶
Claude Code에 요청:
basic_charts.py에서 4개 차트를 하나의 화면에 나란히 보여줘.
plt.subplot(2, 2, ...)으로 2x2 배치해줘.
전체 제목은 "차트 4종 연습"
결과:
┌──────────────────────────────────┐
│ 차트 4종 연습 │
│ ┌──────────┐ ┌──────────┐ │
│ │ 선 그래프 │ │막대그래프 │ │
│ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │원형그래프 │ │ 산점도 │ │
│ └──────────┘ └──────────┘ │
└──────────────────────────────────┘
5. pandas로 데이터 다루기¶
pandas가 뭔가요?¶
엑셀 = pandas
엑셀에서 하는 일:
- 표(시트)에 데이터 넣기
- 정렬, 필터, 합계 계산
- 차트 만들기
pandas도 똑같이, Python으로!
CSV 파일로 실습¶
Claude Code에 요청:
sample_stock.csv 파일을 만들어줘.
내용: 삼성전자 2025년 1월 ~ 5월 주가 (임의 생성)
컬럼: 날짜, 시가, 고가, 저가, 종가, 거래량
그 다음 stock_chart.py에서:
1. pandas로 CSV 파일 불러오기
2. 종가 선 그래프 그리기
3. 거래량 막대 그래프 아래에 추가
pandas 기본 명령어 (Claude Code로 배우기)¶
Claude Code에 요청:
sample_stock.csv를 불러와서 아래를 해줘:
1. 처음 5줄 보기 (head)
2. 기본 통계 (평균, 최대, 최소) 출력
3. 종가가 90000 이상인 날만 필터링
4. 월별 평균 종가 계산
결과를 print로 보여줘.
6. 실전: 주식 데이터 시각화¶
Toss API + 차트 연결¶
뉴스봇(5장)에서 가져온 실제 데이터를 차트로 그립니다.
Step 1: 캔들 데이터 가져오기¶
stock_chart.py에 Toss API로 SK하이닉스(A000660) 최근 30일
캔들 데이터를 가져오는 코드를 써줘.
API: GET https://wts-info-api.tossinvest.com/api/v1/c-chart/kr-s/A000660/day:1
파라미터: count=30, session=all, investMode=krx, useAdjustedRate=true
헤더: Accept: application/json, User-Agent: Mozilla/5.0
가져온 데이터에서 날짜(dt)와 종가(close)를 추출해줘.
Step 2: 실제 데이터 차트¶
가져온 SK하이닉스 실제 데이터로 차트를 그려줘:
- 종가 선 그래프
- 제목에 오늘 날짜와 "SK하이닉스 30일 주가" 표시
- Y축 숫자 단위: 원 (예: 187,500)
Step 3: 백테스트 결과 시각화¶
stock_chart.py에 백테스트 결과를 시각화해줘.
종목별 D+3, D+7 수익률 데이터:
종목 D+3 D+7
SK하이닉스 5.2 12.4
한미반도체 8.1 14.7
두산에너빌리티 6.3 14.6
레인보우로보틱스 4.5 9.0
대한광통신 7.8 14.5
D+3와 D+7을 같은 그래프에 나란히 막대로 보여줘.
색: D+3는 주황, D+7는 빨강
제목: "뉴스봇 백테스트 결과 (6개월)"
결과 예시:
뉴스봇 백테스트 결과 (6개월)
16% ┤ ██ ██ ██ ██
14% ┤ ██ ██ ██ ██ ██
12% ┤ ██ ██ ██ ██ ██ ██
8% ┤ ██ ██ ██ ██ ██ ██ ██
4% ┤ ██ ██ ██ ██ ██ ██ ██
0% ┼────────────────────────────────
SK하이닉스 한미반도체 두산에너 레인보우 대한광통
■ D+3 ■ D+7
7. 인터랙티브 차트 (Plotly)¶
plotly가 뭔가요?¶
matplotlib 차트: plotly 차트:
- 정지된 이미지 - 마우스로 확대/축소
- 저장해서 공유 - 웹 브라우저에서 열림
- 마우스 올리면 값 표시
기본 사용법¶
Claude Code에 요청:
interactive.py에 plotly로 SK하이닉스 주가 차트를 그려줘.
데이터는 위에서 만든 sample_stock.csv 사용.
선 그래프로 종가를 표시하고,
마우스를 올리면 날짜와 주가가 보이게 해줘.
제목: "SK하이닉스 인터랙티브 차트"
실행하면 브라우저에서 자동으로 열리게 해줘.
캔들스틱 차트¶
주식 전용 차트입니다:
Claude Code에 요청:
interactive.py에 캔들스틱 차트를 추가해줘.
sample_stock.csv의 시가, 고가, 저가, 종가를 사용해.
plotly의 go.Candlestick을 써줘.
상승봉: 빨강, 하락봉: 파랑
제목: "SK하이닉스 캔들스틱"
캔들스틱이란:
고가 ─── ┃ ← 위 수염: 그날 최고가
┃
상승 ╔═══╗ ← 몸통 위: 종가 (올랐을 때)
봉 ║ ║
╚═══╝ ← 몸통 아래: 시가
┃
저가 ─── ┃ ← 아래 수염: 그날 최저가
8. 차트 저장하기¶
이미지로 저장 (matplotlib)¶
Claude Code에 요청:
그린 차트들을 이미지로 저장하는 코드를 추가해줘.
- 파일명: chart_오늘날짜.png (예: chart_20260518.png)
- 해상도: 300 DPI (인쇄 품질)
- 저장 폴더: output/
HTML로 저장 (plotly)¶
Claude Code에 요청:
plotly 차트를 HTML 파일로 저장해줘.
파일명: interactive_chart.html
저장하면 "저장 완료: output/interactive_chart.html" 출력해줘.
HTML 파일은 더블클릭으로 브라우저에서 바로 열 수 있습니다.
실습 미션¶
미션 1: 나의 관심 종목 차트¶
Claude Code에 요청:
내가 관심 있는 종목 3개의 최근 30일 주가를
하나의 그래프에 비교해서 보여줘.
Toss API에서 실제 데이터를 가져와.
종목: SK하이닉스(A000660), 두산에너빌리티(A034020), 대한광통신(A010170)
시작 날짜를 100으로 맞춰서 상대적 변화율로 표시해줘.
(= 수익률 비교 차트)
미션 2: 뉴스봇 대시보드¶
Claude Code에 요청:
뉴스봇 실행 결과를 시각화하는 대시보드를 만들어줘.
2x2 레이아웃:
- 왼쪽 위: 백테스트 D+7 수익률 막대그래프
- 오른쪽 위: 인물별 트리거 횟수 막대그래프
- 왼쪽 아래: 카테고리별 채택 종목 수 원형그래프
- 오른쪽 아래: 종목별 D+3 vs D+7 비교
파일명: dashboard.py
실행하면 화면에 표시하고 dashboard.png로 저장해줘.
핵심 요약¶
| 상황 | 쓸 것 | Claude Code 프롬프트 핵심어 |
|---|---|---|
| 시간에 따른 변화 | 선 그래프 | "선 그래프", "plt.plot" |
| 항목 비교 | 막대 그래프 | "막대 그래프", "plt.bar" |
| 비율 표시 | 원형 그래프 | "파이 차트", "plt.pie" |
| 관계 파악 | 산점도 | "산점도", "plt.scatter" |
| 주식 전용 | 캔들스틱 | "캔들스틱", "go.Candlestick" |
| 인터랙티브 | plotly | "plotly", "브라우저에서 열기" |
자주 묻는 질문¶
Q. 차트가 안 열려요.
A. Claude Code에 "차트 창이 안 뜨는데 파일로 저장해줘"라고 요청하세요.
Q. 한글이 깨져요.
A. Claude Code에 "한글 폰트 설정 추가해줘. Mac이야 / Windows야"라고 알려주세요.
Q. 데이터가 없어서 연습 못 하겠어요.
A. Claude Code에 "임의의 샘플 데이터를 만들어줘"라고 하면 됩니다.
Q. 예쁘게 만들고 싶어요.
A. "seaborn 스타일로 바꿔줘" 또는 "다크 테마로 바꿔줘"라고 요청하세요.