0Pricing
Pandas & NumPy Academy · 강의

분석과 KPI 계산

그룹화, 피벗, 롤링을 사용해 월별 코호트 유지율, 제품별 매출, 최근 30일 활성 사용자를 계산합니다.

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

분석 준비 데이터 불러오기

정제와 특성 생성이 완료되었으므로 analysis_ready.parquet 체크포인트를 불러와 KPI 계산을 시작하십시오. 이 단계는 순수한 분석 단계이므로 더 이상 데이터를 정제하지 않습니다. 깨끗하고 검증된 체크포인트가 있으면 시간이 많이 걸리는 데이터 수집 및 정제 단계를 다시 실행하지 않고 KPI 정의를 빠르게 반복해서 개선할 수 있습니다. 계산할 세 가지 KPI는 월별 코호트 유지율, 범주별 제품 수준 매출, 30일 이동 활성 사용자입니다.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')
print(f'Loaded: {df.shape}')
print('KPIs to compute:')
print('  1. Monthly cohort retention matrix')
print('  2. Category revenue and margin ranking')
print('  3. Rolling 30-day active users per region')

KPI 1: 범주별 월별 매출

첫 번째 KPI는 범주별 월별 매출입니다. year_month와 category를 함께 기준으로 그룹화하고 매출을 합산한 다음, 열에는 범주를 행에는 월을 배치하도록 pivot하십시오. 이 pivot 테이블은 보고서의 추세선 차트와 상위 범주 막대 차트의 기반입니다. 3개월 이동 평균을 적용하여 추세를 매끄럽게 만들고 계절성을 강조하십시오.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Monthly revenue by category
monthly_cat = (
    df.groupby(['year_month', 'category'])['revenue']
    .sum()
    .reset_index()
    .pivot(index='year_month', columns='category', values='revenue')
    .fillna(0)
    .sort_index()
)

# 3-month rolling average
monthly_cat_smooth = monthly_cat.rolling(3, min_periods=1).mean()

print('Monthly revenue by category (head):')
print(monthly_cat.round(0).head())
print('Shape:', monthly_cat.shape)

KPI 2: 총매출 기준 상위 지역

전체 기간의 총매출을 기준으로 지역 순위를 매기십시오. groupby().agg()를 사용하면 총매출, 주문 수, 고유 고객 수, 평균 주문 금액 등 여러 통계를 동시에 계산할 수 있습니다. 총매출을 기준으로 내림차순 정렬하고 상위 10개를 유지하십시오. 전체 총매출에서 각 지역이 차지하는 매출 비중을 계산하십시오. 이를 통해 매출의 80%가 한 지역에서 발생하는 경우처럼 사업이 지리적으로 편중되어 발생하는 집중 위험을 확인할 수 있습니다.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

region_kpi = (
    df.groupby('region')
    .agg(
        total_revenue=('revenue', 'sum'),
        order_count=('order_id', 'nunique'),
        unique_customers=('customer_id', 'nunique'),
        avg_order_value=('revenue', 'mean')
    )
    .reset_index()
    .sort_values('total_revenue', ascending=False)
)

total = region_kpi['total_revenue'].sum()
region_kpi['revenue_share'] = (region_kpi['total_revenue'] / total).round(3)

print(region_kpi.head(10).to_string(index=False))

KPI 3: 코호트 유지율 행렬

코호트 유지율 행렬은 각 고객 획득 코호트의 고객 중 이후 각 기간에 한 번 이상 구매한 고객의 비율을 보여 줍니다. 다음 세 단계로 계산하십시오. (1) 각 주문에 '기간 번호'를 할당합니다. 이는 고객의 코호트 월 이후 경과한 개월 수입니다. (2) 코호트와 기간 번호로 groupby하여 고유 고객 수를 셉니다. (3) 코호트 규모(기간 0의 고객 수)로 나누어 유지율을 구합니다. 그런 다음 코호트 × 기간 형식으로 pivot하십시오.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Compute months since cohort start
df['cohort_period'] = (
    (df['order_date'].dt.to_period('M') -
     pd.PeriodIndex(df['cohort_month'], freq='M'))
    .apply(lambda x: x.n)
)

cohort_data = (
    df.groupby(['cohort_month', 'cohort_period'])['customer_id']
    .nunique()
    .reset_index()
    .rename(columns={'customer_id': 'customers'})
)

# Pivot: rows=cohort, columns=period
cohort_pivot = cohort_data.pivot(
    index='cohort_month', columns='cohort_period', values='customers'
)

cohort_sizes = cohort_pivot[0]
retention = cohort_pivot.divide(cohort_sizes, axis=0).round(3)
print('Retention matrix (first 3 cohorts):')
print(retention.head(3))

KPI 4: 30일 이동 활성 사용자

일일 활성 사용자(DAU)와 이동 기간 변형은 핵심 제품 KPI입니다. 임의의 30일 기간에 구매한 고유 고객 수를 계산하십시오. 먼저 일별 고유 구매자 수를 계산하고 날짜를 인덱스로 설정한 다음 rolling('30D').apply(lambda x: x.nunique())를 적용하십시오. 단, DatetimeIndex에서 rolling을 사용하려면 특정 집계 방식이 필요하다는 점에 유의하십시오. 다른 방법으로는 사용자 지정 기간 함수를 사용하여 집합 기반 이동 고유 개수를 계산할 수 있습니다.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

# Daily unique purchasers
daily = (
    df.groupby('order_date')['customer_id']
    .nunique()
    .reset_index()
    .rename(columns={'customer_id': 'daily_unique_customers'})
    .set_index('order_date')
    .sort_index()
)

# 30-day rolling sum (approximation: sum of daily unique purchasers)
# True rolling unique requires custom logic
daily['rolling_30d'] = daily['daily_unique_customers'].rolling('30D').sum()

print('Rolling 30-day active customers:')
print(daily.tail())

제품 수준 매출 순위

제품 수준 분석을 위해 모든 제품 ID를 총매출 기준으로 순위를 매기고 누적 매출 비중을 계산하십시오. 이를 통해 매출이 파레토 분포를 따르는지 확인할 수 있습니다(흔히 제품의 약 20%가 매출의 약 80%를 창출합니다). .cumsum()으로 누적 매출 열을 계산하고, 누적 비중이 80%를 초과하는 지점의 제품 수를 찾아 기준선을 정하십시오. 이 분석은 제품 포트폴리오의 우선순위를 정하는 데 도움이 됩니다.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

product_rev = (
    df.groupby('product_id')['revenue']
    .sum()
    .sort_values(ascending=False)
    .reset_index()
)

total_rev = product_rev['revenue'].sum()
product_rev['rev_share'] = product_rev['revenue'] / total_rev
product_rev['cumulative_share'] = product_rev['rev_share'].cumsum()

pct80_cutoff = (product_rev['cumulative_share'] <= 0.80).sum()
total_products = len(product_rev)
print(f'Top {pct80_cutoff} of {total_products} products ({pct80_cutoff/total_products:.0%}) '
      f'generate 80% of revenue (Pareto)')
print(product_rev.head())

모든 KPI 테이블 저장

각 KPI 테이블을 출력 디렉터리의 이름이 지정된 Parquet 파일로 저장하십시오. 이름 규칙은 kpi_{name}.parquet입니다. 이렇게 하면 시각화 단계가 간단해집니다. 필요한 사전 계산 테이블을 정확히 읽고 아무것도 다시 계산하지 않기 때문입니다. 또한 기술 지식이 없는 이해관계자가 Excel에서 쉽게 열어 볼 수 있도록 통합 KPI 요약을 CSV로 저장하십시오.

import pandas as pd

# Save all KPI tables
monthly_cat.to_parquet('output/kpi_monthly_category_revenue.parquet')
region_kpi.to_parquet('output/kpi_region_summary.parquet', index=False)
retention.to_parquet('output/kpi_cohort_retention.parquet')
daily.to_parquet('output/kpi_rolling_active_users.parquet')
product_rev.to_parquet('output/kpi_product_ranking.parquet', index=False)

# Also a CSV summary for sharing
region_kpi.to_csv('output/region_summary.csv', index=False)

print('All KPI tables saved:')
print('  kpi_monthly_category_revenue.parquet')
print('  kpi_region_summary.parquet')
print('  kpi_cohort_retention.parquet')
print('  kpi_rolling_active_users.parquet')
print('  kpi_product_ranking.parquet')

KPI의 통계적 검증

KPI를 확정하기 전에 통계적 검사를 실행하십시오. 일표본 t-검정을 사용하여 월별 매출 증가율이 0 증가율을 기준으로 통계적으로 유의한지 검정하고, 일원 ANOVA를 사용하여 지역별 매출 차이가 유의한지 확인하십시오. '매출 기준 상위 지역'이라는 보고는 그 차이가 무작위 변동으로 발생했을 가능성이 낮다고 확인할 수 있을 때 더 의미가 있습니다. p값을 메타데이터 열로 KPI 테이블에 추가하십시오.

import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_parquet('output/analysis_ready.parquet')

# Is revenue growth statistically significant?
monthly_total = df.groupby('year_month')['revenue'].sum().sort_index()
month_changes = monthly_total.diff().dropna()
stat, p = stats.ttest_1samp(month_changes, popmean=0)
print(f'Monthly growth test: mean={month_changes.mean():.0f}, p={p:.4f}')
print('Significant positive trend?', month_changes.mean() > 0 and p < 0.05)

# ANOVA: do regions differ significantly?
groups = [g['revenue'].values for _, g in df.groupby('region')]
f, p_anova = stats.f_oneway(*groups)
print(f'Region ANOVA: F={f:.3f}, p={p_anova:.4f}')

전월 대비 증가율 계산

전월 대비(MoM) 증가율은 기본적인 비즈니스 KPI입니다. growth = (current - previous) / previous × 100으로 계산합니다. 깔끔하게 계산하려면 pct_change()를 사용하십시오. MoM 증가율의 3개월 이동 평균은 월별 변동을 완화하여 근본적인 추세를 보여 줍니다. 음의 증가율도 양의 증가율만큼 중요하게 강조해야 합니다. 음의 증가율은 조사가 필요한 기간을 나타내기 때문입니다.

import pandas as pd

df = pd.read_parquet('output/analysis_ready.parquet')

monthly_total = (
    df.groupby('year_month')['revenue'].sum().sort_index()
)

growth = monthly_total.pct_change() * 100
trend = growth.rolling(3, min_periods=1).mean()

kpi_growth = pd.DataFrame({
    'revenue': monthly_total,
    'mom_growth_pct': growth.round(2),
    'trend_3m_avg': trend.round(2)
})

print(kpi_growth.tail(6))
print(f'\nBest month: {monthly_total.idxmax()} (${monthly_total.max():,.0f})')
print(f'Worst month: {monthly_total.idxmin()} (${monthly_total.min():,.0f})')

자동 이상 징후 탐지

이상 징후가 있는 월을 자동으로 표시합니다. 즉, 매출이 직전 6개월 평균에서 표준편차 2배보다 크게 벗어난 월을 찾습니다. 이러한 월은 조사할 가치가 있습니다. 성공적인 캠페인이나 데이터 중단 같은 실제 비즈니스 이벤트를 반영할 수도 있고, 동일한 데이터가 두 번 로드되는 중복 데이터 같은 데이터 품질 문제일 수도 있습니다. 이상 징후 탐지는 자동화된 파이프라인 대시보드에 추가할 가치가 높은 기능이며, 분석가가 가장 중요한 기간에 조사 역량을 집중하도록 도와줍니다.

import pandas as pd
import numpy as np

df = pd.read_parquet('output/analysis_ready.parquet')
monthly = df.groupby('year_month')['revenue'].sum().sort_index()

rolling_mean = monthly.rolling(6, min_periods=3).mean()
rolling_std = monthly.rolling(6, min_periods=3).std()

anomalies = monthly[
    (monthly > rolling_mean + 2 * rolling_std) |
    (monthly < rolling_mean - 2 * rolling_std)
]
print('Anomalous months (>2 std from 6-month rolling mean):')
if len(anomalies) > 0:
    print(anomalies.round(0))
else:
    print('None detected')

KPI 요약 표

모든 KPI의 상위 수준 값을 하나의 경영진 요약 표로 정리합니다. 여기에는 총매출, 총주문 수, 순 고객 수, 평균 주문 금액, 최우수 지역, 최우수 카테고리, 그리고 3개월 차의 평균 30일 코호트 유지율을 포함합니다. 이 한 개의 표로 구성된 요약은 보고서의 첫 페이지입니다. 이해관계자는 차트와 세부 표를 살펴보기 전에 이 표를 통해 핵심 내용을 즉시 파악할 수 있습니다.

import pandas as pd

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

summary = {
    'Total Revenue': f'${df["revenue"].sum():,.0f}',
    'Total Orders': f'{df["order_id"].nunique():,}',
    'Unique Customers': f'{df["customer_id"].nunique():,}',
    'Avg Order Value': f'${df["revenue"].mean():.2f}',
    'Best Region': region_kpi.iloc[0]["region"],
    'Best Category': df.groupby("category")["revenue"].sum().idxmax(),
    'Avg Month-3 Retention': f'{retention.get(3, pd.Series([0])).mean():.1%}'
}

for k, v in summary.items():
    print(f'{k:25s}: {v}')

빠른 확인

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

단원 요약

이번 단원에서는 다음을 배웠습니다. groupby + pivot은 월별 카테고리 매출 행렬과 코호트 유지율 표를 만들고, rolling()은 평활화된 추세와 30일 활성 사용자 근사치를 계산하며, 통계적 검증(성장률에 대한 t-검정, 지역 차이에 대한 ANOVA)은 KPI 해석에 엄밀성을 더합니다. 다음 단계에서는 다중 패널 그림으로 모든 결과를 시각화하고 최종 보고서를 내보냅니다.

자주 묻는 질문

“분석과 KPI 계산” 강의는 무료인가요?

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

“분석과 KPI 계산”에서 뭘 배우나요?

그룹화, 피벗, 롤링을 사용해 월별 코호트 유지율, 제품별 매출, 최근 30일 활성 사용자를 계산합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“분석과 KPI 계산” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 프로젝트 설정과 데이터 수집
  2. 데이터 정제와 특성 공학
  3. 분석과 KPI 계산
  4. 최종 시각화와 보고서 내보내기
← Pandas & NumPy Academy(으)로 돌아가기