Baza WHO (tzw. Global Health Observatory, https://www.who.int/data/gho ) ma ten oto ficzer, że nie da się z niej pobrać (przy użyciu normalnego interfejsu) danych można je tylko oglądać. Żeby pobrać trzeba wpisać coś podobnego do:
https://apps.who.int/gho/athena/api/GHO/WHS9_86?format=csv
gdzie WHS9_86
to identyfikator zbioru danych, przy czym identyfikatory nie są publikowane jeżeli oglądamy dane przy użyciu normalnego interfejsu, ale jest ich lista do pobrania tutaj:
https://apps.who.int/gho/athena/api/GHO?format=csv&profile=verbose
na przykład:
curl 'https://apps.who.int/gho/athena/api/GHO?format=csv&profile=verbose' > gho.csv
grep -i Obesity gho.csv
"GHO","NCD_BMI_30A","Prevalence of obesity among adults..."
"GHO","NCD_BMI_30C","Prevalence of obesity among adults..."
...
Opis interfejsu jest tutaj https://apps.who.int/gho/data/node.resources.api (ten tutaj zaś https://www.who.int/data/gho/info/athena-api jest niekompletny; zresztą cała baza WHO to parodia.) Wreszcie jest też pakiet R umożliwiający dostęp do bazy GHO https://cran.r-project.org/web/packages/rgho/vignettes/a-intro.html.
Wczytujemy dane (oczyszczone skryptem Perlowym):
## curl https://apps.who.int/gho/athena/api/GHO/NCD_BMI_30A?format=csv
## curl https://apps.who.int/gho/athena/api/GHO/NCD_BMI_30C?format=csv
obesity <- read.csv(file='obesity_who_all_C.csv',sep=';',header=T)
## ecdc_countries_names_codes3166.csv
## w tym pliku brakuje wielu krajów np. królestwa Tonga
countries <- read.csv(file='ecdc_countries_names_codes3166.csv',
sep=';',header=T)
##obesity <- left_join(obesity, countries, by=c('kraj' = 'iso') )
Polska kobiety/mężczyźni (bez ogółem bo po co):
obesityPL <- obesity %>% filter (kraj == 'POL' & plec != 'BTSX')
popl <- ggplot(obesityPL, aes(x= as.factor(rok),
group=as.factor(plec), color=as.factor(plec), y=nadwaga )) +
geom_line(size=.5 ) +
geom_point(size=2.5, alpha=.3) +
xlab(label="") +
scale_x_discrete( breaks = every_nth(n = 10)) +
ylab(label="tys") +
theme_nikw()+
ggtitle("Nadwaga w PL")
popl
Wybrane kraje świata (także bez ogółem):
countries <- c('POL', 'DEU', 'ESP', 'CZE', 'ITA', 'FRA', 'FIN',
'AFG', 'CHN', 'IND', 'NZA', 'FJI', 'TON', 'WSM',
'ETH', 'NGA', 'USA', 'CAN', 'MEX')
o <- obesity %>% filter (plec != 'BTSX' & kraj %in% countries) %>% as.data.frame
po <- ggplot(o, aes(x= as.factor(rok),
group=as.factor(plec), color=as.factor(plec), y=nadwaga )) +
geom_line(size=.5, alpha=.6 ) +
geom_point(size=.5, alpha=.3) +
xlab(label="") +
scale_x_discrete( breaks = every_nth(n = 8)) +
scale_y_continuous(breaks=seq(0,75, by=5)) +
ylab(label="tys") +
theme_nikw()+
##labs(caption=source, color='Rok') +
facet_wrap( ~kraj, scales = "fixed", ncol = 6) +
ggtitle("Nadwaga w wybranych krajach")
po
Wykres punktowy dla najnowszych danych (ostatniego raportowanego roku); absurdalnie długi ale trudno. Tylko ogółem oczywiście (BTSX
):
o_last <- obesity %>% filter (plec == 'BTSX' ) %>%
group_by(kraj) %>% drop_na(nadwaga) %>% arrange(rok) %>%
filter(row_number()==n()) %>% as.data.frame
poworld <- ggplot(o_last, aes(x = reorder(kraj, nadwaga), color=region )) +
geom_point(aes(y = nadwaga), size=1) +
xlab(label="kraj") +
ylab(label="obesity") +
ggtitle("Nadwaga") +
theme(axis.text = element_text(size = 4)) +
theme(plot.title = element_text(hjust = 0.5)) +
coord_flip()
poworld
Bardziej skomplikowany wykres punktowy. Poziom w 2016 vs poziom w 1980; do tego słupki obrazujące różnicę
o_first <- obesity %>% filter (plec == 'BTSX' & as.numeric(as.character(rok)) > 1979 ) %>%
group_by(kraj) %>% drop_na(nadwaga) %>% arrange(rok) %>%
filter(row_number()==1) %>% as.data.frame
## Warning in mask$eval_all_filter(dots, env_filter): pojawiły się wartości NA na
## skutek przekształcenia
oo <- bind_rows(o_last, o_first)
# łączymy o_first z o_last
oo.oo <- left_join(o_last, o_first, by='kraj')
# obliczamy różnicę
oo.oo$diff.xy <- oo.oo$nadwaga.x - oo.oo$nadwaga.y
poworld2 <- oo.oo %>%
ggplot(aes(x = reorder(kraj, nadwaga.x) )) +
geom_point(aes(y = nadwaga.x, color="nadwaga.x"), size=1 ) +
geom_point(aes(y = nadwaga.y, color="nadwaga.y"), size=1 ) +
geom_bar(aes(y = diff.xy, fill='roznica'), stat="identity", alpha=.25 ) +
xlab(label="kraj") +
ylab(label="obesity") +
ggtitle("Nadwaga na świecie") +
##
## Skala musi być manualnie
scale_color_manual(name="", labels =c("2016", "1980"),
values = c(nadwaga.x="red", nadwaga.y="blue" ) ) +
scale_fill_manual(name="", values = c(roznica="green" ) ) +
##
theme(axis.text = element_text(size = 4)) +
theme(plot.title = element_text(hjust = 0.5)) +
coord_flip()
poworld2
Inne podejście (wynik ten sam):
obesity$yr <- as.numeric(as.character(obesity$rok))
## Warning: pojawiły się wartości NA na skutek przekształcenia
obesity_diff <- obesity %>%
filter (plec == 'BTSX' & yr > 1979 ) %>%
group_by(kraj) %>%
summarise(fst= nadwaga[which.min(yr)],
lst = nadwaga[which.max(yr)],
diff = nadwaga[which.max(yr)] - nadwaga[which.min(yr)])
## `summarise()` ungrouping output (override with `.groups` argument)
poworld3 <- obesity_diff %>%
ggplot(aes(x = reorder(kraj, lst ))) +
geom_point(aes(y = lst, color="lst"), size=1 ) +
geom_point(aes(y = fst, color="fst"), size=1 ) +
geom_bar(aes(y = diff, fill='diff'), stat="identity", alpha=.25 ) +
xlab(label="kraj") +
ylab(label="obesity") +
ggtitle("Nadwaga na świecie") +
##
scale_color_manual(name="", labels =c("2016", "1980"),
values = c(lst="red", fst="blue" ) ) +
scale_fill_manual(name="", values = c( diff="green" ) ) +
#
theme(axis.text = element_text(size = 4)) +
theme(plot.title = element_text(hjust = 0.5)) +
coord_flip()
poworld3
albo na oddzielnych wykresach:
poworld3 <- ggplot(oo, aes(x = reorder(kraj, nadwaga) )) +
geom_point(aes(y = nadwaga), size=1) +
xlab(label="kraj") +
ylab(label="obesity") +
ggtitle("Nadwaga na świecie (wersja #3)") +
facet_wrap(~as.factor(rok), scales = "fixed") +
theme(axis.text = element_text(size = 4)) +
theme(plot.title = element_text(hjust = 0.5)) +
coord_flip()
poworld3