소프트웨어와 생활웹 교과서
이 페이지의 목차
3단원 · 6차시

데이터 시각화하기

시각화그래프 선택

코드 예제: Python · 예상 50분

학습 목표

  • 목적에 맞는 시각화 방법을 골라 그래프를 그릴 수 있다.

관련 성취기준

  • [12소생03-03]

    데이터를 분석하고 시각화하여 다양한 사회 현상의 의미를 해석한다.

생각 열기 — 숫자 열두 개와 선 하나

새솔시 달마다 대여 건수 합계다. 어느 달이 가장 많았고, 언제부터 줄기 시작했는지 바로 보이는가?

새솔시 달마다 자전거 대여 건수 합계 (2025)
1월2월3월4월5월6월7월8월9월10월11월12월
21,87420,64132,85358,67888,99776,36062,30176,71184,74171,88744,84225,275

시각화(visualization) — 데이터를 그래프·지도·그림처럼 눈으로 볼 수 있는 모양으로 나타내는 일는 데이터를 눈으로 볼 수 있게 바꾸는 일이다. 사람의 눈은 숫자를 읽는 것보다 높낮이·기울기·몰림을 훨씬 빨리 알아챈다.

목적에 맞는 그래프

보이고 싶은 것 → 고를 그래프
보이고 싶은 것그래프새솔시의 예판다스·맷플롯립
시간에 따른 변화꺾은선 그래프달마다 대여 건수plt.plot(x, y)
묶음끼리 비교막대그래프요일별 평균 대여plt.bar(x, y)
값이 어디에 몰렸나(분포)히스토그램하루 대여 건수는 보통 얼마쯤인가plt.hist(값, bins=12)
두 값의 관계산점도기온이 높은 날 대여도 많은가plt.scatter(x, y)
전체에서 차지하는 몫원그래프대여소별 대여 비율plt.pie(값)

그래프 고르기 실험실

목적 네 가지에 맞는 그래프를 골라 그려 보자. 맞지 않는 그래프를 고르면 왜 맞지 않는지 알려 준다.

그래프 고르기목적에 맞는 그래프를 골라 그려 보자

그래프

그래프 종류를 먼저 골라 보자.

그래프로 거짓말하기

같은 데이터라도 그리는 방법에 따라 전혀 다른 인상을 줄 수 있다. 일부러 속이려는 그래프도 있고, 모르고 잘못 그린 그래프도 있다.

  • 축

    세로축 자르기

    막대그래프의 세로축을 0이 아니라 1,500부터 시작하면, 1,600과 2,300의 차이가 몇 배처럼 보인다. 실험실의 「세로축을 0부터」 스위치를 꺼 보자.

  • 기간

    유리한 기간만

    1년 가운데 대여가 오르던 3~5월만 잘라 보여 주면 「자전거 이용이 폭발적으로 늘고 있다」처럼 보인다.

  • 단위

    합계와 평균 섞기

    날 수가 다른 달의 «합계»를 견주면 31일인 달이 유리하다. 비교할 때는 평균이 공정할 수 있다.

  • 빠짐

    제목·단위·출처 없음

    무엇을 언제 어떤 단위로 쟀는지 없으면 읽는 사람이 제멋대로 해석한다.

파이썬으로 그리기

맷플롯립(matplotlib)은 파이썬에서 그래프를 그리는 도구다. 처음 실행하면 맷플롯립(약 12MB)을 받느라 시간이 걸린다. 받기 어려운 교실에서는 확인된 실행 결과의 그림을 보며 코드를 읽어도 된다.

꺾은선 — 시간에 따른 변화

Python달마다 대여 건수 (꺾은선)
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('bike.csv')
월합계 = df.groupby('월')['대여건수'].sum()

plt.figure(figsize=(7, 3.5))
plt.plot(월합계.index, 월합계.values, marker='o')
plt.title('새솔시 달마다 자전거 대여 건수 (2025)')
plt.xlabel('월')
plt.ylabel('대여 건수')
plt.xticks(range(1, 13))
plt.grid(alpha=0.3)
plt.show()
확인된 실행 결과달마다 대여 건수 (꺾은선) 실행 결과 그림 1

막대 — 묶음끼리 비교

Python요일별 평균 대여 건수 (막대)
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('bike.csv')
요일평균 = df.groupby('요일')['대여건수'].mean()
요일평균 = 요일평균.reindex(['월', '화', '수', '목', '금', '토', '일'])

plt.figure(figsize=(7, 3.5))
plt.bar(요일평균.index, 요일평균.values, color='gray')
plt.title('요일별 평균 대여 건수')
plt.ylabel('대여 건수')
plt.show()
확인된 실행 결과요일별 평균 대여 건수 (막대) 실행 결과 그림 1

reindex 를 빼면 막대가 가나다 차례(금·목·수·월·일·토·화)로 늘어선다. 고치기를 눌러 그 줄을 지우고 실행해 보자. 요일의 흐름이 사라져 주말이 높다는 것이 잘 안 보인다.

산점도 — 두 값의 관계

Python기온과 대여 건수 (산점도)
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('bike.csv')

plt.figure(figsize=(6, 4))
plt.scatter(df['평균기온'], df['대여건수'], alpha=0.4)
plt.title('기온과 대여 건수 (점 하나 = 하루)')
plt.xlabel('평균기온(°C)')
plt.ylabel('대여 건수')
plt.show()
확인된 실행 결과기온과 대여 건수 (산점도) 실행 결과 그림 1

점들이 오른쪽 위로 올라가다가 25℃ 를 넘으면서 다시 내려온다. 상관 계수 0.71 이라는 숫자 하나에는 이 «꺾임»이 담기지 않는다. 그래서 숫자와 그래프를 함께 본다.

코랩(Colab)에서 그릴 때 — 한글 글꼴

이 교과서의 실행기는 한글 글꼴(나눔고딕)을 미리 넣어 둔다. 구글 코랩에서 그대로 그리면 한글이 네모(□)로 나온다. 코랩에서는 그래프를 그리기 전에 한 번 이렇게 글꼴을 설치하고 등록한다.

!apt-get -qq install fonts-nanum
import matplotlib.pyplot as plt
from matplotlib import font_manager
font_manager.fontManager.addfont('/usr/share/fonts/truetype/nanum/NanumGothic.ttf')
plt.rcParams['font.family'] = 'NanumGothic'
plt.rcParams['axes.unicode_minus'] = False
실습

그래프 네 가지

약 20분

위 예제를 고쳐 아래 그래프를 그려 보고, 그래프마다 «한 문장 설명»을 단다.

  1. 꺾은선 예제를 고쳐 달마다 평균기온을 그려 보자. ('대여건수' → '평균기온', sum() → mean())
  2. 막대 예제를 고쳐 계절별 평균 대여 건수를 그려 보자. 차례는 봄·여름·가을·겨울로.
  3. 히스토그램 plt.hist(df['대여건수'], bins=12) 로 하루 대여 건수의 분포를 그려 보자.
  4. 산점도 예제에서 '평균기온' 을 '강수량' 으로 바꿔 보자. 기온과는 모양이 어떻게 다른가?
활동지

내가 그린 그래프 설명

스스로 점검
  • 네 그래프에 설명을 달았다
  • 좋은 그래프의 조건을 적었다

글자 규칙으로 살펴보는 점검표다. 다 켜졌다고 좋은 답이 되는 것은 아니다 — 마지막 판단은 내가 한다.

적은 내용은 이 브라우저에만 저장된다. 다른 컴퓨터로 옮기거나 제출하려면 내려받는다.

확인 문제

개념 확인 문제

보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.

「1년 동안 달마다 대여가 어떻게 늘고 줄었나」를 보이기에 가장 알맞은 그래프는?12소생03-03

두 값(기온, 대여 건수)이 함께 움직이는지 보려면 어떤 그래프를 그려야 하나?12소생03-03

요일별 평균 대여 막대그래프의 세로축을 1,500부터 시작했다. 어떤 문제가 생기나?12소생03-03

상관 계수 0.71 만 보고 산점도를 그리지 않으면 놓치는 것은?12소생03-03

이 차시는 C 예제를 제공하지 않는다. 상단에서 다른 언어로 바꾸면 예제를 볼 수 있다.

교과서에서 찾기

이 차시에 대응하는 교과서 위치가 아직 정리되지 않았다. [확인필요]