Najczęstsze przyczyny zgonów w Polsce a projekt kubek

This post was kindly contributed by SmarterPoland » R - go there to comment and to read the full post.

Kontynuując temat ,,projekt kubek”, czyli projekt zbioru różnych charakterystyk związanych z Polską (więcej informacji tutaj), dzisiaj napiszę o tym jak powstawał wykres przedstawiający najczęstsze przyczyny zgonów w Polsce.

Będzie technicznie ale i ciekawie!

Dane

Informacje o częstości przyczyn zgonu można znaleźć w różnych źródłach (WHO, Eurostat, DataMarket, CIA). Niestety źródła te podają bardzo różne liczby. Co więcej, porównując te liczby z wypowiedziami lekarzy w mediach można odnieść wrażenie, że ile wypowiedzi tyle różnych liczb. Jednym słowem, dla laika, bałagan.

Do wizualizacji tego tematu zdecydowałem się na wykorzystanie danych z tej strony. Głównie dlatego, że dane były zebrane w jednym miejscu i nie różniły się bardzo od średniej z pozostałych źródeł (swoją drogą na ww. stronie można zobaczyć prognozę struktury wiekowej w roku 2050 w Polsce. Wygląda gorzej niż tragicznie).

Wykres

W tym przypadku dane to procenty, więc w pierwszym podejściu do ich przedstawienia użyłem wykresów paskowych / słupkowych.
Pierwsze podejście ma kilka ciekawych rozwiązań. Ponieważ o przyczynie śmierci można mówić zarówno w procentach jak i tysiącach zgonów, dlatego na tym wykresie mamy dwie osie. Dodatkowo procenty są dopisane do każdego słupka a informacje o tysiącach dodatkowo zaznaczone pomocniczymi białymi liniami.
Dosyć czytelnie przedstawione są najczęstsze przyczyny śmierci, choć graficznie nie ma szału.

Gdy już znudził mi się powyższy wykres, w pierwszym kroku pozbyłem się czarnych obramówek dla słupków, wyglądały słabo.
Kolejną, dosyć drażniącą rzeczą, było używanie pięciocyfrowych etykiet osi. Zamiast zmuszać czytelnika do liczenia zer zastąpiłem w opisie osi 000 przez literkę k, co moim zdaniem poprawiło czytelność.

Wciąż jednak ten wykres wyglądał słabo. Dwa rożki i nic w środku. Szukając innych pomysłów na zaprezentowanie tych danych, przeglądając moje inne wykresy, wpadłem na chmurę tagów. Stąd zrodził się pomysł by zastosować chmurę tagów również i tutaj.
Coś za coś, nie pokażemy liczby zgonów w tysiącach, ale końcowo wykres będzie równie czytelny a trochę ciekawszy.
Najczęstsze przyczyny wpadną w oko szybko, ponieważ będą przedstawione większą czcionką.

Zastanawiałem się też, czy nie rozwinąć etykiety ,,inne”, ale owocowało to bardzo małymi napisami, które źle wyglądały na wydruku. Pozostała więc jedna zbiorcza etykieta ,,inne”.
Zmieniłem kolejność napisów w chmurze, by bardziej pasowała do sąsiadujących wykresów na kubku, co doprowadziło do poniższej, już ostatecznej wersji.

Dbajmy więc o serce, płuca i mózg, na coś trzeba umrzeć, ale bez powodu lepiej tego momentu nie przybliżać (ok, ZUS i inni ubezpieczyciele, mogą mieć inne spojrzenie na ten temat :-) ).

A kod R użyty do przygotowania powyższego wykresu wygląda tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
# wczytujemy dane ze strony www
library(SmarterPoland)
library(XML)
library(wordcloud)
 
tables <- readHTMLTable('http://www.worldlifeexpectancy.com/country-health-profile/poland')
 
#
# dodajemy polskie nazwy przyczyn zgonu i parsujemy ww. dane
tabn <- rbind(tables[[4]][-1,], tables[[5]][-1,])
l.smierci <- as.numeric(gsub(as.character(tabn[,3]), pattern=",", replacement=""))
proc.smierci <- as.numeric(as.character(tabn[,4]))
 
ktore <- c(1:13)
dat <- data.frame(c(as.character(tabn[ktore,2]),"Inne"), c(l.smierci[ktore],NA), c(proc.smierci[ktore], 100 - sum(proc.smierci[ktore])))
polskien <- c("Choroba niedokrwienna serca", "Udar mózgu", "Rak płuc", "Rak jelita grubego", 
              "Grypa/zapalenie płuc", "Inne choroby płuc", "Choroby wątroby", "Cukrzyca", "Rak żołądka",
              "Samobójstwo","Rak piersi","Wypadek drogowy","Nadciśnienie","Inne")
dat2 <- cbind(dat, polskien)
rownames(dat2) <- dat2[,4]
 
#
# rysujemy chmurę tagów
co <- paste(as.character(dat2[,4]), ", ", round(dat2[,3],1), "%", sep="")
wordcloud(co, (dat2[,3])^0.75, min.freq=0, scale=c(1,.2),rot.per=0)