0Pricing
Pandas & NumPy Academy · 강의

월별 추세 시각화

월별 매출을 선 그래프로 그리고 3개월 이동 평균을 겹쳐 표시하며 최고점과 최저점의 월을 주석으로 표시합니다.

월별 추세 시각화은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

월별 총매출 계산하기

그래프를 그리기 전에 판매 DataFrame을 월별 합계로 집계하세요. year_month Period 열로 그룹화하고 매출을 합산합니다. .to_timestamp()를 사용하여 PeriodIndex를 DatetimeIndex로 변환하면 Matplotlib의 날짜 형식 지정기가 눈금 레이블을 올바르게 표시합니다. 인덱스 기준으로 정렬하면 선 차트가 시간순으로 왼쪽에서 오른쪽으로 이어집니다.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_parquet('sales_features.parquet')

monthly = df.groupby('year_month')['revenue'].sum().sort_index()
monthly.index = monthly.index.to_timestamp()
print(monthly.head())

월별 매출 선 차트 그리기

plt.subplots(figsize=(12, 5))로 Figure와 Axes를 만들고 ax.plot()을 호출하여 월별 매출 추세를 그리세요. marker='o'를 사용하면 매월 점이 표시되어 선이 매끄럽게 보일 때도 개별 데이터 지점을 확인할 수 있습니다. 색상과 선 너비를 설정하여 나중에 추가할 다른 요소와 구분되도록 주요 추세를 두드러지게 만드세요.

fig, ax = plt.subplots(figsize=(12, 5))

ax.plot(monthly.index, monthly.values,
        color='steelblue', linewidth=2, marker='o', markersize=5,
        label='Monthly Revenue')

ax.set_title('Monthly Revenue Trend')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue (USD)')
plt.tight_layout()
plt.show()

3개월 이동 평균 겹쳐 그리기

월별 매출 원시 선은 계절적 잡음 때문에 들쭉날쭉해 보일 수 있습니다. monthly.rolling(3).mean()으로 계산한 3개월 이동 평균을 겹쳐 그려 기본 추세를 더 명확하게 나타내세요. 원시 계열을 가리지 않으면서도 잘 드러나도록 대비되는 색상의 점선으로 그리면 됩니다.

rolling_avg = monthly.rolling(3).mean()

ax.plot(rolling_avg.index, rolling_avg.values,
        color='darkorange', linewidth=2, linestyle='--',
        label='3-Month Moving Avg')

ax.legend()
plt.show()

최고 매출 월에 주석 달기

ax.annotate()를 사용하여 매출이 가장 높은 달을 표시하세요. monthly.idxmax()로 최고점의 위치를 찾고 monthly.max()로 그 값을 구합니다. 주석 화살표는 텍스트 레이블에서 최고점 데이터 지점을 가리키므로, 차트를 PNG나 PDF로 전달받는 사람을 포함한 모든 독자가 핵심 내용을 즉시 파악할 수 있습니다.

peak_date = monthly.idxmax()
peak_val = monthly.max()

ax.annotate(f'Peak: ${peak_val:,.0f}',
            xy=(peak_date, peak_val),
            xytext=(peak_date, peak_val * 1.1),
            arrowprops=dict(arrowstyle='->', color='red'),
            color='red', fontsize=10)
plt.show()

최저 매출 월에 주석 달기

마찬가지로 monthly.idxmin()을 사용해 수익이 가장 낮은 달을 표시하면 계절성이나 이상 현상 가능성을 파악할 수 있습니다. 최고점과 최저점 모두에 주석을 달면 전체 상황을 파악할 수 있습니다. 이해관계자는 가장 좋은 달뿐 아니라 수익이 얼마나 감소할 수 있는지도 확인할 수 있으므로 현금 흐름 계획을 세우는 데 도움이 됩니다.

trough_date = monthly.idxmin()
trough_val = monthly.min()

ax.annotate(f'Trough: ${trough_val:,.0f}',
            xy=(trough_date, trough_val),
            xytext=(trough_date, trough_val * 0.85),
            arrowprops=dict(arrowstyle='->', color='navy'),
            color='navy', fontsize=10)
plt.show()

날짜 눈금 레이블 형식 지정

Matplotlib의 기본 날짜 눈금 레이블은 겹치거나 읽기 어려운 형식으로 표시되는 경우가 많습니다. matplotlib에서 mdates를 가져온 다음 MonthLocator와 DateFormatter를 설정해 눈금 간격과 레이블 형식을 제어합니다. 눈금 레이블을 45도 회전하면 12개월 축에서 레이블이 겹치는 것을 방지할 수 있습니다.

import matplotlib.dates as mdates

ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

Q4 음영 영역 추가

ax.axvspan()을 사용해 Q4 기간(10월~12월)의 배경을 음영으로 강조 표시합니다. 이렇게 하면 계절적 패턴이 즉시 눈에 들어옵니다. 최고점이 음영 영역에 계속 나타난다면 Q4는 프로모션을 집중적으로 진행할 가치가 있는 핵심 판매 기간입니다. alpha 매개변수는 음영의 투명도를 제어합니다.

import datetime

q4_start = datetime.datetime(2023, 10, 1)
q4_end = datetime.datetime(2023, 12, 31)

ax.axvspan(q4_start, q4_end, alpha=0.15, color='gold', label='Q4')
ax.legend()
plt.show()

시간에 따른 범주별 수익 그리기

각 선이 하나의 제품 범주를 나타내는 다중 선 차트를 만듭니다. 월별·범주별 DataFrame을 변환해 열에는 범주를, 인덱스에는 시간을 배치한 다음 열을 순회하며 각 열에 ax.plot()을 호출합니다. 같은 Axes에서 반복적으로 호출하면 Matplotlib이 각 선에 서로 다른 색상을 자동으로 지정합니다.

monthly_cat = df.groupby(['year_month', 'category'])['revenue'].sum().unstack('category')
monthly_cat.index = monthly_cat.index.to_timestamp()

fig, ax = plt.subplots(figsize=(12, 6))
for col in monthly_cat.columns:
    ax.plot(monthly_cat.index, monthly_cat[col], label=col, linewidth=1.5)

ax.legend(loc='upper left', fontsize=8)
ax.set_title('Monthly Revenue by Category')
plt.tight_layout()
plt.show()

월별 수익 누적 막대 차트

누적 막대 차트는 월별 총수익을 보여 주는 동시에 각 범주가 누적 막대에 기여하는 정도도 나타냅니다. 변환한 DataFrame에 직접 monthly_cat.plot(kind='bar', stacked=True, ax=ax)를 사용합니다. 누적 막대는 범주가 6개 미만일 때 가장 적합합니다. 범주가 더 많으면 색상을 구분하기 어려워지기 때문입니다.

fig, ax = plt.subplots(figsize=(12, 5))

monthly_cat.plot(kind='bar', stacked=True, ax=ax, colormap='tab10')

ax.set_title('Monthly Revenue by Category (Stacked)')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue')
ax.legend(loc='upper left', fontsize=8)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

전월 대비 성장률

전월 대비 백분율 성장률을 수익과 함께 그리면 맥락을 파악할 수 있습니다. 예를 들어 1월의 시각적으로 작은 막대가 전월 대비 20% 성장한 결과일 수 있습니다. monthly.pct_change() * 100으로 성장률을 계산하고, ax.twinx()를 사용해 보조 y축에 그립니다. 이렇게 하면 같은 x축을 공유하면서도 서로 다른 단위를 혼동하지 않을 수 있습니다.

growth = monthly.pct_change() * 100

fig, ax1 = plt.subplots(figsize=(12, 5))
ax2 = ax1.twinx()

ax1.bar(monthly.index, monthly.values, width=20, color='steelblue', alpha=0.6, label='Revenue')
ax2.plot(growth.index, growth.values, color='red', marker='o', label='MoM Growth %')

ax1.set_ylabel('Revenue')
ax2.set_ylabel('MoM Growth %')
plt.title('Revenue and Month-over-Month Growth')
plt.tight_layout()
plt.show()

보고서용 그림 저장

fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight')을 사용하면 프레젠테이션 자료나 웹 대시보드에 적합한 고해상도 PNG를 만들 수 있습니다. bbox_inches='tight' 인수는 불필요한 여백을 잘라 내고, dpi=150은 파일 크기를 지나치게 키우지 않으면서 선명한 이미지를 제공합니다. 인쇄 품질이 필요한 보고서를 위해 PDF로도 저장합니다.

fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight')
fig.savefig('monthly_trend.pdf', bbox_inches='tight')
print('Figure saved as PNG and PDF')

빠른 확인

이번 레슨에서 배운 데이터 분석 개념을 제대로 이해했는지 확인해 보세요.

레슨 요약

이번 레슨에서는 월별 총수익을 계산하고 선 차트로 그리는 방법, 이동 평균을 겹쳐 표시하고 최고점과 최저점이 나타나는 달에 주석을 다는 방법, 출판 품질의 그림을 PNG와 PDF로 저장하는 방법을 배웠습니다. 다음에는 사용자 행동 데이터에서 세션화와 이벤트 순서를 살펴보겠습니다.

자주 묻는 질문

“월별 추세 시각화” 강의는 무료인가요?

네 — “월별 추세 시각화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“월별 추세 시각화”에서 뭘 배우나요?

월별 매출을 선 그래프로 그리고 3개월 이동 평균을 겹쳐 표시하며 최고점과 최저점의 월을 주석으로 표시합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“월별 추세 시각화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 판매 데이터 세트 불러오기와 감사
  2. 매출 계산과 특성 공학
  3. 지역 및 범주별 GroupBy 분석
  4. 월별 추세 시각화
← Pandas & NumPy Academy(으)로 돌아가기