Análise de riscos para o Burnout no ambiente de trabalho
1 Introdução
1.1 Problema
O burnout se caracteriza como um fenômeno ocupacional de esgotamento profissional reconhecido pela Organização Mundial da Saúde (OMS) desde 2019, tornando-se um dos temas mais discutidos dentro da saúde organizacional (World Health Organization (2019)). Em especial desde a pandemia de COVID-19, que mudou significativamente os padrões de trabalho, as discussões sobre o burnout se tornaram cada vez mais relevantes no que diz respeito à retenção de talentos, considerando que pesquisas apontam que o burnout é um fator importante na intenção de funcionários deixarem os seus empregos (Trinkenreich et al. (2023)).
Segundo estimativas de um estudo de referência do Instituto Americano de Estresse, o estresse ocupacional custa às empresas norte-americanas mais de US$ 300 bilhões por ano em fatores como rotatividade e falta de desempenho (American Institute of Stress (2024)). No Brasil, o burnout foi reconhecido na portaria GM/MS Nº 1.999 como doença ocupacional em 2022, impondo responsabilidades legais crescentes às empresas (Brasil. Ministério da Saúde (2023)).
Tais questões levantam a seguinte pergunta:
Quais fatores organizacionais e individuais estão mais associados ao risco de burnout, e como eles se combinam para elevar a probabilidade de um funcionário deixar a empresa?
Responder a esta pergunta se torna relevante em casos de análise de: equipes/gestores de RH, que precisem identificar perfis de risco antes que o funcionário solicite demissão; executivos que precisam entender quais departamentos/cargos concentram maior esgotamento; além de pesquisadores que demonstrem interesse nos fatores de comportamento e da organização relacionados ao burnout em larga escala.
1.2 Abordagem
Para a abordagem, foi utilizado o Synthetic Employee Dataset, disponibilizado publicamente no Hugging Face, com 850.000 perfis sintéticos de funcionários construídos com base em distribuições estatísticas reais de ambientes corporativos. O dataset inclui variáveis numéricas (como scores de estresse e carga de trabalho), categóricas (departamento, cargo, persona comportamental), booleanas (saída da empresa) e textuais (feedbacks de funcionários).
Neste primeiro momento, conduzir-se-á a importação, limpeza e pré-processamento dos dados.
2 Pacotes necessários
library(tidyverse) # Manipulação e visualização de dados (dplyr, ggplot2, etc.)
library(janitor) # Padronização de nomes de colunas
library(arrow) # Leitura de arquivos no formato Parquet
library(knitr) # Geração de tabelas formatadas no relatório
library(kableExtra) # Estilização de tabelas
library(skimr) # Sumários estatísticos compactos3 Preparação dos dados
3.1 Fonte e descrição
Os dados foram obtidos do repositório público do Hugging Face:
BrotherTony. (2025). Synthetic Employee Dataset: 800K+ Records for HR Analytics. Hugging Face. https://huggingface.co/datasets/BrotherTony/employee-burnout-turnover-prediction-800k
3.1.1 Contexto e propósito original
O dataset corresponde a um conjunto de dados sintéticos, com base em padrões observados em ambientes corporativos. Seu propósito original é servir como base para modelos preditivos de burnout e análises de contextos de RH.
3.1.2 Características do dataset bruto
| Atributo | Valor |
|---|---|
| Total de registros | ~850.000 |
| Número de variáveis | 31 |
| Formato original | Parquet |
| Idioma | Inglês |
| Licença | CC-BY-NC-ND 4.0 (uso permitido em contexto não comercial e com atribuição) |
3.1.3 Variáveis originais
| Variável | Tipo | Descrição |
|---|---|---|
| employee_id | character | Identificador único |
| role | character | Cargo (diversas variações) |
| job_level | character | Nível: Entry, Mid, Senior, Manager, Lead |
| department | character | Departamento (38 divisões) |
| tenure_months | integer | Tempo de empresa em meses |
| salary | double | Salário anual em USD |
| performance_score | double | Score de desempenho (0–1) |
| satisfaction_score | double | Score de satisfação (0–1) |
| workload_score | double | Carga de trabalho (0–1) |
| team_sentiment | double | Sentimento da equipe (0–1) |
| recent_feedback | character | Texto livre de avaliação do funcionário |
| communication_patterns | character | Estilo de comunicação baseado em persona |
| project_completion_rate | double | Taxa de conclusão de projetos (0–1) |
| overtime_hours | double | Horas extras |
| training_participation | double | Participação em treinamentos (0–1) |
| collaboration_score | double | Score de colaboração (0–1) |
| technical_skills | list | Habilidades técnicas por funcionário |
| soft_skills | list | Habilidades interpessoais por funcionário |
| email_sentiment | double | Sentimento do e-mail (0–1) |
| slack_activity | double | Atividade no Slack (0–1) |
| meeting_participation | double | Participação em reuniões (0–1) |
| goal_achievement_rate | double | Taxa de atingimento de metas (0–1) |
| stress_level | double | Nível de estresse (0–1) |
| burnout_risk | double | Risco de burnout (0–1) |
| left_company | logical | Saiu da empresa? (TRUE/FALSE) |
| turnover_reason | character | Motivo da saída (quando aplicável) |
| risk_factors_summary | character | Resumo do risco (Low, Medium, High, Severe) |
| turnover_probability_generated | double | Probabilidade de saída gerada por ML |
| persona_name | character | Arquétipo comportamental (12 tipos) |
| role_complexity_score | double | Complexidade do cargo (0–1) |
| career_progression_score | double | Progressão de carreira (0–1) |
3.2 Importação dos dados
O dataset é distribuído no formato Parquet, um
formato binário que preserva os dados e ocupa menos espaço que um CSV
equivalente. O pacote arrow permite ler arquivos Parquet
diretamente de uma URL.
O dataset original é dividido em 9 arquivos (shards). Abaixo, importa-se o primeiro, que contém aproximadamente 95.000 registros com os 31 atributos originais.
url_parquet <- paste0(
"https://huggingface.co/datasets/BrotherTony/",
"employee-burnout-turnover-prediction-800k/",
"resolve/refs%2Fconvert%2Fparquet/default/train/0000.parquet"
)
arquivo_local <- "0000.parquet"
if (!file.exists(arquivo_local)) {
download.file(url_parquet, destfile = arquivo_local, mode = "wb")
}
df_bruto <- read_parquet(arquivo_local)3.3 Etapas de limpeza e organização
3.3.1 Padronização dos nomes das variáveis
A função clean_names() do pacote janitor
converte todos os nomes de colunas para snake_case, sem
espaços ou caracteres especiais.
## [1] "employee_id" "role"
## [3] "job_level" "department"
## [5] "tenure_months" "salary"
## [7] "performance_score" "satisfaction_score"
## [9] "workload_score" "team_sentiment"
## [11] "recent_feedback" "communication_patterns"
## [13] "project_completion_rate" "overtime_hours"
## [15] "training_participation" "collaboration_score"
## [17] "technical_skills" "soft_skills"
## [19] "email_sentiment" "slack_activity"
## [21] "meeting_participation" "goal_achievement_rate"
## [23] "stress_level" "burnout_risk"
## [25] "left_company" "turnover_reason"
## [27] "risk_factors_summary" "turnover_probability_generated"
## [29] "persona_name" "role_complexity_score"
## [31] "career_progression_score"
3.3.2 Conversão de tipos de dados
Para os dados vindos do Parquet, algumas conversões de dados são
necessárias: job_level precisa se tornar um fator ordenado
para que comparações entre níveis funcionem corretamente, e
tenure_months é convertido explicitamente para inteiro.
df$job_level <- factor(df$job_level,
levels = c("Entry", "Mid", "Senior", "Manager", "Lead"), #níveis em fator para o nível
ordered = TRUE)
df$tenure_months <- as.integer(df$tenure_months) #inteiro
glimpse(df)## Rows: 849,999
## Columns: 31
## $ employee_id <chr> "SYN_00000000", "SYN_00000001", "SYN_00…
## $ role <chr> " ", " Customer Success Manager", " Adm…
## $ job_level <ord> Mid, Manager, Entry, Manager, Mid, Mid,…
## $ department <chr> "Research & Development", "Research & D…
## $ tenure_months <int> 169, 54, 1, 31, 131, 34, 100, 77, 107, …
## $ salary <dbl> 79704.58, 29694.29, 62208.47, 236066.57…
## $ performance_score <dbl> 0.6324821, 0.5385873, 0.6246560, 0.9593…
## $ satisfaction_score <dbl> 0.6237460, 0.9825562, 0.7672001, 0.1858…
## $ workload_score <dbl> 0.7581168, 0.7884164, 0.6976166, 0.4931…
## $ team_sentiment <dbl> 0.6623349, 0.9346612, 0.8885591, 0.7321…
## $ recent_feedback <chr> "Close to home and good shift time give…
## $ communication_patterns <chr> "Exhibits communication style typical o…
## $ project_completion_rate <dbl> 0.5241873, 0.5582056, 0.5668491, 0.7674…
## $ overtime_hours <dbl> 0.000000, 0.000000, 0.000000, 9.591680,…
## $ training_participation <dbl> 0.04437344, 0.31485786, 0.74490049, 0.2…
## $ collaboration_score <dbl> 0.4921307, 0.9813943, 0.7011382, 0.3396…
## $ technical_skills <list<character>> <"REST APIs", "Python (Pand…
## $ soft_skills <list<character>> <"Communication", "Creativi…
## $ email_sentiment <dbl> 0.6328913, 1.0000000, 0.7580049, 0.2025…
## $ slack_activity <dbl> 0.4921307, 0.9813943, 0.7011382, 0.3396…
## $ meeting_participation <dbl> 0.4921307, 0.9813943, 0.7011382, 0.3396…
## $ goal_achievement_rate <dbl> 0.6324821, 0.5385873, 0.6246560, 0.9593…
## $ stress_level <dbl> 0.9089919, 0.3633211, 0.6643785, 1.0000…
## $ burnout_risk <dbl> 0.8666426, 0.2189959, 0.5415310, 1.0000…
## $ left_company <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE…
## $ turnover_reason <chr> "Not Applicable", "Not Applicable", "Pe…
## $ risk_factors_summary <chr> "Severe Burnout Risk", "Low Risk", "Low…
## $ turnover_probability_generated <dbl> 0.2909790, 0.1560017, 0.2338970, 0.3516…
## $ persona_name <chr> "ChangeResistor", "NewEnthusiast", "New…
## $ role_complexity_score <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,…
## $ career_progression_score <dbl> 1.0000000, 1.0000000, 0.8364946, 1.0000…
3.3.3 Tratamento de valores ausentes e strings especiais
turnover_reason usa a string
"Not Applicable" para funcionários ainda ativos. Para o
contexto do R, converte-se para NA. Em adição, padroniza-se
a capitalização de risk_factors_summary e remove-se espaços
extras nas colunas de texto.
df$turnover_reason[df$turnover_reason == "Not Applicable"] <- NA
df$turnover_reason[df$turnover_reason == ""] <- NA
df$risk_factors_summary <- str_to_title(trimws(df$risk_factors_summary))
df$risk_factors_summary <- factor(
df$risk_factors_summary,
levels = c("Low Risk", "Medium Risk", "High Risk", "Severe Burnout Risk"),
ordered = TRUE
)
df$persona_name <- trimws(df$persona_name)
df$role <- trimws(df$role)
df$department <- trimws(df$department)
df$communication_patterns <- trimws(df$communication_patterns)
df$recent_feedback <- trimws(df$recent_feedback)
n_nas <- colSums(is.na(df))
n_nas <- n_nas[n_nas > 0]
if (length(n_nas) > 0) {
na_tabela <- data.frame(
Variável = names(n_nas),
N_ausentes = as.integer(n_nas)
)
kable(na_tabela,
caption = "Valores ausentes por variável (após tratamento)",
col.names = c("Variável", "Nº de ausentes"),
row.names = FALSE) |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
} else {
cat("Nenhum valor ausente detectado.\n")
}| Variável | Nº de ausentes |
|---|---|
| turnover_reason | 604246 |
| risk_factors_summary | 44784 |
3.3.4 Processamento das colunas de habilidades
As colunas technical_skills e soft_skills
contêm, em cada célula, uma lista de habilidades do funcionário. Para
que possam ser usadas em análises numéricas, é necessário contar o
número de habilidades de cada funcionário e adicionar essa contagem como
uma nova coluna no dataset principal.
df$n_tech_skills <- sapply(df$technical_skills, length) # conta o número de habilidades técnicas por funcionário
df$n_soft_skills <- sapply(df$soft_skills, length) # conta o número de habilidades interpessoais por funcionário
# dataset expandido: uma linha por habilidade técnica
df_tech_skills <- df[, c("role", "job_level", "department",
"persona_name", "burnout_risk",
"left_company", "technical_skills")]
df_tech_skills <- tidyr::unnest(df_tech_skills, technical_skills)
names(df_tech_skills)[names(df_tech_skills) == "technical_skills"] <- "skill"
df_tech_skills$skill <- trimws(as.character(df_tech_skills$skill))
# dataset expandido: uma linha por habilidade interpessoal
df_soft_skills <- df[, c("role", "job_level", "department",
"persona_name", "burnout_risk",
"left_company", "soft_skills")]
df_soft_skills <- tidyr::unnest(df_soft_skills, soft_skills)
names(df_soft_skills)[names(df_soft_skills) == "soft_skills"] <- "skill"
df_soft_skills$skill <- trimws(as.character(df_soft_skills$skill))3.3.5 Criação de variáveis derivadas
Criam-se novas variáveis a partir das existentes. Em especial, desenvolve-se um score composto baseado no modelo de desequilíbrio esforço-recompensa ilustrado por Siegrist (1996), que identifica a combinação de alta demanda e baixa recompensa como bases do esgotamento ocupacional. A operacionalização com pesos numéricos (0.4/0.3/0.3) é uma adaptação exploratória para as variáveis disponíveis no dataset, e não reproduz diretamente nenhuma fórmula original do autor.
High Effort (extrinsic: demands/obligations + intrinsic: need for control) <-> Low Reward (money + esteem + status control)
# 1. Faixa salarial
# Discretizar o salário para a comparação entre grupos de remuneração
df$faixa_salarial <- cut(
df$salary,
breaks = c(0, 50000, 80000, 120000, 200000, Inf),
labels = c("< 50K", "50K-80K", "80K-120K", "120K-200K", "> 200K"),
right = FALSE
)
# 2. Tempo de empresa em anos
df$tenure_anos <- df$tenure_months / 12
# 3. Grupos de tenure (fases de carreira/estágios no trabalho)
# Comparação entre recém-contratados, médio prazo e veteranos
df$grupo_tenure <- cut(
df$tenure_anos,
breaks = c(0, 1, 3, 5, 10, Inf),
labels = c("< 1 ano", "1-3 anos", "3-5 anos", "5-10 anos", "> 10 anos"),
right = FALSE
)
# 4. Índice de engajamento
# Média entre satisfação, colaboração e sentimento da equipe.
df$indice_engajamento <- (df$satisfaction_score +
df$collaboration_score +
df$team_sentiment) / 3
# 5. Score de desequilíbrio esforço-recompensa
# Baseado no modelo de Siegrist (1996): alta carga, horas extras e
# baixa satisfação.
# overtime_hours é dividido por 74 (máximo observado) para ficar
# na mesma escala 0-1 das demais variáveis.
df$score_desequilibrio <- (df$workload_score * 0.4) + # Carga de trabalho (peso 0.4) - recebe o maior peso por ser, no modelo, fator dominante de desequilíbrio
(df$overtime_hours / max(df$overtime_hours, na.rm = TRUE) * 0.3) + #Horas extras (peso 0.3) - normalização min-max divide por 74 obter um número entre 0 e 1
((1 - df$satisfaction_score) * 0.3) #Insatisfação (peso 0.3)
# 6. Flag de alto risco de burnout (acima do percentil 75)
# Variável binária para identificar o quartil superior de risco
df$alto_risco_burnout <- df$burnout_risk >= quantile(df$burnout_risk, 0.75,
na.rm = TRUE)
# 7. Flag: saída associada ao burnout
# Funcionário que saiu E estava em alto risco
df$saida_por_burnout <- df$left_company & df$alto_risco_burnout3.3.6 Remoção de colunas desnecessárias
As colunas de listas originais (technical_skills,
soft_skills) já foram processadas, de modo que os
contadores e datasets expandidos foram gerados. O
employee_id não tem valor analítico. Ambos são removidos do
dataset principal.
df$technical_skills <- NULL
df$soft_skills <- NULL
df$employee_id <- NULL
cat(sprintf("Dataset limpo final: %d linhas × %d colunas\n", nrow(df), ncol(df)))## Dataset limpo final: 849999 linhas × 37 colunas
3.4 Visão do dataset final
df[1:10, c("role", "job_level", "department", "tenure_anos",
"stress_level", "burnout_risk", "satisfaction_score",
"overtime_hours", "left_company",
"risk_factors_summary", "persona_name")] |>
kable(caption = "Amostra do dataset limpo (10 primeiras observações)",
digits = 3) |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
font_size = 11, full_width = TRUE) |>
scroll_box(width = "100%", height = "380px")| role | job_level | department | tenure_anos | stress_level | burnout_risk | satisfaction_score | overtime_hours | left_company | risk_factors_summary | persona_name |
|---|---|---|---|---|---|---|---|---|---|---|
| Mid | Research & Development | 14.083 | 0.909 | 0.867 | 0.624 | 0.000 | FALSE | Severe Burnout Risk | ChangeResistor | |
| Customer Success Manager | Manager | Research & Development | 4.500 | 0.363 | 0.219 | 0.983 | 0.000 | FALSE | Low Risk | NewEnthusiast |
| Administrative Assistant | Entry | HR | 0.083 | 0.664 | 0.542 | 0.767 | 0.000 | TRUE | Low Risk | NewEnthusiast |
| Senior Manager | Manager | Research & Development | 2.583 | 1.000 | 1.000 | 0.186 | 9.592 | FALSE | Severe Burnout Risk | OverachievingSprinter |
| Anonymous Employee | Mid | Research & Development | 10.917 | 0.723 | 0.615 | 0.567 | 0.000 | FALSE | Low Risk | SeasonedExpert |
| Anonymous Employee | Mid | Dairy | 2.833 | 0.362 | 0.217 | 0.909 | 0.000 | FALSE | Low Risk | QuietAchiever |
| Anonymous Employee | Mid | Procurement | 8.333 | 0.457 | 0.309 | 0.895 | 0.000 | FALSE | Low Risk | QuietAchiever |
| Senior Business Analyst | Senior | Meats | 6.417 | 0.599 | 0.464 | 0.708 | 0.000 | FALSE | Low Risk | SocialCatalyst |
| Senior Manager | Manager | Sales & Marketing | 8.917 | 0.955 | 0.934 | 0.616 | 0.000 | FALSE | Severe Burnout Risk | StrugglingLearner |
| Sales | Mid | Procurement | 14.083 | 0.401 | 0.254 | 1.000 | 0.000 | FALSE | Low Risk | QuietAchiever |
3.5 Sumário das variáveis de interesse
df[, c("stress_level", "burnout_risk", "satisfaction_score", "workload_score",
"overtime_hours", "salary", "tenure_anos", "performance_score",
"indice_engajamento", "score_desequilibrio",
"n_tech_skills", "n_soft_skills")] |>
skim()| Name | …[] |
| Number of rows | 849999 |
| Number of columns | 12 |
| _______________________ | |
| Column type frequency: | |
| numeric | 12 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| stress_level | 0 | 1 | 0.79 | 0.26 | 0.00 | 0.61 | 0.94 | 1.00 | 1.00 | ▁▁▂▂▇ |
| burnout_risk | 0 | 1 | 0.74 | 0.32 | 0.00 | 0.48 | 0.91 | 1.00 | 1.00 | ▁▂▂▂▇ |
| satisfaction_score | 0 | 1 | 0.58 | 0.28 | 0.05 | 0.37 | 0.58 | 0.81 | 1.00 | ▅▆▇▆▇ |
| workload_score | 0 | 1 | 0.60 | 0.20 | 0.01 | 0.46 | 0.61 | 0.76 | 1.00 | ▁▃▇▇▅ |
| overtime_hours | 0 | 1 | 3.13 | 6.09 | 0.00 | 0.00 | 0.00 | 4.16 | 73.95 | ▇▁▁▁▁ |
| salary | 0 | 1 | 84563.07 | 47444.31 | 27190.57 | 41006.78 | 78178.53 | 116146.64 | 384330.43 | ▇▃▁▁▁ |
| tenure_anos | 0 | 1 | 5.87 | 4.18 | 0.08 | 2.50 | 5.58 | 8.75 | 29.75 | ▇▆▁▁▁ |
| performance_score | 0 | 1 | 0.69 | 0.18 | 0.07 | 0.57 | 0.70 | 0.83 | 1.00 | ▁▂▅▇▆ |
| indice_engajamento | 0 | 1 | 0.57 | 0.17 | 0.04 | 0.45 | 0.57 | 0.70 | 1.00 | ▁▃▇▆▂ |
| score_desequilibrio | 0 | 1 | 0.38 | 0.11 | 0.01 | 0.30 | 0.38 | 0.45 | 0.69 | ▁▃▇▆▁ |
| n_tech_skills | 0 | 1 | 6.50 | 1.71 | 4.00 | 5.00 | 6.00 | 8.00 | 9.00 | ▇▅▃▅▃ |
| n_soft_skills | 0 | 1 | 5.00 | 1.41 | 3.00 | 4.00 | 5.00 | 6.00 | 7.00 | ▇▇▇▇▇ |
vars_foco <- c("stress_level", "burnout_risk", "satisfaction_score",
"workload_score", "overtime_hours",
"indice_engajamento", "score_desequilibrio")
# Calcular estatísticas para cada variável individualmente
resumo <- data.frame(
Variável = vars_foco,
Mínimo = round(sapply(df[vars_foco], min, na.rm = TRUE), 3),
Mediana = round(sapply(df[vars_foco], median, na.rm = TRUE), 3),
Média = round(sapply(df[vars_foco], mean, na.rm = TRUE), 3),
Máximo = round(sapply(df[vars_foco], max, na.rm = TRUE), 3),
Desvio_Padrao = round(sapply(df[vars_foco], sd, na.rm = TRUE), 3),
Pct_Ausentes = round(sapply(df[vars_foco],
function(x) mean(is.na(x)) * 100), 1),
row.names = NULL
)
kable(resumo,
caption = "Sumário estatístico das variáveis contínuas de interesse",
col.names = c("Variável", "Mínimo", "Mediana", "Média",
"Máximo", "Desvio Padrão", "% Ausentes")) |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) |>
column_spec(1, bold = TRUE, monospace = TRUE)| Variável | Mínimo | Mediana | Média | Máximo | Desvio Padrão | % Ausentes |
|---|---|---|---|---|---|---|
| stress_level | 0.000 | 0.942 | 0.791 | 1.000 | 0.265 | 0 |
| burnout_risk | 0.000 | 0.914 | 0.736 | 1.000 | 0.316 | 0 |
| satisfaction_score | 0.050 | 0.583 | 0.582 | 1.000 | 0.276 | 0 |
| workload_score | 0.007 | 0.614 | 0.599 | 1.000 | 0.200 | 0 |
| overtime_hours | 0.000 | 0.000 | 3.133 | 73.954 | 6.094 | 0 |
| indice_engajamento | 0.041 | 0.570 | 0.574 | 0.999 | 0.169 | 0 |
| score_desequilibrio | 0.013 | 0.377 | 0.378 | 0.693 | 0.107 | 0 |
Destaques do sumário:
- O
burnout_riskmédio da amostra é 0.74 (escala 0–1). - 28.5% dos funcionários saíram da empresa.
- Funcionários com Severe Burnout Risk representam 60.8% da amostra.
- O máximo de
overtime_hoursé 73.9535736h
3.5.1 Distribuição das variáveis categóricas principais
risco_tab <- as.data.frame(table(df$risk_factors_summary)) # Distribuição por nível de risco de burnout
risco_tab$Pct <- round(risco_tab$Freq / sum(risco_tab$Freq) * 100, 1)
names(risco_tab) <- c("Nível de Risco", "N", "%")
kable(risco_tab,
caption = "Distribuição por nível de risco de burnout",
row.names = FALSE) |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Nível de Risco | N | % |
|---|---|---|
| Low Risk | 315695 | 39.2 |
| Medium Risk | 0 | 0.0 |
| High Risk | 0 | 0.0 |
| Severe Burnout Risk | 489520 | 60.8 |
persona_tab <- as.data.frame(table(df$persona_name)) # Distribuição por arquétipo comportamental
persona_tab <- persona_tab[order(-persona_tab$Freq), ]
persona_tab$Pct <- round(persona_tab$Freq / sum(persona_tab$Freq) * 100, 1)
names(persona_tab) <- c("Persona", "N", "%")
kable(persona_tab,
caption = "Distribuição por arquétipo comportamental (persona)",
row.names = FALSE) |>
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)| Persona | N | % |
|---|---|---|
| StrugglingLearner | 86714 | 10.2 |
| CorporateNavigator | 69639 | 8.2 |
| SteadyEddy | 69611 | 8.2 |
| NewEnthusiast | 69566 | 8.2 |
| QuietAchiever | 69525 | 8.2 |
| 9-to-5Clockwatcher | 69434 | 8.2 |
| ChangeResistor | 69337 | 8.2 |
| SeasonedExpert | 69293 | 8.2 |
| SocialCatalyst | 69273 | 8.1 |
| OverachievingSprinter | 69243 | 8.1 |
| BurntOutStar | 69209 | 8.1 |
| AmbitiousClimber | 69155 | 8.1 |
4 Conclusões Parciais
Nesta primeira etapa, foram importados ~95.000 registros via arquivo Parquet diretamente do repositório público do Hugging Face, e realizado um processo de limpeza que envolveu: padronização de nomes de colunas, conversão de tipos, tratamento de valores pseudo-ausentes, criação de contadores a partir das colunas de listas, e criação de 7 variáveis derivadas.
Em seguida, o objetivo é avançar para a análise exploratória dos dados, investigando: a distribuição do risco de burnout por departamento e níveis de cargo; variáveis com maior correlação com burnout e a saída da empresa; o perfil típico do funcionário em risco severo; diferenças do burnout por faixa salarial e tempo de empresa.
5 Referências
Licença dos dados: CC-BY-NC-ND 4.0. BrotherTony (2025), Hugging Face