Modelos de ML que impulsionam resultados no marketing digital

Modelos de ML que impulsionam resultados no marketing digital
“Dados são o novo petróleo, mas o que realmente gera valor é a capacidade de transformá‑los em insights acionáveis.” – Andrew Ng
Neste artigo vamos explorar, de forma prática e detalhada, como aplicar Machine Learning a problemas reais de marketing digital. Você aprenderá a:
Identificar e preparar datasets adequados ao seu negócio; Realizar feature engineering que potencializa a performance dos modelos; Selecionar e treinar algoritmos preditivos (regressão, árvores, ensembles); Avaliar resultados com métricas que realmente importam para a tomada de decisão.
Tudo isso com exemplos de código em Python (scikit‑learn, pandas, matplotlib) e dicas de implantação que podem ser reproduzidas imediatamente.
1. Introdução ao Machine Learning no Marketing Digital
O marketing digital gera volumes massivos de dados: cliques, visualizações, conversões, tempo de permanência, interações sociais, entre outros. Quando esses dados são estruturados e analisados com técnicas de Machine Learning, surgem oportunidades de:
| Problema de negócio | Tipo de modelo típico | Valor gerado |
|---|---|---|
| Previsão de churn de assinantes | Classificação binária | Redução de churn em até 30 % |
| Otimização de lances em mídia paga | Regressão | Aumento de ROI em 15 % |
| Segmentação de audiências | Clustering | Campanhas mais focadas |
| Score de propensão à compra | Classificação multiclasse | Incremento de conversão em 12 % |
Para transformar esses casos em projetos de ML, seguimos um fluxo estruturado:
Nos próximos tópicos vamos detalhar cada passo com foco em duas aplicações típicas: previsão de churn e previsão de taxa de cliques (CTR).
2. Preparando o Dataset
2.1 Fontes de dados comuns
| Fonte | Tipo de informação |
|---|---|
| Google Analytics | Sessões, taxa de rejeição, origem |
| Plataforma de e‑mail | Aberturas, cliques, entregas |
| CRM | Histórico de compras, tickets |
| Redes sociais | Engajamento, alcance, comentários |
| Dados de campanha PPC | Impressões, cliques, custo por clique |
Para o exemplo de churn, vamos usar um dataset público Telco Customer Churn (disponível no Kaggle). Ele contém informações demográficas, uso de serviços e se o cliente cancelou o contrato.
# carregando o dataset
import pandas as pd
url = "https://raw.githubusercontent.com/IBM/telco-customer-churn-on-aws/master/data/Telco-Customer-Churn.csv"
df = pd.read_csv(url)
print(df.head())
2.2 Limpeza e tratamento de valores ausentes
# remover colunas irrelevantes
df = df.drop(columns=['customerID'])
converter total charges para numérico (há valores vazios)
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce')
df['TotalCharges'].fillna(df['TotalCharges'].median(), inplace=True)
transformar variáveis categóricas em dummies
cat_cols = df.select_dtypes(include=['object']).columns
df = pd.get_dummies(df, columns=cat_cols, drop_first=True)
print(df.shape)
2.3 Divisão treino / teste
from sklearn.model_selection import train_test_split
X = df.drop('Churn_Yes', axis=1)
y = df['Churn_Yes']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
3. Feature Engineering que faz a diferença
3.1 Criação de variáveis temporais
Em campanhas de mídia paga, a recência da última interação costuma ser um forte preditor. Suponha que tenhamos a data da última visita (last_visit) e a data atual.
import numpy as np
df['last_visit'] = pd.to_datetime(df['last_visit'])
df['days_since_last'] = (pd.Timestamp('today') - df['last_visit']).dt.days
3.2 Agrupamento de categorias de baixo volume
Categorias com poucas ocorrências podem gerar ruído. Consolidamos em “Outros”.
def consolidate_low_freq(series, threshold=0.01):
freq = series.value_counts(normalize=True)
rare = freq[freq < threshold].index
return series.apply(lambda x: 'Outros' if x in rare else x)
df['payment_method'] = consolidate_low_freq(df['payment_method'])
3.3 Normalização de variáveis contínuas
Para algoritmos baseados em distância (KNN, SVM), a escala importa.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
num_cols = ['tenure', 'MonthlyCharges', 'TotalCharges', 'days_since_last']
X_train[num_cols] = scaler.fit_transform(X_train[num_cols])
X_test[num_cols] = scaler.transform(X_test[num_cols])
4. Seleção e Treinamento de Modelos
4.1 Algoritmos testados
| Algoritmo | Tipo | Por que usar? |
|---|---|---|
| Logistic Regression | Linear | Baseline interpretável |
| Random Forest | Ensemble | Captura interações não lineares |
| XGBoost | Gradient Boost | Alta performance em dados tabulares |
| LightGBM | Gradient Boost | Mais rápido em grandes volumes |
4.2 Pipeline com Cross‑Validation
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.metrics import roc_auc_score, f1_score, classification_report
from sklearn.model_selection import cross_val_score, StratifiedKFold
from xgboost import XGBClassifier
pipeline simples (sem transformação adicional)
model = XGBClassifier(
n_estimators=200,
max_depth=5,
learning_rate=0.05,
subsample=0.9,
colsample_bytree=0.9,
random_state=42,
use_label_encoder=False,
eval_metric='logloss'
)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
auc_scores = cross_val_score(model, X_train, y_train, cv=cv,
scoring='roc_auc')
print(f"ROC‑AUC médio (CV): {auc_scores.mean():.4f}")
4.3 Ajuste fino (Hyperparameter Tuning)
from sklearn.model_selection import RandomizedSearchCV
import numpy as np
param_grid = {
'n_estimators': np.arange(100, 500, 50),
'max_depth': np.arange(3, 10, 1),
'learning_rate': np.logspace(-3, -1, 5),
'subsample': [0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.7, 0.8, 0.9, 1.0]
}
search = RandomizedSearchCV(
estimator=model,
param_distributions=param_grid,
n_iter=30,
scoring='roc_auc',
cv=cv,
random_state=42,
n_jobs=-1,
verbose=1
)
search.fit(X_train, y_train)
print("Melhores parâmetros:", search.best_params_)
print("Melhor ROC‑AUC:", search.best_score_)
4.4 Avaliação no conjunto de teste
best_model = search.best_estimator_
best_model.fit(X_train, y_train)
y_pred = best_model.predict(X_test)
y_proba = best_model.predict_proba(X_test)[:, 1]
print("AUC:", roc_auc_score(y_test, y_proba))
print("F1:", f1_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
Interpretação dos resultados
- AUC > 0.80 indica que o modelo distingue bem clientes que churnam vs. os que permanecem.
- F1‑Score balanceia precisão e recall; essencial quando a classe positiva (churn) é minoritária.
- O relatório de classificação ajuda a identificar desequilíbrios e a necessidade de ajuste de threshold.
5. Métricas de avaliação alinhadas ao negócio
No marketing digital, a métrica escolhida deve refletir o impacto financeiro. Algumas métricas avançadas:
| Métrica | Quando usar | Interpretação |
|---|---|---|
| AUC‑ROC | Classificação geral | Probabilidade de ranking correto |
| Lift (ganho) | Campanhas segmentadas | Quanto a taxa de conversão aumenta em um segmento vs. média |
| Gain Chart | Avaliar top‑k | Percentual de respostas capturadas nos primeiros k% dos leads |
| Profit Curve |


