Skip to main content
Summary

이 장에서 배울 것

이번 장에서는 정리한 데이터를 그래프로 표현하는 방법을 배웁니다. 표는 정확하지만 한눈에 보기 어렵습니다. 반대로 그래프는 복잡한 숫자 속에서 패턴을 빠르게 발견하게 해 줍니다.

이 장을 끝내면 다음을 할 수 있어야 합니다.

  • pandas와 matplotlib으로 기본 그래프를 그린다.

  • 분포, 비교, 변화, 관계에 맞는 그래프를 고른다.

  • 막대그래프, 선그래프, 히스토그램, 산점도를 만든다.

  • 그래프에 제목, 축 이름, 범례를 붙인다.

  • 그래프를 보고 보이는 점과 추가로 확인할 점을 구분해 적는다.

  • 축 왜곡, 잘못된 그래프 선택, 상관관계 오해를 피한다.

핵심은 단순합니다. 표만 보면 보이지 않던 패턴도 그래프로 바꾸면 질문과 인사이트가 선명해집니다.

데이터 시각화

왜 이 주제가 중요한가

데이터 분석에서 그래프는 장식이 아닙니다. 그래프는 데이터를 이해하는 도구입니다.

예를 들어 학생들의 수학 점수 평균만 보면 "전체 수준이 어느 정도인지"는 알 수 있습니다. 하지만 점수가 고르게 퍼져 있는지, 특정 구간에 몰려 있는지, 공부시간이 늘수록 점수도 높아지는지까지는 평균 하나로 알기 어렵습니다.

이때 그래프가 필요합니다.

  • 점수의 퍼짐을 보고 싶으면 히스토그램을 그립니다.

  • 학년별 평균을 비교하고 싶으면 막대그래프를 그립니다.

  • 날짜별 변화가 궁금하면 선그래프를 그립니다.

  • 공부시간과 점수의 관계를 보고 싶으면 산점도를 그립니다.

생성형 AI에게 데이터를 설명해 달라고 요청할 수도 있습니다. 하지만 AI가 만든 설명이 맞는지 확인하려면 우리가 직접 데이터와 그래프를 볼 수 있어야 합니다. 시각화는 AI 답변을 검증하는 가장 쉬운 첫 단계입니다.

핵심 개념 설명

그래프를 고르는 기준

그래프는 예쁜 모양으로 고르는 것이 아닙니다. 질문에 맞게 고르는 것입니다.

보고 싶은 것알맞은 그래프예시 질문
값이 어떻게 퍼져 있는가히스토그램수학 점수는 어느 구간에 몰려 있는가?
항목끼리 얼마나 다른가막대그래프학년별 평균 점수는 어떻게 다른가?
시간에 따라 어떻게 변하는가선그래프날짜별 평균 점수는 올라가는가?
두 변수는 함께 움직이는가산점도공부시간이 길수록 점수가 높은가?

처음에는 이 네 가지만 익혀도 충분합니다. 더 복잡한 그래프는 나중에 배워도 됩니다.

matplotlib과 pandas plot

Python에서 그래프를 그릴 때 많이 쓰는 도구가 matplotlib입니다. 그래프의 기본 요소를 직접 조정할 수 있는 대표적인 시각화 도구입니다.

pandas에도 그래프 기능이 들어 있습니다. pandas의 plot()은 내부적으로 matplotlib을 사용합니다. 그래서 간단한 그래프는 pandas로 빠르게 그리고, 제목이나 축 이름 같은 세부 요소는 matplotlib으로 다듬는 방식이 좋습니다.

import pandas as pd
import matplotlib.pyplot as plt

보통 이 두 줄로 시작합니다. pd는 pandas의 줄임 이름이고, plt는 matplotlib의 그래프 기능을 부르는 줄임 이름입니다.

좋은 그래프의 기본 요소

그래프에는 최소한 다음 요소가 있어야 합니다.

  • 제목: 무엇을 보여 주는 그래프인지 알려 줍니다.

  • x축 이름: 가로축이 무엇인지 알려 줍니다.

  • y축 이름: 세로축이 무엇인지 알려 줍니다.

  • 범례: 선이나 색이 여러 개일 때 각각의 의미를 알려 줍니다.

  • 단위: 점수, 원, 명, 시간처럼 값의 기준을 알려 줍니다.

그래프를 보는 사람은 데이터를 만든 사람이 아닐 수 있습니다. 따라서 그래프는 혼자만 알아보는 그림이 아니라, 다른 사람에게 설명할 수 있는 자료여야 합니다.

쉬운 비유 또는 사례

표 데이터는 재료 목록과 비슷합니다. 밀가루 500g, 설탕 80g, 우유 200ml처럼 정확한 숫자가 적혀 있습니다. 하지만 목록만 보고 완성된 빵의 모양을 상상하기는 어렵습니다.

그래프는 재료를 펼쳐 놓은 조리대와 같습니다. 어떤 재료가 많은지, 어떤 재료가 부족한지, 이상한 재료가 섞여 있는지 한눈에 보입니다.

데이터도 마찬가지입니다. 표에는 모든 값이 들어 있지만, 패턴은 숨어 있습니다. 그래프는 그 패턴을 눈앞으로 꺼내는 도구입니다.

직접 해보는 실습

이번 실습에서는 「데이터 읽기와 정리」에서 저장한 students_clean.csv를 사용합니다. 파일이 없다면 그 장의 예시 데이터를 정리한 뒤 저장하거나, 같은 열 이름을 가진 CSV 파일을 준비하면 됩니다.

선그래프 실습에는 날짜 열이 필요합니다. 만약 정리본을 저장할 때 시험일 열을 제외했다면, 해당 실습에서는 원본 students.csv를 다시 읽어 날짜 열을 변환하는 방법도 함께 보여 드리겠습니다.

1단계: 데이터 불러오기

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('students_clean.csv')
df.head()

먼저 데이터가 제대로 열렸는지 확인합니다.

df.info()
df.describe()

그래프를 그리기 전에도 데이터 확인은 필요합니다. 결측치가 많거나 숫자 열이 문자로 읽히면 그래프가 이상하게 나올 수 있습니다.

2단계: 히스토그램으로 분포 보기

히스토그램은 값이 어느 구간에 얼마나 많이 모여 있는지 보여 줍니다. 수학 점수의 분포를 확인해 봅시다.

df['수학점수'].plot(kind='hist', bins=5)
plt.title('Distribution of Math Scores')
plt.xlabel('Math Score')
plt.ylabel('Number of Students')
plt.show()

bins는 구간의 개수입니다. 구간을 너무 적게 잡으면 정보가 뭉개지고, 너무 많이 잡으면 그래프가 복잡해집니다. 처음에는 5개에서 10개 정도로 시작해도 좋습니다.

그래프 아래에는 이렇게 적어 봅니다.

  • 무엇이 보이는가: 수학 점수가 어느 구간에 많이 모여 있는지 확인할 수 있다.

  • 추가로 확인할 것은 무엇인가: 결측치가 빠진 상태인지, 이상치가 제거되었는지 확인해야 한다.

3단계: 막대그래프로 항목 비교하기

막대그래프는 항목 간 크기를 비교할 때 좋습니다. 학년별 평균 수학 점수를 비교해 봅시다.

grade_math = df.groupby('학년')['수학점수'].mean()

grade_math.plot(kind='bar')
plt.title('Average Math Score by Grade')
plt.xlabel('Grade')
plt.ylabel('Average Math Score')
plt.ylim(0, 100)
plt.show()

여기서 groupby('학년')은 학년별로 데이터를 묶는다는 뜻입니다. 그 뒤 ['수학점수'].mean()은 각 학년의 수학점수 평균을 구합니다.

plt.ylim(0, 100)은 y축 범위를 0점부터 100점까지로 맞춥니다. 점수 데이터에서는 이렇게 실제 가능한 범위를 고려하는 것이 좋습니다. 축을 너무 좁게 잡으면 작은 차이가 아주 큰 차이처럼 보일 수 있습니다.

그래프 아래에는 이렇게 적어 봅니다.

  • 무엇이 보이는가: 학년별 평균 수학 점수 차이를 비교할 수 있다.

  • 추가로 확인할 것은 무엇인가: 학년별 학생 수가 충분한지 확인해야 한다. 학생 수가 너무 적으면 평균이 쉽게 흔들린다.

4단계: 산점도로 두 변수의 관계 보기

산점도는 두 수치형 변수가 어떤 관계를 보이는지 확인할 때 사용합니다. 공부시간과 수학점수의 관계를 살펴봅시다.

df.plot(kind='scatter', x='공부시간', y='수학점수')
plt.title('Study Hours and Math Score')
plt.xlabel('Study Hours')
plt.ylabel('Math Score')
plt.ylim(0, 100)
plt.show()

점들이 오른쪽 위로 올라가는 모양이면 공부시간이 길수록 점수가 높은 경향이 있을 수 있습니다. 하지만 여기서 조심해야 합니다. 산점도에서 함께 움직이는 모습이 보인다고 해서 바로 원인과 결과라고 말할 수는 없습니다.

예를 들어 공부시간이 길어서 점수가 높을 수도 있지만, 원래 수학을 좋아하는 학생이 공부도 더 오래 했을 수 있습니다. 또는 학원, 이전 성적, 시험 난이도 같은 다른 요인이 영향을 주었을 수도 있습니다.

그래프 아래에는 이렇게 적어 봅니다.

  • 무엇이 보이는가: 공부시간과 수학점수 사이에 어떤 방향의 관계가 있는지 볼 수 있다.

  • 추가로 확인할 것은 무엇인가: 표본 수가 충분한지, 다른 영향을 주는 변수가 있는지 확인해야 한다.

5단계: 선그래프로 시간 흐름 보기

선그래프는 시간에 따른 변화를 볼 때 사용합니다. students_clean.csv 안에 시험일 열이 남아 있다면 그 열을 사용하면 됩니다.

# 정리본에 시험일 열이 있는 경우
df['시험일'] = pd.to_datetime(df['시험일'], errors='coerce')
score_by_date = df.groupby('시험일')['수학점수'].mean()

score_by_date.plot(kind='line', marker='o')
plt.title('Average Math Score by Exam Date')
plt.xlabel('Exam Date')
plt.ylabel('Average Math Score')
plt.ylim(0, 100)
plt.show()

만약 정리본에 시험일 열이 없다면, 원본 파일에서 날짜와 점수 열을 다시 읽어 연습할 수 있습니다.

# 정리본에 시험일 열이 없는 경우: 원본에서 필요한 열을 다시 확인
df_date = pd.read_csv('students.csv')
df_date['exam_date'] = pd.to_datetime(df_date['exam_date'], errors='coerce')

score_by_date = df_date.groupby('exam_date')['math_score'].mean()

score_by_date.plot(kind='line', marker='o')
plt.title('Average Math Score by Exam Date')
plt.xlabel('Exam Date')
plt.ylabel('Average Math Score')
plt.ylim(0, 100)
plt.show()

두 코드 중 자신의 파일 구조에 맞는 하나만 실행하면 됩니다. 중요한 것은 그래프 코드보다 데이터에 필요한 열이 실제로 있는지 먼저 확인하는 습관입니다.

선그래프는 x축에 순서가 있을 때 적합합니다. 날짜, 월, 연도처럼 시간이 흐르는 데이터에 잘 맞습니다. 반대로 지역이나 메뉴처럼 순서가 없는 항목을 선으로 연결하면 관계가 있는 것처럼 오해할 수 있습니다.

그래프 아래에는 이렇게 적어 봅니다.

  • 무엇이 보이는가: 날짜별 평균 점수의 변화 방향을 볼 수 있다.

  • 추가로 확인할 것은 무엇인가: 날짜별 학생 수가 다르면 평균 비교가 공정하지 않을 수 있다.

6단계: 한 번에 여러 열 비교하기

수학점수와 영어점수를 함께 비교하고 싶을 때는 막대그래프를 나란히 그릴 수 있습니다.

grade_scores = df.groupby('학년')[['수학점수', '영어점수']].mean()

grade_scores.plot(kind='bar')
plt.title('Average Scores by Grade')
plt.xlabel('Grade')
plt.ylabel('Average Score')
plt.ylim(0, 100)
plt.legend(['Math', 'English'])
plt.show()

여러 값을 함께 보여 줄 때는 범례가 꼭 필요합니다. 범례가 없으면 어떤 막대가 수학이고 어떤 막대가 영어인지 알 수 없습니다.

흔한 실수와 오류 분석

예쁜 그래프를 먼저 만들려고 한다

초보자는 색, 글꼴, 디자인에 먼저 관심을 갖기 쉽습니다. 하지만 분석에서 더 중요한 것은 정확한 그래프입니다.

먼저 확인해야 할 것은 다음입니다.

  • 그래프 종류가 질문에 맞는가?

  • 축 이름과 단위가 있는가?

  • 결측치와 이상치 처리가 적절한가?

  • 그래프가 실제 차이를 과장하거나 축소하지 않는가?

디자인은 그다음입니다.

축을 왜곡한다

막대그래프에서 y축을 90부터 시작하면 92점과 96점의 차이가 매우 크게 보일 수 있습니다. 차이를 강조할 수는 있지만, 보는 사람을 오해하게 만들 수도 있습니다.

특히 점수, 비율, 금액처럼 크기 비교가 중요한 그래프에서는 축 범위를 신중하게 정해야 합니다. 축을 조정했다면 왜 그렇게 했는지도 설명할 수 있어야 합니다.

그래프 종류를 잘못 고른다

시간 흐름이 아닌 항목을 선으로 연결하면 안 됩니다. 예를 들어 서울, 부산, 대구의 평균 점수를 선으로 연결하면 지역 사이에 자연스러운 순서가 있는 것처럼 보입니다. 이 경우에는 막대그래프가 더 적절합니다.

반대로 날짜별 변화를 막대그래프로만 보면 흐름이 잘 보이지 않을 수 있습니다. 시간 흐름은 선그래프가 더 자연스럽습니다.

상관관계를 인과관계로 해석한다

산점도에서 두 변수가 함께 움직인다고 해서 하나가 다른 하나의 원인이라고 단정하면 안 됩니다.

공부시간과 점수 사이에 양의 관계가 보일 수 있습니다. 하지만 그것만으로 "공부시간이 점수를 올렸다"고 결론 내리기는 어렵습니다. 그렇게 말하려면 더 많은 데이터와 더 엄밀한 분석이 필요합니다.

이 장에서는 우선 이렇게 표현하는 습관을 들이면 됩니다.

  • 나쁜 표현: 공부시간이 점수를 올렸다.

  • 좋은 표현: 이 데이터에서는 공부시간이 긴 학생일수록 수학점수가 높은 경향이 보인다.

결측치 때문에 그래프가 달라진다

pandas는 그래프를 그릴 때 결측치를 자동으로 제외하는 경우가 많습니다. 편리하지만 위험할 수 있습니다. 빠진 값이 많은데도 그래프만 보면 문제가 없어 보일 수 있기 때문입니다.

그래프를 그리기 전에는 다음을 확인합니다.

df[['수학점수', '영어점수', '공부시간']].isna().sum()

그래프는 데이터 정리를 대신하지 않습니다. 그래프는 정리된 데이터를 더 잘 이해하게 해 주는 도구입니다.

요약

이번 장에서는 데이터를 그래프로 표현하는 기본 방법을 배웠습니다.

핵심은 다음과 같습니다.

  • 분포를 볼 때는 히스토그램을 사용한다.

  • 항목 비교에는 막대그래프를 사용한다.

  • 시간 흐름에는 선그래프를 사용한다.

  • 두 변수의 관계에는 산점도를 사용한다.

  • 그래프에는 제목, 축 이름, 범례, 단위가 필요하다.

  • 예쁜 그래프보다 정확한 그래프가 먼저다.

  • 상관관계를 인과관계로 단정하면 안 된다.

좋은 시각화는 답을 대신 내려 주지 않습니다. 대신 더 좋은 질문을 하게 만듭니다.

퀴즈

  1. 값이 어느 구간에 많이 모여 있는지 보고 싶을 때 알맞은 그래프는 무엇인가요?

  2. 학년별 평균 점수를 비교할 때 알맞은 그래프는 무엇인가요?

  3. 날짜별 변화 추이를 보고 싶을 때 알맞은 그래프는 무엇인가요?

  4. 공부시간과 수학점수의 관계를 보고 싶을 때 알맞은 그래프는 무엇인가요?

  5. 그래프에 제목과 축 이름을 붙여야 하는 이유는 무엇인가요?

  6. 산점도에서 두 변수가 함께 움직이면 바로 인과관계라고 말할 수 있나요?

  7. 막대그래프의 y축을 좁게 잡으면 어떤 문제가 생길 수 있나요?

  8. 그래프를 그리기 전 결측치를 확인해야 하는 이유는 무엇인가요?

예시 답안

  1. 히스토그램

  2. 막대그래프

  3. 선그래프

  4. 산점도

  5. 그래프가 무엇을 보여 주는지 다른 사람이 이해할 수 있게 하기 위해서입니다.

  6. 아닙니다. 함께 움직이는 경향은 보일 수 있지만 원인과 결과는 추가 분석이 필요합니다.

  7. 작은 차이가 실제보다 크게 보일 수 있습니다.

  8. 결측치가 자동으로 빠지면 그래프가 실제 데이터를 충분히 반영하지 못할 수 있기 때문입니다.

체크리스트

아래 항목에 스스로 표시해 봅시다.

  • pandas와 matplotlib을 불러올 수 있다.

  • 히스토그램으로 분포를 확인할 수 있다.

  • 막대그래프로 항목별 값을 비교할 수 있다.

  • 선그래프로 시간 흐름을 표현할 수 있다.

  • 산점도로 두 변수의 관계를 확인할 수 있다.

  • 그래프에 제목과 축 이름을 붙일 수 있다.

  • 여러 값이 있을 때 범례를 붙일 수 있다.

  • 질문에 맞는 그래프 종류를 선택할 수 있다.

  • 축 왜곡이 왜 위험한지 설명할 수 있다.

  • 상관관계와 인과관계를 구분해 말할 수 있다.

  • 그래프 아래에 보이는 점과 추가 확인할 점을 적을 수 있다.

다음 장 연결

이번 장에서는 그래프로 데이터의 분포, 비교, 변화, 관계를 살펴보았습니다. 이제 우리는 데이터를 표로 읽고, 정리하고, 그림으로 확인할 수 있습니다.

다음 장에서는 그래프 뒤에 있는 기본 생각을 배웁니다. 평균은 무엇을 대표하고, 흩어짐은 왜 중요하며, 확률은 불확실성을 어떻게 다루는지 살펴봅니다. 수식보다 직관을 먼저 익히면 통계와 선형대수도 훨씬 덜 낯설게 느껴집니다.

책 목록

AI 교육 1권 : AI 리터러시 첫걸음: Python과 데이터로 배우는 질문·분석·검증

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기