Analisi e calcolo dei KPI
Calcoli la retention mensile per coorte, i ricavi a livello di prodotto e gli utenti attivi su base mobile di 30 giorni usando groupby, pivot e rolling.
Analisi e calcolo dei KPI è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Caricamento dei dati pronti per l’analisi
Completate la pulizia e la creazione delle feature, carichi il checkpoint analysis_ready.parquet e inizi a calcolare i KPI. Questa fase è dedicata esclusivamente all’analisi: non è più necessaria alcuna pulizia dei dati. La disponibilità di un checkpoint pulito e validato consente di iterare rapidamente sulle definizioni dei KPI senza rieseguire le fasi di acquisizione e pulizia, che richiedono molto tempo. I tre KPI da calcolare sono: retention mensile delle coorti, fatturato dei prodotti per categoria e utenti attivi mobili su 30 giorni.
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: fatturato mensile per categoria
Il primo KPI è il fatturato mensile per categoria. Raggruppi per year_month e category, sommi il fatturato e applichi un pivot per ottenere le categorie come colonne e i mesi come righe. Questa tabella pivot è la base del grafico a linee delle tendenze e del grafico a barre delle categorie principali nel report. Applichi una media mobile su 3 mesi per attenuare la tendenza e mettere in evidenza la stagionalità.
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: principali regioni per fatturato totale
Classifichi le regioni in base al fatturato totale dell’intero periodo. Utilizzi groupby().agg() per calcolare simultaneamente più statistiche: fatturato totale, numero di ordini, clienti unici e valore medio dell’ordine. Ordini in modo decrescente per fatturato totale e mantenga le prime 10 regioni. Calcoli la quota di fatturato di ciascuna regione rispetto al totale complessivo: questo rivela il rischio di concentrazione (se l’80% del fatturato proviene da una sola regione, l’attività è esposta geograficamente).
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: matrice di retention delle coorti
La matrice di retention delle coorti mostra quale percentuale di clienti di ciascuna coorte di acquisizione ha effettuato almeno un acquisto in ogni periodo successivo. La calcoli in tre passaggi: (1) assegni a ogni ordine un «numero di periodo» = numero di mesi trascorsi dal mese della coorte del cliente; (2) esegui il groupby per coorte e numero di periodo e conti i clienti distinti; (3) dividi per la dimensione della coorte (il conteggio del periodo 0) per ottenere i tassi di retention. Applichi un pivot nel formato coorte × periodo.
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: utenti attivi mobili su 30 giorni
Gli utenti attivi giornalieri (DAU) e le varianti con finestra mobile sono KPI fondamentali di prodotto. Calcoli il numero di clienti distinti che hanno effettuato un acquisto in una determinata finestra di 30 giorni. Inizi calcolando gli acquirenti unici giornalieri, imposti la data come indice, quindi applichi rolling('30D').apply(lambda x: x.nunique()); tenga però presente che rolling su un DatetimeIndex richiede un’aggregazione specifica. Un’alternativa consiste nell’utilizzare un conteggio univoco mobile basato su insiemi tramite una funzione personalizzata per la finestra.
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())Classifica del fatturato a livello di prodotto
Per l’analisi a livello di prodotto, ordini tutti gli ID prodotto in base al fatturato totale e calcoli la relativa quota cumulativa del fatturato. Questo rivela se il fatturato segue una distribuzione di Pareto (un risultato comune è che circa il 20% dei prodotti genera circa l’80% del fatturato). Calcoli la colonna del fatturato cumulativo con .cumsum() e individui il numero di prodotti al limite oltre il quale la quota cumulativa supera l’80%. Questa analisi guida le decisioni sulla definizione delle priorità nel portafoglio prodotti.
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())Salvataggio di tutte le tabelle KPI
Salvi ogni tabella KPI in un file Parquet con un nome descrittivo nella directory di output. Convenzione di denominazione: kpi_{name}.parquet. In questo modo la fase di visualizzazione è semplice: legge esattamente la tabella precalcolata di cui ha bisogno, senza ricalcolare nulla. Salvi inoltre un riepilogo combinato dei KPI in un file CSV, così da facilitarne la condivisione con gli stakeholder non tecnici che potrebbero aprirlo in 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')Validazione statistica dei KPI
Prima di finalizzare i KPI, esegua alcuni controlli statistici: verifichi se la crescita mensile del fatturato è statisticamente significativa utilizzando un t-test a un campione rispetto a una crescita pari a zero e controlli se le differenze di fatturato tra le regioni sono significative mediante un’ANOVA a una via. Riportare la «regione principale per fatturato» è più significativo quando si può confermare che la differenza difficilmente sia dovuta a una variazione casuale. Aggiunga i p-value alle tabelle KPI come colonne di metadati.
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}')Calcolo del tasso di crescita mese su mese
Il tasso di crescita mese su mese (MoM) è un KPI aziendale fondamentale: growth = (current - previous) / previous × 100. Utilizzi pct_change() per un calcolo pulito. Una media mobile su 3 mesi della crescita MoM rivela la tendenza sottostante, attenuando la volatilità mensile. I tassi di crescita negativi sono importanti da evidenziare quanto quelli positivi: segnalano periodi che richiedono un’analisi.
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})')Rilevamento automatico delle anomalie
Contrassegnare automaticamente i mesi anomali: i mesi in cui i ricavi si discostano di oltre 2 deviazioni standard dalla media mobile dei 6 mesi precedenti. È opportuno analizzarli: potrebbero riflettere eventi aziendali reali (una campagna di successo, un'interruzione nella disponibilità dei dati) oppure problemi di qualità dei dati (dati duplicati caricati due volte). Il rilevamento delle anomalie è un'aggiunta preziosa a qualsiasi dashboard automatizzata di pipeline e aiuta gli analisti a concentrare l'analisi sui periodi più importanti.
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')Tabella riepilogativa dei KPI
Compilare un'unica tabella riepilogativa per i dirigenti che combini i valori di sintesi di tutti i KPI: ricavi totali, ordini totali, clienti unici, valore medio dell'ordine, regione migliore, categoria migliore e retention media a 30 giorni della coorte al terzo mese. Questo riepilogo in un'unica tabella costituisce la prima pagina del report: offre agli stakeholder una panoramica immediata dei dati principali prima che passino ai grafici e alle tabelle dettagliate.
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}')Verifica rapida
Verifichi la Sua comprensione dei concetti di analisi dei dati trattati in questa lezione.
Riepilogo della lezione
In questa lezione ha appreso che: groupby + pivot crea la matrice dei ricavi mensili per categoria e la tabella della retention delle coorti, rolling() calcola le tendenze smussate e le approssimazioni degli utenti attivi a 30 giorni, mentre la validazione statistica (t-test per la crescita, ANOVA per le differenze tra regioni) conferisce maggiore rigore all'analisi dei KPI. Nel prossimo passaggio visualizzeremo tutti i risultati in una figura multipannello ed esporteremo il report finale.
Domande Frequenti
La lezione «Analisi e calcolo dei KPI» è gratuita?
Sì — il testo completo di «Analisi e calcolo dei KPI» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «Analisi e calcolo dei KPI»?
Calcoli la retention mensile per coorte, i ricavi a livello di prodotto e gli utenti attivi su base mobile di 30 giorni usando groupby, pivot e rolling. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Analisi e calcolo dei KPI»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Configurazione del progetto e acquisizione dei dati
- Pulizia dei dati e feature engineering
- Analisi e calcolo dei KPI
- Visualizzazione finale ed esportazione del report