2022-06-06 08:54:42

관련 글

[python+pandas] 내 블로그 일별 페이지뷰 수(구글 애널리틱스) 선 그래프, 막대 그래프, 히스토그램, 박스 플롯 그리기

[python+pandas] groupby 메소드로 그룹의 평균값, 최대값 산출하기

 

 

오늘은 구글 애널리틱스에서 얻은 제 블로그의 일별 페이지뷰 수를 월별 페이지뷰 수로 변환한 후에 선 그래프를 그리는 것을 해보도록 하겠습니다. 파이썬의 pandas 패키지와 matplotlib 패키지를 활용할 것입니다. 참고로 제 PC에는 현재 1.4.2 버전의 pandas 패키지와 3.5.2 버전의 matplotlib 패키지가 설치되어 있습니다.

 

우선 구글 애널리틱스에서 얻은 제 블로그의 일별 페이지뷰 수 엑셀 파일은 다음과 같습니다. 

 

 

보시다시피 두번째 Sheet인 데이터세트1에 날짜와 그 날의 페이지뷰 수가 들어가 있습니다.

 

1. 엑셀 파일 -> 데이터프레임

우선 이 Sheet를 데이터프레임으로 변환하겠습니다. 

 

# 엑셀 파일 데이터프레임으로 가져오기
df_page_views = pd.read_excel('page_view.xlsx', sheet_name='데이터세트1')
print(df_page_views)

 

 

2. 월별 페이지뷰 수 구하기

이제 월별 페이지뷰 수를 구해줘야할 차례입니다. groupby 메소드를 활용해서 "일 색인" 컬럼에서 년, 월이 같은 행끼리 그룹지어 준 다음에 합계를 구해줍니다.

 

# 월별 페이지뷰 수 구하기 
df_monthly_page_views = df_page_views.groupby(df_page_views['일 색인'].dt.strftime("%Y-%m")).sum()
print(df_monthly_page_views)

 

 

월별 페이지뷰 수가 잘 계산된 것을 확인하실 수 있습니다.

 

3. 불필요한 정보 삭제하기

2019년 12월과 2022년 6월 같은 경우는 몇 일씩만 데이터가 있기 때문에 제거하겠습니다. 데이터프레임 객체의 drop 메소드를 활용하면 됩니다. 

 

# 2019년 12월, 2022년 6월 정보는 제거
df_monthly_page_views.drop(['2019-12', '2022-06'], axis=0, inplace=True)
print(df_monthly_page_views)

 

 

두 행이 각각 잘 삭제된 것을 확인하실 수 있습니다. 

 

4. 선 그래프 그리기

이제 월별 페이지뷰 수를 선 그래프로 나타내보겠습니다. 

 

# 선 그래프 그리기
plt.plot(df_monthly_page_views)
plt.title('월별 페이지뷰 수 추이 그래프')
plt.xlabel('년-월')
plt.ylabel('페이지뷰 수')
plt.show()

 

 

선 그래프가 잘 그려졌습니다. 다만 x축 눈금 라벨의 글씨가 서로 겹쳐져 있어서 잘 안보이는 현상이 있습니다. 

 

5. x축 눈금 라벨 글씨 중첩 현상 해결

이것을 해결하기 위해 그래프의 가로 세로 사이즈를 바꿔주고, x축 눈금 라벨의 폰트 사이즈를 줄여주고, 눈금 라벨을 회전시켜주도록 하겠습니다. 위 코드를 다음과 같이 수정해주면 됩니다.

 

# 선 그래프 그리기
plt.figure(figsize=(12, 6)) # 그래프 사이즈 지정
plt.xticks(size=8, rotation=45) # x축 눈금 라벨 폰트 사이즈 8로 지정하고 45도 회전
plt.plot(df_monthly_page_views)
plt.title('월별 페이지뷰 수 추이 그래프')
plt.xlabel('년-월')
plt.ylabel('페이지뷰 수')
plt.show()

 

 

이제 x축 눈금 라벨이 중첩되지 않고 다 보이죠? 

 

6. 선 그래프 조금 더 예쁘게 만들기

그런데 아직 그래프가 밍밍한 것 같습니다. 조금 더 예쁘게 해주고 싶습니다. 배경에 그리드를 넣어주고, 데이터 포인트마다 마커 표시도 넣어주고, 범례도 넣어주겠습니다. 

 

# 선 그래프 그리기
plt.figure(figsize=(12, 6)) # 그래프 사이즈 지정
plt.xticks(size=8, rotation=45) # x축 눈금 라벨 폰트 사이즈 8로 지정하고 45도 회전
plt.plot(df_monthly_page_views, marker='*', markersize=8)
plt.title('월별 페이지뷰 수 추이 그래프')
plt.xlabel('년-월')
plt.ylabel('페이지뷰 수')
plt.legend(labels=['월별 페이지뷰 수'], loc='best', fontsize=12)
plt.grid(True)
plt.show()

 

 

조금 더 예뻐졌죠? 

 

선 그래프를 보니 제 블로그는 2021년 4월에 페이지뷰 수 정점을 찍은 후에 조금씩 줄어드는 추세인 것을 확인할 수 있습니다. 다시 페이지뷰 수가 늘어나도록 열심히 활동해야겠습니다. ㅎㅎ 

 

전체 코드 공유

전체 파이썬 코드는 여기에 있습니다. 저는 아래 코드를 실행하기 위해 pandas, matplotlib, numpy, openpyxl 패키지를 설치했습니다. 각자 개발환경에 맞게 패키지들을 설치해주시면 됩니다. 

 

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np
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)

# 컬럼 데이터타입 확인
print(df_page_views.dtypes)

# 월별 페이지뷰 수 구하기 
df_monthly_page_views = df_page_views.groupby(df_page_views['일 색인'].dt.strftime("%Y-%m")).sum()
# print(df_monthly_page_views)

# 2019년 12월, 2022년 6월 정보는 제거
df_monthly_page_views.drop(['2019-12', '2022-06'], axis=0, inplace=True)
print(df_monthly_page_views)

# 선 그래프 그리기
plt.figure(figsize=(12, 6)) # 그래프 사이즈 지정
plt.xticks(size=8, rotation=45) # x축 눈금 라벨 폰트 사이즈 8로 지정하고 45도 회전
plt.plot(df_monthly_page_views, marker='*', markersize=8)
plt.title('월별 페이지뷰 수 추이 그래프')
plt.xlabel('년-월')
plt.ylabel('페이지뷰 수')
plt.legend(labels=['월별 페이지뷰 수'], loc='best', fontsize=12)
plt.grid(True)
plt.show()

 

위 내용이 도움이 되신 분들은 공감 버튼 한 번 클릭해주세요! ㅎㅎ