판다스의 데이터프레임에 들어가 있는 데이터는 쉽게 선 그래프, 막대 그래프, 히스토그램, 박스 플롯 등으로 시각화할 수 있습니다. 데이터를 적절한 그래프로 시각화한다면 데이터를 단순히 표 형태로 보여주는 것보다 훨씬 더 직관적으로 데이터를 이해하는데 도움을 줄 수 있습니다.
제 블로그는 구글 애널리틱스에 연동시켜놨기 때문에 구글 애널리틱스가 제 블로그의 사용자, 신규 방문자, 세션, 사용자당 세션 수, 페이지뷰 수, 세션당 페이지수, 평균 세션 시간, 이탈률 등을 자동으로 분석해줍니다.
저는 단순히 사용자 수(방문자수)보다는 페이지뷰 수의 추이가 중요하다고 생각되기 떄문에, 일별 페이지뷰 수를 구글 애널리틱스에서 엑셀(xlsx) 파일로 export한 후에 판다스 데이터프레임으로 가져와서 선 그래프, 막대 그래프, 히스토그램, 박스 플롯을 그려보도록 하겠습니다.
export해서 얻은 엑셀 파일을 열어보면, "데이터세트1" 이라는 Sheet에 일별 페이지뷰 수가 있는 상황입니다. 참고로 제 블로그는 2019년 12월 20일부터 구글 애널리틱스가 분석하기 시작했습니다.
선 그래프
우선 선 그래프부터 그려보도록 하겠습니다. 선 그래프를 그리면 일별 페이지뷰 수의 추이를 한 눈에 파악하는데 도움이 될 것입니다.
우선 아래 파이썬 코드를 실행하려면 pandas, openpyxl, matplotlib 패키지를 설치해주셔야 합니다.
pip install pandas
pip install openpyxl
pip install matplotlib
위와 같은 방식으로 설치해주세요.
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
## 한글 폰트를 그래프에 사용하기 위한 코드 블럭
font_path = "C:/Windows/Fonts/GULIM.TTC"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
# 엑셀 파일 데이터프레임으로 가져오기
df_page_views = pd.read_excel('page_view.xlsx', sheet_name='데이터세트1')
print(df_page_views)
# 선 그래프 그리기
plt.plot(df_page_views['일 색인'], df_page_views['페이지뷰 수'])
plt.title('bskyvision 일별 페이지뷰 수 추이')
plt.xlabel('일자')
plt.ylabel('페이지뷰 수')
plt.grid(True)
plt.show()
위 코드를 실행했더니 터미널에서 일별 페이지뷰 수가 데이터프레임에 잘 담겨진 것을 확인할 수 있었고, 또한 선 그래프로 잘 표현된 것을 확인할 수 있었습니다.
위 선 그래프를 통해 알 수 있는 점들을 정리해보겠습니다.
1) 2020년 초반부터 2021년 4월까지 계속해서 페이지뷰 수가 증가하는 추세였는데, 7000뷰를 찍은 순간부터는 페이지뷰 수가 살짜 줄어든 상태(1000에서 6500 사이)로 유지되고 있다는 점을 확인할 수 있습니다. 제가 2021년 4월에 박사 과정을 멈추고 입사를 하면서 블로그에 신경을 거의 못 썼던 결과가 이 그래프에서 바로 나타나네요. ㅎㅎ
2) 학술적인 내용을 주된 주제로 하는 블로그이다보니 1,2월, 7,8월은 방문수가 다른 월들에 비해 적은 것을 알 수 있습니다. 방학 기간이기 때문이죠. 대학생들이 많이 오는 블로그라는 것입니다. 대학생들, 특히 공대생이 주 타겟인 상태이므로 그들을 위한 글들을 계속해서 작성해나가는 것이 제 블로그의 경쟁력을 높이는 길일 것 같습니다.
막대 그래프
이번에는 막대 그래프로 일별 페이지뷰 수를 확인해보겠습니다. 위 코드에서 plt.plot을 plt.bar로 바꿔주기만 하면 됩니다.
plt.bar(df_page_views['일 색인'], df_page_views['페이지뷰 수'])
막대 그래프로 봤을 때 역시 일별 페이지뷰 수의 추이를 잘 확인할 수 있긴 하지만 막대가 너무 많다보니까 선 그래프를 그렸을 때에 비해서는 정보 전달 능력이 떨어지는 것 같습니다.
히스토그램
이번에는 히스토그램을 그려보도록 하겠습니다. 히스토그램을 이해하려면 먼저 도수분포표라는 것을 알아야 합니다. 도수분포표는 데이터를 적당한 구간으로 분할한 후 그 구간에 해당하는 빈도를 나타낸 표를 뜻합니다. 아래 그림을 보시면 쉽게 이해가 되실 것입니다.
이처럼 0뷰 이상 500뷰 미만, 500뷰 이상 1000뷰 미만 등 적당한 구간을 설정한 후 그 구간에 해당하는 빈도를 나타낸 것이 바로 도수분포표입니다. 이 도수분포표를 막대 그래프로 나타낸 것이 히스토그램이 되는 것이고요. 그러면 한 번 히스토그램을 그려보겠습니다.
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
## 한글 폰트를 그래프에 사용하기 위한 코드 블럭
font_path = "C:/Windows/Fonts/GULIM.TTC"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
# 엑셀 파일 데이터프레임으로 가져오기
df_page_views = pd.read_excel('page_view.xlsx', sheet_name='데이터세트1')
print(df_page_views)
# 히스토그램 그리기
plt.hist(df_page_views['페이지뷰 수'], bins=20)
plt.title('bskyvision 일별 페이지뷰 수 히스토그램')
plt.xlabel('페이지뷰')
plt.ylabel('일수')
plt.grid(True)
plt.show()
저는 bins 옵션의 값으로 20을 줬기 때문에 20개의 구간으로 나눠져서 빈도가 표현되었습니다.
히스토그램은 아까 선 그래프, 막대 그래프와는 달리 다른 정보를 줍니다.
1) 2019년 12월 20일부터 2022년 6월 4일까지 약 2년 반이라는 기간동안 가장 자주 발생한 일일 페이지뷰 수는 약 2000에서 2700 정도라는 점입니다. 그 다음으로 자주 발생한 일일 페이지뷰 수는 4300에서 5000 정도입니다.
2) 7000뷰에 가까운 페이지뷰 수는 아주 드물게 발생했다는 것도 한 눈에 확인 가능합니다. 앞으로는 7000뷰 이상의 일일 페이지뷰 수가 자주 발생하도록 운영해봐야겠습니다. ㅎㅎ
박스 플롯
마지막으로 박스 플롯을 그려보도록 하겠습니다. 박스 플롯은 데이터의 분포와 분산 정도를 한 눈에 볼 수 있게 도와주는 그래프 형식입니다. 박스 플롯에서는 데이터의 최대값, 최소값, 중앙값(제2사분위수, 50%), 제3사분위수(75%), 제1사분위수(25%) 등을 한 번에 확인할 수 있기 때문에 전반적인 기술 통계량을 확인하는데 많이 사용됩니다. 중앙값, 분위수에 대해서 선지식이 없으신 분들은 링크를 참고하시기 바랍니다. 박스 플롯을 어떤 책에서는 상자 수염 그림이라고 부르더군요.
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
## 한글 폰트를 그래프에 사용하기 위한 코드 블럭
font_path = "C:/Windows/Fonts/GULIM.TTC"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
# 엑셀 파일 데이터프레임으로 가져오기
df_page_views = pd.read_excel('page_view.xlsx', sheet_name='데이터세트1')
print(df_page_views)
# 박스 플롯 그리기
plt.boxplot(df_page_views['페이지뷰 수'])
plt.title('bskyvision 일별 페이지뷰 수 박스플롯')
plt.ylabel('페이지뷰')
plt.grid(True)
plt.show()
박스 플롯에서 각 위치가 의미하는 바는 아래 이미지에 설명을 남겨놨으니 확인하시면 되겠습니다.
오늘은 데이터프레임의 데이터를 선 그래프, 막대 그래프, 히스토그램, 박스 플롯으로 나타내는 방법을 알아봤습니다. 혹시 제 설명 중에 부족한 부분들이 있다면 댓글로 알려주시기 바랍니다. 이 글이 도움이 되셨다면, 공감 한번 눌러주시면 감사하겠습니다. 끝까지 읽어주셔서 감사합니다.
관련 글
- [python+pandas] pandas로 엑셀 파일 읽고 수정한 후 쓰기
- [python] matplotlib로 플롯 그릴 때 한글 깨짐 문제 해결 방법
- [python+pandas] 데이터프레임의 기술 통계 정보(평균, 표준편차, 최대값, 최소값, 분위수)를 요약해주는 describe() 메소드
'Dev > python' 카테고리의 다른 글
[python + pandas] 데이터프레임에서 특정 기간의 데이터 추출하기 (0) | 2022.06.21 |
---|---|
[pandas] 데이터프레임의 특정 컬럼을 행 인덱스로 설정하는 방법, set_index() (0) | 2022.06.08 |
[pyside6] 창 타이틀바에서 닫기 버튼, 최소화 버튼, 최대화 버튼 등을 비활성화 되게 하려면? (0) | 2022.06.07 |
[python+pandas] 일간 데이터를 월간 데이터로 변환한 후에 선 그래프 그리기 (5) | 2022.06.06 |
[pandas] 튜플의 리스트를 데이터프레임으로 만들기 (0) | 2022.05.30 |
[python+pandas] 데이터프레임의 기술 통계 정보(평균, 표준편차, 최대값, 최소값, 분위수)를 요약해주는 describe() 메소드 (0) | 2022.05.29 |
[python+pandas] 여러 데이터프레임 하나의 엑셀 파일 내 각각 다른 시트에 저장하기 (5) | 2022.05.15 |
[python] seaborn 라이브러리가 제공하는 타이타닉 데이터셋 설명 (0) | 2022.05.15 |