Python e Analisi dei Dati: Guida Completa dal Principiante all’Esperto
L’analisi dei dati è diventata una competenza fondamentale nel mondo moderno, e Python si è affermato come il linguaggio di programmazione più potente e versatile per questo campo. Questa guida completa ti accompagnerà in un viaggio di apprendimento strutturato, dalla programmazione Python di base fino alle tecniche più avanzate di apprendimento automatico e apprendimento profondo.
In questo articolo
- Fondamenti Python: Sintassi, strutture dati, programmazione orientata agli oggetti
- Librerie Essenziali: NumPy, Pandas, Matplotlib, Seaborn per analisi e visualizzazione
- Apprendimento automatico: Scikit-learn per algoritmi di apprendimento automatico
- Apprendimento profondo: PyTorch per reti neurali e intelligenza artificiale avanzata
- Progetti Pratici: Applicazioni reali per consolidare le competenze
- Buone pratiche: Tecniche professionali per codice pulito e efficiente
Panoramica della Guida
Questa guida è strutturata in modo progressivo, permettendo di acquisire competenze solide a ogni livello. Ogni sezione include teoria, esempi pratici e progetti per consolidare l’apprendimento.
Prerequisiti
- Nessuna esperienza di programmazione richiesta
- Computer con accesso a Internet
- Motivazione ad apprendere e sperimentare
- Curiosità per i dati e l’analisi
Obiettivi della Guida
Al termine di questa guida sarai in grado di:
- Programmare efficacemente in Python per l’analisi dei dati
- Manipolare e analizzare set di dati complessi con Pandas
- Visualizzare dati in modo professionale con Matplotlib e Seaborn
- Implementare algoritmi di apprendimento automatico con Scikit-learn
- Costruire reti neurali con PyTorch per apprendimento profondo
- Realizzare progetti end-to-end di scienza dei dati
Struttura Dettagliata della Guida
Parte I - Fondamenti Python
Sezione 1: Introduzione a Python
- Argomenti:
- Installazione Python e setup ambiente di sviluppo (Anaconda, Jupyter)
- IDE e editor: VS Code, PyCharm, Jupyter Notebook
- Filosofia Python e PEP 8 (stile di codifica)
- Sintassi base: variabili, tipi di dati, operatori
- REPL e primi script Python
Sezione 2: Strutture Dati e Controllo di Flusso
- Argomenti:
- Strutture dati: liste, tuple, set, dizionari
- Controllo di flusso: if/elif/else, for, while
- List comprehensions e dictionary comprehensions
- Funzioni: definizione, parametri, return, scope
- Gestione file: lettura e scrittura
Sezione 3: Programmazione Avanzata Python
- Argomenti:
- Programmazione orientata agli oggetti (classi, ereditarietà, polimorfismo)
- Gestione eccezioni (try/except/finally)
- Decoratori e context managers
- Moduli e pacchetti: import, init.py, pip
- Virtual environments e gestione dipendenze
Parte II - Analisi Dati con Python
Sezione 4: NumPy - Calcolo Numerico
- Argomenti:
- Array NumPy: creazione, indicizzazione, slicing
- Operazioni matematiche e statistiche
- Broadcasting e vectorizzazione
- Algebra lineare con NumPy
- Progetto: Implementazione algoritmo statistico
Sezione 5: Pandas - Manipolazione Dati
- Argomenti:
- DataFrame e Series: creazione e manipolazione
- Importazione dati: CSV, Excel, JSON, database
- Pulizia dati: valori mancanti, duplicati, outliers
- Groupby, merge, join, pivot tables
- Analisi delle serie temporali
- Progetto: Analisi set di dati vendite e-commerce
Sezione 6: Visualizzazione Dati
- Argomenti:
- Matplotlib: grafici base, customizzazione, subplots
- Seaborn: grafici statistici, heatmap, pair plot
- Plotly: grafici interattivi e cruscotti
- Buone pratiche per visualizzazioni efficaci
- Progetto: Cruscotto interattivo per KPI aziendali
Parte III - Apprendimento automatico
Sezione 7: Fondamenti di apprendimento automatico
- Argomenti:
- Tipi di apprendimento: supervisionato, non supervisionato, per rinforzo
- Pre-elaborazione: scaling delle feature, codifica, selezione feature
- Suddivisione train/validation/test e cross-validation
- Metriche di valutazione modelli
- Overfitting, underfitting e compromesso bias-varianza
Sezione 8: Scikit-learn Avanzato
- Argomenti:
- Algoritmi supervisionati: regressione, classificazione, alberi decisionali, SVM, metodi ensemble
- Algoritmi non supervisionati: clustering, PCA, t-SNE
- Ottimizzazione iperparametri: Grid Search, Random Search
- Pipeline e automazione del flusso di lavoro ML
- Progetto: Predizione prezzi immobiliari
Parte IV - Apprendimento profondo con PyTorch
Sezione 9: Introduzione PyTorch
- Argomenti:
- Tensori PyTorch vs array NumPy
- Differenziazione automatica e grafi computazionali
- Calcolo su GPU con CUDA
- Set di dati e DataLoader
- Salvare e caricare modelli
Sezione 10: Reti Neurali con PyTorch
- Argomenti:
- Perceptron e percettroni multistrato
- Backpropagation e discesa del gradiente
- Ottimizzatori: SGD, Adam, RMSprop
- Funzioni di perdita e metriche
- Progetto: Classificazione immagini CIFAR-10
Sezione 11: Apprendimento profondo avanzato
- Argomenti:
- Reti neurali convoluzionali (CNN)
- Reti neurali ricorrenti (RNN, LSTM, GRU)
- Apprendimento per trasferimento e fine-tuning
- Tecniche di regolarizzazione: dropout, batch normalization
- Progetto: Analisi sentiment Twitter con LSTM
Sezione 12: Progetti finali
- Argomenti:
- Progetto end-to-end di pipeline di scienza dei dati
- MLOps: distribuzione modelli con FastAPI
- A/B testing e monitoraggio dei modelli
- Etica nell’AI e bias nei dati
- Progetto: Sistema raccomandazione completo
Risultati di Apprendimento
Al completamento della guida
- 500+ ore di esperienza pratica coding Python
- 12+ progetti pronti per il portafoglio nel tuo GitHub
- Competenze certificate riconosciute dall’industria
- Rete professionale con altri professionisti della scienza dei dati
- Preparazione al lavoro per posizioni junior/mid-level
Modulo 1: Introduzione a Python - Configurazione professionale e primi passi
Configurazione ambiente di sviluppo
Opzione 1: Distribuzione Anaconda (Raccomandato per scienza dei dati)
Anaconda è la distribuzione Python più popolare per scienza dei dati e apprendimento automatico, includendo tutte le librerie essenziali pre-installate.
1
2
3
4
5
6
7
|
# Download da https://www.anaconda.com/products/distribution
# Installazione su Linux/Mac:
bash Anaconda3-2024.02-1-Linux-x86_64.sh
# Verifica installazione
conda --version
python --version
|
Vantaggi Anaconda:
- Oltre 250 pacchetti pre-installati (NumPy, Pandas, Matplotlib, ecc.)
- Gestione ambienti isolati
- Jupyter Notebook integrato
- Spyder IDE incluso
Opzione 2: Installazione Python + Virtual Environment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# Ubuntu/Debian
sudo apt update && sudo apt install python3 python3-pip python3-venv
# Windows (PowerShell)
# Scaricare da python.org e installare
# Assicurarsi di selezionare "Add Python to PATH"
# macOS (con Homebrew)
brew install python3
# Creare virtual environment
python3 -m venv data_science_env
source data_science_env/bin/activate # Linux/Mac
# data_science_env\Scripts\activate # Windows
# Installare pacchetti essenziali
pip install numpy pandas matplotlib seaborn jupyter scikit-learn
|
Per una panoramica completa su venv e Poetry, vedi guida ai virtual environment.
Configurazione IDE professionale
VS Code (Raccomandato)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Estensioni essenziali:
# - Python (Microsoft)
# - Jupyter (Microsoft)
# - Python Docstring Generator
# - GitLens
# - Pylance
# Configurazione settings.json
{
"python.defaultInterpreterPath": "./data_science_env/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.provider": "black"
}
|
Filosofia e buone pratiche Python
Il Zen di Python
I principi fondamentali che guidano ogni scienziato dei dati Python:
Principi chiave per scienza dei dati
- Leggibilità conta: Il codice è letto più spesso di quanto viene scritto
- Semplice è meglio di complesso: Soluzioni eleganti battono quelle complicate
- Dovrebbe esserci un modo ovvio per farlo: Convenzioni standardizzate
- Pratico batte purezza: Soluzioni funzionali sono preferibili a quelle teoriche
PEP 8 - Guida di stile per scienza dei dati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# CORRETTO - Naming conventions
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def calculate_correlation(data_frame, column_x, column_y):
"""
Calcola la correlazione tra due colonne di un DataFrame.
Args:
data_frame (pd.DataFrame): DataFrame contenente i dati
column_x (str): Nome della prima colonna
column_y (str): Nome della seconda colonna
Returns:
float: Coefficiente di correlazione
"""
return data_frame[column_x].corr(data_frame[column_y])
# SCORRETTO - Nomi poco chiari
import pandas
def calc_corr(df, x, y):
return df[x].corr(df[y])
|
Python per scienza dei dati - Primi esempi
Esempio 1: Calcoli Statistici Base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# Importare librerie
import math
import statistics
# Set di dati di esempio: temperature giornaliere
temperatures = [22.5, 25.1, 19.8, 27.3, 24.0, 26.7, 23.2, 21.9, 28.1, 25.5]
# Statistiche descrittive
mean_temp = statistics.mean(temperatures)
median_temp = statistics.median(temperatures)
std_temp = statistics.stdev(temperatures)
min_temp = min(temperatures)
max_temp = max(temperatures)
print(f"Analisi Temperature:")
print(f"Media: {mean_temp:.2f}°C")
print(f"Mediana: {median_temp:.2f}°C")
print(f"Deviazione Standard: {std_temp:.2f}°C")
print(f"Range: {min_temp:.1f}°C - {max_temp:.1f}°C")
# Output:
# Media: 24.41°C
# Mediana: 24.75°C
# Deviazione Standard: 2.64°C
# Range: 19.8°C - 28.1°C
|
Esempio 2: Lavorare con Dati Strutturati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# Simulare un set di dati vendite
sales_data = [
{"product": "Laptop", "price": 999.99, "quantity": 5, "category": "Electronics"},
{"product": "Mouse", "price": 29.99, "quantity": 15, "category": "Electronics"},
{"product": "Keyboard", "price": 79.99, "quantity": 8, "category": "Electronics"},
{"product": "Monitor", "price": 299.99, "quantity": 3, "category": "Electronics"},
{"product": "Desk", "price": 199.99, "quantity": 2, "category": "Furniture"}
]
# Analisi delle vendite
total_revenue = sum(item["price"] * item["quantity"] for item in sales_data)
electronics_revenue = sum(
item["price"] * item["quantity"]
for item in sales_data
if item["category"] == "Electronics"
)
print(f"Ricavo totale: €{total_revenue:,.2f}")
print(f"Ricavo elettronica: €{electronics_revenue:,.2f}")
print(f"Percentuale elettronica: {(electronics_revenue/total_revenue)*100:.1f}%")
# Prodotto più costoso
most_expensive = max(sales_data, key=lambda x: x["price"])
print(f"Prodotto più costoso: {most_expensive['product']} - €{most_expensive['price']}")
|
Esempio 3: Visualizzazione Dati Base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# Creare un grafico semplice con dati fittizi
months = ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu"]
sales = [12000, 15500, 13200, 16800, 14200, 18500]
# Calcolo crescita month-over-month
growth_rates = []
for i in range(1, len(sales)):
growth = ((sales[i] - sales[i-1]) / sales[i-1]) * 100
growth_rates.append(growth)
# Report crescita
print("Crescita Month-over-Month:")
for i, rate in enumerate(growth_rates):
print(f"{months[i]} -> {months[i+1]}: {rate:+.1f}%")
# Calcolo trend
average_growth = sum(growth_rates) / len(growth_rates)
print(f"\nCrescita media mensile: {average_growth:+.1f}%")
|
Jupyter Notebook per scienza dei dati
Primo Notebook
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# Cell 1: Configurazione
import sys
print(f"Python version: {sys.version}")
print(f"Current working directory: {sys.path[0]}")
# Cell 2: Load sample data
data = {
'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
'age': [25, 30, 35, 28, 32],
'salary': [50000, 60000, 70000, 55000, 65000]
}
# Cell 3: Analisi di base
ages = [person['age'] for person in data.values()]
salaries = [person['salary'] for person in data.values()]
print("Statistiche rapide:")
print(f"Eta media: {sum(data['age']) / len(data['age']):.1f}")
print(f"Stipendio medio: €{sum(data['salary']) / len(data['salary']):,.0f}")
|
Markdown Cells per Documentazione
1
2
3
4
5
6
7
8
9
10
11
12
|
# Analisi Stipendi per Età
## Obiettivi
- Analizzare la correlazione tra età e stipendio
- Identificare pattern nei dati
- Visualizzare le relazioni
## Metodologia
1. **Caricamento dati**: Caricamento set di dati campione
2. **EDA**: Analisi esplorativa dei dati
3. **Visualizzazione**: Grafici per risultati chiave
4. **Risultati**: Conclusioni e raccomandazioni
|
Esercitazioni Pratiche
Esercizio 1: Calcolatrice Statistica
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def statistical_calculator(numbers):
"""
Calcolatrice statistica completa.
Args:
numbers (list): Lista di numeri
Returns:
dict: Statistiche calcolate
"""
if not numbers:
return {"error": "Lista vuota"}
# Implementa le seguenti statistiche:
# - Media, mediana, moda
# - Deviazione standard
# - Quartili (Q1, Q2, Q3)
# - Range e IQR
# La tua implementazione qui...
pass
# Test della funzione
test_data = [1, 2, 2, 3, 4, 4, 4, 5, 6, 7, 8, 9, 10]
results = statistical_calculator(test_data)
print(results)
|
Esercizio 2: Analizzatore Testo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
def text_analyzer(text):
"""
Analizza un testo e fornisce statistiche.
Args:
text (str): Testo da analizzare
Returns:
dict: Statistiche del testo
"""
# Implementa:
# - Conteggio parole, caratteri, frasi
# - Parole più frequenti
# - Lunghezza media parole
# - Readability score semplificato
# La tua implementazione qui...
pass
# Test
sample_text = """
Python è un linguaggio di programmazione versatile e potente.
È particolarmente adatto per l'analisi dei dati e l'apprendimento automatico.
La sua sintassi chiara lo rende ideale per principianti ed esperti.
"""
analysis = text_analyzer(sample_text)
print(analysis)
|
Risorse per Approfondire
Verifica rapida sezione 1
Prima di passare alla sezione successiva, assicurati di aver completato:
Lista controllo completamento
- Environment Python configurato correttamente
- IDE/Editor installato e configurato
- Jupyter Notebook funzionante
- Primi script Python eseguiti con successo
- Comprensione di variabili, tipi di dati e operatori base
- Familiarità con documentazione e help() function
Modulo 2: Strutture Dati Python per scienza dei dati
Le strutture dati sono il fondamento di ogni analisi dati efficace. In questa sezione imparerai a padroneggiare liste, tuple, set e dizionari attraverso esempi pratici orientati all’analisi dei dati.
Liste - La Struttura Dati Più Versatile
Le liste sono ordinate, modificabili e permettono duplicati. Sono perfette per sequenze di dati, time series e operazioni di filtrazione.
Creazione e Manipolazione Base
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# Creazione liste per analisi dati
sales_2023 = [45000, 52000, 48000, 61000, 55000, 67000, 59000, 63000, 58000, 71000, 66000, 74000]
months = ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"]
# Operazioni di base
print(f"Vendite totali: €{sum(sales_2023):,}")
print(f"Media mensile: €{sum(sales_2023) / len(sales_2023):,.0f}")
print(f"Miglior mese: {months[sales_2023.index(max(sales_2023))]}")
# Slicing per analisi trimestri
q1 = sales_2023[0:3] # Primo trimestre
q2 = sales_2023[3:6] # Secondo trimestre
q3 = sales_2023[6:9] # Terzo trimestre
q4 = sales_2023[9:12] # Quarto trimestre
quarterly_performance = [sum(q1), sum(q2), sum(q3), sum(q4)]
print(f"Performance trimestri: {quarterly_performance}")
|
Comprensioni di lista per elaborazione dati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# Calcolo crescita month-over-month
growth_rates = [
((sales_2023[i] - sales_2023[i-1]) / sales_2023[i-1] * 100)
for i in range(1, len(sales_2023))
]
# Filtraggio mesi con crescita positiva
positive_months = [
months[i+1] for i, growth in enumerate(growth_rates) if growth > 0
]
# Identificazione outliers (vendite > 1.5 deviazione standard dalla media)
import statistics
mean_sales = statistics.mean(sales_2023)
std_sales = statistics.stdev(sales_2023)
threshold = mean_sales + (1.5 * std_sales)
outlier_months = [
(months[i], sales) for i, sales in enumerate(sales_2023)
if sales > threshold
]
print(f"Mesi outlier: {outlier_months}")
|
Metodi lista essenziali per scienza dei dati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# Set di dati prodotti
products = ["Laptop", "Mouse", "Keyboard", "Monitor", "Tablet"]
prices = [999, 29, 79, 299, 599]
categories = ["Electronics", "Accessories", "Accessories", "Electronics", "Electronics"]
# Sorting con chiavi personalizzate
# Ordinare prodotti per prezzo
products_by_price = sorted(zip(products, prices), key=lambda x: x[1], reverse=True)
print("Prodotti per prezzo:", products_by_price)
# Raggruppamento per categoria
from collections import defaultdict
category_groups = defaultdict(list)
for product, category in zip(products, categories):
category_groups[category].append(product)
print("Raggruppamento:", dict(category_groups))
# Operazioni statistiche su liste
def analyze_numeric_list(data, label="Data"):
"""Analisi completa di una lista numerica"""
return {
'label': label,
'count': len(data),
'sum': sum(data),
'mean': sum(data) / len(data),
'min': min(data),
'max': max(data),
'range': max(data) - min(data),
'sorted': sorted(data)
}
price_analysis = analyze_numeric_list(prices, "Prezzi Prodotti")
print(price_analysis)
|
Tuple - Dati Immutabili e Strutturati
Le tuple sono perfette per dati che non devono cambiare: coordinate, configurazioni, record database.
Tuple per Record Strutturati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# Record dipendenti (immutabili per integrità)
Employee = tuple # Type hint for clarity
employees = [
("Alice Johnson", "Scienziato dei dati", 75000, "2020-03-15"),
("Bob Smith", "Analista dati", 55000, "2021-07-22"),
("Carol Davis", "Ingegnere ML", 85000, "2019-11-30"),
("David Wilson", "Ingegnere dei dati", 70000, "2020-09-10")
]
# Unpacking per analisi
names, roles, salaries, hire_dates = zip(*employees)
# Named tuples per struttura più chiara
from collections import namedtuple
Employee = namedtuple('Employee', ['name', 'role', 'salary', 'hire_date'])
structured_employees = [Employee(*emp) for emp in employees]
# Analisi con named tuples
data_scientists = [emp for emp in structured_employees if 'Scienziato dei dati' in emp.role]
avg_salary_by_role = {}
for role in set(emp.role for emp in structured_employees):
role_salaries = [emp.salary for emp in structured_employees if emp.role == role]
avg_salary_by_role[role] = sum(role_salaries) / len(role_salaries)
print("Stipendio medio per ruolo:")
for role, avg_sal in avg_salary_by_role.items():
print(f" {role}: €{avg_sal:,.0f}")
|
Tuple per Coordinate e Dimensioni
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# Analisi geografica vendite
sales_locations = [
("Milano", (45.4642, 9.1900), 125000),
("Roma", (41.9028, 12.4964), 98000),
("Napoli", (40.8518, 14.2681), 76000),
("Torino", (45.0703, 7.6869), 85000),
("Firenze", (43.7696, 11.2558), 67000)
]
# Calcolo distanze (esempio semplificato)
def calculate_distance(coord1, coord2):
"""Calcola distanza euclidea approssimativa"""
lat1, lon1 = coord1
lat2, lon2 = coord2
return ((lat2 - lat1)**2 + (lon2 - lon1)**2)**0.5
# Trova location più vicine a Milano
milan_coord = sales_locations[0][1]
distances_from_milan = [
(city, calculate_distance(milan_coord, coord), sales)
for city, coord, sales in sales_locations[1:] # Escludi Milano stessa
]
distances_from_milan.sort(key=lambda x: x[1])
print("Città per distanza da Milano:", distances_from_milan)
|
Set - Operazioni Uniche e Confronti
I set sono ideali per analisi di unicità, deduplicazione e operazioni matematiche su insiemi.
Analisi Clienti e Segmentazione
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# Set di dati comportamento clienti
customers_q1 = {"Alice", "Bob", "Charlie", "Diana", "Eve", "Frank", "Grace"}
customers_q2 = {"Bob", "Diana", "Eve", "Henry", "Iris", "Jack", "Kate"}
customers_q3 = {"Charlie", "Diana", "Frank", "Henry", "Liam", "Mia", "Noah"}
customers_q4 = {"Alice", "Eve", "Grace", "Jack", "Liam", "Olivia", "Paul"}
# Analisi customer retention
retained_customers = customers_q1 & customers_q2 & customers_q3 & customers_q4
print(f"Clienti fedeli (tutti i trimestri): {retained_customers}")
# Nuovi clienti per trimestre
new_q2 = customers_q2 - customers_q1
new_q3 = customers_q3 - (customers_q1 | customers_q2)
new_q4 = customers_q4 - (customers_q1 | customers_q2 | customers_q3)
print(f"Nuovi clienti Q2: {new_q2}")
print(f"Nuovi clienti Q3: {new_q3}")
print(f"Nuovi clienti Q4: {new_q4}")
# Customer churn analysis
lost_after_q1 = customers_q1 - (customers_q2 | customers_q3 | customers_q4)
seasonal_customers = (customers_q1 | customers_q4) - (customers_q2 | customers_q3)
print(f"Clienti persi dopo Q1: {lost_after_q1}")
print(f"Clienti stagionali: {seasonal_customers}")
# Metriche di business
total_unique_customers = customers_q1 | customers_q2 | customers_q3 | customers_q4
active_all_quarters = len(retained_customers)
total_customers = len(total_unique_customers)
retention_rate = (active_all_quarters / len(customers_q1)) * 100
print(f"Tasso di retention: {retention_rate:.1f}%")
|
Dizionari - Mappature e Strutture Complesse
I dizionari sono perfetti per lookup tables, configurazioni, e strutture dati nested complesse.
Analisi Vendite Multi-Dimensionale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# Set di dati vendite complesso
sales_data = {
"2023": {
"Q1": {"Milano": 45000, "Roma": 38000, "Napoli": 25000},
"Q2": {"Milano": 52000, "Roma": 41000, "Napoli": 28000},
"Q3": {"Milano": 48000, "Roma": 39000, "Napoli": 30000},
"Q4": {"Milano": 61000, "Roma": 45000, "Napoli": 35000}
},
"2024": {
"Q1": {"Milano": 51000, "Roma": 42000, "Napoli": 29000},
"Q2": {"Milano": 58000, "Roma": 46000, "Napoli": 33000}
}
}
# Analisi performance per città
def analyze_city_performance(data, city):
"""Analizza performance di una città attraverso anni e trimestri"""
city_data = []
for year, quarters in data.items():
for quarter, cities in quarters.items():
if city in cities:
city_data.append({
'year': year,
'quarter': quarter,
'sales': cities[city],
'period': f"{year}-{quarter}"
})
# Calcola metriche
total_sales = sum(record['sales'] for record in city_data)
avg_sales = total_sales / len(city_data)
# Growth analysis
city_data.sort(key=lambda x: (x['year'], x['quarter']))
growth_rates = []
for i in range(1, len(city_data)):
prev_sales = city_data[i-1]['sales']
curr_sales = city_data[i]['sales']
growth = ((curr_sales - prev_sales) / prev_sales) * 100
growth_rates.append(growth)
return {
'city': city,
'total_sales': total_sales,
'average_quarterly_sales': avg_sales,
'quarters_analyzed': len(city_data),
'average_growth_rate': sum(growth_rates) / len(growth_rates) if growth_rates else 0,
'data_points': city_data
}
# Analisi per ogni città
cities = ["Milano", "Roma", "Napoli"]
city_analyses = {city: analyze_city_performance(sales_data, city) for city in cities}
# Report comparativo
print("REPORT PERFORMANCE CITTÀ:")
print("-" * 50)
for city, analysis in city_analyses.items():
print(f"{city}:")
print(f" Vendite totali: €{analysis['total_sales']:,}")
print(f" Media trimestrale: €{analysis['average_quarterly_sales']:,.0f}")
print(f" Crescita media: {analysis['average_growth_rate']:+.1f}%")
print()
|
Comprensioni di dizionario e aggregazioni
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# Aggregazioni avanzate
quarterly_totals = {
f"{year}-{quarter}": sum(cities.values())
for year, quarters in sales_data.items()
for quarter, cities in quarters.items()
}
yearly_totals = {
year: sum(
sum(cities.values()) for cities in quarters.values()
)
for year, quarters in sales_data.items()
}
city_totals = {}
for year, quarters in sales_data.items():
for quarter, cities in quarters.items():
for city, sales in cities.items():
if city not in city_totals:
city_totals[city] = 0
city_totals[city] += sales
print("Totali per trimestre:", quarterly_totals)
print("Totali per anno:", yearly_totals)
print("Totali per città:", city_totals)
# Ranking e top performers
top_quarters = sorted(quarterly_totals.items(), key=lambda x: x[1], reverse=True)
top_cities = sorted(city_totals.items(), key=lambda x: x[1], reverse=True)
print(f"Miglior trimestre: {top_quarters[0][0]} con €{top_quarters[0][1]:,}")
print(f"Miglior città: {top_cities[0][0]} con €{top_cities[0][1]:,}")
|
Conversioni tra Strutture Dati
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# Set di dati originale: lista di tuple
raw_data = [
("Prodotto A", "Electronics", 299.99, 150),
("Prodotto B", "Clothing", 89.99, 300),
("Prodotto C", "Electronics", 199.99, 200),
("Prodotto D", "Home", 149.99, 100),
("Prodotto E", "Electronics", 399.99, 75)
]
# Conversione a dizionario per lookup
product_dict = {product: {"category": cat, "price": price, "stock": stock}
for product, cat, price, stock in raw_data}
# Conversione a set per categorie uniche
unique_categories = set(item[1] for item in raw_data)
# Lista di dizionari per analisi strutturata
products_list = [
{"name": product, "category": cat, "price": price, "stock": stock}
for product, cat, price, stock in raw_data
]
# Raggruppamento per categoria
from collections import defaultdict
category_analysis = defaultdict(lambda: {"products": [], "total_value": 0, "avg_price": 0})
for product in products_list:
cat = product["category"]
category_analysis[cat]["products"].append(product["name"])
category_analysis[cat]["total_value"] += product["price"] * product["stock"]
# Calcola prezzo medio per categoria
for cat_data in category_analysis.values():
cat_products = [p for p in products_list if p["category"] in cat_data["products"]]
cat_data["avg_price"] = sum(p["price"] for p in cat_products) / len(cat_products)
print("Analisi per categoria:")
for category, data in category_analysis.items():
print(f"{category}: {len(data['products'])} prodotti, "
f"valore totale €{data['total_value']:,.0f}, "
f"prezzo medio €{data['avg_price']:.2f}")
|
Esercitazioni Pratiche Avanzate
Esercizio 1: Sistema di Raccomandazione Semplice
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def build_recommendation_system(purchase_history):
"""
Costruisci un sistema di raccomandazione basato su acquisti storici.
Args:
purchase_history (dict): {customer_id: [list_of_products]}
Returns:
dict: Raccomandazioni per ogni cliente
"""
# La tua implementazione qui:
# 1. Trova clienti con acquisti simili
# 2. Suggerisci prodotti acquistati da clienti simili
# 3. Ordina raccomandazioni per popolarità
pass
# Test data
purchase_data = {
"customer_1": ["laptop", "mouse", "keyboard"],
"customer_2": ["laptop", "monitor", "speakers"],
"customer_3": ["mouse", "keyboard", "headphones"],
"customer_4": ["laptop", "mouse", "webcam"],
"customer_5": ["tablet", "stylus", "case"]
}
recommendations = build_recommendation_system(purchase_data)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def sales_performance_analyzer(sales_records):
"""
Analizza performance vendite multi-dimensionale.
Args:
sales_records (list): Lista di record vendite
Formato: [{"date": "2024-01-15", "product": "X", "amount": 100, "region": "North"}]
Returns:
dict: Report completo con metriche e risultati chiave
"""
# Implementa:
# 1. Trend analysis per periodo
# 2. Performance per regione
# 3. Top products analysis
# 4. Seasonal patterns detection
# 5. Anomaly detection
pass
|
Risorse Approfondimenti
Verifica rapida sezione 2
Verifica competenze acquisite
- Creazione e manipolazione efficace di liste
- Uso appropriato di tuple per dati immutabili
- Operazioni su set per analisi univocità
- Dizionari per strutture dati complesse
- Conversioni tra strutture dati
- List/dict comprehensions per elaborazione efficiente
- Implementazione di algoritmi di analisi dati base
Roadmap completa di apprendimento
Percorso di sviluppo competenze
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
PRINCIPIANTE (0-3 mesi)
├── Fondamenti Python e sintassi
├── Padronanza strutture dati
├── I/O file e elaborazione di base
└── Primi progetti di analisi dei dati
INTERMEDIO (3-8 mesi)
├── Competenza NumPy e Pandas
├── Visualizzazione dati (Matplotlib, Seaborn)
├── Analisi statistica
├── Pulizia dati e pre-elaborazione
└── Integrazione SQL
AVANZATO (8-18 mesi)
├── Apprendimento automatico (Scikit-learn)
├── Statistica avanzata
├── Ingegneria delle caratteristiche
├── Selezione e validazione del modello
└── Fondamenti MLOps
ESPERTO (18+ mesi)
├── Apprendimento profondo (PyTorch/TensorFlow)
├── Elaborazione Big Data (Spark/Dask)
├── Algoritmi ML avanzati
├── Rilascio in produzione
└── Ricerca e innovazione
|
Progetti portafoglio consigliati
1. Progetto Analisi e-commerce (Intermedio)
- Set di dati: Transazioni vendite online
- Obiettivi: segmentazione clienti, previsione vendite, previsione churn
- Stack tecnico: Python, Pandas, Matplotlib, Scikit-learn
- Durata: 4-6 settimane
2. Sistema raccomandazione film (Avanzato)
- Set di dati: MovieLens o set di dati personalizzato
- Obiettivi: filtraggio collaborativo, raccomandazioni basate sui contenuti
- Stack tecnico: Python, NumPy, Pandas, Scikit-learn, reti neurali
- Durata: 6-8 settimane
- Set di dati: Twitter API o dati Reddit
- Obiettivi: analisi sentiment in tempo reale, previsione trend
- Stack tecnico: PyTorch, librerie NLP, distribuzione API
- Durata: 8-12 settimane
Risorse supplementari
Libri consigliati
Set di dati per pratica
Comunita e supporto
Conclusioni
Questa guida è in continua evoluzione. Per aggiornamenti, risorse aggiuntive e supporto della comunita, visita regolarmente le nostre risorse consigliate e resta connesso con la comunita scienza dei dati Python.