Obiettivo del Modello e contesto strategico
Per ogni responsabile marketing, la sfida quotidiana è trasformare risorse limitate in risultati massimi. Ogni euro investito deve generare il massimo valore possibile, in un panorama digitale sempre più competitivo e frammentato.
L’obiettivo del modello è , dunque, ottimizzare l’allocazione del budget pubblicitario tra diversi canali digitali per massimizzare il profitto netto, rispettando vincoli di budget e rendimento minimo.
La Sfida Classica: Allocazione del Budget
Immaginate di avere 100€ da investire in pubblicità digitale.
Dove li allocate?
- Google Ads?
- Facebook?
- Instagram?
- LinkedIn?
Tradizionalmente, questa decisione si basava su:
- Intuizione
- Esperienza pregressa
- Feeling personale
L’Approccio Scientifico: Programmazione Lineare
La programmazione lineare ci permette di trasformare questa decisione intuitiva in un processo matematicamente rigoroso.
Componenti Chiave del Modello
- Variabili Decisionali Quanto investire in ogni canale:
- Google Ads (x1)
- Facebook Ads (x2)
- Instagram Ads (x3)
- LinkedIn Ads (x4)
- Parametri di Performance
- Produttività Marginale (a). Rappresenta il “tasso di conversione” o l’efficacia di ogni canale. Questo valore moltiplicato per la spesa del canale contribuisce al ritorno sull’investimento.
- Rendimento Base (b). Rappresenta un “ritorno fisso” o un beneficio intrinseco di ogni canale, indipendente dalla spesa.
- Vincoli Strategici
- Budget totale limitato (100€)
- Ritorno minimo richiesto
- Limiti per singolo canale
Obiettivi Matematici vs Obiettivi di Business
Funzione Obiettivo: Massimizzare il Profitto Netto
Formula:
Profitto = Σ[(Produttività Marginale * Investimento) + Rendimento Base]
Esempio Pratico
Supponiamo i seguenti dati:
- Instagram: Alta produttività (0.6), Buon rendimento base (12€)
- Google Ads: Media produttività (0.5), Rendimento medio (10€)
- LinkedIn: Bassa produttività (0.3), Basso rendimento (5€)
Il modello calcolerà automaticamente la distribuzione ottimale che:
- Rispetta il budget di 100€
- Genera il massimo profitto
- Soddisfa vincoli di rendimento minimo
Vantaggi Strategici
- Oggettività
- Decisioni basate su dati, non su intuizione
- Riducono bias personali
- Flessibilità
- Facile adattare parametri
- Simulare scenari diversi
- Scientifico
- Approccio quantitativo
- Replicabile e verificabile
Limiti del Modello
Non tutto è catturabile matematicamente:
- Qualità creativa degli annunci
- Brand perception
- Fattori qualitativi non lineari
Il nostro modello non sostituisce l’expertise umana, ma la potenzia:
- Fornisce una baseline matematica
- Guida le decisioni strategiche
- Permette allocazioni più consapevoli
Non stiamo solo ottimizzando un budget. Stiamo:
-
Trasformando marketing in scienza
-
Convertendo intuizione in equazione
-
Massimizzando l’efficienza degli investimenti
Il seguente codice Python utilizza la libreria PuLP per risolvere un problema di ottimizzazione lineare, specificamente per massimizzare il ROI (Return on Investment) allocando un budget tra diversi canali pubblicitari.
import pulp
# Definizione del problema
problem = pulp.LpProblem("Maximize_ROI", pulp.LpMaximize)
# Parametri del modello
channels = ["Google_Ads", "Facebook_Ads", "Instagram_Ads", "LinkedIn_Ads"]
# Parametri relativi ai tassi di conversione per canale
a = {"Google_Ads": 0.5, "Facebook_Ads": 0.4, "Instagram_Ads": 0.6, "LinkedIn_Ads": 0.3}
b = {"Google_Ads": 10, "Facebook_Ads": 8, "Instagram_Ads": 12, "LinkedIn_Ads": 5}
# Vincoli
budget_max = 100 # Budget massimo
return_min = 100 # Ritorno minimo richiesto
max_channel = 50 # Limite massimo per canale
# Variabili decisionali
x = {channel: pulp.LpVariable(f"x_{channel}", lowBound=0, upBound=max_channel) for channel in channels}
# Funzione obiettivo: Massimizzare il profitto netto con coefficienti normalizzati
problem += pulp.lpSum([(a[channel]) * x[channel] + b[channel] for channel in channels]), "Profitto_Netto"
# Vincolo 1: Budget totale
problem += pulp.lpSum([x[channel] for channel in channels]) <= budget_max, "Budget_Max"
# Vincolo 2: Minimo ritorno atteso
problem += pulp.lpSum([a[channel] * x[channel] + b[channel] for channel in channels]) >= return_min, "Return_Min"
# Risoluzione del problema
problem.solve()
# Output dei risultati
print("Stato della soluzione:", pulp.LpStatus[problem.status])
print("\nSpesa allocata per canale:")
for channel in channels:
print(f"{channel}: {x[channel].varValue:.2f}")
print("\nProfitto netto massimo:", pulp.value(problem.objective))
Analizziamo il codice in dettaglio:
📊 Componenti Fondamentali del Modello
1. Definizione dei Canali Pubblicitari
channels = [“Google_Ads”, “Facebook_Ads”, “Instagram_Ads”, “LinkedIn_Ads”]
Significato: Rappresenta i quattro canali di investimento pubblicitario disponibili.
2. Parametri Caratteristici dei Canali
a = {“Google_Ads”: 0.5, “Facebook_Ads”: 0.4, “Instagram_Ads”: 0.6, “LinkedIn_Ads”: 0.3} # Produttività marginale
b = {“Google_Ads”: 10, “Facebook_Ads”: 8, “Instagram_Ads”: 12, “LinkedIn_Ads”: 5} # Ritorno base
Produttività Marginale (a)
- Misura l’incremento di efficacia per ogni unità monetaria investita
- Esempio:
- Instagram (0.6) = Per ogni 100€ investiti, migliora le prestazioni del 60%
- Google Ads (0.5) = Per ogni 100€ investiti, migliora le prestazioni del 50%
Ritorno Base (b)
- Rendimento iniziale garantito per ciascun canale
- Esempio:
- Instagram (12) = Rende 12€ anche con investimento minimo
- LinkedIn (5) = Rende 5€ anche con investimento minimo
3. Vincoli del Problema
budget_max = 100 # Budget totale disponibile
return_min = 100 # Ritorno minimo richiesto
max_channel = 50 # Limite massimo per singolo canale
Spiegazione dei Vincoli:
- Non superare 100€ di spesa totale
- Generare almeno 100€ di ritorno
- Nessun canale può ricevere più di 50€
4. Variabili Decisionali
x = {channel: pulp.LpVariable(f”x_{channel}”, lowBound=0, upBound=max_channel) for channel in channels}
Questa è una dictionary comprehension che crea variabili decisionali per ogni canale pubblicitario.
Componenti Principali
a) {channel: ... for channel in channels}
- Genera una variabile per ogni canale
- Usa la lista
channelscome iteratore - Crea un dizionario dove:
- Chiave = nome del canale
- Valore = variabile di ottimizzazione
b) pulp.LpVariable()
Crea una variabile per la programmazione lineare con parametri specifici:
- Primo argomento: Nome della variabile
f"x_{channel}"genera nomi come:- “x_Google_Ads”
- “x_Facebook_Ads”
lowBound=0: Vincolo inferiore- Impedisce valori negativi
- Significa “non posso investire meno di 0€”
upBound=max_channel: Vincolo superiore- Limita l’investimento massimo
- Nel nostro esempio, max 50€ per canale
🎨 Esempio Pratico
channels = ["Google_Ads", "Facebook_Ads", "Instagram_Ads"]
max_channel = 50
x = {channel: pulp.LpVariable(f"x_{channel}", lowBound=0, upBound=max_channel) for channel in channels}
Questo codice genera:
{
"Google_Ads": LpVariable("x_Google_Ads", lowBound=0, upBound=50),
"Facebook_Ads": LpVariable("x_Facebook_Ads", lowBound=0, upBound=50),
"Instagram_Ads": LpVariable("x_Instagram_Ads", lowBound=0, upBound=50)
}
- Per ogni canale, PuLP crea una variabile
- Ogni variabile può assumere valori:
- Maggiori o uguali a 0
- Minori o uguali a 50
- Il risolutore potrà modificare questi valori per ottimizzare l’obiettivo
5. Funzione Obiettivo
problem += pulp.lpSum([(a[channel]) * x[channel] + b[channel] for channel in channels]), "Profitto_Netto"
Calcolo del Profitto:
a[channel] * x[channel]: Incremento di performanceb[channel]: Rendimento base- Sommati per ogni canale
6. Vincoli Matematici
# Vincolo 1: Budget totale problem += pulp.lpSum([x[channel] for channel in channels]) <= budget_max # Vincolo 2: Ritorno minimo problem += pulp.lpSum([a[channel] * x[channel] + b[channel] for channel in channels]) >= return_min
Significato:
- La somma degli investimenti non supera 100€
- Il ritorno totale è almeno 100€
Processo di Risoluzione
- L’algoritmo considera tutte le combinazioni possibili
- Verifica il rispetto dei vincoli
- Seleziona l’allocazione che massimizza il profitto





