dados = read_csv(
    here::here("data/participation-per-country.csv"),
    col_types = cols(
        .default = col_double(),
        site = col_character(),
        country = col_character(),
        geo = col_character(),
        four_regions = col_character(),
        eight_regions = col_character(),
        six_regions = col_character(),
        `World bank income group 2017` = col_character()
    )
) %>% 
    filter(usuarios > 200)
glimpse(dados)
## Rows: 121
## Columns: 21
## $ site                           <chr> "StackOverflow", "StackOverflow", "Stac…
## $ country                        <chr> "Argentina", "Australia", "Austria", "B…
## $ PDI                            <dbl> 49, 36, 11, 80, 65, 69, 70, 39, 63, 80,…
## $ IDV                            <dbl> 46, 90, 55, 20, 75, 38, 30, 80, 23, 20,…
## $ MAS                            <dbl> 56, 61, 79, 55, 54, 49, 40, 52, 28, 66,…
## $ UAI                            <dbl> 86, 51, 70, 60, 94, 76, 85, 48, 86, 30,…
## $ usuarios                       <dbl> 2798, 12313, 2518, 2558, 4275, 10717, 1…
## $ responderam_prop               <dbl> 0.5357398, 0.6133355, 0.6310564, 0.3928…
## $ perguntaram_prop               <dbl> 0.5210865, 0.5897832, 0.5933280, 0.4757…
## $ editaram_prop                  <dbl> 0.09256612, 0.14699911, 0.14932486, 0.0…
## $ comentaram_prop                <dbl> 0.25339528, 0.33395598, 0.35027800, 0.1…
## $ GNI                            <dbl> NA, 59570, 48160, 840, 44990, 11630, 68…
## $ Internet                       <dbl> 51.0, 79.5, 79.8, 5.0, 78.0, 45.0, 51.0…
## $ EPI                            <dbl> 59.02, NA, 63.21, NA, 61.21, 49.96, NA,…
## $ geo                            <chr> "arg", "aus", "aut", "bgd", "bel", "bra…
## $ four_regions                   <chr> "americas", "asia", "europe", "asia", "…
## $ eight_regions                  <chr> "america_south", "east_asia_pacific", "…
## $ six_regions                    <chr> "america", "east_asia_pacific", "europe…
## $ Latitude                       <dbl> -34.00000, -25.00000, 47.33333, 24.0000…
## $ Longitude                      <dbl> -64.00000, 135.00000, 13.33333, 90.0000…
## $ `World bank income group 2017` <chr> "Upper middle income", "High income", "…

Estamos interessados na relação entre quanto as pessoas de diferentes países comentam em questões dos outros. A proporção das pessoas do país que comentou nas questões de outros está medido na variável comentaram_prop.

Considerando essa variável, queremos examinar a relação entre ela e o quão hierárquicas são as relações em um país (PDI). Queremos também levar em conta o quanto as pessoas daquele país têm acesso à Internet (Internet) e qual o tamanho da base de dados que detectamos daquele país (usuarios).

Examinando essa relação

Faça uma visualização que usa os princípios de eficácia no projeto de visualizações para facilitar as comparações que você acha que são as mais importantes para entendermos esse contexto.

Resposta

Os gráficos a seguir apresentam a relação entre as pessoas de diferentes países que comentam em questões de outros (comentaram_prop) e o quão hierárquicas são as relações do pais (PDI), assim como a quantidade de usuários na base de dados de cada país e a proporção da população com acesso a Internet. Os gráficos 1 e 2 apresentam uma visão geral dos dados em mapa, utilizando os principios de eficácia, com intensidade de cor representando um dado e o tamanho dos pontos representando outro. Os gráficos 3 e 4 sintetizam algumas das informações apresentadas em mapas, mostrando o top 20 dos países com relação a uma das variáveis em análise.

No gráfico 1 é possível identificar facilmente pontos com mesmo tamanho e intensidade de cores diferentes, o que já mostra de antemão a relação fraca entre as variáveis apresentadas, o que foi confirmado pelo coeficiente de correlação de Spearman (0.61). Os gráficos 2 e 4 apresentam informações relacionadas ao número de usuários e o acesso a Internet, onde podemos notar que não podemos tomar conclusões precipitadas quanto a relação percebida em um país especifico. Observando o sul da América do Sul observamos três países com uma grande relação de pessoas que comentam em assuntos exteriores e com PDI alto, mas com uma base de dados e acesso a internet menores, dissonante da Austrália, por exemplo, que apresenta uma grande relação de pessoas que comentam em assuntos exteriores e com PDI baixo, mas com base de dados e acesso a internet maiores.

Foi utilizada a exponencial para apresentar comentaram_prop no gráfico 1, enfatizando a diferença de tamanho entre os pontos.

world <- ne_countries(scale = "medium", returnclass = "sf")

grouped_data <- dados %>% group_by(country) %>%
    summarise(
        PDI = mean(PDI, na.rm = TRUE),
        comentaram_prop = mean(comentaram_prop, na.rm = TRUE),
        Internet = mean(Internet, na.rm = TRUE),
        usuarios = sum(usuarios, na.rm = TRUE),
        Latitude = mean(Latitude, na.rm = TRUE),
        Longitude = mean(Longitude, na.rm = TRUE),
        six_regions = six_regions[1]
    ) %>%
    arrange(desc(comentaram_prop))

correlation <- cor(grouped_data$PDI, grouped_data$comentaram_prop, method = "spearman")

plot1 <- ggplot(data = world) +
    geom_sf() +
    geom_point(data = grouped_data, aes(x = Longitude, y = Latitude, size = exp(comentaram_prop), fill = PDI), alpha = .8, pch = 21) +
    ggtitle("1. Relação \"comentaram_prop\" e PDI") +
    theme_minimal() +
    scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
    labs(fill = "Hierarquia das relações do pais (PDI)", size = "\"comentaram_prop\" (Log)") +
    coord_sf(
        xlim = range(grouped_data$Longitude, na.rm = TRUE),
        ylim = range(grouped_data$Latitude, na.rm = TRUE)
    ) +
    theme(
        legend.position = "bottom",
        legend.box = "vertical",
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()
    ) +
    annotate("text", x = -Inf, y = -Inf, label = paste("Correlação (Spearman):", round(correlation, 2)), hjust = -0.7, vjust = 0)

plot2 <- ggplot(data = world) +
    geom_sf() +
    geom_point(data = grouped_data, aes(x = Longitude, y = Latitude, size = usuarios, fill = Internet), alpha = .8, pch = 21) +
    ggtitle("2. Acesso a internet e número de usuários") +
    scale_fill_gradient(low = "lightcyan", high = "darkcyan") +
    theme_minimal() +
    labs(fill = "Internet (proporção)", size = "Usuários") +
    coord_sf(
        xlim = range(grouped_data$Longitude, na.rm = TRUE),
        ylim = range(grouped_data$Latitude, na.rm = TRUE)
    ) +
    theme(
        legend.position = "bottom",
        legend.box = "vertical",
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()
    )

plot3 <- grouped_data %>% head(20) %>%
    ggplot(aes(fill = PDI, x = comentaram_prop, y = reorder(country, comentaram_prop))) +
    ggtitle("3. \"comentaram_prop\": TOP 20 Países") +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
    labs(y = "")

plot4 <- grouped_data %>% head(20) %>%
    ggplot(aes(fill = Internet, x = usuarios, y = reorder(country, usuarios))) +
    ggtitle("4. Usuários na base dados: TOP 20 Países") +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightcyan", high = "darkcyan") +
    labs(y = "")

grid.arrange(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2)

Outras formas de ver

Em seguida, faça 5 visualizações que usem as mesmas variáveis e também pontos, mas que sejam menos eficazes que a que você escolheu acima.

Visualização ruim 1

Apresentar um gráfico comentaram_prop x PDI, facilita visualizar a relação entre as variáveis mas dificulta apresentar a informação dos países, o que poluiria bastante o gráfico.

grouped_data %>%
    ggplot(aes(
        x = PDI,
        y = comentaram_prop,
        color = Internet,
        size = log10(usuarios)
    )) +
    geom_point(alpha = .7) +
    geom_text(
        aes(label = country),
        vjust = 0, hjust = 0,
        color = "black", size=3
    ) +
    labs(
        x = "Hierarquia das relações do pais (PDI)",
        y = "Pessoas que comentam questões exteriores (Proporção)",
        color = "Acesso a Internet",
        size = "Base de dados (log10)"
    ) +
    annotate("text", x = -Inf, y = -Inf, label = paste("Correlação (Spearman):", round(correlation, 2)), hjust = -0.1, vjust = -1) +
    ggtitle("comentaram_prop x PDI (Visualização ruim 1)")

Visualização ruim 2

Gráfico de pizza. Além de ser impossível de visualizar uma grande quantidade de categorias, mesmo apresentando o top 8 ainda fica inviável realizar qualquer tipo de comparação.

plot1 <- grouped_data %>% head(8) %>% mutate(prop = 100*comentaram_prop / sum(comentaram_prop)) %>% mutate(ypos = cumsum(prop)- 0.5*prop ) %>%
    ggplot(aes(x="", y=prop, fill=country)) +
    geom_bar(stat="identity", width=1, color="white") +
    coord_polar("y", start=0) +
    theme_void() + 
    scale_fill_brewer(palette="Set1") +
    ggtitle("comentaram_prop")

plot2 <- grouped_data %>% head(8) %>% mutate(prop = 100*PDI / sum(PDI)) %>% mutate(ypos = cumsum(prop)- 0.5*prop ) %>%
    ggplot(aes(x="", y=prop, fill=country)) +
    geom_bar(stat="identity", width=1, color="white") +
    coord_polar("y", start=0) +
    theme_void() + 
    scale_fill_brewer(palette="Set1") +
    ggtitle("PDI")

plot3 <- grouped_data %>% head(8) %>% mutate(prop = 100*usuarios / sum(usuarios)) %>% mutate(ypos = cumsum(prop)- 0.1*prop ) %>%
    ggplot(aes(x="", y=prop, fill=country)) +
    geom_bar(stat="identity", width=1, color="white") +
    coord_polar("y", start=0) +
    theme_void() + 
    scale_fill_brewer(palette="Set1") +
    ggtitle("Usuarios")

plot4 <- grouped_data %>% head(8) %>% mutate(prop = 100*Internet / sum(Internet)) %>% mutate(ypos = cumsum(prop)- 0.1*prop ) %>%
    ggplot(aes(x="", y=prop, fill=country)) +
    geom_bar(stat="identity", width=1) +
    coord_polar("y", start=0) +
    theme_void() + 
    scale_fill_brewer(palette="Set3") +
    ggtitle("Internet")

grid.arrange(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2)

Visualização ruim 3

Um pouco melhor do que o gráfico de pizza para realizar comparações, mas ainda assim não é eficaz, não permitindo identificar informações importantes a primeira vista. É ruim também para apresentar informações de uma grande quantidade de categorias.

plot1 <- grouped_data %>% head(30) %>% ggplot(aes(x = country, y = comentaram_prop, fill=PDI)) +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
    coord_polar(theta = "x") +
    labs(title = "comentaram_prop")
plot2 <- grouped_data %>% head(30) %>% ggplot(aes(x = country, y = log(usuarios), fill=Internet)) +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightcyan", high = "darkcyan") +
    coord_polar(theta = "x") +
    labs(title = "Usuários")

grid.arrange(plot1, plot2, ncol = 2)

Visualização ruim 4

Mesmo gráfico apresentado na visualização ruim 1, mas com limites exagerados no eixo y, ocultando a relação entre as variáveis.

grouped_data %>%
    ggplot(aes(
        x = PDI,
        y = comentaram_prop,
        color = Internet,
        size = log10(usuarios)
    )) +
    geom_point(alpha = .7) +
    labs(
        x = "Hierarquia das relações do pais (PDI)",
        y = "Pessoas que comentam questões exteriores (Proporção)",
        color = "Acesso a Internet",
        size = "Base de dados (log10)"
    ) +
    annotate("text", x = -Inf, y = -Inf, label = paste("Correlação (Spearman):", round(correlation, 2)), hjust = -0.1, vjust = -1) +
    ggtitle("comentaram_prop x PDI (Visualização ruim 4)") +
    coord_cartesian(xlim = c(0, 110), ylim = c(-1, 1))  # Adjust x and y limits

Visualização ruim 5

Semelhante a visualização ruim 1, mas usa tamanhos de passo (do inglês step size) incomuns, a exemplo do número primo 7, dificultando a leitura do gráfico para estimativa de pontos que não estejam alinhados com os passos.

grouped_data %>%
    ggplot(aes(
        x = PDI,
        y = comentaram_prop,
        color = Internet,
        size = log10(usuarios)
    )) +
    geom_point(alpha = .7) +
    labs(
        x = "Hierarquia das relações do pais (PDI)",
        y = "Pessoas que comentam questões exteriores (Proporção)",
        color = "Acesso a Internet",
        size = "Base de dados (log10)"
    ) +
    annotate("text", x = -Inf, y = -Inf, label = paste("Correlação (Spearman):", round(correlation, 2)), hjust = -0.1, vjust = -1) +
    ggtitle("comentaram_prop x PDI (Visualização ruim 5)") +
    scale_y_continuous(breaks = seq(0, 1, by = 0.07))

Bônus

Inclua o continente dos países (six_regions) na visualização.

Resposta

Como a informação de continente só possui 6 valores possíveis, podemos representa-la utilizando formatos diferentes para os pontos:

plot1 <- ggplot(data = world) +
    geom_sf() +
    geom_point(data = grouped_data, aes(x = Longitude, y = Latitude, size = exp(comentaram_prop), fill = PDI, shape=six_regions), alpha = .8) +
    ggtitle("1. Relação \"comentaram_prop\" e PDI") +
    scale_shape_manual(values = c("america" = 21, "east_asia_pacific" = 22, "europe_central_asia" = 23, "middle_east_north_africa" = 24, "sub_saharan_africa" = 25, "NA" = 26)) +
    theme_minimal() +
    scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
    labs(fill = "Hierarquia das relações do pais (PDI)", size = "\"comentaram_prop\" (Exponencial)", shape = "Continente") +
    coord_sf(
        xlim = range(grouped_data$Longitude, na.rm = TRUE),
        ylim = range(grouped_data$Latitude, na.rm = TRUE)
    ) +
    theme(
        legend.position = "bottom",
        legend.box = "vertical",
        legend.key.size = unit(0.5, "cm"),
        legend.text = element_text(size = 8),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()
    ) +
    annotate("text", x = -Inf, y = -Inf, label = paste("Correlação (Spearman):", round(correlation, 2)), hjust = -0.6, vjust = -0.1, size = 3)

plot2 <- ggplot(data = world) +
    geom_sf() +
    geom_point(data = grouped_data, aes(x = Longitude, y = Latitude, size = usuarios, fill = Internet, shape=six_regions), alpha = .8) +
    ggtitle("2. Acesso a internet e número de usuários") +
    scale_fill_gradient(low = "lightcyan", high = "darkcyan") +
    scale_shape_manual(values = c("america" = 21, "east_asia_pacific" = 22, "europe_central_asia" = 23, "middle_east_north_africa" = 24, "sub_saharan_africa" = 25, "NA" = 26)) +
    theme_minimal() +
    labs(fill = "Internet (proporção)", size = "Usuários", shape = "Continente") +
    coord_sf(
        xlim = range(grouped_data$Longitude, na.rm = TRUE),
        ylim = range(grouped_data$Latitude, na.rm = TRUE)
    ) +
    theme(
        legend.position = "bottom",
        legend.box = "vertical",
        legend.key.size = unit(0.5, "cm"),
        legend.text = element_text(size = 8),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank()
    )

plot3 <- grouped_data %>% head(20) %>%
    ggplot(aes(fill = PDI, x = comentaram_prop, y = reorder(country, comentaram_prop))) +
    ggtitle("3. \"comentaram_prop\": TOP 20 Países") +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
    labs(y = "")

plot4 <- grouped_data %>% head(20) %>%
    ggplot(aes(fill = Internet, x = usuarios, y = reorder(country, usuarios))) +
    ggtitle("4. Usuários na base dados: TOP 20 Países") +
    geom_bar(stat = "identity") +
    scale_fill_gradient(low = "lightcyan", high = "darkcyan") +
    labs(y = "")

grid.arrange(plot1, plot2, plot3, plot4, nrow = 2, ncol = 2)