Torna all'elenco degli articoli Articoli
Tempo di lettura: 11 minuti

Analisi di vendite reali con il foglio informativo per analisti

Avete mai usato il Data Analyst Cheat Sheet per analizzare un set di dati aziendali? In questo articolo potrete vedere in azione i comandi del foglio informativo.

Esplorerò un set di dati reali sulle vendite per rispondere a 10 domande aziendali chiave utilizzando SQL. Seguendo le indicazioni del foglio informativo SQL per l'analisi dei dati, dimostrerò come le query SQL possano aiutare ad analizzare le tendenze, misurare le prestazioni ed estrarre informazioni significative dai dati di vendita.

A tale scopo, utilizzeremo un dataset aperto di Tableau che contiene dati di vendita di articoli per la casa come scrivanie e cancelleria. Questo set di dati offre un modo pratico per esplorare le domande di reporting relative al business e vedere come l'SQL può essere utilizzato per scoprire tendenze utili.

Più che su un caso di studio formale, questo articolo si concentra sulla mappatura delle domande aziendali con le query SQL generali. Vedrete come le tecniche SQL si allineano alle sfide dell'analisi dei dati del mondo reale e come emergono diversi modelli di metriche nei report.

Alla fine, sarete in grado di riconoscere questi modelli e di applicarli al vostro lavoro di reporting SQL. Tuffiamoci nel vivo!

Panoramica

Questa analisi è strutturata in due parti principali. In primo luogo, esamino le tendenze generali, come le vendite totali, i profitti e le quantità vendute. Poi mi concentro sull'andamento delle vendite, identificando i modelli nel tempo, per categoria e tra i diversi segmenti aziendali.

Per rispondere a queste domande, utilizzo tecniche SQL come aggregazioni, rapporti, funzioni finestra e subquery. I modelli metrici comuni, come il raggruppamento dei dati, il monitoraggio delle tendenze, il calcolo delle medie mobili e la classificazione dei risultati, aiutano a strutturare l'analisi. Il foglio di istruzioni SQL per l'analisi dei dati serve come riferimento per funzioni chiave come GROUP BY, classifica, totali progressivi ed estrazioni di date. Negli esempi che seguono ho aggiunto dei tag per categorizzarli: parentesi per le tecniche SQL [SQL], parentesi per i modelli metrici (METRIC) e parentesi per i riferimenti al cheatsheet {SHEET}. Questi tag aiutano a organizzare l'analisi di ciascun esempio.

Gli esempi sono organizzati per livello di difficoltà, partendo da query semplici e incorporando gradualmente tecniche più avanzate. In questo modo è facile seguire e applicare approcci simili ad altri insiemi di dati aziendali.

Come preparare i dati

Per iniziare l'analisi, è necessario preparare il dataset. Io utilizzo un dataset aperto di Tableau Public, che contiene i dati di vendita di articoli per la casa come scrivanie e cancelleria. Poiché è ampiamente utilizzato nella reportistica aziendale, è un'ottima risorsa per esercitarsi con le query SQL. Di seguito sono riportate le istruzioni passo-passo per scaricare il dataset, importarlo in un ambiente SQL e apportare piccole modifiche per pulire i dati.

Scaricare il set di dati da Tableau Public.

  • Andate su Impara → Dati di esempio → Business → Vendite al supermercato.
  • Scaricate il dataset Superstore Sales.
Esplorazione del set di dati sulla crescita delle vendite

Aprire il dataset in Excel.

  1. I dati rilevanti si trovano nella scheda "Ordini".
  2. Aprire il file .xls
  3. Andare alla scheda "Ordini" nel foglio di calcolo.

Download dell'IDE SQL - opzionale per chiunque voglia seguire e ricreare le metriche. Io sto usando MySQL Workbench e MySQL Community Server. Se desiderate utilizzare gli stessi, i download sono disponibili qui sotto. Mostrerò i passaggi per importare il set di dati in MySQL Workbench.

Link per il download:

Preferisco usare MySQL Workbench con il Community Server, quindi i passi seguenti servono a configurarlo:

  1. Innanzitutto, confermo che la connessione all'istanza locale è stata stabilita.
Esplorazione del set di dati sulla crescita delle vendite
  1. Quindi, creo un nuovo schema seguendo queste istruzioni:
  • Fare clic sulla connessione all'istanza locale.
  • Scegliere Schema dal menu superiore.
  • Fare clic con il pulsante destro del mouse e selezionare Crea schema.
  • Nominare lo schema Tableau Superstore.
  • Importare il file .xls come .csv in Tabelle utilizzando la procedura guidata di importazione delle tabelle di dati (prima convertire .xls in .csv). Un metodo alternativo è quello di importarlo come JSON utilizzando un convertitore JSON (link alle istruzioni, che è il metodo che ho utilizzato io).
  • Configurare le impostazioni di importazione e scegliere il tipo di campo predefinito per le diverse colonne di origine. Non includere l'ultima riga vuota!

Prima del passaggio finale, apportare modifiche manuali a Alter Table: rimuovere gli spazi dai nomi delle colonne e sostituirli con i trattini bassi (_).

L'ultimo passo consiste nel fare clic con il pulsante destro del mouse e selezionare Crea schema. Ta-da! Congratulazioni, la parte più complicata è alle spalle.

  1. Date un nome allo schema: Tableau Superstore dovrebbe andare bene. Utilizzare la procedura guidata di importazione dei dati della tabella per aggiungere il file, come mostrato nell'immagine.
Esplorazione del set di dati sulla crescita delle vendite
  1. Caricare il file .csv.
Esplorazione del set di dati sulla crescita delle vendite

Oppure, se si converte in JSON, caricare il file JSON. Per questo è necessario utilizzare un convertitore da .csv a .json, come mostrato nell'immagine.

Esplorazione del set di dati sulla crescita delle vendite

Mantenere tutti i campi selezionati, ma escludere il campo "vuoto" e impostare tutti gli altri come campi "testo".

Esplorazione del set di dati sulla crescita delle vendite

A questo punto, l'unica cosa da fare è cliccare con il tasto destro del mouse sulla tabella orders e selezionare Alter Table.

Esplorazione del set di dati sulla crescita delle vendite

La preparazione dei dati è ora completa e siamo pronti a passare all'analisi. Un piacevole bonus: potete sempre trovare tutte le richieste e i pezzi di codice dell'articolo sulla pagina GitHub dedicata.

Trovare le tendenze generali

Facciamo un po' di riscaldamento a livello facile! Per iniziare l'analisi, partiremo da alcuni indicatori di performance chiave (KPI) per ottenere una visione di alto livello di vendite, profitti e quantità vendute. Queste query aiutano a riassumere il set di dati e a fornire una rapida istantanea delle prestazioni aziendali complessive.

Metriche KPI: Vendite totali, profitto e quantità vendute.

Domanda: Qual è il totale delle vendite, dei profitti e delle quantità vendute?

(AGGREGAZIONE) (COMPLESSIVO) {FUNZIONI DI AGGREGAZIONE}

SELECT 
  ROUND(SUM(Sales), 0) AS sales_total,
  ROUND(SUM(Profit), 0) AS profit_total,
  ROUND(SUM(Quantity), 0) AS quantity_total
FROM `Tableau Superstore`.orders;

Risultato: Questa query calcola il totale delle vendite, dei profitti e delle quantità vendute nell'intero set di dati. Fornisce una visione d'insieme delle prestazioni aziendali complessive.

Metriche KPI: Tendenze mensili e annuali

Domanda: Qual è stato l'andamento mensile/annuale delle vendite, dei profitti e delle quantità vendute?

(AGGREGAZIONE) (TREND) {FUNZIONI DI AGGREGAZIONE | ESTRAZIONE DI PARTI DI DATA}

SELECT 
EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Year,
EXTRACT(MONTH FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Month,
  ROUND(SUM(Sales), 0) AS sales_month,
  ROUND(SUM(Profit), 0) AS profit_month,
  ROUND(SUM(Quantity), 0) AS quantity_month
FROM `Tableau Superstore`.orders
GROUP BY 
  1, 2
ORDER BY 
  1, 2;

Risultato: Questa query suddivide le vendite, i profitti e le quantità per anno e mese, aiutandoci a identificare le tendenze nel tempo. È utile per individuare gli schemi stagionali o la crescita di un anno.

Metriche KPI: Vendite medie, profitto e quantità vendute

Domanda: Qual è stata la media delle vendite, dei profitti e delle quantità vendute?

(AGGREGAZIONE) (COMPLESSIVO) {FUNZIONI DI AGGREGAZIONE}

SELECT 
  ROUND(AVG(Sales), 0) AS sales_average,
  ROUND(AVG(Profit), 0) AS profit_average,
  ROUND(AVG(Quantity), 0) AS quantity_average
FROM `Tableau Superstore`.orders;

Risultato: Invece dei valori totali, questa query calcola la media delle vendite, dei profitti e della quantità venduta per ordine. È utile per comprendere le dimensioni tipiche delle transazioni e confrontarle con periodi di tempo o segmenti aziendali diversi.

Spero che siate riusciti a superare il primo livello di analisi! Ora facciamo un passo avanti con query più avanzate. Il livello medio è quello successivo, a partire dal calcolo della media mobile, che aiuta a smussare le fluttuazioni a breve termine e a identificare le tendenze delle vendite nel tempo. Questo approccio ci permette di prevedere le vendite future analizzando i modelli dei mesi precedenti.

Domanda: Come possiamo prevedere le vendite per mese?
[WINDOW FUNCTION] (TREND | MOVING AVERAGE) {FUNZIONI AGGREGATE | ESTRAZIONE DI PARTI DI DATA | MEDIA MOBILE}

SELECT 
  EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Year,
  EXTRACT(MONTH FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Month,
  ROUND(SUM(Sales), 0) AS sales_total,
  ROUND(AVG(SUM(sales)) OVER(ORDER BY EXTRACT(MONTH FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) 
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW), 0) AS moving_average
FROM `Tableau Superstore`.orders
GROUP BY 1, 2
ORDER BY 1, 2;

Risultato: Questa query calcola i totali delle vendite mensili e applica una media mobile sugli ultimi tre mesi (compreso quello in corso). Questo aiuta a identificare le tendenze delle vendite nel tempo, attenuando le fluttuazioni a breve termine e rendendo più facile la previsione delle prestazioni future.

Spero che siate al passo! Ora affrontiamo una query più avanzata. Il livello più alto è quello successivo, dove calcoliamo la somma cumulativa delle vendite per il 2017. Questo totale progressivo aiuta a seguire l'andamento delle vendite mese per mese, fornendo un quadro chiaro delle prestazioni complessive durante l'anno.

Domanda: Qual è la somma cumulativa delle vendite per il 2017? Mostrare per mese.
[WINDOW FUNCTION | CTE] (TREND | CUMULATIVE) {FUNZIONI AGGREGATE | ESTRAZIONE DI PARTI DI DATA | TOTALE CORRENTE | CTE}

WITH monthly_report AS (
  SELECT 
    EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Year,
    EXTRACT(MONTH FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Month,
    ROUND(SUM(Sales), 0) AS monthly_sales_total
  FROM `Tableau Superstore`.orders
  WHERE EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) = 2017
  GROUP BY 1, 2
)
SELECT
  order_month,
  yearly_sales_total,
  SUM(yearly_sales_total) OVER(ORDER BY order_Year) AS running_sales_total
FROM monthly_report
ORDER BY 1, 3 DESC;

Risultato: Questa query calcola innanzitutto i totali delle vendite mensili per il 2017 utilizzando una Common Table Expression (CTE). Quindi applica un totale corrente utilizzando una funzione finestra per sommare le vendite progressivamente nei mesi. Ciò consente di analizzare la crescita cumulativa e di individuare le tendenze delle vendite nell'arco dell'anno.

Determinazione delle tendenze di vendita

Cominciamo di nuovo con il livello più semplice, ma questa volta concentrandoci sugli approfondimenti regionali e di categoria. Queste query aiutano a suddividere le metriche chiave per i diversi segmenti dell'azienda, offrendo un quadro più chiaro rispetto al semplice esame dei totali complessivi.

Domanda: Quali sono le vendite totali, i profitti e le quantità per ogni regione?

(AGGREGAZIONE) (GRUPPO) {FUNZIONI DI AGGREGAZIONE}

SELECT 
  Region,
  ROUND(SUM(Sales), 0) AS sales_total,
  ROUND(SUM(Profit), 0) AS profit_total,
  ROUND(SUM(Quantity), 0) AS quantity_total
FROM `Tableau Superstore`.orders
GROUP BY 1
ORDER BY 2 DESC;

Risultato: Questa query raggruppa le vendite, i profitti e le quantità per regione, consentendoci di confrontare le prestazioni tra le diverse aree geografiche. Ci aiuta a identificare le regioni con i migliori risultati e quelle che potrebbero necessitare di ulteriori analisi.

Domanda: Qual è il margine di profitto per ogni categoria di prodotto?

[AGGREGAZIONE | RAPPORTO] (GRUPPO) {FUNZIONI DI AGGREGAZIONE | DIVISIONE DI INTERI}

SELECT
  Category,
  ROUND(SUM(Sales), 0) AS sales_total,
  ROUND(SUM(Profit), 0) AS profit_total,
  ROUND(SUM(Profit)/SUM(Sales), 2) AS profit_margin
FROM `Tableau Superstore`.orders
GROUP BY 1
ORDER BY 4 DESC;

Risultato: Questa query calcola le vendite, i profitti e il margine di profitto per ogni categoria di prodotti. Dividendo il profitto per le vendite, si ottiene il rapporto di redditività, che aiuta a determinare quali categorie generano i maggiori profitti.

Passiamo al livello medio, dove analizzeremo le variazioni delle vendite anno su anno (YoY) e calcoleremo la percentuale delle vendite totali per ogni categoria.

Domanda: Creare un report che mostri le vendite, le vendite medie e la variazione annuale (delta) per anno.
[WINDOW FUNCTION] (TREND | DELTA) {FUNZIONI AGGREGATE | ESTRAZIONE DI PARTI DI DATA | DIFFERENZA TRA DUE RIGHE (DELTA) }

SELECT DISTINCT
    EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y'))) AS order_Year,
    ROUND(SUM(sales), 0) AS sales_total,
    ROUND(LAG(SUM(SALES)) OVER(ORDER BY EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y')))), 0) AS sales_prev_year,
    (ROUND(SUM(sales), 0)) - (ROUND(LAG(SUM(SALES)) OVER(ORDER BY EXTRACT(YEAR FROM DATE(STR_TO_DATE(order_date, '%m/%d/%Y')))), 0)) AS sales_yoy_difference
FROM `Tableau Superstore`.orders
GROUP BY 1
ORDER BY 1;

Risultato: Questa query calcola le vendite totali per anno e le confronta con l'anno precedente utilizzando la funzione LAG(). Il risultato è una differenza a/a, che aiuta a tenere traccia della crescita o del calo delle vendite annuali a colpo d'occhio.

Domanda: Qual è la percentuale delle vendite totali per ogni categoria?
[SUBQUERY] (GROUP | RATIO) {Funzioni aggregate | Calcolo della percentuale del totale all'interno di un gruppo}.

SELECT DISTINCT
    category,
    ROUND(SUM(sales), 0) AS sales_total,
    ROUND((SUM(sales) / (SELECT SUM(sales) FROM `Tableau Superstore`.orders)) * 100, 0) AS percent_oftotal
FROM `Tableau Superstore`.orders
GROUP BY 1;

Risultato: Questa query calcola le vendite di ogni categoria come percentuale delle vendite totali. La sottoquery assicura che il denominatore rimanga fisso, consentendo un confronto accurato delle prestazioni delle categorie rispetto all'intero set di dati.

Abbiamo raggiunto la parte finale dell'analisi, il livello più difficile, quindi affrontiamo un'ultima sfida. Questa volta, identificheremo le due sottocategorie più vendute all'interno di ogni categoria di prodotto per vedere quali sono gli articoli che generano più fatturato.

Domanda: Quali sono le due sottocategorie più vendute all'interno di ciascun gruppo?
[WINDOW FUNCTION | CTE] (RANK) {AGGREGATE FUNCTIONS | RANK | CTE}

WITH category_ranking AS (
  SELECT
    Category,
    Sub_Category,
    ROUND(SUM(Sales), 0) AS sales_total,
    DENSE_RANK() OVER(PARTITION BY Category ORDER BY SUM(SALES) DESC) AS sub_category_rank
  FROM `Tableau Superstore`.orders
  GROUP BY 1, 2
)
SELECT
  Category,
  Sub_Category,
  sales_total
FROM category_ranking
WHERE sub_category_rank <= 2
ORDER BY 1, 3 DESC;

Risultato: Questa query classifica le sottocategorie all'interno di ciascuna categoria in base alle vendite totali utilizzando la funzione di finestra DENSE_RANK(). Poiché il raggruppamento avviene per categoria, non è possibile utilizzare una semplice funzione aggregata per la classificazione. Invece, la Common Table Expression (CTE) calcola prima le classifiche e la selezione finale filtra solo le due migliori sottocategorie per categoria.

Conclusione

In questo articolo abbiamo esplorato 10 query SQL chiave che aiutano a rispondere alle domande aziendali relative alla reportistica. Abbiamo iniziato con le metriche KPI di base, siamo passati all'analisi dei trend e alle previsioni, per finire con le classifiche più avanzate e i calcoli cumulativi.

Lavorando su queste query, avete visto gli schemi SQL più comuni utilizzati nella reportistica aziendale, tra cui le aggregazioni, le funzioni finestra e le subquery. Sia che abbiate seguito passo dopo passo o che abbiate semplicemente rivisto gli esempi, queste tecniche possono essere un riferimento pratico per l'analisi dei dati di vendita in SQL.

Spero che questa analisi abbia contribuito a chiarire come applicare le tecniche di Scheda dell'analista di dati nella pratica. Se qualcosa non è chiaro, se individuate qualche errore o se avete domande sull'articolo o su qualche pezzo di codice, discutiamone e miglioriamo insieme! Sarei felice di collegarmi su LinkedIne potete trovare altri esempi e approfondimenti sul mio profilo profilo Tableau Public o sul mio blog. Attendo con ansia le vostre riflessioni!