Visualização de dados com o ggplot2: múltiplas facetas

Utilizando a linguagem R

Wlademir Prates

O que você encontra aqui?

Neste vídeo …

  1. O que é o ggplot2?
  2. Aprenda a gerar gráficos de plotagem múltipla com as funções facet_grid() e facet_wrap().
  3. Exemplo prático de people analytics com ggplot2.

O que é o ggplot2?

  • É um um pacote para criar gráficos, baseado na “Grámatica dos Gráficos”.

  • Usa componentes semânticos, como escalas e camadas para montar e formatar as visualizações.

Dados para o exemplo

O dado deste exemplo está no repositório https://github.com/wrprates/open-data.

library(readr)
data <- readr::read_csv(
  "https://raw.githubusercontent.com/wrprates/open-data/master/ibm_hr_emplyee_attrition.csv"
)

Primeiras linhas do dado:

Veja mais: Vídeo de dataset para RH no canal.

Vamos aos exemplos …

Gráficos com valores absolutos

Gráfico base para contagem de colaboradores por Gênero

Código

library(ggplot2)

grafico_contagem_genero <- ggplot2::ggplot(
  data,
  ggplot2::aes(
    x = Gender,
    y = EmployeeCount,
    fill = Gender
  )
) +
  ggplot2::geom_col() +
  ggplot2::scale_fill_manual(values = c("#4192B5", "#E89978"))

Gráfico base - Contagem por Gênero

Faceta por Departamento

grafico_contagem_genero +
  ggplot2::facet_grid(~ Department)

Faceta por Departamento

Faceta por Departamento e Attrition

grafico_contagem_genero +
  ggplot2::facet_grid(Attrition ~ Department)

Faceta por Departamento e Attrition

Quando a facet_grid() é ruim?

⚠️ Caso de mau uso da facet_grid()

grafico_contagem_genero +
  ggplot2::facet_grid(~ JobRole)

facet_wrap() pode resolver!

grafico_contagem_genero +
  ggplot2::facet_wrap(~ JobRole)

Gráficos com valores relativos, em percentual

Gráfico para percentual de colaboradores por Gênero - utilizando facet_grid()

Tabela auxiliar - % por Gênero

dado_genero_resumido <- data |>
  dplyr::group_by(Department, Gender) |>
  dplyr::summarise(
    count = dplyr::n(),
    .groups = "drop"
  ) |>
  dplyr::group_by(Department) |>
  dplyr::mutate(
    Percent = round(100 * count / sum(count), 2)
  ) |>
  dplyr::ungroup()

Como fica o dado resumido?

% de Gênero por Departamento

grafico_percentual_genero_departamento <- ggplot2::ggplot(
  dado_genero_resumido, 
  ggplot2::aes(
    x = Gender,
    y = Percent,
    fill = Gender
  )
) +
  ggplot2::geom_col() +
  ggplot2::scale_fill_manual(values = c("#4192B5", "#E89978")) +
  ggplot2::facet_grid(~ Department) +
  ggplot2::geom_text(
    ggplot2::aes(label = Percent),
    vjust = -0.5
  )

% de Gênero por Departamento

Case. Quais cargos são mais críticos em termos de turnover?

Mostrar o percentual de turnover voluntário em relação à média geral, para cada cargo.

Tabela auxiliar - % Demissão Voluntária por JobRole

dado_jobrole_resumido <- data |>
  dplyr::group_by(JobRole, Attrition) |>
  dplyr::summarise(count = dplyr::n(), .groups = "drop") |>
  dplyr::group_by(JobRole) |>
  dplyr::mutate(Percent = round(100 * count / sum(count), 2)) |>
  dplyr::ungroup()

Como fica o dado resumido?

% de Demissão por Cargo

sairam <- nrow(data |> dplyr::filter(Attrition == "Yes"))
ficaram <- nrow(data |> dplyr::filter(Attrition == "No"))
turnover <- 100 * sairam / (sairam + ficaram)

grafico_percent_attrition_jobrole <- dado_jobrole_resumido |>
  ggplot2::ggplot(
    ggplot2::aes(
      x = Attrition, 
      y = Percent,
      fill = Attrition
    )
  ) +
  ggplot2::geom_col() +
  ggplot2::scale_fill_manual(values = c("#4192B5", "#E89978")) +
  ggplot2::facet_wrap(~ JobRole) +
  ggplot2::geom_text(
    data = subset(dado_jobrole_resumido, Percent > 10),
    ggplot2::aes(label = Percent),
    color = "#e6e6e6",
    vjust = 1.2,
    size = 3
  ) +
  ggplot2::geom_hline(yintercept = turnover, linetype = "dashed", size = .1)

% de Demissão por Cargo

Visualização de dados com o ggplot2: múltiplas facetas

Obrigado!