Predição de Saídas — Parte 1/4

Preparação do ambiente, limpeza dos dados e análise exploratória completa

Higor Gomes
12 min readAug 22, 2022
Figura 1 — Capa. Fonte: o autor.

Caso você já tenha lido este artigo, aqui você encontra as outras partes: análise intermediária, análise avançada e análise expert.

Introdução

Um dos primeiros tópicos com o qual nos deparamos quando pesquisamos por People Analytics é a retenção de colaboradores, especialmente utilizando técnicas preditivas. “Predição de Turnover” sem dúvidas é uma das maiores pedidas nas empresas brasileiras quando o tema é RH orientado a dados.

Além disso, existe uma certa projeção hierárquica em que o prescritivo (qual ação tomar hoje com base no que pode acontecer no futuro) fica acima, ou melhor ainda, tem mais valor que o descritivo (o que aconteceu/está acontecendo). O intuito desses quatro artigos (parte 1 aqui, mas fique à vontade para conferir a parte 2, parte 3 e parte 4) é justamente provar que essa hierarquia não existe, e que todo e qualquer projeto de análise de dados (especialmente em people analytics) tem muito valor em todas as camadas.

A Figura 2 abaixo traz de forma esquemática como nos é apresentada essa hierarquia de análises na maioria das vezes.

Figura 2 — Fases teóricas do analytics. Fonte: o autor.

Por termos constantemente novos cenários, novas informações e até mesmo novas perspectivas sobre os mesmos problemas (isso sem contar os novos problemas que sempre surgem), as fases do analytics no dia a dia seguem mais ou menos o formato descrito na Figura 3 a seguir.

Figura 3 — Fases reais do analytics. Fonte: o autor.

Assumindo que já exista o conhecimento, ferramentas e necessidades para navegar pelos quatro estágios, eles acontecem de forma contínua e conjunta, e não de forma hierárquica, conforme sempre nos deparamos.

Indo um pouco além, trago a provocação de que, via de regra, nossos maiores esforços precisam ser nas duas primeiras camadas: descritiva e diagnóstica (quais os motivos do que aconteceu/está acontecendo). Isso pelo fato de que uma boa análise preditiva é sempre precedida por uma boa análise descritiva. Se você não tem boas features (atributos) com um bom nível de explicabilidade do fenômeno, provavelmente você terá um modelo preditivo com baixos níveis de assertividade; caso você tenha boas features com um bom nível de explicabilidade, uma análise descritiva já traz muitas informações sobre o seu problema.

Proposição do Problema

No dia a dia, um problema de predição de saídas envolve diversas fontes de dados, além de metodologias de pesquisa elaboradas para a elicitação de novas informações. Aqui, pra fins didáticos, iremos utilizar uma base de dados disponibilizada no Kaggle [1] para realizarmos nossas análises.

Apenas uma observação semântica: embora seja comum esse tipo de problema ser chamado de “Predição de Turnover”, aqui iremos utilizar o termo “Predição de Saídas”, uma vez que o Turnover não é apenas relacionado a saídas, e sim rotatividade (entradas também entram na conta) como um todo.

Assim, para essa primeira etapa (análise básica), iremos seguir os seguintes passos:

  • Instalação e importação das bibliotecas: todas as tecnologias necessárias para realizar essa e todas as outras etapas da análise completa
  • Conexão com a base de dados: trazendo o dataset para dentro do nosso notebook
  • Observação dos dados: qual o tamanho da nossa base, quais features temos disponíveis, quais seus tipos, e também possíveis pontos de limpeza, como valores nulos e outliers
  • Limpeza e tratamento dos dados: removendo features sem valor semântico, tratando valores nulos e outliers, tratamento de colunas categóricas e padronização completa
  • Análise exploratória dos dados: observando as distribuições, entendendo os dados e identificando possíveis acionáveis em relação ao problema

Já conseguimos perceber que “apenas” na camada descritiva é possível ter muitas informações valiosas sobre o nosso problema.

Em termos de ferramental, iremos utilizar o Google Colab [2] para desenvolver nossos códigos. A escolha de uma linguagem de programação para resolver esse tipo de problema se dá justamente pelo fato de almejarmos a predição, o que fica praticamente inviável (pelo menos para os algoritmos que iremos usar) sem uma estrutura mais robusta (usando apenas Excel, por exemplo).

Instalação e Importação das Bibliotecas

Aqui, no caso do Colab, precisaremos instalar apenas uma biblioteca. Na parte das importações, iremos dividir em em 4 grandes blocos: bibliotecas básicas, de visualização, de predição e adicionais.

Conexão com a Base de Dados

Os dados estão disponibilizados para download via Kaggle. Entretanto, iremos utilizar uma conexão direta com o GitHub, também em formato csv, para ser possível rodar o notebook em qualquer máquina.

A seguir, temos uma representação da tabela que iremos utilizar para nossas análises na Figura 4.

Figura 4 — Tabela inicial. Fonte: o autor.

Observação dos Dados

Os primeiros métodos utilizados nessa etapa serão o head(), describe() e info(). Além disso, utilizaremos as propriedades shape e columns. Abaixo, o snippet completo.

O método head() traz um resumo do dataset (no caso, apresentando as primeiras 3 linhas), a fim de nos familiarizarmos um pouco mais com a base (conforme ilustrado na Figura 4). Para a propriedade shape, temos como resultado o número de linhas e colunas do dataset, respectivamente.

>>> dataset_inicial.shape
(1470, 35)

Já com a propriedade columns, teremos acesso a todas as colunas (ou features) da nossa tabela.

>>> dataset_inicial.columns
Index(['Age', 'Attrition', 'BusinessTravel', 'DailyRate', 'Department', 'DistanceFromHome', 'Education', 'EducationField', 'EmployeeCount', 'EmployeeNumber', 'EnvironmentSatisfaction', 'Gender', 'HourlyRate', 'JobInvolvement', 'JobLevel', 'JobRole', 'JobSatisfaction', 'MaritalStatus', 'MonthlyIncome', 'MonthlyRate', 'NumCompaniesWorked', 'Over18', 'OverTime', 'PercentSalaryHike', 'PerformanceRating', 'RelationshipSatisfaction', 'StandardHours', 'StockOptionLevel', 'TotalWorkingYears', 'TrainingTimesLastYear', 'WorkLifeBalance', 'YearsAtCompany', 'YearsInCurrentRole', 'YearsSinceLastPromotion', 'YearsWithCurrManager'], dtype='object')

Para os métodos describe() e info(), teremos algumas estatísticas descritivas e informações sobre o dataset, respectivamente. As Figuras 5 e 6 trazem, em ordem, o resultado obtido com esses dois métodos.

Figura 5 — Resultado parcial do método describe(). Fonte: o autor.
Figura 6 — Resultado do método info(). Fonte: o autor.

O método describe() já nos adianta informações bastante relevantes sobre as colunas numéricas, como contagem total (acusando valores faltantes), valores mínimos e máximos (acusando discrepâncias como idades negativas ou acima de 200), além de nos dar uma ideia da distribuição dessas variáveis.

Para finalizar a sessão de observação do dataset, iremos nos concentrar em valores faltantes e outliers. Aquilo vale ressaltar que, por outlier, estamos nos referindo a exemplos que estão fora da faixa normal [3]. O snippet completo dessa parte está representado a seguir.

E aqui, hora de uma pausa estratégica nos códigos para falar um pouquinho de teoria. Sobre valores nulos, não temos muita margem para discussão; entretanto, a identificação de outliers merece um pouco mais de atenção. Serão utilizadas 3 ferramentas diferentes:

  • Z-Score modificado: é uma pontuação padronizada que mede a força do outlier ou o quanto uma pontuação específica difere da pontuação típica, podendo ser mais robusto do que o z-score padrão porque se baseia na mediana para seu cálculo. Assim, valores que estão 3 desvios-padrão acima da mediana serão identificados como outliers [4]
  • Variação interquartil: para encontrar o valor base para os outliers de baixo, você pega o valor do primeiro quartil (Q1) e diminui pelo valor do IQR multiplicado por 1,5; Já para os outliers de cima, você deve somar o terceiro quartil (Q3) com o produto da mesma multiplicação anterior [5]
  • Winsorização modificado: esse método consiste em identificar valores acima ou abaixo de determinado percentil estabelecido, sendo similar à técnica do IQR. Entretanto, a winsorização é acompanhada da substituição desses valores, a aqui iremos apenas identificá-los [6]

Os resultados obtidos com a busca por valores nulos e busca por outliers estão representados, respectivamente, nas Figuras 7 e 8. Vale ressaltar que, apesar das 3 técnicas utilizadas para detecção de outliers, foi escolhida a winsorização por conta dos resultados apresentados.

Figura 7— Resultado da busca por valores nulos. Fonte: o autor.
Figura 8 — Parte do resultado da busca por valores nulos. Fonte: o autor.

Limpeza e Tratamento dos Dados

Aqui chegamos a uma das etapas (se não for a mais) importantes em um projeto de análise de dados: a limpeza. Mais vale uma tabela com dados 100% confiáveis e tratados do que um modelo preditivo com as técnicas mais avançadas de IA, porém construído com uma base ruim. Lembrem-se sempre: garbage in, garbage out (lixo entra, lixo sai).

A limpeza e tratamento dos dados é particular para cada tipo de problema, juntamente com cada tipo de fonte de dados. Existem diversas possibilidades aqui, desde padronização de tipos de datas (e.g. YYYY-mm-dd para mm/dd/yyyy), as clássicas remoções de outliers e valores faltantes, até tratamentos mais complexos como pessoas com menos de 20 anos ganhando mais de 50 mil reais por mês. O snippet abaixo representa todas as limpezas aplicadas ao dataset inicial do nosso problema em questão.

As colunas “EmployeeCount”, “EmployeeNumber”, “Over18” e “StandardHours” foram removidas por não acrescentarem informações relevantes a nossa análise. Além disso, já fizemos uma análise prévia dos valores nulos e outliers, conforme representado nas Figuras 7 e 8. Assim, iremos optar por não remover esses valores, uma vez que eles têm impacto direto na nossa variável alvo (saber se a pessoa sai ou não) e não aparentam ser erro de digitação/inserção dos dados.

As últimas linhas do snippet acima (24 a 28) trazem de uma forma bastante visual possíveis erros de padronização nas variáveis categóricas (por exemplo, departamentos “Human Resources” e “Human resources”). A Figura 9 abaixo traz uma parte do resultado.

Figura 9 — Parte do resultado de análise das variáveis categóricas. Fonte: o autor.

Infelizmente, no dia a dia nossos dados estarão completamente diferentes dos encontrados aqui, apresentando diversos tipos de sujeiras e tratamentos necessários. Não existe uma fórmula pronta para essa etapa, justamente pela particularidade de cada base de dados e cada tipo de problema. Entretanto, a seguir temos alguns pontos de atenção para essa etapa crucial dos nossos projetos:

  • Tratamentos simples: tratamento de valores nulos e faltantes (para ambos os casos, é possível optar pela remoção da linha completa ou substituição do valor pela média ou mediana do grupo); padronização dos tipos (colunas de data, texto, número)
  • Tratamentos intermediários: padronização de atributos categóricos; identificação e tratamento de outliers; remoção de atributos sem valor semântico para o problema
  • Tratamentos avançados: identificação de discrepâncias como pessoas muito novas com salários muito elevados, pessoas com um salário 4 vezes maior que o desvio padrão dos salários de um mesmo departamento, pessoas com lideranças fora do mesmo departamento, entre outras

Análise Exploratória dos Dados

Agora, iremos observar nosso dataset de forma gráfica, além de possivelmente obter insights e identificar alavancas para lidarmos com o nosso problema de saída dos colaboradores.

Primeiramente, vamos observar o balanceamento das nossas classes negativas (em que “Attrition” = “No”, ou seja, pessoas que não saíram da empresa) e positivas (em que “Attrition” = “Yes”, sendo as pessoas que saíram da empresa). Os snippets para a criação do Gráfico 1 está representado abaixo, juntamente com um snippet auxiliar para a criação de datasets para ativos (classe negativa) e inativos (classe positiva).

O resultado está representado no Gráfico 1 abaixo. Observação: é possível interagir com todos os gráficos que serão gerados aqui.

Gráfico 1 — Balanceamento das classes negativas e positivas. Fonte: o autor.

Já com o primeiro gráfico, conseguimos algumas informações sobre nosso problema, assim como um possível desafio na predição: o desbalanceamento das classes. Como temos muito mais observações de pessoas que ficaram na empresa do que pessoas que saíram, precisaremos de alguns cuidados especiais ao treinar um modelo preditivo.

Além disso, estatísticas descritivas funcionarão melhor para a classe negativa (verde) do que a positiva (laranja), por conta do volume de dados. Vale lembrar que, quando queremos identificar um problema de saídas de colaboradores, sempre precisamos olhar para os ativos também, e não só para os inativos. O motivo pode ser exemplificado desta maneira: só consigo saber se a motivação de quem está saindo está baixa se eu souber a motivação de quem está ficando.

A seguir, iremos observar as variáveis numéricas contínuas e discretas por meio de gráficos de dispersão. Para esse gráfico, assim como os próximos, iremos dividir a visualização entre ativos e inativos, a fim de procurar diferenças entre as duas populações. O snippet dessa etapa estão representados a seguir.

A expectativa em termos de gráficos de dispersão é encontrar distribuições similares à normal, assim como diferenças significativas entre as médias das populações, conforme ilustrado na Figura 10 abaixo.

Figura 10 — Distribuição normal. Fonte: o autor.

Entretanto, assim como na maioria dos casos reais, as nossas distribuições aqui são um pouco diferentes, conforme representadas nos Gráficos 2 a 13 a seguir.

Gráfico 2 — Distribuição da variável Age. Fonte: o autor.
Gráfico 3 — Distribuição da variável DailyRate. Fonte: o autor.
Gráfico 4 — Distribuição da variável DistanceFromHome. Fonte: o autor.
Gráfico 5 — Distribuição da variável HourlyRate. Fonte: o autor.
Gráfico 6 — Distribuição da variável MonthlyIncome. Fonte: o autor.
Gráfico 7 — Distribuição da variável MonthlyRate. Fonte: o autor.
Gráfico 8 — Distribuição da variável PercentSalaryHike. Fonte: o autor.
Gráfico 9 — Distribuição da variável TotalWorkingYears. Fonte: o autor.
Gráfico 10 — Distribuição da variável YearsAtCompany. Fonte: o autor.
Gráfico 11 — Distribuição da variável YearsInCurrentRole. Fonte: o autor.
Gráfico 12 — Distribuição da variável YearsSinceLastPromotion. Fonte: o autor.
Gráfico 13 — Distribuição da variável YearsWithCurrManager. Fonte: o autor.

À primeira vista, a única informação que é possível obter com essas visualizações é de que a população de pessoas inativas é mais jovem que a de pessoas ativas. Apesar de ser um dado demográfico, não traz (pelo menos, inicialmente) acionáveis pro nosso problema.

Seguindo a investigação, agora é hora de gerarmos gráficos de barras para as variáveis numéricas discretas. O snippet abaixo ilustra como essa etapa foi gerada.

Os resultados dessa etapa estão representados nos Gráficos 14 a 21 abaixo.

Gráfico 14 — Barras da variável Age. Fonte: o autor.
Gráfico 15 — Barras da variável DistanceFromHome. Fonte: o autor.
Gráfico 16 — Barras da variável PercentSalaryHike. Fonte: o autor.
Gráfico 17 — Barras da variável TotalWorkingYears. Fonte: o autor.
Gráfico 18 — Barras da variável YearsAtCompany. Fonte: o autor.
Gráfico 19 — Barras da variável YearsSinceLastPromotion. Fonte: o autor.
Gráfico 20 — Barras da variável YearsInCurrentRole. Fonte: o autor.
Gráfico 21 — Barras da variável YearsWithCurrManager. Fonte: o autor.

Com os gráficos de barras gerados acima já é possível obter algumas informações demográficas sobre o nosso problema de saída dos colaboradores.

Entretanto, é importante fazer uma observação: em picos muito elevados de porcentagem de saídas é necessário entender a quantidade de pessoas no recorte, pois um número baixo de amostra (por exemplo, pessoas com mais de 40 anos de empresa) pode resultar em porcentagens altas de saída caso exista mesmo que apenas um ocorrência, não significando que aquela faixa é de fato um problema sistêmico.

Em contrapartida, podemos afirmar que, de fato, as saídas têm uma ocorrência relativamente menor em pessoas mais jovens, e com menos tempo de casa.

Por fim, iremos analisar agora as variáveis categóricas por meio da plotagem de gráficos de barras, conforme o passo anterior. O snippet de código dessa etapa está representado a seguir.

Os resultados dessa etapa estão representados nos Gráficos 22 a 34 abaixo.

Gráfico 22 — Barras da variável WorkLifeBalance. Fonte: o autor.
Gráfico 23 — Barras da variável TrainingTimesLastYear. Fonte: o autor.
Gráfico 24 — Barras da variável StockOptionLevel. Fonte: o autor.
Gráfico 25 — Barras da variável RelationshipSatisfaction. Fonte: o autor.
Gráfico 26 — Barras da variável PerformanceRating. Fonte: o autor.
Gráfico 27 — Barras da variável OverTime. Fonte: o autor.
Gráfico 28 — Barras da variável MaritalStatus. Fonte: o autor.
Gráfico 29 — Barras da variável JobSatisfaction. Fonte: o autor.
Gráfico 30 — Barras da variável JobRole. Fonte: o autor.
Gráfico 31 — Barras da variável JobLevel. Fonte: o autor.
Gráfico 32 — Barras da variável JobInvolvement. Fonte: o autor.
Gráfico 33 — Barras da variável Gender. Fonte: o autor.
Gráfico 34 — Barras da variável EnvironmentSatisfaction. Fonte: o autor.
Gráfico 35 — Barras da variável EducationField. Fonte: o autor.
Gráfico 36 — Barras da variável Education. Fonte: o autor.
Gráfico 37 — Barras da variável Department. Fonte: o autor.
Gráfico 38 — Barras da variável BusinessTravel. Fonte: o autor.

Os gráficos para as variáveis categóricas trazem algumas informações bastante interessantes para o nosso problema. Em especial, levo nossa atenção para temas de satisfação (“EnvironmentSatisfaction”, “JobInvolvement” e “JobSatisfaction”), área de estudo e variáveis que possivelmente têm relação com saúde mental (“BusinessTravel”, “OverTime” e “WorkLifeBalance”).

Já temos, apenas com a análise descritiva, dois excelentes pontos de partida:

  • As features que temos disponíveis no nosso problema não conseguem responder de maneira enfática o que mais causa as saídas na empresa em questão. Assim, um razoável próximo passo seria coletar mais insumos para enriquecer nossa análise descritiva. Uma outra alternativa seria combinar as features disponíveis, a fim de criar novos atributos (que será implementado na análise avançada dessa série de artigos)
  • As primeiras alavancas que somos tentados a movimentar quando o tema é retenção de colaboradores são as financeiras. Aumentar o salário, benefícios, entre outras, parecem ser as variáveis mais óbvias para prolongarmos o compromisso de um colaborador com a empresa. Entretanto, vimos aqui que variáveis relacionadas aos desafios, engajamento e saúde mental são as mais importantes nesse tipo de problema [7].

Conclusão

Nessa primeira parte da nossa série de 4 artigos, vimos que com a análise exploratória é possível obter diversas respostas. Inclusive, a principal delas é sobre a qualidade da nossa base, bem como a necessidade pela busca de novos atributos.

Vimos algumas das possíveis técnicas para essa etapa, mas vale ressaltar que existem inúmeras ferramentas/combinações/métodos possíveis para conhecer e obter insights descritivos de uma base de dados. Um tipo de visual que acompanha bem os gráficos de dispersão é o boxplot, conforme representado na Figura 11 a seguir.

Figura 11 — Exemplo de boxplot. Fonte: o autor.

Além disso, o snippet de código abaixo traz uma maneira de reproduzir todos os gráficos de dispersão entre as variáveis numéricas do dataset completo.

Agora, com uma análise descritiva em mãos e alguns possíveis caminhos, convido vocês a seguirmos para a análise intermediária, onde cobriremos tópicos como correlações, testes de hipóteses e análise de sobrevivência, aumentando mais ainda nosso poder de análise.

O código completo do projeto está disponível aqui.

Caso você já tenha lido este artigo, fique à vontade para conferir as outras partes: análise intermediária, análise avançada e análise expert.

--

--