Todos os estudos de caso

RH e Gestão de Pessoas

Painel de People Analytics: headcount, turnover e clima

Contexto

Empresa de serviços com 2.400 colaboradores em 9 filiais. O RH reportava headcount por e-mail no dia 10 e turnover apenas no fechamento do trimestre — sempre tarde demais para agir. O objetivo é um painel que mostre movimentação diária, turnover por área com causa provável e risco de saída por perfil.

Perguntas que o painel deve responder

  • Quantas pessoas eu tinha em cada mês e como esse número se moveu?
  • Quais áreas têm turnover acima da média e desde quando?
  • Existe relação entre tempo desde a última promoção e pedido de demissão?
  • Quanto custou a rotatividade no último ano, por área?
  • Qual é o perfil de quem sai nos primeiros 90 dias?

Indicadores e metas

IndicadorMetaPor que importa
Headcount AtivoConforme quadro aprovadoBase de todos os outros indicadores; precisa ser uma foto de data, não um total
Turnover Mensal e 12M≤ 1,8% / ≤ 18%Mede a perda de conhecimento e o custo de reposição
Turnover Voluntário x InvoluntárioVoluntário ≤ 60%Saída voluntária de talento é falha de gestão; involuntária é falha de seleção
Tempo Médio de Casa≥ 3,2 anosIndicador de maturidade e retenção real
Tempo Médio de Preenchimento de Vaga≤ 38 diasVaga aberta é entrega que não acontece
Custo de ReposiçãoReduzir 15% a.a.Traduz turnover em dinheiro e patrocina o investimento em retenção
Absenteísmo %≤ 2,2%Sinal precoce de clima, saúde e sobrecarga
eNPS≥ 40A pergunta mais preditiva de saída voluntária

Modelo de dados

O desafio central de RH em Power BI é que o headcount é um saldo em uma data, não uma soma. A solução é uma fato de movimentação (admissões e desligamentos) e uma medida de saldo acumulado — ou, em bases grandes, um snapshot periódico.

TabelaPapelObservação
fMovimentacaoFatoUma linha por evento: admissão, promoção, transferência, desligamento
fSnapshotMensalFatoFoto do quadro no último dia de cada mês (opcional, para bases grandes)
fAbsenteismoFatoDia × Colaborador × Tipo de ausência
fPesquisaClimaFatoResposta por colaborador e por onda de pesquisa
dColaboradorDimensãoMatrícula, cargo, área, gestor, data de admissão, gênero, faixa etária
dCargoDimensãoCargo, nível, faixa salarial
dCalendarioDimensãoDia
dMotivoSaidaDimensãoMotivo, tipo (voluntário / involuntário)

Medidas DAX

Headcount em uma data

DAX
Headcount =VAR DataRef = MAX( dCalendario[Date] )RETURNCALCULATE(    DISTINCTCOUNT( dColaborador[Matricula] ),    FILTER(        ALL( dColaborador ),        dColaborador[DataAdmissao] <= DataRef &&        ( ISBLANK( dColaborador[DataDesligamento] ) || dColaborador[DataDesligamento] > DataRef )    ))

Saldo em uma data, não soma de linhas. Esta é a medida que sustenta todo o painel — e a que mais costuma vir errada em planilhas.

Admissões, desligamentos e headcount médio

DAX
Admissões =CALCULATE(    COUNTROWS( dColaborador ),    USERELATIONSHIP( dColaborador[DataAdmissao], dCalendario[Date] )) Desligamentos =CALCULATE(    COUNTROWS( dColaborador ),    USERELATIONSHIP( dColaborador[DataDesligamento], dCalendario[Date] )) Headcount Médio =VAR Inicial =    CALCULATE( [Headcount], dCalendario[Date] = MIN( dCalendario[Date] ) - 1, REMOVEFILTERS( dCalendario ) )VAR Final = [Headcount]RETURN DIVIDE( Inicial + Final, 2 )

Duas datas na mesma dimensão exigem relacionamentos inativos ativados sob demanda com USERELATIONSHIP.

Turnover

DAX
Turnover Mensal % = DIVIDE( [Desligamentos], [Headcount Médio] ) Turnover M % =VAR Deslig12M =    CALCULATE( [Desligamentos], DATESINPERIOD( dCalendario[Date], MAX( dCalendario[Date] ), -12, MONTH ) )VAR HC12M =    AVERAGEX(        VALUES( dCalendario[AnoMes] ),        CALCULATE( [Headcount], LASTDATE( dCalendario[Date] ) )    )RETURN DIVIDE( Deslig12M, HC12M ) Turnover Voluntário % =DIVIDE(    CALCULATE( [Desligamentos], dMotivoSaida[Tipo] = "Voluntário" ),    [Headcount Médio]) Turnover Precoce (< 90 dias) =CALCULATE(    [Desligamentos],    FILTER(        dColaborador,        DATEDIFF( dColaborador[DataAdmissao], dColaborador[DataDesligamento], DAY ) <= 90    ))

Turnover precoce é o indicador que mais rápido paga o painel: ele aponta falha em seleção, onboarding ou expectativa de vaga.

Custo da rotatividade

DAX
Custo de Reposição =VAR CustoRecrutamento = [Desligamentos] * 2800VAR CustoTreinamento  = [Desligamentos] * 4200VAR PerdaProdutividade =    SUMX(        FILTER( dColaborador, NOT ISBLANK( dColaborador[DataDesligamento] ) ),        RELATED( dCargo[SalarioMedio] ) * 3   -- 3 meses de curva de aprendizado    )RETURN CustoRecrutamento + CustoTreinamento + PerdaProdutividade

Traduzir turnover em reais é o que transforma um indicador de RH em pauta de diretoria. Calibre as constantes com o time de RH da empresa.

Risco de saída (score simples)

DAX
Score de Risco =VAR MesesSemPromocao =    DATEDIFF( MAX( dColaborador[DataUltimaPromocao] ), TODAY(), MONTH )VAR AbsenteismoRel = DIVIDE( [Horas Ausentes], [Horas Previstas] )VAR NotaClima = [eNPS Individual]VAR TempoCasa = DATEDIFF( MAX( dColaborador[DataAdmissao] ), TODAY(), MONTH )RETURN    IF( MesesSemPromocao > 30, 3, IF( MesesSemPromocao > 18, 2, 0 ) ) +    IF( AbsenteismoRel > 0.05, 2, 0 ) +    IF( NotaClima <= 6, 3, IF( NotaClima <= 8, 1, 0 ) ) +    IF( TempoCasa BETWEEN 12 && 24, 2, 0 ) Faixa de Risco =SWITCH( TRUE(),    [Score de Risco] >= 7, "Alto",    [Score de Risco] >= 4, "Médio",    "Baixo")

Não é machine learning: é uma regra de negócio explícita, auditável e discutível com o RH. Em People Analytics, transparência vale mais que sofisticação.

Absenteísmo e clima

DAX
Absenteísmo % = DIVIDE( SUM( fAbsenteismo[HorasAusentes] ), [Horas Previstas] ) eNPS =VAR Promotores  = CALCULATE( COUNTROWS( fPesquisaClima ), fPesquisaClima[Nota] >= 9 )VAR Detratores  = CALCULATE( COUNTROWS( fPesquisaClima ), fPesquisaClima[Nota] <= 6 )VAR Respondentes = COUNTROWS( fPesquisaClima )RETURN DIVIDE( Promotores - Detratores, Respondentes ) * 100 Taxa de Resposta % =DIVIDE( DISTINCTCOUNT( fPesquisaClima[Matricula] ), [Headcount] )

Sempre exiba a taxa de resposta ao lado do eNPS: um eNPS de 60 com 12% de resposta não significa nada.

Diversidade

DAX
Participação por Gênero % =DIVIDE( [Headcount], CALCULATE( [Headcount], REMOVEFILTERS( dColaborador[Genero] ) ) ) Razão Salarial por Gênero =VAR MediaF = CALCULATE( AVERAGE( fRemuneracao[Salario] ), dColaborador[Genero] = "F" )VAR MediaM = CALCULATE( AVERAGE( fRemuneracao[Salario] ), dColaborador[Genero] = "M" )RETURN DIVIDE( MediaF, MediaM )

Compare sempre dentro do mesmo cargo e nível: a razão bruta mistura composição de quadro com diferença salarial real.

Layout do painel

  1. 1Página 1 — Visão Geral: cartões de Headcount, Admissões, Desligamentos, Turnover 12M, Tempo de Casa e Absenteísmo; gráfico de colunas de movimentação mensal (admissões positivas, desligamentos negativos) com linha de headcount sobreposta.
  2. 2Página 1, bloco inferior: matriz por área com turnover, headcount e cor semântica; small multiples de turnover por filial.
  3. 3Página 2 — Turnover: cascata de movimentação do ano (saldo inicial, admissões, desligamentos, saldo final); pizza (4 fatias) voluntário x involuntário; barras por motivo de saída; curva de sobrevivência por tempo de casa.
  4. 4Página 3 — Risco e Clima: matriz de colaboradores por faixa de risco (respeitando a RLS de gestor), eNPS por área com taxa de resposta, correlação entre absenteísmo e nota de clima em dispersão.
  5. 5Página 4 — Recrutamento: funil de vagas (abertas, triagem, entrevista, proposta, admitido), tempo médio por etapa, custo por contratação.
  6. 6RLS obrigatória: cada gestor vê apenas a própria cadeia via PATHCONTAINS; salários visíveis apenas para o perfil RH.

Desafio final

Implemente a medida de Headcount por data e valide contra a folha de pagamento de três meses diferentes. Depois construa a curva de sobrevivência: percentual de colaboradores admitidos em cada ano que permanecem na empresa após 6, 12, 24 e 36 meses.