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
| Indicador | Meta | Por que importa |
|---|---|---|
| Headcount Ativo | Conforme quadro aprovado | Base 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ário | Voluntá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 anos | Indicador de maturidade e retenção real |
| Tempo Médio de Preenchimento de Vaga | ≤ 38 dias | Vaga aberta é entrega que não acontece |
| Custo de Reposição | Reduzir 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 | ≥ 40 | A 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.
| Tabela | Papel | Observação |
|---|---|---|
| fMovimentacao | Fato | Uma linha por evento: admissão, promoção, transferência, desligamento |
| fSnapshotMensal | Fato | Foto do quadro no último dia de cada mês (opcional, para bases grandes) |
| fAbsenteismo | Fato | Dia × Colaborador × Tipo de ausência |
| fPesquisaClima | Fato | Resposta por colaborador e por onda de pesquisa |
| dColaborador | Dimensão | Matrícula, cargo, área, gestor, data de admissão, gênero, faixa etária |
| dCargo | Dimensão | Cargo, nível, faixa salarial |
| dCalendario | Dimensão | Dia |
| dMotivoSaida | Dimensão | Motivo, tipo (voluntário / involuntário) |
Medidas DAX
Headcount em uma data
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
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
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
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 + PerdaProdutividadeTraduzir 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)
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
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
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
- 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.
- 2Página 1, bloco inferior: matriz por área com turnover, headcount e cor semântica; small multiples de turnover por filial.
- 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.
- 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.
- 5Página 4 — Recrutamento: funil de vagas (abertas, triagem, entrevista, proposta, admitido), tempo médio por etapa, custo por contratação.
- 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.