Pandas & NumPy Academy · 강의

최종 시각화와 보고서 내보내기

주석이 포함된 다중 패널 Matplotlib 그림을 만들고, PNG와 PDF로 내보내며, 구조화된 요약을 마크다운 파일에 작성합니다.

레슨 4/413개 단계

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

최종 결과물

캡스톤의 마지막 단계에서는 계산한 KPI를 보기 좋고 공유하기 쉬운 결과물로 완성합니다. 주석이 포함된 차트로 구성된 다중 패널 Matplotlib 그림과 시각화 참조가 삽입된 구조화된 마크다운 보고서를 만듭니다. 이해관계자가 실제로 받는 것은 바로 이러한 명확한 시각 자료와 서술형 요약입니다. 좋은 시각화는 숫자를 통찰로 바꾸고, 잘 구성된 보고서는 그 통찰을 실행 가능한 정보로 만듭니다. 이 단원에서는 그림 구성, 주석, PNG/PDF 내보내기, 구조화된 마크다운 생성을 다룹니다.

다중 패널 그림 설정

figsize와 gridspec_kw를 함께 사용하는 plt.subplots()로 패널마다 크기가 다른 그림을 만듭니다. 경영진 보고서에서 흔히 사용하는 배치는 위쪽에 넓은 추세 차트를 두고, 아래쪽 행에 유지율 히트맵과 지역 막대 차트를 배치하는 방식입니다. 각 요소를 수동으로 서식 지정하지 않아도 깔끔하고 전문적인 차트를 만들 수 있도록 처음부터 plt.style.use('seaborn-v0_8-whitegrid')로 일관된 스타일을 설정합니다.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.style.use('seaborn-v0_8-whitegrid')

# 2x2 layout with custom row heights
fig = plt.figure(figsize=(16, 12))
gs = gridspec.GridSpec(2, 2,
                       height_ratios=[1, 1.2],
                       hspace=0.4, wspace=0.35)

ax_trend   = fig.add_subplot(gs[0, :])   # full width top row
ax_heatmap = fig.add_subplot(gs[1, 0])   # bottom left
ax_bar     = fig.add_subplot(gs[1, 1])   # bottom right

print('Figure with 3 panels created.')

패널 1: 월별 매출 추세선

월별 총매출을 표식이 있는 선으로 그리고, 그 위에 3개월 이동 평균을 겹쳐 표시한 다음 실제 선 아래 영역을 음영 처리합니다. ax.annotate()를 사용해 화살표와 텍스트로 최고점 및 최저점인 월에 주석을 추가합니다. 이를 통해 매출이 가장 강했던 시점과 하락한 시점, 장기 추세가 긍정적인지 여부를 한눈에 전달할 수 있습니다. 실제 값과 평활화된 값을 구분하되 서로 어울리도록 색상을 사용합니다.

import pandas as pd
import matplotlib.pyplot as plt

monthly = pd.read_parquet('output/kpi_monthly_category_revenue.parquet')
monthly_total = monthly.sum(axis=1)

ax = plt.gca()
ax.plot(monthly_total.index, monthly_total.values,
        marker='o', linewidth=2, color='#2196F3', label='Monthly Revenue')
ax.plot(monthly_total.index,
        monthly_total.rolling(3, min_periods=1).mean().values,
        linewidth=2, linestyle='--', color='#FF5722', label='3-Month Avg')
ax.fill_between(monthly_total.index, monthly_total.values, alpha=0.1, color='#2196F3')

# Annotate peak
peak_idx = monthly_total.idxmax()
ax.annotate(f'Peak: ${monthly_total[peak_idx]/1e3:.0f}K',
            xy=(peak_idx, monthly_total[peak_idx]),
            xytext=(0, 20), textcoords='offset points',
            arrowprops=dict(arrowstyle='->', color='#E91E63'),
            color='#E91E63', fontsize=10)
ax.set_title('Monthly Revenue Trend', fontsize=14, fontweight='bold')
ax.legend()
plt.show()

패널 2: 코호트 유지율 히트맵

Seaborn을 사용해 코호트 유지율 행렬을 색상으로 구분된 히트맵으로 시각화합니다. 100%(기간 0)가 가장 밝은 색이 되고 유지율이 감소할수록 점점 어두워지도록 값을 정규화합니다. 아직 발생하지 않은 미래 기간에 해당하는 NaN 셀은 마스킹하여 차트를 깔끔하게 유지합니다. 빠르게 읽을 수 있도록 각 셀에 백분율 값을 표시합니다. 이 차트는 고객 충성도 패턴을 이해하는 데 가장 유용한 도구 중 하나입니다.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

retention = pd.read_parquet('output/kpi_cohort_retention.parquet')

fig, ax = plt.subplots(figsize=(10, 6))

sns.heatmap(
    retention,
    annot=True,
    fmt='.0%',
    cmap='YlOrRd_r',
    mask=retention.isna(),
    linewidths=0.5,
    ax=ax,
    cbar_kws={'label': 'Retention Rate'}
)
ax.set_title('Cohort Retention Matrix', fontsize=14, fontweight='bold')
ax.set_xlabel('Months After First Purchase')
ax.set_ylabel('Cohort Month')
plt.tight_layout()
plt.show()

패널 3: 상위 지역 가로 막대 차트

가로 막대 차트는 지역 이름을 매출과 비교할 때 적합합니다. 지역 이름은 y축의 텍스트 레이블로 표시됩니다. 최우수 지역이 맨 위에 오도록 막대를 내림차순으로 정렬합니다. ax.text()를 사용해 각 막대 끝에 매출 값을 표시합니다. 매출 비중을 기준으로 연속적으로 대비되는 색상 팔레트를 사용하며, 최상위 지역에는 가장 짙은 색을 적용합니다. 이 차트는 지리적 집중도와 지역별 성과를 즉시 전달합니다.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
top5 = region_kpi.head(5).sort_values('total_revenue')

fig, ax = plt.subplots(figsize=(8, 5))
colors = cm.Blues(np.linspace(0.4, 0.9, len(top5)))

bars = ax.barh(top5['region'], top5['total_revenue'], color=colors)
for bar, val in zip(bars, top5['total_revenue']):
    ax.text(bar.get_width() * 1.01, bar.get_y() + bar.get_height()/2,
            f'${val/1e3:.0f}K', va='center', fontsize=9)

ax.set_title('Top 5 Regions by Revenue', fontsize=13, fontweight='bold')
ax.set_xlabel('Total Revenue ($)')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.show()

다중 패널 그림 저장

완성된 그림을 두 가지 형식으로 내보냅니다. 프레젠테이션과 웹 보고서에 삽입할 때는 PNG를 사용하고, 고해상도 인쇄에는 PDF를 사용합니다. 화면 해상도에서 그림이 선명하게 보이도록 PNG에는 dpi=150 이상을 사용합니다. 그림 가장자리에서 레이블이 잘리지 않도록 bbox_inches='tight'를 전달합니다. 프로젝트 설정 단계에서 정한 출력 디렉터리에 저장합니다.

import matplotlib.pyplot as plt

# After assembling all panels in the figure
fig.suptitle('2024 Sales Performance Report', fontsize=16,
             fontweight='bold', y=1.02)

# Save as PNG (for web/presentations)
fig.savefig('output/report_figure.png',
            dpi=150,
            bbox_inches='tight',
            facecolor='white')

# Save as PDF (for print)
fig.savefig('output/report_figure.pdf',
            bbox_inches='tight',
            facecolor='white')

print('Figures saved:')
print('  output/report_figure.png')
print('  output/report_figure.pdf')

구조화된 마크다운 보고서 작성

구조화된 마크다운 파일을 프로그래밍 방식으로 작성하여 텍스트 보고서를 생성합니다. 머리말, 핵심 KPI를 포함한 경영진 요약, 각 분석 섹션의 주요 발견 사항, 저장된 그림 파일에 대한 참조를 포함합니다. 보고서를 직접 작성하지 않고 코드로 생성하면 실행할 때마다 실제 계산값을 반영한 최신의 정확한 보고서가 만들어집니다. 파이썬 f-string을 사용해 계산된 숫자를 텍스트에 직접 삽입합니다.

import pandas as pd
from datetime import datetime

df = pd.read_parquet('output/analysis_ready.parquet')
region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
retention = pd.read_parquet('output/kpi_cohort_retention.parquet')

report = f'''
# 2024 Sales Performance Report

Generated: {datetime.now().strftime('%Y-%m-%d %H:%M')}

## Executive Summary

- **Total Revenue**: ${df['revenue'].sum():,.0f}
- **Total Orders**: {df['order_id'].nunique():,}
- **Unique Customers**: {df['customer_id'].nunique():,}
- **Top Region**: {region_kpi.iloc[0]['region']} (${region_kpi.iloc[0]['total_revenue']:,.0f})
- **Average Month-3 Retention**: {retention.get(3, pd.Series([0])).mean():.1%}

## Key Findings

1. Revenue grew steadily through the year with a peak in October.
2. The top region accounts for {region_kpi.iloc[0]['revenue_share']:.0%} of total revenue.
3. Month-3 cohort retention averages {retention.get(3, pd.Series([0])).mean():.1%}.

## Figures

![Revenue Trends](report_figure.png)
'''
with open('output/report.md', 'w') as f:
    f.write(report)
print('Report written to output/report.md')

차트에 주석 추가

효과적인 차트는 주석을 통해 이야기를 전달합니다. ax.axvline()으로 중요한 이벤트(제품 출시, 가격 변경)를 표시하고, ax.axhspan()으로 경기 침체 기간을 음영 처리하며, ax.annotate()로 주목할 만한 데이터 지점을 텍스트와 화살표로 강조합니다. 단위를 포함해 축에 레이블을 지정하고(ax.set_ylabel('Revenue ($)')), 설명적인 제목을 추가하며, 여러 계열을 표시할 때는 범례를 포함합니다. 또한 ax.yaxis.set_major_formatter(FuncFormatter(...))를 사용해 눈금 레이블을 읽기 쉽게 서식 지정합니다.

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import pandas as pd

monthly_total = pd.read_parquet('output/kpi_monthly_category_revenue.parquet').sum(axis=1)

fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(monthly_total.index, monthly_total.values, linewidth=2.5, color='#1565C0')

# Format y-axis as $K
ax.yaxis.set_major_formatter(
    mticker.FuncFormatter(lambda x, _: f'${x/1e3:.0f}K')
)

# Mark a hypothetical event
ax.axvline(x='2024-06', color='red', linestyle=':', alpha=0.6)
ax.text('2024-06', monthly_total.max() * 0.95,
        ' Campaign\n Launch', color='red', fontsize=9)

ax.set_title('Monthly Revenue 2024', fontsize=14, fontweight='bold')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

데이터 표를 엑셀로 내보내기

일부 이해관계자는 마크다운 보고서보다 엑셀을 선호합니다. pd.ExcelWriter를 사용하면 여러 DataFrames를 하나의 엑셀 통합 문서에서 서로 다른 시트로 내보낼 수 있습니다. 이는 데이터를 직접 탐색하려는 비즈니스 이해관계자에게 제공하기 좋은 전문적인 결과물입니다. startrow와 startcol을 사용해 시트 안에서 표의 위치를 정하고, 상위 수준의 숫자를 첫 번째 탭에 표시하도록 'Summary' 시트를 추가합니다.

import pandas as pd

region_kpi = pd.read_parquet('output/kpi_region_summary.parquet')
retention = pd.read_parquet('output/kpi_cohort_retention.parquet')
product_rank = pd.read_parquet('output/kpi_product_ranking.parquet')

with pd.ExcelWriter('output/sales_report_2024.xlsx', engine='openpyxl') as writer:
    region_kpi.to_excel(writer, sheet_name='Region KPIs', index=False)
    retention.to_excel(writer, sheet_name='Cohort Retention')
    product_rank.head(50).to_excel(writer, sheet_name='Top 50 Products', index=False)

print('Excel workbook written: output/sales_report_2024.xlsx')

보고서 생성 자동화

데이터 수집, 정제, KPI 계산, 시각화, 보고서 내보내기로 이어지는 전체 파이프라인을 명령줄에서 실행할 수 있는 main() 함수로 묶습니다. 파이썬의 logging 모듈을 사용해 시작 및 종료 시간, 각 단계의 행 수, 감지된 이상 징후를 기록합니다. python pipeline.py 명령 하나로 처음부터 끝까지 실행되는 파이프라인은 크론, 에어플로 또는 클라우드 스케줄러를 통한 예약 자동화를 적용할 준비가 된 상태입니다.

import logging
import time
from datetime import datetime

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s'
)

def main():
    start = time.time()
    logging.info('Pipeline started')

    logging.info('Step 1: Data ingestion')
    # load_and_merge()  # returns df

    logging.info('Step 2: Data cleaning')
    # clean(df)  # returns df_clean

    logging.info('Step 3: KPI computation')
    # compute_kpis(df_clean)  # saves parquet files

    logging.info('Step 4: Visualisation and report export')
    # build_report()  # saves PNG, PDF, markdown, Excel

    elapsed = time.time() - start
    logging.info(f'Pipeline complete in {elapsed:.1f}s')

if __name__ == '__main__':
    main()

과정 완료 및 다음 단계

데이터 분석: 판다스 및 NumPy 트랙을 완료하셨습니다. 이제 브로드캐스팅과 선형 대수로 NumPy 배열을 생성하고 변환할 수 있으며, 어떤 데이터 원천에서든 Pandas DataFrames를 만들고 조작할 수 있습니다. 또한 실제 데이터세트를 정제하고 형태를 변경하며 집계하고, Matplotlib과 Seaborn으로 출판 품질의 시각화를 만들고, SciPy로 통계 검정을 적용하고, 청킹과 Dask로 대규모 데이터세트에 대응하고, Pandas를 SQL 데이터베이스와 통합하며, 재현 가능한 종단 간 데이터 파이프라인을 설계할 수 있습니다. 이러한 기술은 업계의 모든 데이터 기반 직무를 뒷받침하는 기초입니다.

빠른 확인

이번 단원에서 배운 데이터 분석 개념을 이해했는지 확인합니다.

단원 요약

이 마지막 단원에서는 다음을 배웠습니다. GridSpec을 사용한 다중 패널 Matplotlib 그림은 여러 차트 유형을 결합한 전문적인 보고서 레이아웃을 만들 수 있고, 주석(axvline, annotate, text)은 차트에 서술적 맥락을 더하며, main() 함수에서 보고서 생성 자동화(마크다운, 엑셀, PNG, PDF)를 구현하면 파이프라인을 예약 실행 가능하고 재현 가능하게 만들 수 있습니다. 판다스 및 NumPy 트랙을 완료하신 것을 축하합니다. 이제 실제 데이터 분석 과제에 도전할 준비가 되었습니다!

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“최종 시각화와 보고서 내보내기” 강의는 무료인가요?

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

“최종 시각화와 보고서 내보내기”에서 뭘 배우나요?

주석이 포함된 다중 패널 Matplotlib 그림을 만들고, PNG와 PDF로 내보내며, 구조화된 요약을 마크다운 파일에 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 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. 분석과 KPI 계산
  4. 최종 시각화와 보고서 내보내기
← Pandas & NumPy Academy(으)로 돌아가기