R Markdown

O propósito desse documento é ensinar a mostrar graficamente a representatividade de blocos de partidos políticos no Senado. Também pretende-se calcular o poder de coalizão utilizando o índice de Shapley-Shubik.

library(GameTheory)
library(ggplot2)
library(tibble)
library(RColorBrewer)
library(waffle)
# Valores e cálculo das porcentagens
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática", 
            "Democracia", "Vanguarda", "Pelo Brasil")

# Total
total_assentos <- sum(assentos)

# Criar vetor nomeado com % no nome
blocos_pct <- paste0(
  blocos,
  " (", sprintf("%.1f", assentos / total_assentos * 100), "%)"
)

# Montar vetor final com nomes já contendo a %:
dados_waffle <- setNames(assentos, blocos_pct)

# Cores opcionais
cores <- c("#4E79A7", "#F28E2B", "#E15759", "#76B7B2", "#59A14F")

# Plot
waffle(dados_waffle, 
       rows = 9,
       size = 0.5,
       colors = cores,
       title = "Distribuição dos Assentos por Bloco",
       xlab = "1 quadrado = 1 assento") +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
    legend.title = element_blank(),
    legend.text = element_text(size = 10),
    legend.position = "right"
  )

# Pesos dos blocos
assentos <- c(26, 17, 15, 12, 11)

# Nomes dos blocos
blocos <- c("Parlamentar democrático", "Resistência democrática",
            "Democracia", "Vanguarda", "Pelo Brasil")

# Quota necessária para vitória (maioria simples)
quota <- 41 

# Cálculo do poder de Shapley-Shubik
senado_simples <- ShapleyShubik(quota, assentos, blocos)

# Extrair a linha "Shapley-Shubik"
shapley_row_simples <- senado_simples$Results["Shapley-Shubik", ]

# Criar data frame com blocos e valores
df_shapley_simples <- tibble::tibble(
  Bloco_original = colnames(senado_simples$Results),
  Shapley = as.numeric(shapley_row_simples)
)

# Criar coluna com quebras de linha
df_shapley_simples$Bloco <- gsub(" ", "\n", df_shapley_simples$Bloco_original)

# Reordenar por valor decrescente
df_shapley_simples$Bloco <- factor(df_shapley_simples$Bloco,
                                   levels = df_shapley_simples$Bloco[order(-df_shapley_simples$Shapley)])

# Gráfico para maioria simples
ggplot(df_shapley_simples, aes(x = Bloco, y = Shapley, fill = Bloco)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = round(Shapley, 3)),
            vjust = -0.3, size = 3) +
  theme_minimal() +
  labs(
    x = NULL,
    y = NULL,
    title = "Poder de coalizão no Senado - Maioria Simples (41 votos)"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(size = 10),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position = "none"
  ) +
  scale_fill_brewer(palette = "Greens")

# Dados
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática", 
            "Democracia", "Vanguarda", "Pelo Brasil")
quota <- 49

# Cálculo do índice Shapley-Shubik
senado2025 <- ShapleyShubik(quota, assentos, blocos)

# Extrair resultados
shapley_row <- senado2025$Results["Shapley-Shubik", ]

# Data frame para o gráfico
df_shapley <- tibble(
  Bloco_original = colnames(senado2025$Results),
  Shapley = as.numeric(shapley_row)
)

# Quebra de linha nos nomes e ordenação
df_shapley$Bloco <- gsub(" ", "\n", df_shapley$Bloco_original)
df_shapley$Bloco <- factor(df_shapley$Bloco, 
                           levels = df_shapley$Bloco[order(-df_shapley$Shapley)])

# Gráfico
ggplot(df_shapley, aes(x = Bloco, y = Shapley, fill = Bloco)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = round(Shapley, 3)), 
            vjust = -0.3, size = 3) +
  theme_minimal() +
  labs(
    x = NULL,
    y = NULL,
    title = "Poder de coalizão no Senado Brasileiro - 49 votos"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(size = 10),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position = "none"
  ) +
  scale_fill_brewer(palette = "Reds")

# Dados
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática", 
            "Democracia", "Vanguarda", "Pelo Brasil")
quota <- 54

# Cálculo do índice Shapley-Shubik
senado2025 <- ShapleyShubik(quota, assentos, blocos)

# Extrair resultados
shapley_row <- senado2025$Results["Shapley-Shubik", ]

# Data frame para o gráfico
df_shapley <- tibble(
  Bloco_original = colnames(senado2025$Results),
  Shapley = as.numeric(shapley_row)
)

# Quebra de linha nos nomes e ordenação
df_shapley$Bloco <- gsub(" ", "\n", df_shapley$Bloco_original)
df_shapley$Bloco <- factor(df_shapley$Bloco, 
                           levels = df_shapley$Bloco[order(-df_shapley$Shapley)])

# Gráfico
ggplot(df_shapley, aes(x = Bloco, y = Shapley, fill = Bloco)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = round(Shapley, 3)), 
            vjust = -0.3, size = 3) +
  theme_minimal() +
  labs(
    x = NULL,
    y = NULL,
    title = "Poder de coalizão no Senado Brasileiro - 54 votos"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(size = 10),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position = "none"
  ) +
  scale_fill_brewer(palette = "Blues")