Visualisierung der Altersverteilung eines Landes

Wie sich mit R Bevölkerungspyramiden eines beliebigen Landes plotten lassen, ist bereits in diesem Blogbeitrag erklärt. Das Skript funktioniert aber wegen einer Umstellung der Quellenseite mit den Daten nicht mehr und wurde deshalb überarbeitet.
Ein Problem lag in der Umstellung auf HTTPS. Die Funktion readHTMLTable() kommt damit nicht zurecht. Auch Versuche etwa mit RCurl oder getURL() fruchteten nicht. Das Skript ist nun so konzipiert, dass es erst die Tabelle mit den Daten aller Länder der Erde herunterlädt und diese dann einliest, oder die zuvor manuell heruntergeladene Tabelle verwendet. Die Daten stammen von der Webseite https://www.census.gov.
Die Formatierung des Data Frames erfolgt etwas anders als im alten Skript. Der Plot selbst ist nahezu gleich, ergänzt um die Zahl der Gesamtbevölkerung. Das Beispiel plottet die Bevölkerungspyramide von Nigeria, es ist aber mit geringen Anpassungen mit jedem Land möglich.

library(reshape2)
library(ggplot2)
library(readxl)
library(dplyr)

df <- read_excel("daten/census_data.xlsx")
# download.file(url="https://www.petitessen.net/wp-content/uploads/2019/10/census_data.xlsx", 
#               destfile="localcopy.xlsx", mode="wb")
# df <- read_excel("localcopy.xlsx")
df <- df %>%
  filter(Country == "Nigeria") #Land auswählen
summe <- df[1,5]
summe <- prettyNum(summe, big.mark = ".", decimal.mark = ",")
summe <- as.character(summe)
keep <- c(4, 6, 7)
df <- df[,keep]
names(df) <- c("Age", "Male", "Female")
cols <- 2:3
df[,cols] <- apply(df[,cols], 2, function(x) as.numeric(as.character(gsub(",", "", x))))
df <- df[df$Age != 'Total', ]  
df$Male <- -1 * df$Male
df$Age <- factor(df$Age, levels = df$Age, labels = df$Age)
df.melt <- melt(df, 
                value.name='Population', 
                variable.name = 'Gender', 
                id.vars='Age' )
df.melt$Gender <- ifelse(df.melt$Gender == "Male", "Männlich", "Weiblich")
p1 <- ggplot(df.melt, aes(x = Age, y = Population, fill = Gender)) + 
  geom_bar(data = subset(df.melt, Gender == "Weiblich"), stat = "identity") + 
  geom_bar(data = subset(df.melt, Gender == "Männlich"), stat = "identity") + 
  scale_y_continuous(breaks = seq(-18000000, 18000000, 2000000), 
                     labels = paste0(as.character(c(seq(18, 0, -2), seq(1, 18, 2))), "m")) + #eventuell anpassen
  coord_flip() + 
  ggtitle(paste0("Nigeria", " (Bevölkerung = ", summe, ")")) + #Land anpassen
  xlab("Alter") +
  ylab("Bevölkerung") +
  guides(fill=guide_legend(title="Geschlecht")) +
  scale_fill_brewer(palette = "Set1") + 
  theme_bw()
p1

Bevölkerungspyramide

Klicke auf das Bild für eine vergrößerte Darstellung

Das Skript: Das Skript liest zunächst die benötigten Bibliotheken ein und lädt die zuvor heruntergeladene Datentabelle. Um das Skript den Download erledigen zulassen, kommentiere die Zeile 6 aus und entferne das # in Zeile 7 bis 9. Es folgt die Formatierung des Data Frames, bis nur noch die Daten des gewünschten Landes enthalten sind. Der Plot besteht aus zwei Barplots, die mittels coord_flip() um 90 Grad gedreht sind. Um statt Nigeria die Bevölkerungspyramide eines anderen Landes zu plotten, ist der englische (!) Name des Landes in der Zeile filter(Country == "Nigeria") einzutragen. Die Zeile scale_y_continuous(breaks = seq(-18000000, 18000000, 2000000), labels = paste0(as.character(c(seq(18, 0, -2), seq(1, 18, 2))), "m")) muss gegebenenfalls je nach Größe der Bevölkerung angepasst werden. Hier ist etwas Herumspielen mit den Werten angesagt. Für Deutschland etwa wäre die passende Zeile scale_y_continuous(breaks = seq(-4000000, 4000000, 1000000), labels = paste0(as.character(c(seq(4, 0, -1), seq(1, 4, 1))), "m")). Schließlich lässt sich noch der Titel entsprechend ändern in der Zeile ggtitle(paste0("Nigeria", " (Bevölkerung = ", summe, ")")).
Nigeria ist eines der wenigen Länder, in denen die Bevölkerungspyramide eine Pyramidenform aufweist. Die Mehrzahl der Bevölkerung ist jünger als 20 Jahre, und kaum jemand wird älter als 80 Jahre. An der Bevölkerungspyramide von Deutschland lässt sich ein Teil der Geschichte ablesen: Viele Männer, die 2019 im Alter von über 90 Jahren gewesen wären, sind im Zweiten Weltkrieg gefallen. Eine weitere Einbuchtung tritt bei den 86- bis 89-Jährigen auf, weil während der Weltwirtschaftskrise um 1932 in Deutschland weniger Kinder geboren wurden. Das sich anschließende Geburtenhoch wird durch den Geburtenrückgang in der Zeit des Zweiten Weltkrieges abgelöst. Die Ende der 1950er Jahre und in den 1960er Jahren geborenen Menschen werden als Babyboomer bezeichnet und gehen bald in Rente. Prost Mahlzeit!

Bier Schreiben macht durstig! Spendier mir doch ein Bier, indem du mir einen kleinen Betrag via Paypal schickst oder ein paar Bitcoin- oder Ethereum-Bruchteile an die entsprechende nachfolgende Adresse. Prost & auf dein Wohl!





Bitcoin-Adresse : 1PjYNNjHmkAUmf626hukL32Vs1wFt8v1wT
Ethereum-Adresse : 0x974e73994c7483eef1396a21b9937aecb7b6c286

Teile diesen Beitrag!