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