E aí, tudo bem?
Hoje vamos montar um dashboard de Recursos de humanos. Esse em especial, foi desenvolvido pelo Flávio Leopoldo durante um desafio proposto por mim aos alunos da Xperiun.
O Cenário
O Desafio People Analytics proposto para aos alunos na nossa comunidade exclusiva, teve como objetivo realizar as seguintes análises:
Análise de Funcionários
- Contratações, Demissões, Headcount (funcionários ativos), Turnover Demissional, Massa Salarial;
- No cálculo de Turnover Demissional, divida a quantidade de Demissões no período atual pelo Headcount no período anterior;
- Calcular a quantidade e o percentual de má contratações, considerando que uma má contratação é quando um funcionário é demitido com menos de 60 dias de contratação;
- Segmentar o tempo de retenção de funcionários em 3 categorias: “Menor que 60 dias”, “Entre 60 e 365 dias” e “Maior que 365 dias”;
- Avaliar o que influencia a retenção de funcionários por mais tempo;
- Segmentar os afastamentos em Ativo (códigos 3, 4 e 14), Passivo (códigos 1, 2 e 13) e Espontâneo (demais códigos) e calcular o Turnover para essas divisões;
- Realizar essas análises ao longo do tempo, por cargo, faixa etária, sexo, escolaridade.
Análise da Ficha Financeira
- Calcular os valores referentes à Faltas (eventos 3 e 4), Atrasos (evento 2457) e Atestados (eventos 14 e 113). Esses valores somados dão origem ao KPI de Absenteísmo;
- Calcular o percentual de Absenteísmo, dividindo a soma dos valores acima pelos valores gastos com Horas Normais (eventos 1 e 100);
- Calcular o valor gasto com Horas Extras (eventos 257, 261, 264, 266 e 400) e o seu percentual em relação às Horas Normais;
- Realizar essas análises ao longo do tempo, por cargo, faixa etária, sexo, escolaridade.
Dashboard do Flávio
Com base nisso, o Flávio (vencedor do desafio), criou um dashboard segmentando as análises da seguinte forma:
- Análise de Funcionários: onde temos as contratações, desligamentos, funcionários ativos, headcount e más contratações. O grande barato dessa página são os filtros dos gráficos, quando eu clico por exemplo em Contratações ele muda as análises dos gráficos para contratações, ou seja, um filtro de medida dinâmico para trocar a análise, que será feito utilizando o Tabular Editor.
- Análise de Absenteísmo: ao longo do tempo, por faixa etária, por gênero.
- Comparativo de Horas Extras
Clique aqui para adquirir essa solução completa.
Base de Dados
A base de dados de disponibilizada continha os seguintes arquivos:
- Tabela de funcionários: que foi extraída do sistema contendo código do funcionário (matrícula), nome, sexo, data de admissão, cargo atual, a data da última mudança do cargo, escala, centro de custo, estado civil, escolaridade, data de nascimento, nacionalidade, raça, valor do salário, data do último salário, situação atual (demitido, férias, trabalhando etc.), data da demissão, causa da demissão.
- Ficha financeira: contendo informações referente aos pagamentos, ou seja, folha salarial e tudo mais. Foram extraídos do sistema os movimentos de janeiro a junho do ano de 2020, com a estrutura das colunas idênticas mudando apenas o ano e o mês. Neste arquivo temos as seguintes colunas: matrícula (código do funcionário), cargo, mês de pagamento, evento, descrição, tipo e valor pago.
Você sabe o que são os eventos de uma folha salarial?
Evento é o que escreve se é salário normal, férias, ausência, imposto etc.
Importando e Tratando os Dados
Com o Power BI desktop aberto:
- Vá em obter dados
- Pasta
- Conectar, em seguida selecione a pasta onde está salva a base de dados
Clique em transformar dados.
Crie uma referência para o arquivo funcionários, e outra para a ficha financeira:
- Clique com o botão direito em BaseDados
- Referência
- Nomeie a nova consulta como Funcionários
- Repita os passos 1 e 2, e nomeie a nova consulta como Ficha Financeira
Em seguida, clique com o botão direito em cima de BaseDados e desmarque a opção Habilitar carga.
Desabilite a carga também das outras duas consultas, Ficha Financeira e Funcionários.
Expandindo a tabela de Funcionários
Com a tabela Funcionários selecionada, clique em Binary, em seguida clique em Table na linha da planilha 1. Pronto, a tabela de funcionários já está expandida.
Clique em usar a primeira linha como cabeçalho.
Crie 02 referências a partir da tabela Funcionários, nomeie a primeira como dFuncionarios e a segunda como fContratos. Deve ficar assim:
Tratando a tabela de dFuncionarios
Na tabela dFuncionarios:
- Vá em escolher colunas
- Selecione as colunas: Cód Funcionario, Data Nascimento, Escolaridade, Estado Civil, Funcionario, Nacionalidade, Raça e Sexo
- Clique em OK.
Clique com o botão direito em cima do código do funcionário e remova duplicatas.
Na coluna de Data Nascimento, coloque o tipo de data. Viu que tem vários erros? Esse cenário é muito comum nas empresas não é mesmo, os dados nunca vêm perfeitos.
Nesse caso, esses erros serão tratados como branco, mas o melhor cenário seria a correção do dado na fonte. Clique com o botão direito em cima da coluna Data Nascimento, e escolha a opção substituir erros.
Analise as datas… Veja que há valores bem estranhos!
Nesse caso pode-se deduzir que o valor de 21/04/2982 por exemplo, é 21/04/1982. Porém deduzir não é melhor cenário, pois o dado pode ficar errado.
Então, crie uma condicional onde a data de nascimento não poderá ser menor que 1/1/1920 e nem maior que 1/1/2006.
- Vá em adicionar coluna
- Coluna personalizada
- Faça o seguinte cálculo:
= if [Data Nascimento] is null or [Data Nascimento] < #date(1920,1,1) or [Data Nascimento] > #date(2006,1,1) then null else [Data Nascimento]
Dica: Estamos trabalhando com linguagem M neste cálculo, a linguagem M é case sensitive portanto, letras maiúsculas e minúsculas importam, e muito.
- Clique em OK
- Clicando com o direito em cima de Data Nascimento, escolha a opção remover
- Renomeie a coluna personalizada que você acabou de criar como Data Nascimento e coloque o tipo como Data.
Note que os valores estranhos sumiram.
Trate a coluna de Sexo, trocando M por Masculino e F por Feminino.
Clique com o botão direito em cima do M e escolha a opção substituir valores, e escreva Masculino. Depois repita o processo para o sexo F.
Crie um range por faixa etária, para isso primeiro é necessário criar uma coluna com a idade de cada funcionário:
- Clique na coluna Data Nascimento
- Adicionar coluna
- Data
- Idade
Isso irá trazer a idade em dias, e para transformar em anos, com a coluna Idade que acabou de criar selecionada:
- Clique na guia Transformar
- Duração
- Total de anos
Com a informação da idade em anos, já é possível criar o range utilizando uma coluna condicional. Na guia adicionar coluna, selecione coluna condicional, e preencha os campos conforme abaixo:
Se
Idade for igual a null então N/A
Idade for menor que ou igual 24 então 15 a 24
Idade for menor que ou igual 34 então 25 a 34
Idade for menor que ou igual 44 então 35 a 44
Idade for menor que ou igual 54 então 45 a 54
Senão 55+
Veja que o valor 55 + não ficou como esperado, então altere na barra de fórmulas, e aproveitar para colocar o tipo como texto.
Range de idade criado, agora você pode remover a coluna de idade, pois não precisamos mais dela.
Tratando a tabela de fContratos
O tratamento aqui será um pouco mais chatinho, pois será necessário sumarizar a coluna de cargos onde há vários tipos de ajudante, vários tipos de analista etc.
Primeiro selecione apenas as colunas que iremos utilizar. Com a tabela fContratos selecionada, vá em escolher colunas e marque a opções:
– Cargo
– Cód Causa Afastamento
– Cód Funcionário
– Cód Situação
– Cód T. Contrato
– Data Admissão
– Data Afastamento
– Data Cargo
– Data Salário
– Escala
– Situação
– Tipo Contrato
– Valor Salário
Com a coluna cargo selecionada:
- Clique em adicionar colunas
- Extrair
- Texto antes do delimitador, e o delimitador é espaço.
Na barra de fórmulas, troque “Texto Antes do Delimitador” por “Cargo Resumido“.
Na coluna Data Afastamento, coloque tipo Data e depois substitua os erros (datas com 00/00/0000) por null.
Agora crie a segmentação dos afastamentos:
3,4,14 – Ativo
1,2,13 – Passivo
Demais Códigos – Espontâneo
Você sabe o que quer dizer cada um desses afastamentos?
- Ativo é quando o funcionário pede demissão
- Passivo é quando o funcionário é demitido
- Espontâneo é o afastamento por morte, entre outros
A segmentação poderia ser feita no DAX, mas criar através de coluna condicional no Power Query possibilita o uso nos filtros e deixando o relatório mais dinâmico.
Na guia adicionar colunas, clique em coluna condicional, e faça a seguinte configuração:
Coloque essa coluna com o tipo Texto.
Ufa, a primeira parte de transformações já foi, próxima etapa é tratar as fichas financeiras.
Tabela Ficha Financeira
- Selecione a tabela Ficha Financeira no Power Query
- Use o filtro para manter apenas os arquivos relativos à ficha financeira
- Clique na área destacada na coluna Content para combinar os arquivos
Lembrando que para usar esse recurso de combinar é necessário que todos os arquivos tenham a mesma estrutura, OK?
Sabe o que é o mais legal desse recurso? É que você pode colocar as fichas financeiras em uma pasta somente delas e quando entrar o mês 7, por exemplo, basta adicionar nessa pasta sem precisar refazer as transformações.
Vamos em frente…
Remova a coluna Nome da Origem dessa tabela.
Na Coluna Descrição, vá no filtro, em filtros de texto, escolha a opção “Não Contém“, Médi.
Nas colunas Evento e Matrícula, clique no filtro e peça para remover vazio.
Agora a partir da ficha financeira, clique com o botão direito e crie 02 novas referências: dEvento e fFinanceiro.
Tratando a fFinanceiro
Remova as colunas de Descrição e Tipo. A tabela deve ficar conforme a figura abaixo:
Tratando a dEvento
Com a tabela dEvento selecionada:
- Mantenha apenas as colunas Evento, Descrição, Tipo
- Na coluna Evento, clique no filtro e peça para remover vazio
- Remova as duplicatas da coluna Evento
- Agora crie uma coluna condicional para segmentar os eventos:
- Clique em Adicionar Coluna
- Coluna Condicional
- Nomeie como Categoria
- Faça as configurações conforme demonstrado na figura 32
- Configure o último argumento da Condicional
- Defina o tipo dessa nova coluna como texto
Tabela dEvento finalizada, pode clicar em fechar e aplicar.
Figura 33 – Tabela dEvento
Modelando os Dados
Antes de iniciar a modelagem, crie a tabela de datas para poder analisar os dados ao longo do tempo.
Nesse caso aqui eu vou utilizar um código que já está pronto.
Em Modelagem → Nova Tabela →Cole o código que está logo abaixo
dCalendario =VAR vAnoMin =
YEAR ( MIN ( fContratos[Data Admissão] ) )
VAR vAnoMax =
YEAR ( MAX ( fContratos[Data Afastamento] ) )
VAR vDataInicial =
DATE ( vAnoMin; 01; 01 )
VAR vDataFinal =
DATE ( vAnoMax; 12; 31 )
RETURN
ADDCOLUMNS (
CALENDAR ( vDataInicial; vDataFinal );
“Ano”; YEAR ( [Date] );
“Mês Num”; MONTH ( [Date] );
“Mês”; FORMAT ( [Date]; “mmmm” );
“Dia”; DAY ( [Date] )
)
Sempre lembre de classificar a coluna de mês utilizando um índice numérico, para que os meses fiquem na ordem certinha.
Para isso, siga os passos abaixo:
- Clique em cima da coluna mês da tabela calendário
- Na barra de ferramentas, clique em Classificar por coluna
- Escolha a opção mês num
Agora sim, os dados estão prontos para a modelagem.
Os relacionamentos devem ficar assim:
Tá perdido?! ? Calma que vou te explicar. Para criar os relacionamentos entre as tabelas basta clicar no campo e arrastar para a tabela correspondente.
Relacionamento com a tabela fContratos
- Arraste o Cód Funcionário (tabela dFuncionario) na direção de Cód Funcionário (tabela fContratos).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
- Arraste a Data (tabela dCalendario) na direção de Data Admissão (tabela fContratos).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
Relacionamento: Inativo
- Arraste a Data (tabela dCalendario) na direção de Data Afastamento (tabela fContratos).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
Relacionamento: Inativo
Relacionamentos com a tabela fFinanceiro
- Arraste o Cód Funcionário (tabela dFuncionario) na direção de Matrícula (tabela fFinanceiro).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
- Arraste a Data (tabela dCalendario) na direção de Mês Pag. (tabela fFinanceiro).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
- Arraste o Evento (tabela dEvento) na direção de Evento (tabela fFinanceiro).
Cardinalidade: 1 para Muitos.
Direção do filtro cruzado: único.
Se você quiser conferir se os relacionamentos ficaram certos.
- Clique em modelagem
- Gerenciar relações
- Editar, caso seja necessária alguma alteração.
Cálculos DAX
Antes de começarmos, crie uma tabelinha de medidas para armazenar e organizar os cálculos.
Você pode fazer isso seguindo os passos abaixo:
- Clique na aba relatório
- Inserir dados
- Dê à tabela o nome de Medidas
- Clique em carregar
Sempre que for criar uma nova medida, clique com o botão direito em cima da tabela de medidas, em seguida escolha a opção Nova Medida.
Cálculos da fFuncionários
A seguir você verá uma breve explicação sobre o cálculo a ser realizado, e em seguida tem a fórmula DAX, é só clicar em nova medida, e copiar e colar a fórmula, Ok ?.
Contratações: cada linha da tabela de contratos é uma contratação. Lembre-se que existe um relacionamento inativo entre a fContratos e a dCalendario, dessa forma quando for analisar esse valor considerando o tempo, vai dar ruim né.
Utilize a função USERELATIONSHIP para ativar esse relacionamento.
Contratações =CALCULATE (
COUNTROWS ( fContratos );
USERELATIONSHIP ( dCalendario[Data]; fContratos[Data Admissão] )
)
Demissões: as demissões são identificadas pelo código da situação igual a 7. E nesse caso aqui também é necessário ativar via DAX o relacionamento
entre dCalendario e fContratos.
CALCULATE (
COUNTROWS ( fContratos );
USERELATIONSHIP ( dCalendario[Data]; fContratos[Data Afastamento] )
)
Headcount: é a quantidade de funcionários ativos no período, ou seja, deve-se levar em conta a data de afastamento e a data de admissão.
Headcount =VAR vDataFinalContexto =
MAX ( dCalendario[Data] )
RETURN
CALCULATE (
COUNTROWS ( fContratos );
FILTER (
fContratos;
fContratos[Data Admissão] <= vDataFinalContexto
&& ( fContratos[Data Afastamento] > vDataFinalContexto
|| fContratos[Cód Situação] <> 7 )
)
)
Massa Salarial: é o salário dos funcionários ativos.
Massa Salarial =//Somente para ativos!!!
VAR vDataFinalContexto =
MAX ( dCalendario[Data] )
RETURN
CALCULATE (
SUM ( fContratos[Valor Salário] );
FILTER (
fContratos;
fContratos[Data Admissão] <= vDataFinalContexto
&& ( fContratos[Data Afastamento] > vDataFinalContexto
|| fContratos[Cód Situação] <> 7 )
)
)
Turnover: é medido pela divisão quantidade de demissões no período atual pelo do headcount do período anterior.
% Turnover =VAR vHCAnterior =
CALCULATE (
[Headcount];
PREVIOUSDAY ( dCalendario[Data] )
)
VAR vHCNonBlank =
COALESCE (
vHCAnterior;
[Headcount]
)
RETURN
DIVIDE (
[Demissões];
vHCNonBlank
)
Mas, e essa tal de COALESCE que eu nunca vi?!
Essa função nesse caso está sendo usada para tratar valores em branco, então, quando o Headcount anterior for branco, o valor retornado
será o Headcount atual.
Má Contratações: funcionários demitidos antes com até 60 dias.
Má contratações =CALCULATE (
[Contratações];
FILTER (
fContratos;
DATEDIFF (
fContratos[Data Admissão];
fContratos[Data Afastamento];
DAY
) < 60
&& fContratos[Data Afastamento]
<> BLANK ()
)
)
Percentual de Má Contratações: é só dividir a quantidade de má contratações pelas contratações.
% Má Contratações =DIVIDE (
[Má Contratações];
[Contratações]
)
Segmentação da Retenção:
1 . Clique na aba dados
2 . Clique na tabela fContratos
3 . Escolha a opção Nova Coluna
4 . Crie a medida destacada, copiando e colando a fórmula abaixo, e dê enter
Retenção (dias) =VAR vDataInicial = fContratos[Data Admissão]
VAR vDataFinal =
COALESCE (
fContratos[Data Afastamento];
TODAY ()
)
VAR vQtdDias =
DATEDIFF (
vDataInicial;
vDataFinal;
DAY
)
VAR vResult =
SWITCH (
TRUE ();
vQtdDias < 60; “Menor que 60”;
vQtdDias < 366; “Entre 60 e 365”;
“Maior que 365”
)
RETURN
vResult
Turnover do ano máximo: para utilizarmos no visual de KPI
% Turnover Ano Max =VAR vAnoMax =
MAX ( dCalendario[Ano] )
RETURN
CALCULATE (
[% Turnover];
dCalendario[Ano] = vAnoMax
)
Cálculos da fFinanceiro
Horas Normais =CALCULATE (
SUM ( fFinanceiro[ Valor] );
dEvento[Categoria] = “Normais”
) + 0
Horas Extras =
CALCULATE (
SUM ( fFinanceiro[ Valor] );
dEvento[Categoria] = “Extras”
)
% Horas Extras =
DIVIDE ( [Horas Extras]; [Horas Normais] )
Absenteísmo =
CALCULATE (
SUM ( fFinanceiro[ Valor] );
KEEPFILTERS ( dEvento[Categoria] IN { “Faltas”; “Atrasos”; “Atestados” } )
)
% Absenteísmo =
DIVIDE (
[Absenteísmo];
[Horas Normais];
BLANK ()
)
Criando os Visuais
Aqui estamos utilizando o background que o Flávio disponibilizou.
Léo, como eu crio esse background? Você pode usar o bom e sempre atual Power Point.
Mas e depois de criar? É só salvar os slides em formato SVG e importar no Power BI.
Como fazer a importação no Power BI:
- Clique em Formato
- Em adicionar imagem, escolha o arquivo
- Ajuste a transparência para 0%
- Em ajuste de imagem, escolha a opção ajuste
Antes de criar os primeiros visuais, veja abaixo uma visão geral sobre configuração de visuais:
- Visuais padrão do Power BI. Se você clicar nos 3 pontinhos ao final da área demarcada, você abre o marketplace da Microsoft de onde você pode importar visuais diferentes.
- Nessa área você colocar os eixos do gráfico (atributos descritivos) que você irá analisar, por exemplo, sexo, idade, escolaridade.
- Nessa área você coloca os valores (medidas).
- O rolinho expande a área de configuração de cores, tamanho de texto etc.
- Área de configuração de cores, tamanhos etc.
Agora que você já sabe como criar background e importar no Power BI, e conhece o painel de visualização, pode ir para os próximos passos:
- Página Home:
Para configurar o botão de navegação, Iniciar:
- Imagem do Botão
- Vá em inserir
- Botões -> em branco
- Arraste o botão em branco para cima da imagem do botão acessar
- Escolha o tipo: Navegação da Página
- Destino do botão: funcionários
Pulo do Gato: para testar se deu certo, Crtl + clique com o mouse!!!
- Página de Funcionários:
A página deverá conter todos os elementos numerados da figura 45, utilize a numeração para se orientar quanto a configuração.
Dê uma olhada na tabela abaixo e veja de acordo com a numeração, qual visual foi utilizado, e suas configurações de eixo e valor. As cores você pode escolher de acordo com suas preferências:
Para configurar a seleção de medidas automática, item 14, é necessário instalar o tabular editor. Você pode baixá-lo aqui: link para dowload.
Depois de instalado, ele fica aqui.
Com o seu arquivo pbix aberto:
- Clique em Tabular Editor → Tables → Create New → Calculation Group → Nomeie como SelecaoMedidas.
- Renomeie o campo Name para Filtro.
Dentro de Calculation Items, colocaremos os itens que serão filtrados.
- Clique em cima de Calculation Items > New Calculation Item
- Crie um calculation item para cada medida que vamos utilizar, contratações, demissões, headcount, massa salarial, % turnover.
Para configurar cada cálculo, siga os passos abaixo:
- Com o item calculado selecionado
- Expanda a tabela de medidas
- Visualize a medida que você precisa, nesse caso contratações, e arraste para o campo indicado pela seta.
- Repita o processo para os Calculation Items (Demissões, Headcount, Massa Salarial, % Turnover)
Ainda no tabular Editor:
Clique na tabela SelecaoMedidas → Create New → Measure → Nomeie como Métrica Selecionada
Agora, crie a medida SELECTEDMEASURE () na área apontada pela seta.
Clique em salvar no Tabular Editor.
A tabela Seleção Medidas criada no tabular deve aparecer no Power BI, e agora você pode pegar o campo filtro dessa tabela e colocar no campo de configuração do segmentador, item 14.
Importante: para que esse visual fique igual ao da foto, clique no rolinho de configurações e coloque a orientação como Horizontal.
Para configurar a ordem dos campos no item 14, no local apontado pela seta na figura 54, ordene conforme abaixo:
0 Contratações
1 Demissões
2 Headcount
3 Massa Salarial
4 % Turnover
Agora para configurar o formato, no local apontado pela seta, faça as seguintes configurações:
“R$ 0.00” Massa Salarial
“0.0%” Turnover
Agora edite as interações do item 14 com os outros visuais para que ele mude os valores apenas dos gráficos abaixo dele.
- Clique no visual de segmentação
- Em formato
- Editar interações
- Marque a opção nenhum
- Marque a opção nenhum também nos cartões, conforme destacado
Menu Expansível
- Clique na guia exibição
- Ative o Painel de Indicadores e o de Seleção
- Crie o indicador: Funcionários
- Clicando na guia inserir, crie uma forma retângulo e cubra toda a área, nesse exemplo o retângulo está na cor azul com transparência 28%, mas
você pode fazer como achar melhor.
- Crie mais uma forma retangular que é onde colocaremos o menu
- Dentro do retângulo branco, insira imagens para representar os botões
- Insira uma caixa de texto do lado de cada ícone, conforme mostrado abaixo
Ícone 01 – Texto: Funcionário
Ícone 02 – Texto: Absenteísmo
Ícone 03 – Texto: Horas Extras
8. Clique em Botões
- Insira o Botão de Voltar
- Configure a ação dos botões:
Exemplo: Absenteísmo. Tipo: Navegação na página. Destino: Absenteísmo.
Demais botões:
Funcionários. Tipo: Navegação na página. Destino: Nenhum.
Horas Extras. Tipo: Navegação na página. Destino: Horas Extras.
Voltar. Tipo: Indicador. Indicador: Funcionários.
11. Selecione os retângulos, botões e textos criados, e no painel de seleção, clique com o botão direito para agrupar, nomeie como Menu Pg1
12. Crie o um novo indicador, e nomeie como Menu Pg1
- No painel de seleção oculte o Menu Pg1
- Clique com botão direito no indicador de funcionários e peça para atualizar
15. Tire o ocultar do Menu Pg 1 → clique com o botão direito em cima do indicador Menu Pg1 e atualize também.
- Insira um botão em branco e coloque em cima do menu, a ação deve ser: tipo (indicador), Indicador (Menu).
Agora é por sua conta, os demais elementos da página funcionários você já pode inserir sozinho.
- Gráfico do tipo sparkline que você pode importar da loja da microsoft
- São filtros do tipo segmentação
Só a prática nos torna bons, por isso como tarefa, vou deixar para você criar as páginas de absenteísmo e horas extras, aproveite e acrescente outras análises que você achar necessário.
Por hoje é só!
Abraços.
Léo