축과 단위를 표시한 그래프
100분 안팎
학습 목표
로컬 matplotlib로 날짜별 선 그래프와 강수 그룹별 분포 그래프에 축·단위·범례·표본 수를 표시합니다.
개념
축은 숫자의 의미를 전달합니다
같은 데이터도 축 범위를 바꾸면 작은 차이가 크게 보일 수 있습니다. 그래프 작업의 목표는 결과를 강조하는 것보다 비교 가능한 눈금을 제공하는 것입니다. 이번 실습은 matplotlib로 날짜별 선 그래프와 강수 그룹별 분포 그림을 만듭니다. 각 그림에서 가로축의 관측 단위와 세로축의 단위를 읽고 표본 수가 어느 자료를 세는지 설명할 수 있어야 합니다.
일별 통행량의 세로축은 Traffic (vehicles/region-day), 가로축은 Date (Asia/Seoul)로 적습니다. 이 날짜는 앞 단계에서 정제한 현지 날짜이며 새 시간대 변환을 수행하지 않습니다. A와 B를 범례로 구분하고 각 지역의 유효 교통 관측 수를 함께 표시합니다. 그림 제목에는 합성 자료라는 사실을 남겨 실제 지역의 교통 정책 근거로 오인하지 않게 합니다.
선으로 이어도 되는 지점을 정합니다
시간 순서의 변화에는 선 그래프를 사용할 수 있습니다. 먼저 date.fromisoformat으로 날짜를 변환하고 기간의 모든 날짜를 만듭니다. 문자열 순서가 우연히 날짜 순서와 같아도 날짜 자료형을 사용하면 일 간격을 명시할 수 있습니다. 월이 바뀌거나 날짜가 빠진 사례를 다룰 때 단순 범주 축보다 시간 간격이 잘 드러납니다.
A의 마지막 날짜는 교통 결측입니다. 이 지점을 삭제하고 앞뒤 관측을 이어 그리면 기록하지 않은 구간을 관측한 것처럼 보이게 할 수 있습니다. 실습에서는 누락된 날짜를 math.nan으로 남겨 선을 끊습니다. B 마지막 날짜에는 교통90대가 있고 강수만 결측이므로 시계열에는 남깁니다. 강수 비교에서 제외되는 행이 교통 시계열에도 항상 제외되는 것은 아닙니다.
시계열 범례의 A n=2, B n=3은 교통량이 있는 지역·날짜 수입니다. 두 수의 합5는 분포 그림의 완전 사례4와 다릅니다. 서로 다른 그림에 n=4라는 공통 설명을 복사하면 한 그림의 실제 관측을 숨깁니다. 그림마다 포함 조건을 먼저 고르고 그 조건에 맞춰 표본 수를 계산합니다. 같은 입력 파일을 썼다는 사실만으로 같은 분모가 되는 것은 아닙니다.
분포는 점과 상자로 확인합니다
강수 그룹별 분포 그림은 강수와 교통이 모두 있는 지역·날짜만 사용합니다. 실습의 강수 기준은1mm 이상이고 그보다 작으면 dry입니다. dry 값은80과0, rain 값은100과120입니다. 범례에 dry n=2와 rain n=2를 적고 점 하나가 지역·날짜 한 관측이라는 제목을 붙입니다. 단위를 차량 자체의 개수와 혼동하지 않습니다.
상자그림은 중앙값과 사분위 구간을 요약하지만 n=2인 표본에서는 분포의 형태를 잘 설명하지 못합니다. 따라서 관측 점을 같이 그려 실제 값이 두 개뿐임을 보여 줍니다. 두 점이 겹치면 겹침 수를 표에 남기거나 위치 흔들기를 고려하지만 위치를 흔들 때에는 실제 범주 의미를 바꾸지 않습니다. 이번 작은 표본에서는 원래 그룹 위치에 점을 둡니다.
빈 그룹을0대 한 관측으로 바꾸지 않습니다. 그룹의 값 목록이 비어 있으면 상자를 그리지 않고 n=0 / NA 표시를 남깁니다. 평균 규모를 비교하는 막대는0을 기준으로 길이를 읽게 합니다. 선 그래프에서 일부 범위를 확대할 필요가 있다면 축 범위와 확대 목적을 표시하고 전체 범위 그림도 제공해 독자가 차이의 실제 규모를 확인하게 합니다.
그림 파일을 재현 가능한 산출물로 만듭니다
matplotlib.use("Agg")는 화면 창 대신 파일을 생성하는 백엔드를 선택합니다. pyplot을 가져오기 전에 설정합니다. fig, ax = plt.subplots()로 그림과 축을 만들고 ax.set, ax.legend로 이름과 범례를 설정합니다. plt.show에 의존하지 않고 fig.savefig로 저장하면 창을 열 수 없는 환경에서도 동일한 입력을 그림 파일로 전달할 수 있습니다.
출처·기간·결측 정책은 fig.text로 그림 아래에 쓰고 tight_layout의 rect로 그 영역을 확보합니다. 저장 전에 글자가 잘리는지 확인합니다. 한글 폰트가 없는 환경에서 깨지는 문제를 줄이기 위해 그림 축은 영문으로 표시하고 보고서에 한국어 설명을 함께 둡니다. Glyph missing 경고는 데이터 계산 오류가 아니라 글꼴 문제이지만 글자를 읽을 수 없으면 전달 결과는 미완성입니다.
그림을 저장한 뒤 plt.close(fig)로 해당 그림의 메모리를 해제합니다. 두 그림을 만들 때 이전 축이나 범례가 다음 파일에 남지 않도록 각각 새 Figure를 만듭니다. PNG 서명과 파일 크기 검사는 파일이 생성되었는지만 보여 줍니다. 눈금과 표본 수의 뜻, 문구 잘림, 색상 구별 여부는 파일을 직접 열어 확인해야 합니다.
실행 환경의 오류를 구분합니다
로컬 data-axes ZIP에는 앞 모듈 코드와 axes.py, requirements.txt, check.sh가 있습니다. 가상 환경에 matplotlib==3.9.4를 설치한 뒤 python3 axes.py로 figures/daily.png와 distribution.png를 만듭니다. bash check.sh는 기존 회귀 검사와 새 그룹·PNG 검사를 실행합니다. 이 작성 환경은 설치 다운로드가 막혀 matplotlib 실행을 외부 검증 대기로 표시했습니다. 실행하지 못한 그림 출력은 따라하기 결과로 적지 않습니다.
ModuleNotFoundError: No module named matplotlib가 나오면 현재 python3가 가상 환경의 실행 파일인지 확인하고 같은 python3 -m pip로 requirements.txt를 설치합니다. SSL 또는 연결 오류는 네트워크와 설치 경로를 확인할 문제이며 그림 코드의 정답 여부를 판정할 근거가 아닙니다. 기존 데이터 테스트가 실패하면 파일 생성부터 고치기보다 앞 모듈의 입력과 지표 정의가 유지되는지 확인합니다.
제출할 때 그림 두 장과 실행 명령, 원래 데이터에서 고른 값 목록을 함께 냅니다. A 마지막 날짜가0으로 내려가지 않는지, B 마지막90대가 보이는지, 분포의 관측 점이 네 개인지 직접 확인합니다. R 그래프 장의 개념은 더 읽기로 보내고 여기서는 Python의 파일 저장과 우리 프로젝트의 분모 차이에 집중합니다.
따라하기
그림별 분모 계산
코드를 독립적으로 실행하고 결과를 확인합니다.
rows=[(100,3),(80,0),(None,None),(120,10),(0,0),(90,None)]
print('time series n=',sum(v is not None for v,r in rows),sep='')
print('distribution n=',sum(v is not None and r is not None for v,r in rows),sep='')실행 결과
time series n=5 distribution n=4
날짜와 결측 간격 준비
코드를 독립적으로 실행하고 결과를 확인합니다.
from datetime import date,timedelta
import math
dates=[date(2026,9,1)+timedelta(days=i) for i in range(3)]
values=[100,80,math.nan]
for d,v in zip(dates,values): print(d, 'gap' if math.isnan(v) else v)실행 결과
2026-09-01 100 2026-09-02 80 2026-09-03 gap
matplotlib 파일 생성과 직접 점검
data-axes ZIP 루트에서 가상 환경을 만들고 다음 명령을 실행합니다. 작성 환경에서는 설치 네트워크가 막혀 실행하지 못했습니다. 생성한 두 PNG의 축·기간·범례·n과 결측 구간을 직접 확인합니다. bash check.sh는 회귀와 그룹·PNG 서명을 검사합니다.
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
python3 axes.py
bash check.sh확인 문제
실습
data-axes ZIP에서 axes.py를 완성합니다. python3 -m venv .venv 후 pip install -r requirements.txt로 matplotlib==3.9.4를 설치하고 README-axes.md의 명령을 실행합니다. A 결측은 선 단절, B 마지막90대는 유지, 시계열n=5·분포n=4를 확인합니다. 두 PNG에 축·단위·기간·출처·표본 수·결측 정책을 표시합니다. check.sh는 기존 회귀 및 강수 그룹·PNG 파일 검사를 수행합니다. 눈금과 문구 잘림은 파일을 열어 별도로 확인합니다.
실행 명령
bash check.sh
기대 결과
의존성 설치 후 기존53개+새1개 통과; daily.png·distribution.png 생성. venv에 matplotlib==3.9.4 설치 후 solution 54개 통과·starter는 PNG 그룹 테스트 1개 실패로 확인.
모범 답안
모범 답안 내려받기더 읽기
면접 질문
- 공개 데이터로 만든 그래프의 신뢰성을 확인하는 방법을 설명해 주시면 됩니다.