Skip to content

Decision Tree

1 Exploração dos Dados 20

model year price transmission mileage fuelType tax mpg engineSize
A4 2012 9990 Manual 49500 Diesel 30 62.8 2
A3 2019 22382 Manual 4352 Diesel 145 51.4 1.6
A6 2019 28990 Semi-Auto 7000 Diesel 150 47.9 2
A3 2020 30777 Semi-Auto 3925 Petrol 145 44.1 1.5
A4 2016 14950 Manual 22000 Petrol 145 51.4 1.4
Q2 2019 24365 Manual 3578 Diesel 145 47.9 1.6
Q7 2016 30495 Semi-Auto 22639 Diesel 165 48.7 3
A7 2017 29900 Semi-Auto 14468 Diesel 145 52.3 3
A4 2016 15256 Manual 25214 Diesel 0 74.3 2
Q2 2020 24950 Semi-Auto 789 Diesel 145 47.9 1.6

2 Pré-processamento 10

Para iniciar o processo de análise, foi realizado o carregamento do dataset de carros Audi, disponível em formato CSV. Em seguida, foi feita uma amostragem aleatória de 10 registros para facilitar a visualização e manipulação inicial dos dados.

Na etapa de pré-processamento, valores ausentes nas colunas numéricas (tax, mpg e price) foram preenchidos com a mediana de cada coluna, garantindo que não houvesse dados faltantes que pudessem prejudicar as análises subsequentes. Após o tratamento dos dados, foram selecionadas as principais variáveis de interesse: model, year, price, transmission, mileage, fuelType, tax, mpg e engineSize.

A visualização das primeiras linhas do dataset permitiu verificar a estrutura dos dados, identificar possíveis inconsistências e compreender melhor as variáveis disponíveis para a construção dos modelos de machine learning.

2.1 Data cleaning

model year price transmission mileage fuelType tax mpg engineSize
A4 2012 9990 Manual 49500 Diesel 30 62.8 2
A3 2019 22382 Manual 4352 Diesel 145 51.4 1.6
A6 2019 28990 Semi-Auto 7000 Diesel 150 47.9 2
A3 2020 30777 Semi-Auto 3925 Petrol 145 44.1 1.5
A4 2016 14950 Manual 22000 Petrol 145 51.4 1.4
Q2 2019 24365 Manual 3578 Diesel 145 47.9 1.6
Q7 2016 30495 Semi-Auto 22639 Diesel 165 48.7 3
A7 2017 29900 Semi-Auto 14468 Diesel 145 52.3 3
A4 2016 15256 Manual 25214 Diesel 0 74.3 2
Q2 2020 24950 Semi-Auto 789 Diesel 145 47.9 1.6

2.2 Data Encoding Categorical variables

model year price transmission mileage fuelType tax mpg engineSize
A4 2012 9990 0 49500 0 30 62.8 2
A3 2019 22382 0 4352 0 145 51.4 1.6
A6 2019 28990 1 7000 0 150 47.9 2
A3 2020 30777 1 3925 1 145 44.1 1.5
A4 2016 14950 0 22000 1 145 51.4 1.4
Q2 2019 24365 0 3578 0 145 47.9 1.6
Q7 2016 30495 1 22639 0 165 48.7 3
A7 2017 29900 1 14468 0 145 52.3 3
A4 2016 15256 0 25214 0 0 74.3 2
Q2 2020 24950 1 789 0 145 47.9 1.6

3 Divisão dos Dados 20

4 Treinamento do Modelo 10

Teste com 80% dos dados para treino

Após a etapa de exploração e pré-processamento dos dados, foi realizada a divisão do dataset em conjuntos de treino e teste. Essa separação é fundamental para avaliar o desempenho do modelo de machine learning de forma imparcial, garantindo que o algoritmo seja treinado em uma parte dos dados e validado em outra, nunca vista durante o treinamento.

Utilizou-se a função train_test_split da biblioteca scikit-learn, que permite dividir os dados de forma aleatória, mantendo a proporção definida entre treino e teste (por exemplo, 80% para treino e 20% para teste). Dessa forma, é possível medir a capacidade de generalização do modelo e evitar problemas como overfitting.

import matplotlib.pyplot as plt
import kagglehub
import pandas as pd
from kagglehub import KaggleDatasetAdapter
from io import StringIO
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score


plt.figure(figsize=(12, 10))

# Preprocess the data
def preprocess(df):
    # Fill missing values
    df['tax'].fillna(df['tax'].median(), inplace=True)
    df['mpg'].fillna(df['mpg'].median(), inplace=True)
    df['price'].fillna(df['price'].median(), inplace=True)

    # Convert categorical variables
    label_encoder = LabelEncoder()
    df['transmission'] = label_encoder.fit_transform(df['transmission'])
    df['fuelType'] = label_encoder.fit_transform(df['fuelType'])

    # Select features
    features = ['model', 'year', 'price', 'transmission', 'mileage', 'fuelType', 'tax', 'mpg', 'engineSize']
    return df[features]


# Load the Audi dataset
df = pd.read_csv('https://raw.githubusercontent.com/EnricoDiGioia/Machine-Learning/refs/heads/main/data/audi.csv')

# Preprocessing
df = preprocess(df)

# Display the first few rows of the dataset
#print(df.sample(n=10, random_state=42).to_markdown(index=False))

# Carregar o conjunto de dados
x = df[['price', 'tax', 'mpg', 'engineSize', 'mileage', 'year']]
y = df['fuelType']

# Dividir os dados em conjuntos de treinamento e teste
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# Criar e treinar o modelo de árvore de decisão
classifier = tree.DecisionTreeClassifier()
classifier.fit(x_train, y_train)

# Avaliar o modelo
accuracy = classifier.score(x_test, y_test)
print(f"Accuracy: {accuracy:.2f}")
tree.plot_tree(classifier)


# Para imprimir na página HTML
buffer = StringIO()
plt.savefig(buffer, format="svg")
print(buffer.getvalue())

Accuracy: 0.99 2025-11-24T10:56:53.908591 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

O teste com 80% atingiu 99% de acurácia, ou seja, overfitting.

Teste com 70% dos dados para treino

Accuracy: 0.99 2025-11-24T10:56:58.195566 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

O teste com 70% atingiu 99% de acurácia, ou seja, overfitting.

Teste com 60% dos dados para treino

Accuracy: 0.98 2025-11-24T10:57:02.370718 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

O teste com 60% atingiu 98% de acurácia, ou seja, overfitting.

Teste com 50% dos dados para treino

Accuracy: 0.98 2025-11-24T10:57:06.100189 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

O teste com 50% atingiu 98% de acurácia, ou seja, overfitting.

5 Avaliação do Modelo 20

Com os testes realizados, é possível ver que com esta base de dados é impossível fazer um modelo confiável com esta técnica. Talvez, usando alguma outra técnica ou com mais dados, seria possível.

6 Relatório Final

Neste projeto, foi realizada a análise e modelagem de dados utilizando a técnica de árvore de decisão. O processo envolveu a exploração dos dados, pré-processamento, codificação de variáveis categóricas, divisão dos dados em conjuntos de treino e teste, e avaliação do desempenho do modelo.

Os testes realizados com diferentes proporções de dados para treino (80%, 70%, 60% e 50%) mostraram que o modelo atingiu alta acurácia (99%), indicando ocorrência de overfitting. Isso significa que o modelo está ajustado demais aos dados de treino e pode não generalizar bem para novos dados.

A partir dos resultados, conclui-se que, com esta base de dados e técnica utilizada, não é possível construir um modelo confiável. Recomenda-se testar outras técnicas de machine learning ou utilizar uma base de dados maior e mais variada para obter resultados mais robustos.