IQR vs MAD: due approcci robusti per identificare gli outlier nei dataset reali
Quando si lavora con i dati, prima o poi ci si imbatte in un problema apparentemente banale ma in realtà cruciale: la presenza degli outlier.
Un sensore che registra un valore impossibile. Un cliente che effettua un acquisto dieci volte superiore alla media. Un rendimento finanziario fuori scala. Un errore di inserimento dati che trasforma 120 euro in 12.000 euro.
La domanda è sempre la stessa:
quel valore è un errore oppure rappresenta un’informazione importante?
In Data Science la risposta non può essere affidata all’intuizione. Occorrono metodi robusti, riproducibili e statisticamente fondati.
Tra le tecniche più utilizzate troviamo due approcci particolarmente interessanti:
- IQR (Interquartile Range)
- MAD (Median Absolute Deviation)
Entrambi hanno una caratteristica fondamentale: utilizzano la mediana invece della media e risultano quindi molto meno sensibili alla presenza di valori estremi.
In questo articolo vedremo come funzionano, quando conviene utilizzarli e quali problemi possono emergere nei dataset reali.
Perché la media è spesso una cattiva idea
Supponiamo di avere i seguenti valori:
[math]10,\; 11,\; 12,\; 13,\; 14,\; 200[/math]
La media vale:
[math]\displaystyle \bar{x} = 43.3[/math]
Un valore che non rappresenta affatto il comportamento tipico del dataset.
La mediana invece è:
[math]12.5[/math]
Molto più vicina alla realtà.
Per questo motivo la statistica robusta preferisce costruire gli algoritmi di rilevazione delle anomalie attorno alla mediana.
Metodo 1: Interquartile Range (IQR)
L’Interquartile Range misura la dispersione del 50% centrale dei dati.
Si definisce come:
[math]\text{IQR} = Q_3 – Q_1[/math]
dove:
- [math]Q_1[/math] = primo quartile (25° percentile)
- [math]Q_3[/math] = terzo quartile (75° percentile)
Una volta calcolato l’IQR si costruiscono due soglie:
Limite inferiore:
[math]\displaystyle Q_1 – 1.5 \times \text{IQR}[/math]
Limite superiore:
[math]\displaystyle Q_3 + 1.5 \times \text{IQR}[/math]
I valori che si trovano oltre questi limiti vengono classificati come outlier.
Metodo 2: Median Absolute Deviation (MAD)
Il MAD misura quanto le osservazioni si allontanano dalla mediana.
La definizione è:
[math]\text{MAD} = \operatorname{mediana}\bigl(|x_i – \operatorname{mediana}(x)|\bigr)[/math]
Il procedimento è semplice:
- calcolare la mediana dei dati;
- calcolare le distanze assolute dalla mediana;
- trovare la mediana di tali distanze.
A differenza dell’IQR, il MAD considera la distanza di ogni osservazione dal centro della distribuzione.
Esempio semplice
Prendiamo un piccolo insieme di misure (ad esempio minuti impiegati per completare un compito):
Dati: [math]8,\; 9,\; 10,\; 11,\; 12,\; 30[/math]
Vogliamo usare l’IQR per decidere se [math]30[/math] è un outlier.
Calcoli passo passo
- Ordinare i dati
[math]8,\; 9,\; 10,\; 11,\; 12,\; 30[/math] - Trovare la mediana (Q2)
Con [math]n=6[/math] la mediana è la media dei valori 3° e 4°:
[math]\displaystyle \text{Mediana} = \frac{10+11}{2} = 10.5[/math] - Calcolare [math]Q1[/math] e [math]Q3[/math]
La metà inferiore è [math]8,\; 9,\; 10[/math] → [math]Q1 = 9[/math].
La metà superiore è [math]11,\; 12,\; 30[/math] → [math]Q3 = 12[/math]. - Calcolare l’IQR
[math]\text{IQR} = Q3 – Q1 = 12 – 9 = 3[/math] - Costruire i recinti (fences)
Limite inferiore: [math]Q1 – 1.5 \times \text{IQR} = 9 – 1.5 \cdot 3 = 9 – 4.5 = 4.5[/math]
Limite superiore: [math]Q3 + 1.5 \times \text{IQR} = 12 + 1.5 \cdot 3 = 12 + 4.5 = 16.5[/math] - Confrontare i dati con i limiti
Tutti i valori minori di [math]4.5[/math] o maggiori di [math]16.5[/math] sono considerati outlier. Qui:
[math]30 > 16.5 \;\Rightarrow\; 30[/math] è un outlier secondo l’IQR.
Interpretazione pratica
Cosa ci dice il risultato: il valore [math]30[/math] è molto distante dal 50% centrale dei dati; l’IQR lo segnala come anomalo.
Cosa fare dopo: non eliminare automaticamente [math]30[/math]. Verificare la fonte (errore di misura, inserimento errato, evento reale). Se è un errore, correggerlo; se è reale, potrebbe essere l’informazione più interessante del dataset.
🔁 Cosa sarebbe successo con il metodo MAD (con [math]k=2.5[/math])?
- Mediana = [math]10.5[/math]
- Scostamenti assoluti dalla mediana:
[math]|8-10.5|=2.5,\; |9-10.5|=1.5,\; |10-10.5|=0.5,\; |11-10.5|=0.5,\; |12-10.5|=1.5,\; |30-10.5|=19.5[/math] - Ordinati: [math]0.5,\; 0.5,\; 1.5,\; 1.5,\; 2.5,\; 19.5[/math]
- MAD = mediana degli scostamenti = [math](1.5+1.5)/2 = 1.5[/math]
- Soglia = [math]2.5 \times 1.5 = 3.75[/math]
- Distanza di [math]30[/math] = [math]19.5 > 3.75[/math] → anche MAD lo classifica come outlier.
In questo caso entrambi i metodi concordano.
💡 Consiglio pratico: Nell’esempio, la scelta tra IQR e MAD non cambia il risultato. Tuttavia, in dataset con distribuzioni molto asimmetriche o con più outlier vicini, i due metodi possono divergere. IQR è più conservativo e adatto a distribuzioni reali (es. stipendi, tempi di reazione); MAD è più sensibile e ideale per monitoraggi automatici (es. sensori, transazioni finanziarie).
Il MAD normalizzato: la versione usata in Data Science
Nella pratica professionale si utilizza spesso una versione scalata del MAD:
[math]\text{MAD}_n = 1.4826 \cdot \text{MAD}[/math]
Il fattore [math]1.4826[/math] rende il MAD confrontabile con la deviazione standard quando i dati seguono una distribuzione normale.
Questo porta a un indicatore molto utilizzato:
Robust Z-Score
[math]\displaystyle z_r = \frac{x_i – \operatorname{mediana}(x)}{1.4826 \cdot \text{MAD}}[/math]
Regola pratica:
- [math]|z_r| > 2.5[/math] → possibile outlier
- [math]|z_r| > 3.5[/math] → outlier molto probabile
Molti sistemi di monitoraggio automatico utilizzano proprio questa variante.
Esempio pratico: rilevamento anomalie nei tempi di consegna
Supponiamo di osservare:
[math]2,\; 3,\; 4,\; 5,\; 7,\; 9,\; 9,\; 25[/math]
La mediana vale:
[math]6[/math]
Gli scostamenti assoluti diventano:
[math]4,\; 3,\; 2,\; 1,\; 1,\; 3,\; 3,\; 19[/math]
La loro mediana è:
[math]\text{MAD} = 3[/math]
Utilizzando:
[math]k = 2.5[/math]
otteniamo:
[math]2.5 \times 3 = 7.5[/math]
Poiché:
[math]|25 – 6| = 19[/math]
il valore 25 viene classificato come outlier.
IQR vs MAD: differenze operative
| Aspetto | IQR | MAD |
|---|---|---|
| Basato su | Quartili | Distanze dalla mediana |
| Robustezza | Molto elevata | Molto elevata |
| Interpretabilità | Alta | Media |
| Boxplot | Ideale | Non utilizzato |
| Automazione | Buona | Ottima |
| Serie temporali | Discreto | Molto efficace |
| Dataset piccoli | Buono | Ottimo |
Caso reale: analisi degli stipendi
Consideriamo:
[math]1200,\; 1250,\; 1300,\; 1320,\; 1350,\; 1400,\; 1600,\; 2500[/math]
L’IQR individua come anomalo solamente:
[math]2500[/math]
Il MAD invece segnala:
- 1600
- 2500
Questo non significa che il MAD sia “migliore”.
Significa semplicemente che è più severo.
Nel contesto degli stipendi è plausibile che esistano figure più senior o ruoli manageriali.
In questo caso l’IQR tende a produrre meno falsi positivi.
Il problema del masking
Uno dei fenomeni più insidiosi nell’analisi degli outlier è il cosiddetto masking.
Consideriamo:
[math]25,\; 28,\; 30,\; 32,\; 33,\; 35,\; 36,\; 40,\; 120,\; 210[/math]
L’IQR individua correttamente:
- 120
- 210
come valori anomali.
Ora aggiungiamo:
[math]1000[/math]
Il terzo quartile aumenta drasticamente.
L’IQR cresce.
Le soglie si allargano.
Paradossalmente 120 e 210 possono smettere di essere classificati come outlier.
L’anomalia estrema ha “nascosto” le anomalie meno estreme.
Questo fenomeno prende il nome di masking ed è uno dei motivi per cui in applicazioni critiche vengono spesso utilizzati approcci robusti multipli.
Serie temporali: il caso che inganna molti data scientist
Supponiamo di osservare una temperatura che cresce lentamente durante la giornata:
[math]18.2,\; 18.5,\; 18.7,\; 19.0,\; 19.2,\; 19.3,\; 19.4,\; 19.5,\; 19.6,\; 19.7,\; 19.8,\; 30.1[/math]
Il valore 30.1 è chiaramente un’anomalia.
Tuttavia il MAD applicato all’intera serie potrebbe classificare come anomali anche alcuni valori iniziali.
Perché?
Perché il metodo confronta tutto con una mediana globale.
La serie però possiede un trend.
In presenza di trend o stagionalità è buona pratica:
- rimuovere il trend;
- utilizzare finestre mobili;
- applicare il MAD ai residui.
Questa è la logica utilizzata in molti sistemi di anomaly detection industriale.
Finanza: quando le code pesanti complicano tutto
I rendimenti finanziari raramente seguono una distribuzione normale.
Presentano spesso:
- leptocurtosi;
- volatilità variabile;
- code pesanti.
In queste condizioni una soglia standard come:
[math]k = 2.5[/math]
può generare moltissimi falsi allarmi.
Non è il MAD a fallire.
È la soglia che è stata calibrata per distribuzioni molto più regolari.
Per questo motivo nei modelli quantitativi vengono spesso utilizzati:
- MAD con soglie adattive;
- Robust Z-Score dinamici;
- filtri di Hampel;
- modelli GARCH sui residui.
Quando usare IQR e quando usare MAD
| Scenario | Metodo consigliato |
|---|---|
| Analisi esplorativa | IQR |
| Boxplot | IQR |
| Dashboard aziendali | IQR |
| Monitoraggio sensori | MAD |
| Dataset piccoli | MAD |
| Machine Learning | MAD |
| Serie temporali | MAD su rolling window |
| Finanza | MAD calibrato |
| Dati asimmetrici | IQR |
Errori comuni nell’identificazione degli outlier
Eliminare automaticamente gli outlier
Un outlier potrebbe rappresentare l’evento più importante del dataset. Una frode bancaria, un guasto industriale o una vendita eccezionale sono spesso proprio gli outlier.
Utilizzare la deviazione standard su dati non normali
Molti dataset reali non seguono una distribuzione gaussiana. I metodi robusti risultano generalmente più affidabili.
Ignorare trend e stagionalità
Una crescita costante può essere interpretata erroneamente come anomalia.
Utilizzare sempre le stesse soglie
I valori 1.5 (IQR) e 2.5 (MAD) non sono leggi universali. Sono semplicemente convenzioni.
Confondere anomalia ed errore
Un valore insolito non è necessariamente sbagliato. Spesso rappresenta proprio il fenomeno che stiamo cercando di individuare.
Esercizio 1 – Base (Metodo IQR)
Scenario
Un’app per il fitness registra ogni giorno il numero di passi degli utenti (in migliaia). Nell’ultima settimana i valori sono:
[math]6.2,\; 7.1,\; 5.8,\; 6.9,\; 12.4,\; 7.3,\; 6.5[/math].
Il valore 12.4 sembra anomalo. Usa il metodo IQR per stabilire oggettivamente se si tratta di un outlier.
Soluzione
- Ordinamento dei dati: [math]5.8,\; 6.2,\; 6.5,\; 6.9,\; 7.1,\; 7.3,\; 12.4[/math].
- Calcolo di Mediana, Q1 e Q3:
Mediana (Q2) = 4° valore → [math]6.9[/math]
Q1 = mediana della metà inferiore ([math]5.8, 6.2, 6.5[/math]) → [math]6.2[/math]
Q3 = mediana della metà superiore ([math]7.1, 7.3, 12.4[/math]) → [math]7.3[/math] - Calcolo dell’IQR: [math]\text{IQR} = Q3 – Q1 = 7.3 – 6.2 = 1.1[/math]
- Determinazione dei recinti (fences):
Limite inferiore = [math]Q1 – 1.5 \times \text{IQR} = 6.2 – 1.65 = 4.55[/math]
Limite superiore = [math]Q3 + 1.5 \times \text{IQR} = 7.3 + 1.65 = 8.95[/math] - Individuazione outlier: [math]12.4 > 8.95[/math] → è un outlier confermato.
💡 Domanda e Risposta di riflessione
Perché si usa la mediana e non la media nel calcolo dei quartili?
La mediana è robusta per natura. Se usassimo la media, il valore anomalo di 12.4 la trascinerebbe artificialmente verso l’alto, falsando la posizione del centro di gravità dei dati e rovinando la capacità dell’algoritmo di identificare proprio quell’anomalia.
L’Occhio del Data Scientist
In una piattaforma di monitoraggio dell’attività fisica, un valore anomalo come 12.4 non è necessariamente spazzatura statistica. Potrebbe rappresentare una camminata eccezionalmente lunga, una sessione sportiva intensa o un errore di sincronizzazione. Un data scientist non eliminerebbe mai automaticamente questo dato: prima andrebbe a incrociare GPS, frequenza cardiaca o durata totale per confermarne la veridicità.
Esercizio 2 – Base (Metodo MAD)
Scenario
Un’azienda di e-commerce monitora i tempi di consegna (in giorni) per 8 ordini:
[math]2,\; 3,\; 4,\; 5,\; 7,\; 9,\; 9,\; 25[/math].
Usa il metodo MAD (Scostamento Assoluto Mediano) con fattore di sensibilità [math]k = 2.5[/math] per verificare se la consegna in 25 giorni è un outlier.
Soluzione
- Mediana dei dati: n=8 → media tra 4° e 5° valore: [math](5+7)/2 = 6[/math]
- Scostamenti assoluti dalla mediana: [math]|2-6|=4,\;|3-6|=3,\;|4-6|=2,\;|5-6|=1,\;|7-6|=1,\;|9-6|=3,\;|9-6|=3,\;|25-6|=19[/math]
- Calcolo del MAD: ordiniamo gli scostamenti: [math]1,1,2,3,3,3,4,19[/math]; mediana = media tra 4° e 5°: [math](3+3)/2 = 3[/math] → [math]\text{MAD}=3[/math]
- Soglia di tolleranza: [math]k \times \text{MAD} = 2.5 \times 3 = 7.5[/math]
- Confronto: [math]|25-6| = 19 > 7.5[/math] → 25 è decisamente un outlier.
💡 Domanda e Risposta di riflessione
Cosa accadrebbe se usassimo [math]k = 3[/math] invece di [math]2.5[/math]?
La soglia diventerebbe [math]3 \times 3 = 9[/math]. 25 dista 19 → resterebbe outlier. Se l’outlier fosse stato 14 (distanza 8), con [math]k=2.5[/math] sarebbe anomalo, con [math]k=3[/math] sarebbe rientrato. Il fattore [math]k[/math] regola la tolleranza ai falsi positivi.
L’Occhio del Data Scientist
Nelle grandi aziende di e‑commerce, il MAD non serve a “pulire i dati”, ma a monitorare i KPI logistici in tempo reale. Un ordine con consegna di 25 giorni attiva alert operativi, verifiche sul corriere e warning per il customer service. La robustezza del MAD evita che metriche di controllo si “abituino” ai ritardi estremi.
Esercizio 3 – Confronto su Dati Asimmetrici (Stipendi)
Scenario
Stipendi mensili (€) in una piccola startup:
[math]1200,\; 1250,\; 1300,\; 1320,\; 1350,\; 1400,\; 1600,\; 2500[/math].
Applica IQR e MAD ([math]k=2.5[/math]) e commenta le differenze.
Soluzione
Metodo IQR
Q1 = media dei primi 4: [math](1250+1300)/2 = 1275[/math]
Q3 = media degli ultimi 4: [math](1400+1600)/2 = 1500[/math]
[math]\text{IQR} = 1500 – 1275 = 225[/math]
Limite superiore = [math]1500 + 1.5 \times 225 = 1837.5[/math]
Esito: 2500 è outlier; 1600 è normale.
Metodo MAD
Mediana = [math](1320+1350)/2 = 1335[/math]
Scostamenti: [math]135,85,35,15,15,65,265,1165[/math] → ordinati: [math]15,15,35,65,85,135,265,1165[/math]
MAD = media tra 65 e 85 = [math]75[/math]
Soglia = [math]2.5 \times 75 = 187.5[/math]
[math]|2500-1335| = 1165 > 187.5[/math] → outlier; [math]|1600-1335| = 265 > 187.5[/math] → anche 1600 è outlier.
💡 Domanda e Risposta di riflessione
Quale metodo è più appropriato per gli stipendi?
Dipende dal dominio. In una startup uno stipendio di 1600€ è realistico (ruolo senior). L’IQR è la scelta migliore perché assorbe l’asimmetria naturale dei salari, evitando falsi allarmi.
L’Occhio del Data Scientist
Le distribuzioni economiche hanno quasi sempre una lunga “coda destra”. L’IQR produce risultati più coerenti con la realtà aziendale, mentre il MAD — rigidamente simmetrico — risulta troppo severo. Conoscere questa differenza è cruciale in HR analytics e segmentazione clienti.
Esercizio 4 – Multiple Outlier e Fenomeno “Masking”
Scenario
Sensore IoT – livelli PM10 (µg/m³) in 10 giorni:
[math]25,\; 28,\; 30,\; 32,\; 33,\; 35,\; 36,\; 40,\; 120,\; 210[/math].
Identifica outlier con IQR e MAD, poi rifletti sul masking.
Soluzione
IQR
Mediana = 34; Q1 = 30; Q3 = 40; IQR = 10; limite sup = [math]40+15=55[/math].
Outlier: 120 e 210.
MAD ([math]k=2.5[/math])
Mediana = 34; scostamenti: [math]9,6,4,2,1,1,2,6,86,176[/math]; ordinati: [math]1,1,2,2,4,6,6,9,86,176[/math]; MAD = media tra 4 e 6 = 5; soglia = 12.5.
Outlier: 120 e 210.
💡 Domanda e Risposta di riflessione
Aggiungendo un 11° valore 1000, i valori 120 e 210 restano outlier con IQR?
No. Aggiungendo 1000, i dati diventano 11: mediana = 35, Q1 = 30, Q3 = 120, IQR = 90. Nuovo limite sup = [math]120 + 1.5×90 = 255[/math]. Ora solo 1000 è outlier: 120 e 210 sono “nascosti” dal masking.
L’Occhio del Data Scientist
Il masking è una vulnerabilità critica: un’anomalia estrema altera i recinti e rende invisibili anomalie meno estreme. Nei sistemi industriali si usano approcci ensemble (Isolation Forest, LOF) per evitare che un singolo algoritmo nasconda l’inquinamento reale.
Esercizio 5 – Dati con Deriva Temporale (Trend)
Scenario
Temperature orarie in serra (dall’alba al tramonto):
[math]18.2,\; 18.5,\; 18.7,\; 19.0,\; 19.2,\; 19.3,\; 19.4,\; 19.5,\; 19.6,\; 19.7,\; 19.8,\; 30.1[/math].
Il valore 30.1 è un guasto. Applica IQR e MAD all’intera serie.
Soluzione
IQR
Q1 = media primi 6 = [math](18.7+19.0)/2 = 18.85[/math]
Q3 = media ultimi 6 = [math](19.6+19.7)/2 = 19.65[/math]
IQR = 0.8; limite sup = [math]19.65 + 1.5×0.8 = 20.85[/math]
→ 30.1 outlier.
MAD ([math]k=2.5[/math])
Mediana globale = 19.35; scostamenti ordinati: 0.05,0.05,0.15,0.15,0.25,0.35,0.35,0.45,0.65,0.85,1.15,10.75; MAD = 0.35; soglia = 0.875.
30.1 è outlier, ma anche 18.2 (distanza 1.15) viene classificato come anomalia (falso allarme).
💡 Domanda e Risposta di riflessione
Perché il MAD genera falsi allarmi sui valori freddi del mattino?
La soglia MAD è estremamente piccola perché i dati centrali sono molto concentrati. Confrontando le ore fredde con la mediana globale “calda”, la deviazione matematica viene scambiata per anomalia.
L’Occhio del Data Scientist
Applicare metriche statiche a serie con trend è un errore comune. In produzione si usano Rolling MAD (finestre mobili di 2-3 ore), filtro di Hampel, o si modella il trend prima di cercare l’anomalia sui residui. L’anomalia va cercata rispetto a ciò che è normale “in quel momento”.
Esercizio 6 – Distribuzione a Code Pesanti (Finanza)
Scenario
Rendimenti giornalieri (%) di un portafoglio (20 giorni) – distribuzione leptocurtica:
[math]-2.1,\; -1.8,\; -0.5,\; 0.1,\; 0.3,\; 0.4,\; 0.5,\; 0.5,\; 0.6,\; 0.7,\; 0.8,\; 0.9,\; 1.0,\; 1.1,\; 1.2,\; 1.5,\; 2.0,\; 3.5,\; 4.2,\; 8.0[/math].
Soluzione
Metriche descrittive:
Mediana = [math](0.7+0.8)/2 = 0.75[/math]
Q1 = 0.35, Q3 = 1.35, IQR = 1.0, MAD = 0.45.
IQR Standard (1.5) → limiti: [-1.15, 2.85] → outlier: -2.1, -1.8, 3.5, 4.2, 8.0 (5 eventi).
IQR Espanso (2.2 per code pesanti) → limiti: [-1.85, 3.55] → outlier: -2.1, 4.2, 8.0 (3 outlier reali).
MAD standard ([math]k=2.5[/math]) → soglia = [math]2.5×0.45=1.125[/math] → valori fuori da [-0.375, 1.875] → outlier: -2.1, -1.8, -0.5, 2.0, 3.5, 4.2, 8.0 (7 falsi allarmi).
💡 Domanda e Risposta di riflessione
Perché si espande il fattore dell’IQR? Il MAD è inutile in finanza?
Aumentare il moltiplicatore dice all’algoritmo: “questi dati sono volatili, sii più permissivo”. Il MAD standard fallisce perché [math]k=2.5[/math] è calibrato sulla distribuzione normale, che la finanza non rispetta. Non è l’algoritmo sbagliato, ma l’uso di parametri teorici su dati reali caotici.
L’Occhio del Data Scientist
Nei sistemi di trading quantitativo applicare parametri standard è fatale. I rendimenti non sono gaussiani; eventi “impossibili” accadono ciclicamente. Si usano IQR espansi o MAD ricalibrati. Inoltre, cancellare un outlier come +8.0% significa amputare l’unico segnale rilevante: quello è uno shock di liquidità o una fusione, esattamente ciò che un modello predittivo deve studiare, non ignorare.
Conclusioni
IQR e MAD rappresentano due degli strumenti più importanti della statistica robusta.
L’IQR è intuitivo, facilmente visualizzabile e perfetto per l’analisi esplorativa dei dati.
Il MAD è più adatto a pipeline automatizzate, sistemi di monitoraggio e algoritmi di anomaly detection.
Nella pratica professionale raramente si sceglie un solo metodo. I data scientist più esperti confrontano più indicatori robusti e interpretano i risultati alla luce del dominio applicativo.
Perché la domanda corretta non è:
“Questo valore è un outlier?”
ma piuttosto:
“Perché questo valore è diverso dagli altri e cosa può insegnarci sul fenomeno che stiamo osservando?”
Articoli di approfondimento
👉 Outlier: cosa sono, come trovarli e rimuoverli con Pandas (IQR e Z-score)
👉 Esercizi risolti sulle misure di variabilità: varianza, scarto e range
👉 L’incubo delle medie ingannevoli: quando la statistica mente
👉 Percentili e quartili: cosa sono e come si calcolano
👉 Statistica per il budgeting: quartili, percentili e IQR con esercizi





