Skip to content

Arvore de decisao

Exploração dos Dados

A base possui 140 registros e 9 colunas.

Estágio acadêmico: Referente a qual estagio academico o respondente está. Sendo 71% estudantes de graduação, 21% no ensino médio e 8% de pós graduação.

Pressão dos colegas: O quanto o aluno se sente pressionado pelos colegas numa escala de 1 a 5, com média das respostas de 3,07.

Pressão acadêmica da família: O quanto o aluno se sente pressionado pela familia numa escala de 1 a 5, com média das respostas de 3,17.

Ambiente de estudo: Como o aluno classifica o ambiente onde estuda entre as categorias: Peaceful (49% das respostas), Noisy(24% das respostas) e Disrupted(27% das respostas).

Estratégia de enfrentamento: Como o aluno enfrenta o estresse, entre as opções: Analisar a situacao com inteligencia (62%), Colapso emocional (23%), apoio de amigo/familia (15%).

Maus habitos: Diz se o respondente tem maus habitos, como fumar ou beber, entre as opções: "Não" (88%), "Sim" (7%) e 5% preferiram não responder.

Competição acadêmica: Classificar a competicao academica na sua vida, em uma escala escala de 1 a 5, tendo média das respostas de 3,49.

Índice de estresse: Classificar o nivel de estresse academico, em uma escala de 1 a 5, tendo média de 3,72.

AcademicStage PeerPressure HomePressure StudyEnv Strategy BadHabits AcademicComp Stress
undergraduate 4 5 Noisy Analyze the situation and handle it with intellect No 3 5
undergraduate 3 4 Peaceful Analyze the situation and handle it with intellect No 3 3
undergraduate 1 1 Peaceful Social support (friends, family) No 2 4
undergraduate 3 2 Peaceful Analyze the situation and handle it with intellect No 4 3
undergraduate 3 3 Peaceful Analyze the situation and handle it with intellect No 4 5

Pré-processamento

Remoção de colunas irrelevantes

A coluna Timestamp foi removida por não agregar informações para a previsão.

Variável-alvo

A variável alvo definida foi "Rate your academic stress index".

Tratamento de missing value

A base apresenta apenas um valor nulo em Study Environment, que será preenchido com "Peaceful", valor mais frequente.

Codificação de variáveis categóricas

As colunas "Your Academic Stage", "Study Environment", "What coping strategy you use as a student?" e "Do you have any bad habits?", são categóricas.

Foram convertidas em valores numéricos utilizando Label Encoding, para que a árvore de decisão consiga interpretá-las.

Features e target

feature (X): estágio acadêmico, pressão dos colegas, pressão da família, ambiente de estudo, estratégia de enfrentamento, hábitos nocivos, nível de competição acadêmica.

target (y): índice de estresse acadêmico (1 a 5).

Divisão dos Dados

80% dos registros da base foram separados para treino e 20% separados para testes de acuracia

Treinamento do Modelo

Accuracy: 0.71 2025-11-18T23:24:51.586351 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

import matplotlib.pyplot as plt
import pandas as pd

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

# Preprocess the data
def preprocess(df: pd.DataFrame) -> pd.DataFrame:
    # remocao da coluna Timestamp
    df = df.drop(columns=['Timestamp'])

    # Tratamento de missing values
    ## 'Study Environment' tem 1 valor ausente -> preenchid com a moda (valor mais frequente)
    df['StudyEnv'].fillna(df['StudyEnv'].mode()[0], inplace=True)

    #conversao de variaveis categoricas
    label_encoder = LabelEncoder()
    df['AcademicStage'] = label_encoder.fit_transform(df['AcademicStage'])
    df['StudyEnv'] = label_encoder.fit_transform(df['StudyEnv'])
    df['Strategy'] = label_encoder.fit_transform(df['Strategy'])
    df['BadHabits'] = label_encoder.fit_transform(df['BadHabits'])

    # Selecao de features
    features = [
        'AcademicStage',                       
        'PeerPressure',                       
        'HomePressure',    
        'StudyEnv',                            
        'Strategy',                      
        'BadHabits',
        'AcademicComp' 
    ]

    return df[features]


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

# Carregar base
df = pd.read_csv('https://raw.githubusercontent.com/tigasparzin/Machine-Learning/refs/heads/main/data/StressExp.csv')

# Variáveis de entrada e alvo
X = preprocess(df)
y = df['Stress']

# 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())

Avaliação do Modelo

Rodando o modelo e prestando mais atenção na base, percebi que haviam apenas 15 registros onde meu target era menor do que 3, o que acabava deixando meu modelo com underfittig, tendo acuracia de apenas 36%. Para solucionar este problema, criei dados sinteticos. Balanceando a quantidade de dados em cada nivel de stress

População da base.

Fui adicionando registros aos poucos, para tentar chegar no melhor resultado com a menor quantidade de dados sintéticos possivel. Para chegar no modelo atual, distribuí 100 novos registros da seguinte maneira:

Stress = 1 → +30 registros
Stress = 2 → +27 registros
Stress = 3 → +20 registros
Stress = 4 → +0 registros
Stress = 5 → +23 registro

Após essas alterações, a acuracia subiu para 73%.

Conclusão

Ao realizar esse projeto, entendi a necessidade de fazer um pré-processamento dos dados, visto que nem sempre a base virá de acordo com o que o projeto exige e também o impacto de que a frequencia dos dados registrados impacta diretamente na acuracia. Diante de um problema na precisão do meu modelo, tive que buscar soluções alternativas, como a geração de daos sintéticos. Acho válido adicionar também que avaliar se a acuracia está boa ou não, dependeria da proposta do projeto, visto que casos diferentes tem consequencias diferentes.