Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.
Recentemente, criei alguns conjuntos de dados para facilitar a análise da interação entre dados demográficos e afiliações a partidos políticos dos distritos congressionais dos EUA. Meu objetivo era criar este gráfico:
Eu adicionei esses dados ao Choroplethr e enviei a nova versão ao CRAN. Esta postagem mostra como usar esses conjuntos de dados, a análise que fiz e as nuances por trás dos dados.
O primeiro passo é fazer o download da última versão do Choroplethr. Digite o seguinte no console R:
install.packages("choroplethr") library(choroplethr) packageVersion("choroplethr") # [1] ‘3.7.0’
Esta nova versão é 3.7.0, e seu console deve exibir “[1] ‘3.7.0’ ”
Esta análise é limitada aos 435 membros votantes da Câmara dos Representantes que foram eleitos para o 116º Congresso em 2018. Todos os dados demográficos são da American Community Survey (ACS) de 5 anos de 2018.
Contents
? congress116.regions
Cada vez que começo a trabalhar com uma nova geografia, gosto de criar uma estrutura de dados com uma convenção de nomenclatura de
data(congress116.regions) head(congress116.regions, n=10) region state.name state.fips district.number 1 0101 alabama 01 01 2 0102 alabama 01 02 3 0103 alabama 01 03 4 0104 alabama 01 04 5 0105 alabama 01 05 6 0106 alabama 01 06 7 0107 alabama 01 07 8 0200 alaska 02 00 9 0401 arizona 04 01 10 0402 arizona 04 02
Aqui região é um número de 4 caracteres (ou seja, sempre há um 0 à esquerda). Também temos o nome do estado do distrito, seu código FIPS e número do distrito.
Como regra geral, a numeração dos Distritos começa em “01”. A exceção é quando um estado tem apenas um membro votante (como o Alasca, mostrado acima). Então o número do distrito é “00”.
? df_congress116_demographics
Eu também adicionei um data.frame que contém um punhado de estatísticas demográficas sobre cada distrito congressional. A convenção de nomenclatura para essas estruturas de dados em Choroplethr é df_
data(df_congress116_demographics) head(df_congress116_demographics) region total_population percent_white percent_black percent_asian percent_hispanic per_capita_income median_rent median_age 1 0101 706503 65 27 1 3 26318 637 39.6 2 0102 680575 62 31 1 4 25511 566 38.5 3 0103 706705 68 25 2 3 25172 524 38.4 4 0104 683391 84 7 1 6 23865 430 40.8 5 0105 714145 73 17 2 5 30809 565 39.7 6 0106 703715 76 15 2 5 34527 766 39.0
Observação: esses dados vêm de uma nova função que escrevi chamada ? get_congressional_district_demographics. Se você deseja obter os mesmos dados de outros anos ou pesquisas, use essa função.
? df_congress116_party
O objetivo desta análise não foi apenas olhar para as estatísticas demográficas, mas para ver a interação entre dados demográficos e filiação partidária. Eu peguei dados de partidos políticos sobre os membros do 116º Congresso da Wikipedia e os armazenei no data.frame ? df_congress116_party:
data(df_congress116_party) head(df_congress116_party) region party state.name district.number member 1 0101 Republican alabama 01 Bradley Byrne 2 0102 Republican alabama 02 Martha Roby 3 0103 Republican alabama 03 Mike Rogers 4 0104 Republican alabama 04 Robert Aderholt 5 0105 Republican alabama 05 Mo Brooks 6 0106 Republican alabama 06 Gary Palmer
ggplot2 requer que todos os seus dados estejam em um único data.frame. Então, começamos fundindo ? df_congress_116_demographics com ? df_congress116_party:
df = merge(df_congress116_demographics, df_congress116_party)
O código para criar o gráfico no início deste post é bastante complicado. Eu encapsulei na nova função ? visualize_df_by_race_ethnicity_party:
library(ggplot2) visualize_df_by_race_ethnicity_party(df) + ggtitle("Race and Ethnicity of US Congressional Districts by Partyn116th Congress, 2018 5-year ACS")
Ainda precisamos definir o título manualmente, pois a função não tem como saber a geografia ou o ano dos dados.
Explicação
Quando mostro o gráfico acima para meus amigos que estudaram visualização de dados, eles dizem “Uau, isso é muito dramático!” No entanto, meus amigos que não estudaram Visualização de Dados ficam confusos com isso. Eu gostaria que esta análise fosse entendida por todos, então vou dedicar um momento para explicar o gráfico.
O gráfico mostra uma série de Box Plots. Um Box Plot ajuda a entender como os números são distribuídos.
- A “caixa” mostra os percentis 25 a 75.
- A linha horizontal no meio da caixa mostra o valor mediano.
- A linha vertical mostra os valores mínimo e máximo.
- Os círculos são outliers estatísticos.
Exemplo
Agora que você sabe o que é um Box Plot, podemos examinar um exemplo específico de como ele nos ajuda a entender esses dados.
Cada distrito congressional tem alguma porcentagem de residentes que são brancos. Esse número deve estar entre 0 (nenhum residente branco) e 100 (todos os residentes são brancos). Este gráfico divide todos os distritos congressionais em dois grupos com base no partido político em que cada distrito votou. Em seguida, ele cria um gráfico de caixa para visualizar a porcentagem de residentes em cada grupo que são Brancos.
ggplot(df, aes(party, percent_white)) + geom_boxplot(aes(fill = party)) + scale_fill_manual(values = c("blue", "red")) + ggtitle("Percent White US Congressional Districts by Partyn116th Congress, 2018 5-year ACS")
O resultado aqui é bastante dramático. Para distritos democráticos, o valor médio foi 52% de brancos. Mas para distritos republicanos, o valor médio foi 76% de brancos. O valor mediano para distritos republicanos foi superior ao 75º percentil para distritos democráticos. Este Box Plot por si só demonstra que no 116º Congresso, os Distritos Democrata e Republicano tinham demografia muito diferente. As outras parcelas simplesmente reforçam esse ponto.
Costumo ouvir de usuários do Choroplethr que amam o projeto e querem ajudá-lo a ter sucesso. Existem três maneiras de ajudar.
Financiamento
A melhor maneira de ajudar o Choroplethr a crescer continua sendo financiando. Eu estimo que levará cerca de um mês para mover todos os mapas de Choroplethr do antigo formato “Quadro de Dados Fortificado” para Características Simples. Se você conhece uma organização que pode financiar esse trabalho, entre em contato comigo.
Revise meu trabalho
Outra maneira de ajudar é revisando meu trabalho. Choroplethr é atualmente um projeto paralelo, o que significa que (a) não tenho nenhuma equipe de QA verificando meu trabalho e (b) não tenho nenhum cliente verificando meu trabalho. O pior cenário é que meu trabalho contém um erro e que o erro afeta a análise de alguém.
Há duas coisas neste lançamento que eu gostaria de revisar:
- O código para obter as afiliações partidárias do Distrito do Congresso (ou seja, gerar ? df_congress116_party), que pode ser encontrado aqui. Como você verá, parece que me deparei com um bug em como o RVest, R e / ou RStudio lidam quando retirado da Wikipedia. Eu detalho o problema no código, bem como minha solução alternativa.
- O código para obter as estatísticas demográficas dos distritos eleitorais, que pode ser encontrado aqui. Parece (sem dúvida) haver um bug no TidyCensus ou nos dados que a API do Censo retorna quando você solicita dados demográficos em distritos congressionais. Eu detalho o problema no código, bem como minha solução alternativa.
Especialistas em redistritamento
? get_congressional_district_demographics atualmente retorna oito estatísticas demográficas para cada distrito. Essas são as mesmas oito variáveis que escolhi, quase ao acaso, cinco anos atrás, quando comecei a trabalhar no Choroplethr.
Gostaria de ouvir os especialistas em redistritamento sobre as tabelas que usam em seu trabalho. Acho que seria valioso que o Choroplethr se tornasse uma ferramenta de código aberto que permitisse que as pessoas explorassem o redistritamento. Mas, para fazer isso, preciso falar com especialistas no assunto. Se você puder ajudar com isso, entre em contato comigo.
A postagem Explorando a Demografia dos Distritos Congressionais dos EUA em R apareceu primeiro em AriLamstein.com.
Relacionados