La spesa ottima
Quanto costa davvero mangiare bene? Lo abbiamo chiesto a un modello di programmazione lineare, come fece Stigler nel 1945.
- Metodo
- Programmazione lineare (LP)
- Strumenti
- Python, PuLP, pandas
- Risultato
- −31% — sul costo settimanale della spesa
Nel 1945 l’economista George Stigler si pose una domanda semplice e leggermente disperata: qual è la spesa minima che tiene in vita un uomo adulto, rispettando tutti i fabbisogni nutrizionali noti? Non esisteva ancora il simplesso: Stigler risolse “a occhio e buon senso” tra 77 alimenti, e arrivò a 39,93 dollari l’anno. Due anni dopo, il metodo del simplesso di Dantzig confermò che il suo errore era di pochi centesimi.1
Il diet problem è diventato l’esercizio numero uno di ogni corso di ottimizzazione — e quasi sempre resta lì, un giocattolo da aula. Ma la domanda di Stigler è tornata attualissima: con l’inflazione alimentare degli ultimi anni, quanto costa davvero mangiare in modo corretto in Italia? E quanto del nostro carrello è abitudine, non necessità?
01Il problema
Vogliamo comporre la spesa settimanale di un adulto che:
- copra i fabbisogni dei LARN (Livelli di Assunzione di Riferimento per Nutrienti) della Società Italiana di Nutrizione Umana: energia, proteine, fibre, calcio, ferro, vitamina C e altri — 14 vincoli in tutto;
- costi il meno possibile ai prezzi correnti;
- resti mangiabile: nessun alimento può superare una quota massima delle calorie totali, perché la soluzione “solo avena e latte in polvere” è ottima sulla carta e immangiabile nella vita.
Il confronto è con il carrello medio di un adulto ricavato dalle statistiche sui consumi delle famiglie, che ai prezzi usati qui vale 62,40 € a settimana.
02I dati
Servono tre tabelle, tutte pubbliche:
- Prezzi al dettaglio — medie nazionali per 22 alimenti di base (pasta, pane, latte, uova, legumi, ortaggi, frutta, carni, pesce azzurro, olio EVO…), dall’Osservaprezzi del MIMIT e dai prezzi al consumo ISTAT.
- Composizione nutrizionale — per 100 g di ciascun alimento, dalle tabelle CREA di composizione degli alimenti.
- Fabbisogni LARN — per un adulto di riferimento: 2.000 kcal, 50 g di proteine, 25 g di fibre, 1.000 mg di calcio, e così via.
I prezzi riportati in questo numero sono medie esemplificative assemblate per la dimostrazione: servono a mostrare il metodo. Il notebook allegato scarica i dati aggiornati dalle fonti citate, e i numeri cambiano — poco — con essi.
03Il modello
La formulazione è quella classica. Per ogni alimento i la variabile xi è la quantità acquistata in ettogrammi a settimana:
min Σi ci · xi
t.c. Σi ani · xi ≥ bn per ogni nutriente n
ei · xi ≤ β · E per ogni alimento i
xi ≥ 0
dove ci è il prezzo, ani il contenuto del nutriente n, bn il fabbisogno settimanale, ei le calorie dell’alimento ed E le calorie totali. Il parametro β è il vincolo di varietà: il tetto massimo di calorie che un singolo alimento può coprire. È la manopola che separa la matematica dalla cucina.
04La soluzione
In PuLP il modello sta in una ventina di righe:
import pulp
m = pulp.LpProblem("dieta_ottima", pulp.LpMinimize)
x = {i: pulp.LpVariable(i, lowBound=0) for i in alimenti}
# obiettivo: costo della spesa settimanale
m += pulp.lpSum(prezzo[i] * x[i] for i in alimenti)
# fabbisogni LARN (settimanali)
for n in nutrienti:
m += pulp.lpSum(contenuto[n][i] * x[i] for i in alimenti) >= fabbisogno[n]
# vincolo di varietà: nessun alimento oltre il 25% delle calorie
for i in alimenti:
m += kcal[i] * x[i] <= 0.25 * kcal_totali
m.solve()
Con β al 25% la spesa ottima costa 43,10 € a settimana: tutti e 14 i vincoli nutrizionali sono rispettati, nessun alimento domina il piatto.
Dove finiscono i soldi? Il modello ridisegna il carrello: giù la carne, su legumi e cereali. La verdura resta — ma cambia composizione, verso gli ortaggi con il miglior rapporto nutrienti/prezzo.
Il carrello, prima e dopo
Spesa settimanale per gruppo alimentare, in euro
Vedi i dati in tabella (€)
| Carrello medio | Spesa ottima | |
|---|---|---|
| Cereali e pane | 9,8 | 12,4 |
| Carne e pesce | 18,6 | 7,5 |
| Latticini e uova | 10,2 | 6,4 |
| Verdura | 8,4 | 6,2 |
| Frutta | 7,9 | 4,6 |
| Legumi | 1,2 | 4,1 |
| Altro | 6,3 | 1,9 |
Il vincolo di varietà (β = 25%) impedisce le soluzioni monotone alla Stigler.
Elaborazione su dati MIMIT Osservaprezzi e ISTAT (prezzi esemplificativi)
E che cosa si mangia, in concreto? Questa è la dieta ottima in grammi al giorno — riconoscibilmente mediterranea, senza che nessuno l’abbia chiesto al modello:
La dieta ottima nel piatto
Grammi al giorno per alimento (primi 12)
Vedi i dati in tabella (g)
| Dieta ottima | |
|---|---|
| Latte | 250 |
| Mele | 180 |
| Pane integrale | 150 |
| Pomodori | 150 |
| Yogurt | 125 |
| Arance | 120 |
| Pasta | 120 |
| Verdure a foglia | 100 |
| Carote | 80 |
| Fagioli secchi | 60 |
| Pollo | 60 |
| Pesce azzurro | 40 |
Soluzione del modello LP con dati CREA e prezzi esemplificativi
05Il prezzo della varietà
La parte più interessante non è il minimo, ma la sua sensibilità. Stringendo β — cioè pretendendo una dieta sempre più varia — il costo sale, e il modello ci dice esattamente di quanto:
Quanto costa la varietà
Costo settimanale della dieta ottima al variare del tetto β per singolo alimento
Vedi i dati in tabella (€)
| Costo ottimo | |
|---|---|
| 40% | 40 |
| 35% | 41 |
| 30% | 42 |
| 25% | 43 |
| 20% | 46 |
| 15% | 50 |
| 10% | 57 |
Sotto il 10% il problema diventa inammissibile con 22 alimenti: la varietà ha un limite fisico.
Analisi di sensibilità sul modello LP
Fra il 40% e il 25% la varietà costa pochi euro. Sotto il 20% ogni punto di β si paga caro: i vincoli nutrizionali costringono il modello verso alimenti sempre meno efficienti. A un certo punto il problema diventa inammissibile: con 22 alimenti non esiste una dieta in cui nessuno superi il 10% delle calorie.
La lezione di ottimizzazione del mese: il valore di un vincolo si misura in euro. Il prezzo-ombra della varietà è quasi zero finché è ragionevole, ed esplode quando diventa ideologia.
06Quanto si risparmia, e i limiti
19,30 € a settimana sono circa 1.000 € l’anno a persona: non è un dettaglio. Ma il numero va maneggiato con onestà:
- il carrello medio include gusti, marche e comodità che il modello ignora di proposito: il risparmio “vero” per una famiglia reale sta fra il 10% e il 20%, non al 31%;
- i prezzi medi nazionali nascondono forti differenze territoriali — l’ISTAT pubblica gli indici per capoluogo, e rifare il conto per la propria città è l’esercizio perfetto per il lettore;
- una dieta è anche cultura e piacere: il modello propone, la tavola dispone.
Il notebook completo, con i dati e il codice per riprodurre ogni figura, è nella cartella del numero. Se lo rifate con i prezzi della vostra città, scriveteci: pubblichiamo i confronti nel prossimo numero.
-
G. J. Stigler, The Cost of Subsistence, Journal of Farm Economics, 1945. La soluzione esatta arrivò nel 1947 con il metodo del simplesso, usando una delle prime applicazioni documentate: nove impiegati per 120 giorni-uomo di calcoli. ↩