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

Tratamentos avançados, correlações, testes estatísticos e análise de sobrevivência

Higor Gomes
11 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 básica, análise avançada e análise expert.

Introdução

No antigo anterior (Predição de Saídas — Parte 1) vimos toda a etapa de importação das bibliotecas, conexão e observação da base de dados, limpeza completa e análise exploratória. Caso você não tenha lido o artigo anterior, recomendo fortemente a leitura antes de seguirmos.

Recapitulando:

  • Estamos analisando uma base de dados fictícia disponibilizada aqui [1] cujo tema central é analisar as alavancas que impulsionam as saídas dos colaboradores
  • Contamos com 34 variáveis preditoras (features) e 1 variável target binária (binária, indicando se a pessoa saiu ou não)
  • A base é significantemente desbalanceada (84% de ativos, 16% de inativos)

A partir daqui, podemos nos aventurar um pouco mais em nossas análises a fim de dar os primeiros passos na análise descritiva avançada e diagnóstica. Iremos cobrir os seguintes tópicos nessa etapa:

  • Tratamentos adicionais: transformação das features textuais em numéricas com label encoder e variáveis dummy, normalização das variáveis
  • Correlação: identificação do grau de relacionamento entre as variáveis por meio da correlação linear de Pearson
  • Testes estatísticos: análise da distribuição das variáveis, normalidade dos dados e testes estatísticos para análise de variância
  • Análise de sobrevivência: observação da probabilidade de ocorrência de um evento ao longo do tempo

Tratamentos Adicionais

Como estamos entrando em uma fase mais analítica do nosso problema, é importante já deixarmos a base de dados num formato 100% adequado para qualquer tipo de análise futura.

A primeira transformação a ser feita será a codificação das features, que consiste essencialmente em transformar variáveis categóricas (texto) em numéricas, uma vez que uma considerável parte dos modelos preditivos que utilizaremos adiante (e também no cotidiano) não lidam bem com dados textuais. Além disso, será importante termos todas as variáveis em formato numérico para a análise de correlação.

Iremos utilizar duas estratégias diferentes para essa etapa:

  • Label Encoding: consiste em converter as classes categóricas em números que as representam [2]. Por exemplo, uma feature que tem valores como “RH”, “Vendas” e “Engenharia” seria convertida para 0, 1 e 2, respectivamente. Essa técnica, apesar de mais ágil e sem acréscimo ao número total de features no dataset, pode induzir determinados tipos de algoritmos ao erro, uma vez que os números podem ser interpretados como uma hierarquia, quando na verdade não deveriam. De acordo com o exemplo ilustrado, algoritmos baseados em distância, por exemplo, dariam um peso maior para Engenharia (2) em relação a RH (0), o que não condiz com a realidade do problema. Um esquema do Label Encoding está representado na Figura 2
  • One-Hot-Encoding: essa estratégia divide uma feature em várias colunas, cada uma representando uma categoria, e essas colunas são preenchidas com valor 0 ou 1 — dependendo da categoria original [2]. Ainda no exemplo anterior, teríamos três novas colunas, sendo elas “Coluna_RH”, “Coluna_Vendas” e “Coluna_Engenharia”, em que cada linha correspondente a observações de RH teria o valor 1 na primeira coluna, enquanto que 0 nas 2 outras, e assim sucessivamente. Assim, apesar de criar novas colunas no dataset e aumentar a necessidade por uma redução de dimensionalidade, essa técnica evita o enviesamento de modelos, sendo uma excelente alternativa na maioria dos casos. Um esquema do One-Hot-Encoding está representado na Figura 3
Figura 2 — Esquema do Label Encoding. Fonte: o autor.
Figura 3 — Esquema do One-Hot-Encoding. Fonte: o autor.

A seguir, os snippets de código dessa etapa.

A segunda etapa de transformação que será aplicada ao dataset é a normalização das features. A normalização consiste em deixar todas as features na mesma escala, evitando que determinada característica tenha mais impacto em possíveis análises e modelos preditivos que se baseiam em distância.

Existem diversas técnicas possíveis para essa etapa, como normalização robusta, normalização por escala decimal, normalização por tangente hiperbólica, entre outras. Aqui, utilizaremos as duas estratégias a seguir:

  • Normalização min-max: consiste em trazer todas as observações de uma feature para um intervalo determinado (no caso, usaremos 0 e 1). Essa é uma técnica vantajosa no sentido de manter a proporcionalidade dos dados e não gerar distorções
  • Normalização z-score: aqui, a abordagem será enquadrar todas as observações em uma distribuição similar à normal padrão (média 0 e desvio padrão 1), podendo distorcer a proporcionalidade dos dados e, assim, sendo indicada para distribuições normais

A seguir, o snippet de código para essa etapa. Observação: a versão com variáveis dummy do dataset irá passar apenas pela normalização max-min, uma vez que boa parte das variáveis já está na escala entre 0 e 1.

Correlação

Um próximo passo interessante para as nossas análises é a correlação, que consiste no grau de relacionamento entre duas variáveis [3]. Aqui, iremos analisar o caso da correlação linear por meio do Coeficiente de Correlação de Pearson, definido de acordo com a Equação 1 a seguir.

Equação 1 — Coeficiente de Correlação de Pearson. Fonte: UFPB.

Esse coeficiente pode variar de -1 (correlação total negativa, variáveis inversamente proporcionais) a 1 (correlação total positiva, variáveis diretamente proporcionais), em que valores próximos a 0 (tanto positivos quanto negativos) indicam uma fraca relação entre as features analisadas. As Figuras 4, 5 e 6 ilustram os casos de coeficiente de correlação igual a 1, -1 e -0,08 (pouca ou nenhuma relação linear), respectivamente.

Figura 4 — Variáveis com coeficiente de relação igual a 1. Fonte: o autor.
Figura 5 — Variáveis com coeficiente de relação igual a -1. Fonte: o autor.
Figura 6 — Variáveis com coeficiente de relação igual a -0,08. Fonte: o autor.

A seguir, o snippet de código para gerar a matriz de correlação geral.

Com isso, temos no Gráfico 1 nossa primeira matriz de correlação. Todos os gráficos apresentados nesse artigo são interativos, então fique à vontade para explorar como preferir.

Gráfico 1 — Matriz de correlação geral. Fonte: o autor.

Além da matriz de correlação geral, pode ser uma boa alternativa gerar matrizes separadas de acordo com populações de interesse. No nosso caso, em que estamos analisando um problema de saídas de colaboradores, teremos também o Gráfico 2, apresentando as matrizes de correlação linear para pessoas ativas e inativas.

A seguir, o snippet de código dessa etapa, seguido dos resultados.

Gráfico 2 — Matrizes de correlação comparativas. Fonte: o autor.

Um ponto importante para descartamos aqui é que tendemos a extrapolar o significado de correlação, muitas vezes o tornando sinônimo de causa. Isso pode nos levar a conclusões errôneas, uma vez que correlação não implica em causalidade. A título de exemplo, a Figura 7 traz a correlação linear entre os gastos do Estados Unidos com ciência, espaço e tecnologia e o total de mortes por enforcamento, estrangulamento e sufocamento, disponíveis (juntamente com outras dezenas de exemplos) no site Spurious Correlations [4].

Figura 7 — Correlação entre variáveis. Fonte: Spurious Correlations.

O coeficiente de correlação linear entre as duas variáveis, de acordo com o site, é de 99,79%. Isso nos afirma que elas são diretamente proporcionais, quase que em perfeição. Entretanto, fica a provocação: é possível afirmar que uma é a causa da outra?

Isso só seria passível de aceitação como verdade se fizemos um experimento alterando apenas uma das variáveis, controlando todas as outras, e observando o comportamento da variável alvo ao longo de certo período de tempo. Assim, em termos práticos para o nosso problema, vamos utilizar o coeficiente de correlação para remover features colineares (com alto nível de relacionamento), a fim de reduzir o total de atributos e evitar duplicidades em nossas análises (e modelos preditivos).

O snippet de código a seguir traz essa etapa de remoção de features com alto coeficiente de correlação.

Utilizamos aqui um limite de 0.8 (80% de relação entre as variáveis), para duas versões do dataset final: a versão utilizando label encoder e a versão utilizando variáveis dummy, apenas a título de comparação. A partir daqui, iremos seguir com o dataset gerado com as variáveis dummy e normalizado com a técnica de min-max, uma vez que vimos nos parágrafos anteriores que essa será a versão mais adequada pro nosso tipo de problema.

Testes Estatísticos

Os testes estatísticos podem ser divididos em dois grandes grupos, conforme fundamentem ou não os seus cálculos na premissa de que a distribuição de frequências dos erros amostrais é normal, as variâncias são homogêneas, os efeitos dos fatores de variação são aditivos e os erros independentes [5].

Assim, teremos dois grandes grupos: o testes paramétricos (para distribuições que atendem todas as premissas anteriores), e os testes não paramétricos, para quando pelo menos alguma dessas premissas não for atendida. Alguns exemplos de testes estatísticos que podemos realizar:

  • Testes para amostras paramétricas: t de Student, ANOVA, Tukey, Duncan e Scheffé
  • Testes para amostras não paramétricas: Mann-Whitney, Fisher, Kruskal-Wallis, Wilcoxon e Friedman

Para as nossas análises, o foco será entender a distribuição das amostras que iremos analisar e, em caso dela ser aproximadamente normal, iremos buscar diferenças nas médias entre duas populações (ativos e inativos), a fim de identificar diferenças estatísticas (por exemplo, de satisfação, salário, entre outras).

O primeiro passo vai ser gerar os histogramas de todas as variáveis contínuas, uma vez que esse tipo de visualização pode nos dar uma boa ideia da distribuição de uma amostra. A Figura 8 ilustra um histograma gerado a partir de dados normalmente distribuídos.

Figura 8 — Histograma de dados normalmente distribuídos. Fonte: o autor.

O snippet de código a seguir traz a forma como essa etapa foi feita.

Os resultados dessa etapa estão representados nos Gráficos 3 a 14 a seguir.

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

Observamos que, dentre todas as variáveis analisadas, apenas “Age” tem um comportamento ligeiramente normal. Isso é bastante esperado nos problemas reais do cotidiano, principalmente com variáveis latentes. Para confirmarmos o que encontramos por meio dos histogramas, podemos lançar mão de uma técnica auxiliar: o Gráfico Q-Q!

O gráfico quantil-quantil ou qq-plot, proposto por Wilk & Gnanadesikan
(1968), é um dispositivo gráfico exploratório utilizado para verificar a validade de um pressuposto de distribuição para um conjunto de dados. Em
geral, a ideia básica é a de calcular o valor teoricamente esperado para cada
ponto de dados com base na distribuição em questão. Se os dados de fato
seguirem a distribuição assumida os pontos deste gráfico formarão aproximadamente uma linha reta [6].

No nosso caso, iremos observar se as distribuições seguem um padrão de distribuição normal. O snippet de código a seguir mostra como essa etapa foi feita.

Os Gráficos 15 a 26, ilustrados a seguir, trazem os resultados obtidos.

Gráfico 15 — QQ-plot da variável Age. Fonte: o autor.
Gráfico 16 — QQ-plot da variável DistanceFromHome. Fonte: o autor.
Gráfico 17 — QQ-plot da variável DailyRate. Fonte: o autor.
Gráfico 18 — QQ-plot da variável HourlyRate. Fonte: o autor.
Gráfico 19 — QQ-plot da variável MonthlyRate. Fonte: o autor.
Gráfico 20 — QQ-plot da variável MonthlyIncome. Fonte: o autor.
Gráfico 21 — QQ-plot da variável PercentSalaryHike. Fonte: o autor.
Gráfico 22 — QQ-plot da variável YearsAtCompany. Fonte: o autor.
Gráfico 23 — QQ-plot da variável TotalWorkingYears. Fonte: o autor.
Gráfico 24 — QQ-plot da variável YearsInCurrentRole. Fonte: o autor.
Gráfico 25 — QQ-plot da variável YearsWithCurrManager. Fonte: o autor.
Gráfico 26 — QQ-plot da variável YearsSinceLastPromotion. Fonte: o autor.

Assim, concluímos de forma enfática que a única variável que apresenta uma distribuição moderadamente normal é “Age”, sendo a única feature que nos permite a aplicação de algum teste paramétrico. A natureza dessa feature não nos traz muitos acionáveis para eventualmente agir sobre o turnover na empresa fictícia, mas podemos aproveitar a oportunidade para analisar se, de fato, há diferença estatística entre as idades de pessoas que saíram e pessoas que ficaram.

Com apenas um comando conseguimos realizar um teste t de Student utilizando a biblioteca Scipy [7]:

>>> stats.ttest_ind(dataset.loc[dataset['Attrition'] == "Yes"]['Age'], dataset.loc[dataset['Attrition'] == "No"]['Age'])

Basicamente, estamos comparando as médias de idades das pessoas que saíram com as pessoas que ficaram, a fim de observar se há uma diferença estatística entre elas. O resultado obtido foi:

Ttest_indResult(statistic=-6.1786638353072165, pvalue=8.356308021103649e-10)

O p-valor (ou p-value) é usado no teste de hipóteses para nos ajudar a apoiar ou rejeitar a hipótese nula, sendo a evidência contra ela. Quanto menor o p-valor, mais forte a evidência de que você deve rejeitar a hipótese nula [8]. No nosso caso, a hipótese nula é de que não há diferença estatística entre as amostras.

Existem alguns limiares possíveis de p-valor para realizarmos nossas análises, sendo o mais famoso dele 5% (0.05). Valores de p-valor abaixo de 0.05 sugerem a rejeição da hipótese nula, ou seja, a conclusão de que existe diferença estatística entre as amostras analisadas. Como o p-valor obtido com a nossa análise foi de 0.00000000836 (arredondando), concluímos que as médias das idades de pessoas ativas e inativas é estatisticamente diferente.

Podemos também realizar uma análise gráfica desses valores por meio dos boxplots. O Gráfico 27 representa essa análise, antecedido do snippet de código utilizado para sua construção.

Gráfico 27 — Boxplots de Age. Fonte: o autor.

Análise de Sobrevivência

A Análise de Sobrevivência é uma técnica estatística que visa analisar dados onde a variável de interesse é o tempo até a ocorrência de um evento. Esse tempo é denominado tempo de falha, podendo ser o tempo até a morte do paciente, bem como até a cura ou reincidência de uma doença [9].

A principal característica de dados de sobrevivência é a presença de censura, que é a observação parcial da resposta; ou seja, geralmente os dados de tempo de vida são incompletos, dada a impossibilidade dos pesquisadores acompanharem todos os indivíduos amostrados durante o período de tempo destinado à pesquisa [9].

No nosso problema, o evento é a saída do colaborador, e a censura é justamente os colaboradores ainda ativos, pois não chegamos ao seu evento de saída ainda. Esse tipo de análise é uma poderosa ferramenta nas etapas exploratórios de um problema, pois costuma trazer insights de features que antes não nos diziam muitas informações de forma visual.

Abaixo, o snippet de código com a função para criar os gráficos de análise de sobrevivência. A estratégia para a nossa análise será baseada em duas etapas: escolher uma feature e um limite, traçando as curvas de sobrevivência para as amostras abaixo e acima desse valor.

A seguir, no Gráfico 28, o resultado gerado para a variável “DistanceFromHome”, escolhendo o limite 2.

Gráfico 28 — Análise de Sobrevivência para a variável DistanceFromHome. Fonte: o autor.

É possível notar que, para a faixa de pessoas com 10 anos de casa, por exemplo, a chance de ser ativa é aproximadamente 15 pontos percentuais maior se elas morarem a menos de 2 unidades de distância da empresa. A título de comparação, os Gráficos 29 e 30 trazem a mesma variável, porém apresentada em forma de distribuições e barras, respectivamente.

Gráfico 29 — Gráfico de distribuição para a variável DistanceFromHome. Fonte: o autor.
Gráfico 30 — Gráfico de barras para a variável DistanceFromHome. Fonte: o autor.

Observa-se que, definitivamente, a análise de sobrevivência é uma excelente alternativa para casos como o representado acima. À primeira vista, a variável “DistanceFromHome” não nos dizia muito sobre a permanência de colaboradores com os gráficos de distribuição e barras, o que mudou completamente com a análise de sobrevivência.

Aqui, observamos uma poderosa sinergia entre análise de dados e áreas de negócios (o people em conjunto com o analytics): a definição de quais variáveis serão analisadas, e principalmente quais serão os limites definidos, é uma tarefa da análise de sobrevivência que é altamente potencializada com informações das pessoas que têm contexto sobre o dia a dia da organização. Por exemplo, se “DistanceFromHome” faz sentido para determinado time (todos podem estar em regime remoto), ou se 2 é realmente o melhor limite.

Conclusão

Chegamos ao final da segunda etapa do nosso problema de predição de saídas. Aqui expandimos bastante as análises realizadas na parte 1 (análise básica), e provamos mais ainda que existe muito trabalho a ser feito no campo descritivo e diagnóstico.

Agora com mais ferramentas para gerarmos análises completas dos nossos dados, convido vocês para seguirmos para a análise avançada, onde criaremos modelos preditivos, identificaremos a importância de cada feature na predição, aplicaremos técnicas para lidar com o desbalanceamento e escolheremos um modelo para prever as saídas.

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 básica, análise avançada e análise expert.

--

--