Este repositório contém o projeto de análise e modelagem de dados relacionado a vinhos espanhóis. O objetivo é explorar as características dos vinhos, extrair insights valiosos do conjunto de dados e criar modelos de Machine Learning para previsão de preços.
| Biblioteca | Uso |
|---|---|
pandas |
Manipulação e análise de dados |
numpy |
Operações numéricas |
matplotlib |
Visualizações e gráficos |
seaborn |
Visualizações estatísticas |
itertools |
Combinações e permutações de variáveis |
IPython.display |
Renderização de Markdown nos notebooks |
| Módulo | Uso |
|---|---|
Pipeline |
Encadeamento de transformações |
ColumnTransformer |
Transformações por tipo de variável |
TransformedTargetRegressor |
Transformação do alvo (log1p) |
OneHotEncoder |
Codificação de variáveis nominais |
OrdinalEncoder |
Codificação de variáveis ordinais |
TargetEncoder |
Codificação de alta cardinalidade (winery) |
RobustScaler |
Normalização robusta a outliers |
SimpleImputer |
Imputação de dados faltantes |
| Módulo | Uso |
|---|---|
DummyRegressor |
Modelo baseline |
LinearRegression |
Regressão linear |
KNeighborsRegressor |
K-Nearest Neighbors |
RandomForestRegressor |
Random Forest |
cross_validate |
Validação cruzada |
ShuffleSplit |
Estratégia de split externo (Nested CV) |
GridSearchCV |
Busca exaustiva de hiperparâmetros |
📓 Notebook:
01 - EDA_wines.ipynb
- Compreensão inicial dos dados: Carregamento da base de dados e visualização inicial das variáveis, tipos de dados e dimensão do conjunto de dados.
- Análise Univariada: Exploração de cada variável individualmente para observar distribuições, identificar outliers e entender a concentração de dados numéricos e as frequências de variáveis categóricas (como vinícola, tipo, região, corpo do vinho, e acidez).
- Análise Bivariada: Cruzamento de variáveis para observar as relações entre elas, como por exemplo, a relação do preço (price) com as avaliações (rating), ou o perfil de avaliação dependendo da classificação de safra (year).
- Análise Multivariada: Entendimento de correlações e interações mais complexas entre múltiplas variáveis simultaneamente, gerando insights fundamentais que orientarão as próximas etapas de modelagem. O dataset Spanish Wines contém 7.500 amostras de vinhos espanhóis com 11 variáveis:
| Variável | Descrição | Natureza | Tipo |
|---|---|---|---|
winery |
Nome da vinícola | Qualitativa | Nominal |
wine |
Nome do vinho | Qualitativa | Nominal |
year |
Ano da safra | Quantitativa | Discreta |
rating |
Avaliação média dos usuários | Quantitativa | Contínua |
num_reviews |
Número de avaliações recebidas | Quantitativa | Discreta |
country |
País de origem | Inútil | — |
region |
Região de produção | Qualitativa | Nominal |
price |
Preço em euros (variável-alvo) | Quantitativa | Contínua |
type |
Variedade do vinho | Qualitativa | Nominal |
body |
Classificação do corpo | Quantitativa | Ordinal |
acidity |
Classificação da acidez | Quantitativa | Ordinal |
- A coluna
yearestava tipada comoobjectpor conter o valor"N.V."(Non-Vintage), exigindo conversão numérica com tratamento de erros. - A variável
countrypossui variância zero (todos os registros são"Espana"), sendo descartada na modelagem. - As variáveis
type(545 nulos),bodyeacidity(1.169 nulos cada) apresentam dados faltantes significativos.
- Compreensão inicial dos dados — Carregamento da base, criação do dicionário de dados, inspeção de tipos (
dtypes,info), verificação de valores únicos por variável (ex.: 480 vinícolas, 76 regiões, 21 tipos de uva) e dimensão do dataset. - Análise Univariada — Estudo individual de cada variável com histogramas, boxplots e tabelas de frequência. Foi possível observar a forte assimetria positiva da variável
price(distribuição com cauda longa à direita), além de concentração deratingentre 4.0 e 4.4 e a predominância de vinhos tipo "Red" e da região de Rioja. - Análise Bivariada — Cruzamento de variáveis em pares utilizando
itertools.combinationspara variáveis quantitativas eitertools.permutationspara qualitativas. Explorou-se a relação preço × avaliação, preço × número de reviews, e o perfil de preço por tipo de vinho, região e safra. - Análise Multivariada — Análise de correlações e interações entre múltiplas variáveis simultaneamente, identificando padrões complexos que orientaram as decisões de feature engineering na etapa de modelagem.
Notebook:
02 - Analise Comparativa_wines.ipynb
Análise comparativa para prever o preço dos vinhos espanhóis.
Pipeline automatizado com ColumnTransformer + Pipeline do scikit-learn:
- Variáveis discretas (
year,num_reviews): imputação pela mediana +RobustScaler. - Variáveis contínuas (
rating): imputação pela média +RobustScaler. - Variáveis ordinais (
body,acidity): imputação pela moda +OrdinalEncoder. - Variáveis nominais (
region,type): imputação pela moda +OneHotEncoder. - Alta cardinalidade (
winery, 480 valores): imputação pela moda +TargetEncoder+RobustScaler. - Descartadas:
wineecountry(variância zero / sem valor preditivo). O alvo (price) foi transformado comlog1pviaTransformedTargetRegressorpara lidar com a assimetria da distribuição de preços.
| Tipo de Variável | Exemplos | Tratamento |
|---|---|---|
| Discretas | year, num_reviews |
Imputação pela mediana + RobustScaler |
| Contínuas | rating |
Imputação pela média + RobustScaler |
| Ordinais | body, acidity |
Imputação pela moda + OrdinalEncoder |
| Nominais | region, type |
Imputação pela moda + OneHotEncoder |
| Alta cardinalidade | winery (480 valores) |
Imputação pela moda + TargetEncoder + RobustScaler |
| Descartadas | wine, country |
Variância zero / sem valor preditivo |
A análise univariada na EDA revelou a presença de outliers significativos nas variáveis numéricas (especialmente price e num_reviews). O RobustScaler utiliza o intervalo interquartil (IQR) para normalização, reduzindo o impacto de valores extremos na escala dos dados — ao contrário do StandardScaler, que utiliza média e desvio padrão e é altamente sensível a outliers.
A variável winery possui 480 categorias únicas. Utilizar OneHotEncoder geraria 480 colunas extras, causando explosão de dimensionalidade e diluição das features relevantes. O TargetEncoder substitui cada categoria pela média condicional do alvo (price), ou seja, cada vinícola é representada pelo preço médio de seus vinhos. Isso captura eficientemente o "peso da marca" em uma única coluna numérica, preservando a informação preditiva sem aumentar a dimensionalidade.
O alvo (price) apresenta forte assimetria positiva (cauda longa à direita), com poucos vinhos muito caros que distorcem os modelos. A transformação com log1p via TransformedTargetRegressor normaliza a distribuição, permitindo que os modelos aprendam tanto com vinhos baratos quanto com vinhos de alta gama. A inversa (expm1) é aplicada automaticamente nas predições.
| Modelo | Sigla | Tipo | Hiperparâmetros Otimizados |
|---|---|---|---|
| Dummy Regressor | DUM | Baseline | — |
| Regressão Linear | LRG | Paramétrico linear | — |
| K-Nearest Neighbors | KNN | Baseado em distância | n_neighbors, weights, p |
| Random Forest | RFR | Ensemble não-linear | n_estimators, max_depth, min_samples_split |
Nested Cross-Validation com ShuffleSplit (10 folds externos) + GridSearchCV (3 folds internos), garantindo separação rigorosa entre otimização de hiperparâmetros e avaliação de generalização.
Para os modelos KNN e Random Forest, foram definidas grades de busca com o GridSearchCV:
K-Nearest Neighbors (KNN):
| Hiperparâmetro | Valores Testados | Descrição |
|---|---|---|
n_neighbors |
1, 6, 11, 16, 21, 26 | Quantidade de vizinhos considerados |
weights |
uniform, distance |
Peso dos vizinhos (igual ou ponderado pela distância) |
p |
1, 2 | Distância Manhattan (p=1) ou Euclidiana (p=2) |
Random Forest Regressor (RFR):
| Hiperparâmetro | Valores Testados | Descrição |
|---|---|---|
n_estimators |
50, 100, 200 | Número de árvores no ensemble |
max_depth |
None, 10, 20, 30 |
Profundidade máxima de cada árvore |
min_samples_split |
2, 5, 10 | Amostras mínimas para dividir um nó |
Para garantir uma avaliação imparcial, implementamos uma Validação Cruzada Aninhada (Nested CV) com dois loops:
┌─────────────────────────────────────────────────────────┐
│ LOOP EXTERNO — ShuffleSplit (10 iterações, 80/20) │
│ └─ Avalia a generalização real do pipeline completo │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ LOOP INTERNO — GridSearchCV (3 folds) │ │
│ │ └─ Otimiza hiperparâmetros (KNN e RFR) │ │
│ │ └─ Scoring: neg_mean_absolute_error (MAE) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
- Loop Externo (
ShuffleSplit, 10 splits,test_size=0.2): a cada iteração, separa 80% para treino e 20% para teste. O pipeline completo (pré-processamento + otimização + modelo) é treinado nos 80% e avaliado nos 20% restantes, simulando dados inéditos. - Loop Interno (
GridSearchCV,cv=3): dentro de cada treino, realiza busca exaustiva nos hiperparâmetros usando 3 partições internas, selecionando a melhor combinação por MAE. - Separação rigorosa: em nenhum momento os dados de teste do loop externo participam da otimização de hiperparâmetros, eliminando o risco de data leakage. Métricas de avaliação: MAE (erro em euros), MSE (penaliza erros grandes), MAPE (erro percentual) e R² (variância explicada).
| Métrica | DUM (Baseline) | LRG | KNN | RFR 🏆 |
|---|---|---|---|---|
| MAE (€) | 43.05 ± 4.17 | 26.32 ± 3.08 | 20.72 ± 2.98 | 15.74 ± 2.79 |
| MSE | 27,062 ± 8,000 | 18,368 ± 6,461 | 12,511 ± 4,982 | 8,789 ± 4,044 |
| R² | -0.03 ± 0.00 | 0.30 ± 0.13 | 0.53 ± 0.09 | 0.68 ± 0.08 |
| MAPE (%) | 68.89 ± 1.81 | 21.87 ± 0.95 | 15.27 ± 1.53 | 11.16 ± 0.92 |
- 🏆 O Random Forest Regressor é o melhor modelo: R² = 0.68, MAE = € 15.74, MAPE = 11.16%.
- O TargetEncoder no
wineryfoi decisivo para capturar o "peso da marca" sem causar explosão de dimensionalidade. - A Regressão Linear (R² = 0.30) supera o baseline, mas é limitada por assumir relações lineares em um problema não-linear.
- O KNN (R² = 0.53) apresenta boa performance graças ao
RobustScalere aoTargetEncoder.
avanti_bootcamp_ds/
├── notebooks/
│ ├── 01 - EDA_wines.ipynb # Análise Exploratória
│ └── 02 - Analise Comparativa_wines.ipynb # Modelagem e Comparação
├── pics/
│ ├── logo_hakunama-data.png
│ └── vinho_desenho.jpg
├── requirements.txt
└── README.md

