Skip to content

Random Forest

Introdução

O modelo desenvolvido tem como objetivo prever o resultado de admissões em programas de MBA a partir de um conjunto de informações sobre os candidatos. Para isso, foi escolhida a técnica de Random Forest, um método de aprendizado de máquina baseado em um conjunto de árvores de decisão que, ao trabalharem de forma conjunta, proporcionam maior precisão e robustez nas previsões. Essa abordagem permite não apenas identificar o status de admissão de cada candidato, mas também compreender a relevância de diferentes variáveis no processo seletivo, por meio da análise da importância das features. Assim, o modelo combina poder preditivo e capacidade interpretativa, funcionando tanto como uma ferramenta de classificação quanto de apoio à decisão, ao destacar os fatores mais determinantes no perfil de um candidato admitido.

Base de dados

A base utilizada é composta por dados sintéticos criados a partir das estatísticas da turma de 2025 do MBA de Wharton. Ela reúne informações demográficas, acadêmicas e profissionais de candidatos, como gênero, nacionalidade, área de formação, desempenho no GPA e no GMAT, além de experiência de trabalho e setor de atuação. Esses atributos foram relacionados ao status final da candidatura, categorizado como admitido, em lista de espera ou negado. Por se tratar de um conjunto de dados diversificado, é possível observar tanto os aspectos objetivos ligados ao desempenho acadêmico e profissional quanto elementos contextuais que podem influenciar o resultado do processo seletivo. Essa combinação torna o dataset especialmente relevante para análises exploratórias e para o desenvolvimento de modelos preditivos que buscam compreender os critérios implícitos de seleção em admissões de MBA.

Exploração dos Dados

A seguir foi realizada uma análise exploratória da base de dados, com o objetivo de compreender o significado e a composição de cada coluna. Essa etapa busca identificar possíveis problemas, como valores ausentes ou distribuições desbalanceadas, que podem influenciar diretamente a qualidade do modelo. As visualizações e estatísticas descritivas permitem observar padrões, tendências e discrepâncias entre os candidatos, fornecendo subsídios importantes para orientar as decisões de pré-processamento e a construção da árvore de decisão.

A variável gênero apresenta uma diferença significativa na quantidade de aplicações. Observa-se uma predominância de candidatos do sexo masculino em comparação às candidatas do sexo feminino, o que indica uma distribuição desigual nesse aspecto. Essa discrepância pode refletir tendências do mercado de MBA ou características específicas da base gerada. Além disso, é um fator importante a ser considerado no modelo, já que possíveis vieses de gênero podem influenciar tanto a análise quanto as previsões de admissão.

2025-12-02T15:31:29.434382 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável alunos internacionais mostra que a maior parte das aplicações é de candidatos domésticos (não internacionais), enquanto os estudantes internacionais representam uma parcela menor do total. Essa diferença pode indicar que os programas de MBA ainda têm maior procura local, embora o número de aplicações internacionais seja relevante para demonstrar a diversidade e a atratividade global da instituição. Essa característica pode influenciar o modelo de predição, visto que fatores como origem do aluno podem estar relacionados às taxas de aceitação.

2025-12-02T15:31:29.529376 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável GPA apresenta distribuição concentrada em torno de valores relativamente altos, entre 3.1 e 3.3, o que indica que a maior parte dos candidatos possui desempenho acadêmico consistente. A mediana situa-se pouco acima de 3.2, reforçando esse padrão. Observa-se ainda a presença de alguns valores atípicos, tanto abaixo de 2.8 quanto acima de 3.6, que representam candidatos com desempenho fora do perfil predominante. Esses outliers, embora pouco frequentes, podem influenciar a análise estatística e devem ser considerados no pré-processamento ou na interpretação dos resultados do modelo. De forma geral, a distribuição do GPA sugere que a base é composta majoritariamente por candidatos academicamente fortes, o que pode ser um dos critérios determinantes no processo de admissão.

2025-12-02T15:31:29.627965 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável major, que representa a área de formação acadêmica dos candidatos, apresenta distribuição relativamente equilibrada entre as categorias, mas com destaque para Humanidades, que concentra o maior número de aplicações. As áreas de STEM e Business aparecem em proporções semelhantes, ambas com menor participação em relação a Humanidades. Essa diferença pode refletir o perfil da amostra, indicando maior procura de candidatos oriundos de cursos de Humanidades pelos programas de MBA. A análise dessa variável é relevante para verificar se determinadas formações acadêmicas têm maior representatividade ou desempenham papel diferenciado nos resultados de admissão.

2025-12-02T15:31:29.735168 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável raça apresenta distribuição diversificada entre os candidatos, com destaque para a categoria de pessoas que preferiram não se identificar, seguida pelo grupo White. Em seguida aparecem Asian, Black e Hispanic, enquanto a categoria Other concentra a menor quantidade de aplicações. Essa composição evidencia tanto a representatividade de diferentes origens raciais quanto a limitação do campo para candidatos internacionais. A análise dessa variável é importante para compreender a diversidade do conjunto de dados e avaliar se há possíveis diferenças de perfil que podem influenciar nos resultados de admissão.

2025-12-02T15:31:29.847615 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável GMAT apresenta uma distribuição concentrada entre 600 e 700 pontos, faixa onde se encontra a maior parte dos candidatos. O pico de frequência ocorre próximo de 650 pontos, o que sugere que esse valor é representativo do desempenho médio dos aplicantes. Apesar dessa concentração, também há candidatos com pontuações mais baixas, em torno de 570, bem como outros que alcançam notas elevadas acima de 750, embora em menor quantidade. Essa distribuição indica que, em geral, os candidatos possuem desempenho sólido no exame, mas com variação suficiente para permitir que o modelo identifique padrões relacionados ao status de admissão.

2025-12-02T15:31:29.972645 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável experiência profissional apresenta distribuição concentrada entre 4 e 6 anos de atuação no mercado, com destaque para os candidatos que possuem 5 anos de experiência, que representam a maior parte das aplicações. Os extremos da distribuição, com candidatos que possuem apenas 1 ou 2 anos de experiência e aqueles com mais de 7 anos, aparecem em menor número, configurando perfis menos frequentes na amostra. Esse padrão sugere que a base de dados está composta principalmente por profissionais em estágio intermediário de carreira, o que reflete o perfil típico de aplicantes a programas de MBA. Essa variável é particularmente relevante, pois pode influenciar diretamente nas chances de admissão, uma vez que a experiência prática é um critério valorizado nas seleções.

2025-12-02T15:31:30.105156 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

A variável setor de experiência profissional revela que a maior parte dos candidatos possui trajetória em Consultoria, que se destaca amplamente em relação aos demais setores. Em seguida aparecem PE/VC (Private Equity e Venture Capital), Tecnologia e setores ligados ao serviço público ou organizações sem fins lucrativos, todos com participação significativa. Áreas tradicionais como Investment Banking e Financial Services também se mostram relevantes, mas em menor proporção. Já setores como Saúde, Bens de Consumo (CPG), Mídia/Entretenimento, Varejo, Imobiliário e Energia aparecem de forma mais restrita, representando nichos específicos da amostra. Essa distribuição indica que o MBA atrai predominantemente profissionais de consultoria e finanças, mas também apresenta diversidade ao incluir candidatos de áreas emergentes e de setores menos tradicionais.

2025-12-02T15:31:30.250507 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/

Pré-Processamento

Com base na análise exploratória realizada, foram definidos e aplicados procedimentos de pré-processamento a fim de adequar os dados para a etapa de modelagem. As principais etapas conduzidas incluem:

  • Tratamento de valores ausentes:na variável admission, valores nulos foram interpretados como recusa e substituídos por Deny. Já na variável race, os valores ausentes foram preenchidos como Unknown, garantindo a consistência da base.
  • Codificação de variáveis categóricas: colunas como gender, international, major, race, work_industry e admission foram convertidas em variáveis numéricas por meio do método LabelEncoder, possibilitando sua utilização pelo modelo de árvore de decisão.
  • Imputação em variáveis numéricas: atributos como gpa, gmat e work_exp tiveram seus valores ausentes substituídos pela mediana, minimizando a influência de outliers e preservando a distribuição original dos dados.
  • Seleção de variáveis: foram mantidas no conjunto de treino apenas as colunas relevantes para a análise preditiva, enquanto identificadores como application_id foram descartados por não possuírem valor analítico.
  • Separação entre features e target: as variáveis explicativas (X) foram definidas a partir das características acadêmicas, demográficas e profissionais dos candidatos, enquanto a variável alvo (y) corresponde ao status de admission.
  • Divisão em treino e teste: o conjunto de dados foi dividido em duas partes, com 80% para treino e 20% para teste, garantindo estratificação da variável alvo para preservar a proporção entre as classes.
application_id gender international gpa major race gmat work_exp work_industry admission
1 Female False 3.3 Business Asian 620 3 Financial Services Admit
2 Male False 3.28 Humanities Black 680 5 Investment Management nan
3 Female True 3.3 Business nan 710 5 Technology Admit
4 Male False 3.47 STEM Black 690 6 Technology nan
5 Male False 3.35 STEM Hispanic 590 5 Consulting nan
6 Male False 3.18 Business White 610 6 Consulting nan
7 Female False 2.93 STEM Other 590 3 Technology Admit
8 Male True 3.02 Business nan 630 6 Financial Services nan
9 Male False 3.24 Business White 590 2 Nonprofit/Gov nan
10 Male False 3.27 Humanities Asian 690 3 Consulting nan
11 Male False 3.05 Humanities White 580 5 Technology nan
12 Male True 2.85 Humanities nan 580 4 PE/VC nan
13 Female False 3.24 Humanities Hispanic 640 6 PE/VC Waitlist
14 Female False 3.39 Business Black 690 4 Nonprofit/Gov nan
15 Female False 3.03 STEM White 600 5 Technology Admit
16 Female True 3.05 Humanities nan 710 4 Consulting Admit
17 Female False 3.32 Business Asian 710 5 PE/VC Admit
18 Male False 3.23 Humanities Black 700 4 Health Care nan
19 Male False 3.13 Humanities White 630 6 Financial Services nan
20 Male True 3.09 Business nan 670 8 Consulting nan
gender international gpa major race gmat work_exp work_industry admission
1 0 3.48 1 5 630 5 8 0
1 0 3.27 0 5 610 6 10 0
1 0 3.31 2 0 670 6 8 0
1 1 3.29 1 4 660 5 10 0
1 1 3.02 2 4 570 3 10 0
1 0 3.4 1 0 710 4 13 0
0 0 3.23 0 0 670 7 9 0
1 0 3.36 2 1 700 5 10 2
0 0 3.36 1 1 670 4 6 2
1 0 3.29 0 5 620 6 1 0
1 1 3.4 2 4 580 5 1 0
0 0 3.21 1 2 580 5 1 0
1 1 3.06 0 4 640 4 1 0
0 0 3.2 1 2 630 6 1 0
1 0 3.25 2 0 610 5 6 0
1 0 3.27 2 1 630 6 1 0
1 1 3.01 0 4 610 6 13 0
1 1 3.15 0 4 620 6 10 0
0 0 2.93 1 2 580 5 0 0
1 1 3.25 0 4 570 6 8 0

Divisão dos dados

Nesta etapa, o conjunto de dados foi dividido em duas partes: treinamento e teste. O conjunto de treinamento é utilizado para ajustar o modelo de Random Forest, permitindo que ele aprenda os padrões que relacionam as variáveis de entrada com o resultado de admissão. Já o conjunto de teste é usado para avaliar o desempenho do modelo em dados nunca vistos, garantindo que a análise reflita a capacidade real de generalização.

A proporção de 80% para treino e 20% para teste foi adotada, e a divisão foi feita de forma estratificada, mantendo a proporção entre candidatos admitidos e não admitidos. Essa estratégia evita que o modelo aprenda de forma enviesada e assegura maior consistência na avaliação final.

# Divisão dos Dados
import pandas as pd
from sklearn.model_selection import train_test_split

# 1. Carregar a base pré-processada
df = pd.read_csv("./src/MBA.csv")

# 2. Converter variável-alvo para binária, caso ainda não esteja
df["admission"] = df["admission"].apply(lambda x: 1 if x == "Admit" else 0)

# 3. Separar features (X) e alvo (y)
X = df.drop(columns=["admission"])
y = df["admission"]

# 4. Divisão treino/teste (80/20) com estratificação
X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    stratify=y,
    random_state=42
)

# 5. Exibir informações
print("Tamanho do conjunto de treinamento:", X_train.shape)
print("Tamanho do conjunto de teste:", X_test.shape)
print("\nProporção de classes no treino:")
print(y_train.value_counts(normalize=True))
print("\nProporção de classes no teste:")
print(y_test.value_counts(normalize=True))

Treinamento do Modelo

Desempenho do Modelo

Acurácia (teste): 0.8539   |   OOB score: 0.8488

Relatório de Classificação

classe precision recall f1-score support
0 0.8778 0.9632 0.9185 1059.0000
1 0.4935 0.2111 0.2957 180.0000
accuracy 0.8539 0.8539 0.8539 0.8539
macro avg 0.6857 0.5871 0.6071 1239.0000
weighted avg 0.8220 0.8539 0.8280 1239.0000
2025-12-02T15:31:31.356604 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/ 2025-12-02T15:31:31.717871 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/ 2025-12-02T15:31:32.148606 image/svg+xml Matplotlib v3.10.7, https://matplotlib.org/
# docs/random-forest/rf_viz.py
# Gera imagens SVG (matriz de confusão, importâncias e 1 árvore do ensemble)
# para embutir no MkDocs com exec="on" html="1".

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO
from sklearn.model_selection import train_test_split
from sklearn.metrics import (accuracy_score, classification_report,
                             confusion_matrix, ConfusionMatrixDisplay)
from sklearn.ensemble import RandomForestClassifier
from sklearn import tree

# ========================
#  Helpers de renderização
# ========================
def fig_to_svg():
    """Retorna a figura atual como string SVG e fecha a figura."""
    buf = StringIO()
    plt.tight_layout()
    plt.savefig(buf, format="svg", bbox_inches="tight")
    plt.close()
    return buf.getvalue()

def h2(txt):  # título HTML
    print(f"<h2 style='margin:16px 0 8px'>{txt}</h2>")

def h3(txt):
    print(f"<h3 style='margin:12px 0 6px'>{txt}</h3>")

# ==========
# 1) Dados
# ==========
# Ajuste o caminho se necessário
df = pd.read_csv("./src/MBA.csv")

# Pré-processamento essencial (alvo binário + codificação leve)
df["admission"] = df["admission"].fillna("Deny")
df["admission"] = (df["admission"] == "Admit").astype(int)

# imputações simples
for col in ["gmat", "work_exp"]:
    if df[col].isna().any():
        df[col] = df[col].fillna(df[col].median())
if "race" in df.columns and df["race"].isna().any():
    df["race"] = df["race"].fillna("Unknown")

# remove ID se existir
if "application_id" in df.columns:
    df = df.drop(columns=["application_id"])

# one-hot nas categóricas
cat_cols = df.select_dtypes(exclude=["number", "bool"]).columns
X = pd.get_dummies(df.drop(columns=["admission"]), columns=cat_cols, drop_first=True)
y = df["admission"]

# divisão
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

# ==========
# 2) Modelo
# ==========
rf = RandomForestClassifier(
    n_estimators=300,
    max_depth=None,
    max_features="sqrt",
    oob_score=True,
    n_jobs=-1,
    random_state=42
)
rf.fit(X_train, y_train)

# ==================
# 3) Métricas texto
# ==================
y_pred = rf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
rep = classification_report(y_test, y_pred, output_dict=True)
rep_df = (pd.DataFrame(rep).T
          .rename_axis("classe")
          .reset_index()[["classe","precision","recall","f1-score","support"]])

# Títulos e números principais
h2("Desempenho do Modelo")
print(f"<p><b>Acurácia (teste):</b> {acc:.4f} &nbsp;&nbsp;|&nbsp;&nbsp; "
      f"<b>OOB score:</b> {rf.oob_score_:.4f}</p>")
h3("Relatório de Classificação")
print(rep_df.to_html(index=False, float_format=lambda x: f"{x:.4f}"))

# =========================
# 4) Matriz de Confusão SVG
# =========================
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(cm, display_labels=[0,1])
disp.plot(values_format="d", cmap="Blues", colorbar=False)
plt.title("Matriz de Confusão — Random Forest")
print(fig_to_svg())

# ===================================
# 5) Importância das variáveis (Top15)
# ===================================
imp = (pd.Series(rf.feature_importances_, index=X.columns)
         .sort_values(ascending=False)
         .head(15))[::-1]  # invertido p/ barh crescer p/ cima

plt.figure(figsize=(8,5))
sns.barplot(x=imp.values, y=imp.index)
plt.xlabel("Score de Importância (MDI)")
plt.ylabel("Variável")
plt.title("Importância das Variáveis — Top 15")
plt.grid(axis="x", linestyle="--", alpha=0.5)
print(fig_to_svg())

# ==========================================
# 6) Uma árvore do ensemble (visão ilustrativa)
# ==========================================
# Pega um estimador e desenha até profundidade 3 para ficar legível
est = rf.estimators_[0]
plt.figure(figsize=(12,6))
tree.plot_tree(est, max_depth=3, fontsize=8, feature_names=X.columns, class_names=["0","1"], filled=True)
plt.title("Árvore Representativa (estimador 0) — max_depth=3")
print(fig_to_svg())

Avaliação do Modelo

O modelo de Random Forest apresentou um desempenho geral consistente, atingindo uma acurácia de 85,39% nos dados de teste e um OOB score de 84,88%, o que indica boa capacidade de generalização — ou seja, o modelo mantém resultados estáveis mesmo em amostras fora do treinamento.

A matriz de classificação mostra que o modelo tem excelente desempenho na classe 0 (não admitidos), com precisão de 87,8% e recall de 96,3%, resultando em um f1-score de 0,918. Já para a classe 1 (admitidos), o modelo apresenta uma precisão menor (49,3%) e recall de 21,1%, o que indica dificuldade em identificar todos os candidatos realmente admitidos — uma consequência comum em bases desbalanceadas, onde há muito mais casos de não admissão do que de admissão.

Mesmo com essa limitação, o modelo demonstra boa capacidade de separar os dois grupos, sendo mais conservador ao prever admissões (o que reduz falsos positivos, mas aumenta falsos negativos).

Importância das Variáveis

Abaixo estão as variáveis que mais contribuíram para as decisões do modelo Random Forest, segundo o método Mean Decrease in Impurity (MDI):

Ranking Variável Importância
🥇 1 GPA (média acadêmica) 0.2970
🥈 2 GMAT (nota do exame) 0.2827
🥉 3 Experiência profissional (work_exp) 0.0986
4 Área de formação – Humanities 0.0339
5 Área de formação – STEM 0.0312
6 Gênero – Masculino 0.0285
7 Setor – Consulting 0.0224
8 Raça – White 0.0206
9 Setor – Private Equity / VC 0.0176
10 Setor – Technology 0.0168

Observação:
O modelo dá maior peso ao desempenho acadêmico e profissional, reforçando que candidatos com GPA e GMAT altos e maior experiência de trabalho têm maior probabilidade de admissão.