어때요 코딩 참 쉽죠 어때요 코딩 참 쉽죠

도와줘 파이썬! 원하는 대로 그리는 나만의 그래프

글. 산업공학과 3 이재혁 편집. 조선해양공학과 4 백지원
교과서, 뉴스, 웹페이지 등 정보를 제공해 주는 많은 콘텐츠 속 우리의 시선을 사로잡는 예쁜 그래프들. 흰 배경과 검은 글자 사이 알록달록한 그래프는 그 존재만으로도 뇌의 긴장을 사악 풀어주곤 합니다. 발표 준비를 하다 보면 ‘나도 저런 깔끔한 그래프 그리고 싶다..’ 하는 생각이 들지 않을 수가 없는데요.
이번 [어때요, 코딩 참 쉽죠?] 코너에서는 코딩을 이용해서 정확하면서도 이해하기 쉬운 그래프를 그리는 방법을 배워 보겠습니다! 본 기사에서 소개하는 방법만 잘 따라와도 앞으로 학교에서 발표 1등은 독자 여러분의 것! 장담할게요!

오늘은 가장 범용적인 언어인 파이썬(Python)을 이용해서 코딩을 진행해 보겠습니다! 그래프를 그릴 때 사용할 데이터는 요즘 뉴스에서 많이 볼 수 있는 ‘신혼부부’에 관한 통계자료예요. 해당 데이터는 대한민국 통계청 사이트에서 찾을 수 있고 자세한 다운로드 방법은 각주에 명시해 둘 테니 참고해 주세요.1 여러분이 조금 더 흥미롭게 실습을 진행할 수 있도록, 이번 시간에는 ‘저출산 문제’에 관한 발표 자료를 만들고 있다고 가정하고 데이터를 활용해 보겠습니다!

1 대한민국 통계청 > 통계조사 > 통계청 통계 > 분야별보기 > 보건·사회·복지 – 신혼부부통계 > 대표통계표 > 시도별 신혼부부 총괄 (시점:2015~2021년, 파일형태: 셀 병합 체크 해제)

그림 1. '시도별 신혼부부 총괄’ 엑셀 자료
[그림 1]과 같은 엑셀 파일이 다운 받아졌다면 잘 따라오고 있는 겁니다! 이제는 해당 엑셀 파일을 파이썬으로 가져와서 사용해 볼게요. 본 기사에서는 Jupyter Notebook을 사용해서 파이썬을 구동하도록 하겠습니다.

잠깐! Jupyter Notebook이 뭔가요?

흔히들 파이썬으로 코딩을 하려면 파이썬 언어를 설치하고, 파이참(PyCharm)과 같은 IDE(Integrated Development Environment, 통합 개발 환경)도 설치해야 한다고 알고 있을 거예요. 이런 경우에는 확장자가 ‘.py’인 파이썬 파일을 작성해서 컴파일러에 전달하게 됩니다. 한 번에 1개의 .py 파일을 처음부터 끝까지 모두 실행하는 것이지요.

주피터 노트북은 이와 다르게 원하는 부분의 코드만 단계적으로 실행할 수 있는 셀로 구성되어 있습니다. 이뿐만 아니라, 코드에 대한 설명을 첨부하기에 용이한 마크다운이라는 기능도 있죠. 오늘의 실습과 같이 반복적으로 여러 경우를 테스트하고 디버깅하는 작업이 필요하다면 주피터 노트북을 사용하는 것을 추천해요. 주피터 노트북에서는 확장자가 ‘.py’가 아니라 ‘.ipynb’로 구성된 파일을 작성하게 되니 이 점 착오 없길 바랍니다.

주피터 노트북처럼 셀 단위로 코드를 작성할 수 있는 다른 편리한 방법들도 있는데요. 그중 하나가 바로 구글 코랩(Google Colab)을 활용하는 것입니다. 별도로 회원가입을 하거나 프로그램을 설치할 필요 없이 구글 ID만 있으면 웹페이지에서 파이썬으로 코드를 작성하고 실행할 수 있어요.

파이썬으로 엑셀 파일 불러오기
그림 2, pandas 사용해서 데이터 가져오기

1
2
3
4
5
import pandas as pd
df = pd.read_excel('시도별_신혼부부_총괄.xlsx', sheet_name = '데이터')
df.set_index('행정구역별', inplace=True)
df
 
cs
위의 코드를 실행하면 엑셀로 저장되어 있던 데이터를 파이썬에서 다룰 수 있어요. 표를 다루기 쉽도록 pandas라는 라이브러리를 pd라고 이름 붙인 후 사용해 주었고, 이 표의 이름을 데이터 프레임의 약자인 df로 지정해 주었어요. 그리고 read_excel이라는 ‘메서드’를 활용해 ‘시도별_신혼부부_총괄.xlsx’이라는 파일을 불러옵니다. 이때 괄호 안에 sheet_name이라는 변수를 별도로 지정하면 여러 개의 시트 중에서도 특정 시트의 정보만 불러올 수 있어요.

마지막 줄의 df라는 명령어는 변수의 이름만 입력해서 변수 안에 담긴 데이터를 확인하는 명령어예요. 아마 많은 분이 처음 파이썬을 배울 때에는 데이터를 출력하려면 print와 같은 명령어를 입력해야 한다고 배웠을 거예요. 그런데 변수의 이름만 입력하면 데이터가 출력된다니, 신기하죠? 이 기능은 주피터 노트북 환경에서 특별히 조금 더 편리하게 추가해 둔 기능이기 때문에 여러분이 만약 파이참 등 다른 개발 환경에서 코드를 실행시킨다면 오류가 발생합니다. 다른 개발 환경에서는 print(df) 와 같은 명령어를 사용해서 데이터를 출력해 주세요.

잠깐! ‘메서드’가 뭔가요?

우리가 컴퓨터에 실질적으로 명령을 전달하는 명령어를 파이썬에서는 ‘메서드(함수)’라고 해요. 라이브러리에서 특정 메서드를 사용할 때는 위와 같이 온점(.)으로 접근할 수 있어요.

이렇게 표를 파이썬으로 가져왔으니, 조금 더 보기 편한 형태로 바꿔 볼게요! set_index라는 메서드를 이용해서 ‘전라남도’, ‘서울특별시’와 같은 행정구역명을 df의 행 이름으로 지정해 줍니다. 참고로, 위의 코드를 실행했을 때, 경고 문자가 출력되어도 코드 진행에는 무리가 없으니 당황하지 않아도 됩니다!

원형 그래프 그리기 (주제: 2021년 기준, 지역별 신혼부부 수의 비율)
변수명을 입력해서 데이터를 출력해 보면 그 안에 ‘신혼부부 수’, ‘맞벌이 부부 수’, ‘맞벌이 비율’ 등 다양한 정보가 담겨 있음을 볼 수 있어요. 많은 정보를 가지고 있다는 것은 그만큼 다양하게 분석해 볼 수 있다는 뜻이지만 깔끔한 그래프를 그리기 위해서 우리에게 필요한 정보만 남겨주도록 합시다!

가장 먼저 2021년 기준, 지역별 신혼부부 수의 비율을 알아보려고 해요. [그림 3]과 같이 ‘2021년 신혼부부 수’에 대한 정보가 담겨 있는 ‘2021’이라는 열의 정보만 가지고 와서 df_2021_A라고 이름 붙여 줄게요.

1
2
3
df_2021_A = df['2021']
df_2021_A
 
cs
그림 3. 2021년 신혼부부 수
우리가 필요한 데이터만 골라냈으니, 그래프를 그릴 차례입니다. 이번에는 matplotlib의 pyplot이라는 새로운 라이브러리를 가져오고 이를 plt라고 이름 붙여 줄게요. 이 라이브러리는 그래프를 그릴 때 아주 유용하니까 꼭 기억해 두도록 해요.

잠깐! 한글이 포함된 그래프를 그릴 때의 주의사항이 있어요.

본격적으로 시작하기 전에 각자 해결하길 권장하는 사항이 하나 있어요. 한글이 포함된 그래프를 정상적으로 출력해 주기 위해서는 폰트를 다운 받는 등 일련의 과정을 거쳐야 합니다. 내용이 길어서 본문에는 포함하지 못했으나 ‘matplotlib 한글 깨짐’과 같이 검색하면 이의 해결 방법을 찾을 수 있으니, 꼭 한 번 시도해 보길 바랍니다! 이것이 너무 복잡해서 시도하기 힘들다면 한글로 되어 있는 행과 열의 이름을 영어로 바꿔주는 것도 괜찮아요!

심화 지식이 있는 독자분들을 위해 제가 사용한 코드를 아래에 소개합니다.


1
2
3
4
5
6
7
8
9
10
from matplotlib import rc
import matplotlib.font_manager as fm
 
fm._rebuild()
fm.get_fontconfig_fonts()
# 디렉토리 및 파일 이름에 맞추어 변경
font_location = './NanumBarunGothic.ttf'
# font_name = fm.FontProperties(fname=font_location).get_name()
rc('font', family='NanumBarunGothic')
 
cs

1
2
3
4
5
6
from matplotlib import pyplot as plt
 
plt.figure(figsize=(88))
plt.pie(df_2021_A[2:], labels=df_2021_A.index[2:],  autopct='%1.1f%%')
plt.show()
 
cs
우리가 그림을 그릴 때 도화지를 준비하는 것처럼, 파이썬으로 그래프를 그릴 때도 가장 먼저 파이썬 컴파일러에게 그림을 그리는 기능을 활용할 수 있도록 준비해야 하는데요. 이러한 명령이 바로 matplotlib 라이브러리의 figure 메서드입니다. figure 메서드 안의 figsize라는 변수에 (가로 길이, 세로 길이)를 입력해서 도화지의 크기를 설정할 수 있어요. 그리고 이 도화지 위에 pie라는 메서드를 이용하여 원형 그래프를 그릴 수 있습니다.

코드의 4번째 줄에서 볼 수 있는 index 메서드는 표의 행 이름에 대한 정보를 가지고 있는 리스트예요. pie 메서드 안에 2021년 각 지역 신혼부부의 수가 담긴 데이터 df_2021_A[2:] 를 넣어주고, labels라는 변수에 index 메서드를 활용하여 각 지역의 이름(ex. 경기도)을 넣어 줄게요. 마지막으로, autopct라는 변수를 이용해서 각 항목의 비율을 어떤 형식으로 보여줄지까지 결정해 주면 원형 그래프가 완성됩니다. show 메서드를 이용하면 [그림 4]와 같이 완성된 그래프를 출력해서 확인할 수 있답니다.
그림 4. 지역별 신혼부부 수 원형 그래프
위의 과정을 따라 하면 이런 예쁜 원형 그래프를 그릴 수 있어요. 그래프를 보니 우리나라 신혼부부의 대다수는 경기도 혹은 서울특별시에 살고 있군요. 상단 그래프를 그릴 때 순서를 지정해 주지 않아 이의 순서가 뒤섞여 있지만, 가장 큰 비율을 차지하는 항목부터 순서대로 표시하는 것도 가능해요! 원형 그래프를 성공적으로 그린 독자분은 이의 방법도 한 번 찾아서 시도해 보면 좋을 것 같아요.
선 그래프 그리기 (주제: 연도에 따른 전국 맞벌이 비율의 변화 추세)

1
2
3
4
5
6
7
df_전국_BA = df[['2015.2''2016.2''2017.2''2018.2''2019.2''2020.2''2021.2']].loc['전국']
years = range(2015,2022)
 
plt.figure(figsize=(75))
plt.plot(years, df_전국_BA, marker='o')
plt.show()
 
cs
원그래프를 성공적으로 그리는 데에 성공했지만 우리는 여기서 만족할 수 없죠! 이번에는 연도에 따른 전국 맞벌이 비율의 변화 추세를 선 그래프로 확인해 봅시다. 첫 번째로, ‘전국’에 해당하는 행에서 맞벌이 비율에 관한 정보를 df_전국_BA라는 이름으로 저장해 줄게요. 이후에는 range 함수를 이용해서 연도 정보를 years 변수에 저장해 줄게요. range 함수를 이용하면 앞의 숫자보다 크거나 같고 뒤의 숫자보다 작은 연속하는 수들을 리스트로 저장할 수 있어요.

데이터가 모두 정리되었으니 이를 표현하는 선 그래프를 그려 줄게요. plot 메서드를 이용하면 데이터의 점들을 [그림 5]와 같이 이어주는 선 그래프를 그릴 수 있어요. x축에 해당하는 데이터인 years를 먼저 입력하고 y축에 해당하는 df_전국_BA를 그 뒤에 입력해 주면 된답니다. 이후에는 marker라는 변수를 이용해서 각 연도의 값을 나타내는 포인트에 점을 찍어 이를 강조해 줄게요. 이렇게 선 그래프도 완성했어요.
그림 5. 연도별 전국 맞벌이 비율 선 그래프 1
위의 그래프를 보니 시간이 지날수록 전국 신혼부부의 맞벌이 비율이 계속 올라가고 있네요. 2021년에 벌써 50%를 넘겼는데 지금은 이보다 더 높아졌을 것이라고 예상해 볼 수도 있을 것 같아요.
그래프 세부 사항 조정하기
이렇게 기본적인 그래프 두 종류를 함께 그려 보았어요! 마지막으로, 그래프의 완성도를 높일 수 있는 몇 가지 방법까지 알아보고 오늘 이 시간은 마무리하도록 할게요.

1
2
3
4
5
6
df_전국_BA = df[['2015.2''2016.2''2017.2''2018.2''2019.2''2020.2''2021.2']].loc['전국']
years = range(2015,2022)
 
plt.figure(figsize=(75))
plt.plot(years, df_전국_BA, marker='o', color='r', linewidth=2)
 
cs

1
2
3
4
5
6
7
8
plt.xlabel('연도', fontsize=14)
plt.ylabel('맞벌이 비율', fontsize=14)
plt.title('전국 연도별 맞벌이 비율 추이', fontsize=17)
plt.grid(True)
plt.tight_layout()
plt.show()
 
 
cs
앞서 그렸던 선 그래프를 더 정교하게 다뤄 보겠습니다! 우선, 그래프 자체의 모양부터 조금 바꿔 볼게요. 그래프를 그리기 위해 plot 메서드를 실행할 때 color 변수를 이용하면 선을 빨간색으로 바꿀 수 있고, linewidth 변수를 이용하면 선을 더 두껍게 그릴 수 있어요.

이렇게 열심히 그렸어도 아무런 설명이 없으면 그래프를 처음 본 사람은 그 의미를 파악하기 어려울 거예요. x축, y축에 관한 정보가 그래프에 적혀 있지 않기 때문이죠. plot 메서드를 실행한 뒤, xlabel, ylabel 메서드를 실행하면 x축, y축의 이름을 정해줄 수 있어요. 이때에도 마찬가지로 괄호 안에 fontsize 변수를 지정해서 글씨의 크기도 키워 줄게요.

마지막으로 이 그래프가 무엇을 의미하는지 표현하기 위해 title 메서드에 그래프의 제목을 적어주고 grid 메서드로 가는 선 형태의 격자도 표현할 수 있어요. tight_layout 메서드를 이용하면 글자들끼리 겹치는 현상도 방지해 줄 수 있죠.
그림 6. 연도별 전국 맞벌이 비율 선 그래프 2
이렇게 여러분이 직접 파이썬 코딩을 해서 다양한 형태의 그래프를 그릴 수 있고, 세부 사항과 기능도 원하는 대로 추가할 수 있어요!

코딩을 사용하면 오늘 다뤘던 원형 그래프와 선 그래프뿐 아니라 막대그래프, 산점도 등의 많은 형태의 그래프를 그릴 수 있으며 여러 개의 그래프를 한 도화지 위에 겹쳐 그리는 것도 가능하답니다. 물론 엑셀이나 파워포인트를 이용해서 간단한 그래프를 그릴 수도 있어요. 그러나, 여러 개의 그래프를 반복해서 그려야 하거나 데이터의 종류와 구조가 많아져 복잡해지면 파이썬을 이용하는 것이 훨씬 더 편리할 거예요. .이와 같은 그래프 그리기가 익숙해지면 나중에 여러분도 학교에서 숙제를 하며 내가 원하는 모양과 성격을 띠는 여러분만의 그래프를 그려서 사용할 수 있을 거예요. 이 기사를 통해 공상 독자 여러분이 코딩과 그래프 모두와 더 친해질 수 있다면 좋겠습니다!
데이터
  • 대한민국 통계청. (각주 1)
그림출처
그림 1~6: 자체 제작