Lab 03 - FPCC 2

Os dados nesse repositório tem medições feitas em 2016 dos níveis de participação das pessoas de diferentes países nos sites StackOverflow e SuperUser, ambos da plataforma StackExchange.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(here)
## here() starts at C:/Users/s701257454/Documents/Mestrado/FPCC2/Lab 03/fpcc2-lab-3-matheusarauj
library(viridis)
## Carregando pacotes exigidos: viridisLite
library(treemap)
library(fmsb)

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", "…
grafico_barras_empilhadas_coment <- function(dados) {
    dados_soma <- dados %>%
        group_by(country) %>%
        summarise(Soma_Valor = sum(comentaram_prop)) %>%
        arrange(Soma_Valor) %>%
        pull(country)
    
    # Ordenar os países de acordo com a soma dos valores
    dados$country <- factor(dados$country, levels = dados_soma)
    
    # Gráfico de barras empilhadas
    ggplot(dados, aes(x = country, y = comentaram_prop, fill = site)) +
        geom_bar(stat = "identity") +
        labs(title = "Proporção de comentários por país(%)", 
             x = "País", 
             y = "Proporção de comentários",
             fill = "Fonte de Dados") +
        theme_minimal() +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_barras_empilhadas_pdi <- function(dados) {
    dados_soma <- dados %>%
        group_by(country) %>%
        summarise(Soma_Valor = sum(PDI)) %>%
        arrange(Soma_Valor) %>%
        pull(country)
    
    # Ordenar os países de acordo com a soma dos valores
    dados$country <- factor(dados$country, levels = dados_soma)
    
    # Gráfico de barras empilhadas
    ggplot(dados, aes(x = country, y = PDI, fill = site)) +
        geom_bar(stat = "identity") +
        labs(title = "Gráfico de Barras Empilhadas por País e Fonte de Dados", 
             x = "País", 
             y = "PDI",
             fill = "Fonte de Dados") +
        theme_minimal() +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_barras_empilhadas_internet <- function(dados) {
    
# Substituir NA por 0
  dados <- dados %>% mutate(Internet := ifelse(is.na(Internet), 0, Internet))
  
  ordenacao <- dados %>%
        group_by(country) %>%
        summarise(Soma_Valor = mean(Internet)) %>%
        arrange(Soma_Valor) %>%
        pull(country)
    
    # Ordenar os países de acordo com a soma dos valores
    dados$country <- factor(dados$country, levels = ordenacao)
  
  # Gráfico de barras lado a lado
  ggplot(dados, aes(x = country, y = Internet, fill = site)) +
    geom_bar(stat = "identity", position = position_dodge()) +
    labs(title = "Acesso a internet por país", 
         x = "País", 
            y = "Proporção(%)",
             fill = "Fonte de Dados") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_barras_empilhadas_usuarios <- function(dados) {
    dados <- dados %>% mutate(usuarios = ifelse(is.na(usuarios), 0, usuarios))
    
    ordenacao <- dados %>%
        group_by(country) %>%
        summarise(Soma_Valor = mean(usuarios)) %>%
        arrange(Soma_Valor) %>%
        pull(country)
    
    # Ordenar os países de acordo com a soma dos valores
    dados$country <- factor(dados$country, levels = ordenacao)
    
    # Gráfico de barras empilhadas
    ggplot(dados, aes(x = country, y = usuarios, fill = site)) +
        geom_bar(stat = "identity", position = position_dodge()) +
        labs(title = "Gráfico de Barras Lado a Lado por País e Fonte de Dados", 
             x = "País", 
             y = "Usuários",
             fill = "Fonte de Dados") +
        theme_minimal() +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_correlacao <- function(dados) {
    ggplot(dados, aes(x = PDI, y = comentaram_prop, color = site)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE, color = "black") +
        labs(title = "Correlação entre PDI e Proporção de Comentários",
             x = deparse(substitute(PDI)),
             y = deparse(substitute(Comentários)))
}

grafico_correlacao_internet_usuarios <- function(dados) {
    ggplot(dados, aes(x = Internet, y = usuarios, color = site)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE, color = "black") +
        labs(title = "Correlação entre acesso a internet e tamanho da base de dados",
             x = deparse(substitute(Internet)),
             y = deparse(substitute(Usuários)))
}

grafico_dispersao <- function(dados) {
    ggplot(dados, aes(x = country, y = comentaram_prop, color = site)) +
        geom_point() +
        labs(title = "Gráfico de Dispersão com Cores por Fonte",
             x = deparse(substitute(País)),
             y = deparse(substitute(Comentários))) +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_pizza <- function(dados) {
    ggplot(dados, aes(x = "", y = comentaram_prop, fill = country)) +
        geom_bar(stat = "identity", width = 1) +
        coord_polar("y", start = 0) +
        labs(title = "Gráfico de Pizza",
             fill = deparse(substitute(Países)),
             y = deparse(substitute(Comentários))) +
        theme_void()
}

grafico_linha <- function(dados) {
    ggplot(dados, aes(x = country, y = comentaram_prop, group = 1)) +
        geom_line() +
        labs(title = "Gráfico de Linha",
             x = deparse(substitute(Países)),
             y = deparse(substitute(Comentários))) +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
}

grafico_area <- function(dados) {
    # Calcula a proporção total
    total <- sum(dados$comentaram_prop)
    dados <- transform(dados, proporcao = comentaram_prop / total)
    
    # Cria o treemap
    treemap(dados, index = "country", vSize = "proporcao",
            title = "Gráfico de Treemap por País e Proporção", 
            palette = "RdYlBu", border.col = "white",
            legend.only = TRUE)
}

grafico_calor <- function(dados) {
    dados <- dados[order(dados$comentaram_prop, decreasing = TRUE), ]
    
    # Cria o heatmap
    ggplot(dados, aes(x = "", y = country, fill = comentaram_prop)) +
        geom_tile() +
        scale_fill_gradient(low = "lightblue", high = "darkblue") +
        labs(x = NULL, y = NULL, fill = "Proporção", 
             title = "Mapa de Calor da Proporção por País") +
        theme_minimal() +
        theme(axis.text.x = element_blank(),
              axis.ticks.x = element_blank())
    
    
}

grafico_correlacao_pdi_coment_regiao <- function(dados) {
    ggplot(dados, aes(x = PDI, y = comentaram_prop, color = six_regions, shape = site)) +
        geom_point() +  # Ajuste o tamanho dos pontos conforme necessário
        geom_smooth(aes(group = 1), method = "lm", se = FALSE, color = "black") +
        labs(title = "Correlação entre Proporção de Comentários e PDI",
             x = deparse(substitute(PDI)),
             y = deparse(substitute(Comentários)))
}

grafico_piramide <- function(dados) {
  # Dividir os dados em duas partes baseadas na variável z
  dados1 <- dados %>% filter(site == "StackOverflow")
  dados2 <- dados %>% filter(site == "SuperUser")
  
  # Tornar os valores da segunda parte negativos para o gráfico
  dados2 <- dados2 %>% mutate(usuarios := -usuarios)
  
  # Unir os dados novamente
  dados_comb <- bind_rows(dados1, dados2)
  
  ordenacao <- dados %>%
        group_by(country) %>%
        summarise(Soma_Valor = mean(usuarios)) %>%
        arrange(Soma_Valor) %>%
        pull(country)
    
    # Ordenar os países de acordo com a soma dos valores
    dados_comb$country <- factor(dados_comb$country, levels = ordenacao)
  
  # Gráfico de pirâmide
  ggplot(dados_comb, aes(x = country, y = usuarios, fill = site)) +
    geom_bar(stat = "identity", position = "identity") +
    coord_flip() +
    labs(title = "Número de usuários por país",
         x = "País",
         y = "Usuários",
         fill = "Site") +
    theme_minimal()
}

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).

Proporção de comentários por país

A proporção de comentários por país pode ser observada no seguinte gráfico:

print(grafico_barras_empilhadas_coment(dados))

## Correlação entre proporção de comentários e PDI A correlação entre a proporção de comentários e o quão hierárquicas são as relações em um país pode ser observada no seguinte gráfico:

print(grafico_correlacao(dados))
## `geom_smooth()` using formula = 'y ~ x'

Utilizando o método de spearman, podemos observar que a correção é moderada negativa.

print(paste("Correlacao:", cor(dados$comentaram_prop, dados$PDI, method = "spearman")))
## [1] "Correlacao: -0.60833608327577"

Acesso a internet e número de usuários por país

A proporção de usuários que possuem acesso a internet por país pode ser observado no seguinte gráfico:

print(grafico_barras_empilhadas_internet(dados))

Já a quantidade de usuários por país pode ser observada no seguinte gráfico:

options(repr.plot.width = 10, repr.plot.height = 8)
print(grafico_piramide(dados))

Visualizações menos eficazes

Podemos observar que o gráfico de dispersão nos dá menos informações do que precisamos:

print(grafico_dispersao(dados))

Assim como o gráfico de setores:

print(grafico_pizza(dados))

Assim como o gráfico linear:

print(grafico_linha(dados))

Assim como o gráfico de área:

print(grafico_area(dados))

## $tm
##           country       vSize vColor   stdErr vColorValue level        x0
## 1       Argentina 0.015935272      3 1.015935          NA     1 0.7974937
## 2       Australia 0.021369849      3 1.021370          NA     1 0.0000000
## 3         Austria 0.020742039      3 1.020742          NA     1 0.1348456
## 4      Bangladesh 0.010357543      3 1.010358          NA     1 0.6786115
## 5         Belgium 0.019968913      3 1.019969          NA     1 0.2590742
## 6          Brazil 0.013227290      3 1.013227          NA     1 0.7952680
## 7        Bulgaria 0.016528100      3 1.016528          NA     1 0.3770389
## 8          Canada 0.021127805      3 1.021128          NA     1 0.1348456
## 9           Chile 0.014634173      3 1.014634          NA     1 0.4806610
## 10          China 0.008964885      3 1.008965          NA     1 0.7553556
## 11       Colombia 0.012129793      3 1.012130          NA     1 0.5871206
## 12     Costa Rica 0.006654985      2 1.006655          NA     1 0.8427751
## 13        Croatia 0.017577049      3 1.017577          NA     1 0.3770389
## 14 Czech Republic 0.018329606      3 1.018330          NA     1 0.4853404
## 15        Denmark 0.019658356      3 1.019658          NA     1 0.2590742
## 16        Ecuador 0.005336701      2 1.005337          NA     1 0.8975070
## 17          Egypt 0.011586104      3 1.011586          NA     1 0.5871206
## 18        Estonia 0.010618020      2 1.010618          NA     1 0.8437222
## 19        Finland 0.021331814      3 1.021332          NA     1 0.1348456
## 20         France 0.017707647      3 1.017708          NA     1 0.8984917
## 21        Germany 0.021454783      3 1.021455          NA     1 0.0000000
## 22          Ghana 0.002853082      2 1.002853          NA     1 0.9374763
## 23         Greece 0.016882761      3 1.016883          NA     1 0.3770389
## 24      Guatemala 0.005673726      2 1.005674          NA     1 0.8427751
## 25      Hong Kong 0.018892686      3 1.018893          NA     1 0.3770389
## 26        Hungary 0.020102726      3 1.020103          NA     1 0.1348456
## 27          India 0.013236693      3 1.013237          NA     1 0.6927851
## 28      Indonesia 0.011408355      3 1.011408          NA     1 0.6786115
## 29           Iran 0.014863662      3 1.014864          NA     1 0.9022698
## 30        Ireland 0.019202473      3 1.019202          NA     1 0.2590742
## 31         Israel 0.025079613      3 1.025080          NA     1 0.0000000
## 32          Italy 0.017783295      3 1.017783          NA     1 0.7965497
## 33          Japan 0.013647632      3 1.013648          NA     1 0.5871206
## 34         Latvia 0.010581417      2 1.010581          NA     1 0.6786115
## 35        Lebanon 0.009783803      2 1.009784          NA     1 0.8386407
## 36      Lithuania 0.017139545      3 1.017140          NA     1 0.3770389
## 37       Malaysia 0.013859307      3 1.013859          NA     1 0.4806610
## 38          Malta 0.010084620      2 1.010085          NA     1 0.7553556
## 39         Mexico 0.013092682      3 1.013093          NA     1 0.5871206
## 40        Morocco 0.005484780      2 1.005485          NA     1 0.8427751
## 41    Netherlands 0.019992567      3 1.019993          NA     1 0.2590742
## 42    New Zealand 0.023085541      3 1.023086          NA     1 0.0000000
## 43        Nigeria 0.004068509      2 1.004069          NA     1 0.8975070
## 44         Norway 0.020061561      3 1.020062          NA     1 0.2590742
## 45       Pakistan 0.013215917      3 1.013216          NA     1 0.8976780
## 46           Peru 0.007532232      2 1.007532          NA     1 0.7553556
## 47    Philippines 0.016038829      3 1.016039          NA     1 0.5872395
## 48         Poland 0.019080852      3 1.019081          NA     1 0.2590742
## 49       Portugal 0.015938463      3 1.015938          NA     1 0.6926965
## 50        Romania 0.018081094      3 1.018081          NA     1 0.5904141
## 51         Russia 0.014367916      3 1.014368          NA     1 0.4806610
## 52   Saudi Arabia 0.005126270      2 1.005126          NA     1 0.9497842
## 53         Serbia 0.016209386      3 1.016209          NA     1 0.4806610
## 54      Singapore 0.017878303      3 1.017878          NA     1 0.6940632
## 55       Slovakia 0.010415278      2 1.010415          NA     1 0.6786115
## 56       Slovenia 0.011005531      2 1.011006          NA     1 0.7626505
## 57   South Africa 0.017418237      3 1.017418          NA     1 0.3770389
## 58    South Korea 0.003511267      2 1.003511          NA     1 0.9374763
## 59          Spain 0.014474264      3 1.014474          NA     1 0.4806610
## 60         Sweden 0.020294332      3 1.020294          NA     1 0.1348456
## 61    Switzerland 0.021832864      3 1.021833          NA     1 0.0000000
## 62         Taiwan 0.009754482      3 1.009754          NA     1 0.9194414
## 63       Thailand 0.012990409      3 1.012990          NA     1 0.5871206
## 64         Turkey 0.014361270      3 1.014361          NA     1 0.4806610
## 65 United Kingdom 0.022022983      3 1.022023          NA     1 0.0000000
## 66  United States 0.020629868      3 1.020630          NA     1 0.1348456
## 67        Uruguay 0.008633346      2 1.008633          NA     1 0.7553556
## 68      Venezuela 0.006488059      2 1.006488          NA     1 0.9223860
## 69        Vietnam 0.010596783      3 1.010597          NA     1 0.9219393
##            y0          w          h   color
## 1  0.67346595 0.10477615 0.15208874 #A50026
## 2  0.00000000 0.13484563 0.15847639 #D73027
## 3  0.49124706 0.12422858 0.16696672 #F46D43
## 4  0.00000000 0.07674418 0.13496194 #FDAE61
## 5  0.49117804 0.11796472 0.16927869 #FEE090
## 6  0.54430587 0.10241004 0.12916008 #FFFFBF
## 7  0.00000000 0.10362207 0.15950365 #E0F3F8
## 8  0.65821377 0.12422858 0.17007201 #ABD9E9
## 9  0.53600376 0.10645962 0.13746219 #74ADD1
## 10 0.18491954 0.08741952 0.10255015 #4575B4
## 11 0.12663680 0.09149081 0.13257936 #313695
## 12 0.20387575 0.07961086 0.08359394 #A50026
## 13 0.65592821 0.10362207 0.16962649 #D73027
## 14 0.82555470 0.10507365 0.17444530 #F46D43
## 15 0.32453198 0.11796472 0.16664606 #FDAE61
## 16 0.10179098 0.05227715 0.10208478 #FEE090
## 17 0.00000000 0.09149081 0.12663680 #FFFFBF
## 18 0.40855527 0.07821711 0.13575060 #E0F3F8
## 19 0.82828578 0.12422858 0.17171422 #ABD9E9
## 20 0.82555470 0.10150831 0.17444530 #74ADD1
## 21 0.15847639 0.13484563 0.15910625 #4575B4
## 22 0.00000000 0.06252371 0.04563201 #313695
## 23 0.15950365 0.10362207 0.16292630 #A50026
## 24 0.10021177 0.05473189 0.10366399 #D73027
## 25 0.82555470 0.10830149 0.17444530 #F46D43
## 26 0.00000000 0.12422858 0.16182045 #FDAE61
## 27 0.54430587 0.10248285 0.12916008 #FEE090
## 28 0.40855527 0.08403908 0.13575060 #FFFFBF
## 29 0.67346595 0.09773019 0.15208874 #E0F3F8
## 30 0.16175049 0.11796472 0.16278149 #ABD9E9
## 31 0.81401242 0.13484563 0.18598758 #74ADD1
## 32 0.82555470 0.10194195 0.17444530 #4575B4
## 33 0.54430587 0.10566447 0.12916008 #313695
## 34 0.27067619 0.07674418 0.13787908 #A50026
## 35 0.28746969 0.08080073 0.12108558 #D73027
## 36 0.32242995 0.10362207 0.16540438 #F46D43
## 37 0.00000000 0.10645962 0.13018369 #FDAE61
## 38 0.28746969 0.08328506 0.12108558 #FEE090
## 39 0.40120209 0.09149081 0.14310378 #FFFFBF
## 40 0.00000000 0.05473189 0.10021177 #E0F3F8
## 41 0.66045673 0.11796472 0.16947920 #ABD9E9
## 42 0.64281265 0.13484563 0.17119977 #74ADD1
## 43 0.00000000 0.03996925 0.10179098 #4575B4
## 44 0.82993593 0.11796472 0.17006407 #313695
## 45 0.54430587 0.10232200 0.12916008 #A50026
## 46 0.00000000 0.08741952 0.08616190 #D73027
## 47 0.67346595 0.10545704 0.15208874 #F46D43
## 48 0.00000000 0.11796472 0.16175049 #FDAE61
## 49 0.67346595 0.10479713 0.15208874 #FEE090
## 50 0.82555470 0.10364907 0.17444530 #FFFFBF
## 51 0.26508245 0.10645962 0.13496118 #E0F3F8
## 52 0.10179098 0.05021581 0.10208478 #ABD9E9
## 53 0.67346595 0.10657847 0.15208874 #74ADD1
## 54 0.82555470 0.10248658 0.17444530 #4575B4
## 55 0.13496194 0.07674418 0.13571425 #313695
## 56 0.40855527 0.08107169 0.13575060 #A50026
## 57 0.48783433 0.10362207 0.16809388 #D73027
## 58 0.04563201 0.06252371 0.05615897 #F46D43
## 59 0.40004363 0.10645962 0.13596013 #FDAE61
## 60 0.16182045 0.12422858 0.16336282 #FEE090
## 61 0.31758264 0.13484563 0.16191006 #FFFFBF
## 62 0.28746969 0.08055858 0.12108558 #E0F3F8
## 63 0.25921616 0.09149081 0.14198594 #ABD9E9
## 64 0.13018369 0.10645962 0.13489875 #74ADD1
## 65 0.47949269 0.13484563 0.16331996 #4575B4
## 66 0.32518328 0.12422858 0.16606378 #313695
## 67 0.08616190 0.08741952 0.09875764 #A50026
## 68 0.20387575 0.07761399 0.08359394 #D73027
## 69 0.40855527 0.07806067 0.13575060 #F46D43
## 
## $type
## [1] "index"
## 
## $vSize
## [1] "proporcao"
## 
## $vColor
## [1] NA
## 
## $stdErr
## [1] "proporcao"
## 
## $algorithm
## [1] "pivotSize"
## 
## $vpCoorX
## [1] 0.02812148 0.97187852
## 
## $vpCoorY
## [1] 0.01968504 0.91031496
## 
## $aspRatio
## [1] 1.483512
## 
## $range
## [1] NA
## 
## $mapping
## [1] NA NA NA
## 
## $draw
## [1] TRUE

Assim como o gráfico de calor:

print(grafico_calor(dados))

Adição da informação de continente

Podemos identificar qual continente o país pertence a partir do seguinte gráfico:

print(grafico_correlacao_pdi_coment_regiao(dados))
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: shape.
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?