Pandas & NumPy Academy · Pelajaran

Analisis dan Penghitungan KPI

Hitung retensi kohort bulanan, pendapatan per produk, dan pengguna aktif bergulir selama 30 hari menggunakan groupby, pivot, dan rolling.

Pelajaran 3 dari 413 langkah

Analisis dan Penghitungan KPI adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Memuat Data Siap Analisis

Setelah pembersihan dan rekayasa fitur selesai, muat titik pemeriksaan analysis_ready.parquet dan mulai menghitung KPI. Tahap ini murni analisis—tidak ada lagi pembersihan data. Dengan adanya titik pemeriksaan yang bersih dan tervalidasi, Anda dapat mengulangi definisi KPI dengan cepat tanpa menjalankan ulang tahap penyerapan dan pembersihan yang memakan waktu. Tiga KPI yang akan dihitung: retensi kelompok bulanan, pendapatan tingkat produk berdasarkan kategori, dan pengguna aktif bergulir 30 hari.

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: Pendapatan Bulanan berdasarkan Kategori

KPI pertama adalah pendapatan bulanan berdasarkan kategori. Kelompokkan berdasarkan year_month dan category, jumlahkan pendapatan, lalu lakukan pivot agar kategori menjadi kolom dan bulan menjadi baris. Tabel pivot ini menjadi dasar grafik garis tren dan grafik batang kategori teratas dalam laporan. Terapkan rata-rata bergulir 3 bulan untuk menghaluskan tren dan menonjolkan musiman.

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: Wilayah Teratas berdasarkan Total Pendapatan

Urutkan wilayah berdasarkan total pendapatan selama seluruh periode. Gunakan groupby().agg() untuk menghitung beberapa statistik secara bersamaan: total pendapatan, jumlah pesanan, pelanggan unik, dan nilai pesanan rata-rata. Urutkan berdasarkan total pendapatan secara menurun dan pertahankan 10 teratas. Hitung porsi pendapatan setiap wilayah relatif terhadap total keseluruhan—ini mengungkap risiko konsentrasi (jika 80% pendapatan berasal dari satu wilayah, bisnis tersebut terekspos secara geografis).

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: Matriks Retensi Kelompok

Matriks retensi kelompok menunjukkan persentase pelanggan dari setiap kelompok akuisisi yang melakukan setidaknya satu pembelian pada setiap periode berikutnya. Hitung dalam tiga langkah: (1) tetapkan 'nomor periode' pada setiap pesanan = jumlah bulan sejak bulan kelompok pelanggan; (2) lakukan groupby berdasarkan kelompok dan nomor periode, lalu hitung pelanggan berbeda; (3) bagi dengan ukuran kelompok (jumlah periode 0) untuk memperoleh tingkat retensi. Lakukan pivot ke format kelompok × periode.

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: Pengguna Aktif Bergulir 30 Hari

Pengguna Aktif Harian (DAU) dan variasi jendela bergulir merupakan KPI produk inti. Hitung jumlah pelanggan berbeda yang melakukan pembelian dalam jendela 30 hari mana pun. Mulailah dengan menghitung pembeli unik harian, tetapkan tanggal sebagai indeks, lalu terapkan rolling('30D').apply(lambda x: x.nunique())—namun perhatikan bahwa rolling pada DatetimeIndex memerlukan agregasi tertentu. Alternatifnya adalah menggunakan penghitungan unik bergulir berbasis himpunan melalui fungsi jendela khusus.

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())

Peringkat Pendapatan Tingkat Produk

Untuk analisis tingkat produk, urutkan semua ID produk berdasarkan total pendapatan dan hitung porsi pendapatan kumulatifnya. Ini menunjukkan apakah pendapatan mengikuti distribusi Pareto (temuan umum: sekitar 20% produk menghasilkan sekitar 80% pendapatan). Hitung kolom pendapatan kumulatif dengan .cumsum() dan temukan jumlah produk batas saat porsi kumulatif melampaui 80%. Analisis ini membantu mengarahkan keputusan tentang prioritas portofolio produk.

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())

Menyimpan Semua Tabel KPI

Simpan setiap tabel KPI ke file Parquet bernama di direktori keluaran. Konvensi penamaan: kpi_{name}.parquet. Dengan demikian, tahap visualisasi menjadi sederhana—tahap tersebut membaca tabel prahitung yang tepat tanpa menghitung ulang apa pun. Simpan juga ringkasan KPI gabungan ke CSV agar mudah dibagikan kepada pemangku kepentingan nonteknis yang mungkin membukanya di Excel.

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')

Validasi Statistik KPI

Sebelum memfinalkan KPI, jalankan pemeriksaan statistik: uji apakah pertumbuhan pendapatan bulanan signifikan secara statistik menggunakan uji-t satu sampel terhadap pertumbuhan nol, dan periksa apakah perbedaan pendapatan antarwilayah signifikan menggunakan ANOVA satu arah. Pelaporan 'wilayah teratas berdasarkan pendapatan' menjadi lebih bermakna jika Anda dapat memastikan bahwa perbedaan tersebut kemungkinan kecil disebabkan oleh variasi acak. Tambahkan nilai-p ke tabel KPI sebagai kolom metadata.

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}')

Menghitung Tingkat Pertumbuhan Bulan ke Bulan

Tingkat pertumbuhan bulan ke bulan (MoM) adalah KPI bisnis mendasar: growth = (current - previous) / previous × 100. Gunakan pct_change() untuk penghitungan yang bersih. Rata-rata bergerak 3 bulan dari pertumbuhan MoM menampilkan tren yang mendasari dengan menghaluskan volatilitas bulanan. Tingkat pertumbuhan negatif sama pentingnya untuk ditonjolkan seperti tingkat positif—keduanya menandakan periode yang memerlukan penyelidikan.

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})')

Deteksi Anomali Otomatis

Tandai bulan-bulan anomali secara otomatis: bulan ketika pendapatan menyimpang lebih dari 2 simpangan baku dari rata-rata 6 bulan terakhir. Bulan-bulan ini perlu ditelusuri — penyebabnya mungkin peristiwa bisnis yang nyata (kampanye yang berhasil, gangguan data) atau masalah kualitas data (data duplikat dimuat dua kali). Deteksi anomali merupakan tambahan yang berharga untuk dasbor pipeline otomatis apa pun dan membantu analis memusatkan penyelidikan pada periode waktu yang paling penting.

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')

Tabel Ringkasan KPI

Susun satu tabel ringkasan eksekutif yang menggabungkan nilai tingkat teratas dari semua KPI: total pendapatan, total pesanan, jumlah pelanggan unik, nilai pesanan rata-rata, wilayah terbaik, kategori terbaik, dan rata-rata retensi cohort 30 hari pada bulan ke-3. Ringkasan satu tabel ini menjadi halaman pertama laporan — memberikan gambaran utama secara langsung kepada para pemangku kepentingan sebelum mereka menelaah grafik dan tabel terperinci.

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}')

Pemeriksaan Singkat

Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.

Rangkuman Pelajaran

Dalam pelajaran ini Anda mempelajari bahwa: groupby + pivot membuat matriks pendapatan kategori bulanan dan tabel retensi cohort, rolling() menghitung tren yang diperhalus dan perkiraan pengguna aktif 30 hari, serta validasi statistik (uji-t untuk pertumbuhan, ANOVA untuk perbedaan wilayah) menambah ketelitian pada analisis KPI. Selanjutnya, kita akan memvisualisasikan semua hasil dalam gambar multi-panel dan mengekspor laporan akhir.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Analisis dan Penghitungan KPI” gratis?

Ya — teks lengkap “Analisis dan Penghitungan KPI” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Analisis dan Penghitungan KPI”?

Hitung retensi kohort bulanan, pendapatan per produk, dan pengguna aktif bergulir selama 30 hari menggunakan groupby, pivot, dan rolling. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?

Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Analisis dan Penghitungan KPI” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?

Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penyiapan Proyek dan Pengambilan Data
  2. Pembersihan Data dan Rekayasa Fitur
  3. Analisis dan Penghitungan KPI
  4. Visualisasi Akhir dan Ekspor Laporan
← Kembali ke Pandas & NumPy Academy