Nur wenige Länder haben eine Altersverteilung in Pyramidenform
Bevölkerungspyramiden zeigen die Altersverteilung einer Population. Grafisch betrachtet handelt es sich dabei um zwei vertikale Barplots. Die entsprechenden Daten für sämtliche Länder der Erde lassen sich online von der Seite www.census.gov abrufen und direkt im Skript verwerten.
Das erledigt die Funktion get_data
. Die URL, mit der sich die Bevölkerungsdaten abrufen lassen, besteht aus vier Teilen. Beim Aufruf von get_data
wird das Land in Form eines Länderkürzels und das Jahr übergeben.
Eine Liste der gültigen Länderkürzel findet sich auf der Seite https://en.wikipedia.org/wiki/List_of_FIPS_country_codes.
Das nachfolgende Skript funktioniert wegen einer Umstellung der Quellenseite mit den Daten nicht mehr und wurde deshalb überarbeitet. Das neue, funktionierende Skript ist in diesem Blogbeitrag beschrieben.
library(XML) library(reshape2) library(ggplot2) library(grid) library(gridExtra) # country codes: https://en.wikipedia.org/wiki/List_of_FIPS_country_codes get_data <- function(country, year) { part1 <- "http://www.census.gov/population/international/data/idb/region.php?N=%20Results%20&T=10&A=separate&RT=0&Y=" part2 <- "&R=-1&C=" url <- paste0(part1, year, part2, country) df <- data.frame(readHTMLTable(url)) keep <- c(2, 4, 5) 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' ) return(df.melt) } germany <- get_data("GM", 2016) germany$Gender <- ifelse(germany$Gender == "Male", "Männlich", "Weiblich") p1 <- ggplot(germany, aes(x = Age, y = Population, fill = Gender)) + geom_bar(data = subset(germany, Gender == "Weiblich"), stat = "identity") + geom_bar(data = subset(germany, Gender == "Männlich"), stat = "identity") + scale_y_continuous(breaks = seq(-4000000, 4000000, 1000000), labels = paste0(as.character(c(4:0, 1:4)), "m")) + coord_flip() + ggtitle("Deutschland") + xlab("Alter") + ylab("Bevölkerung") + guides(fill=guide_legend(title="Geschlecht")) + scale_fill_brewer(palette = "Set1") + theme_bw() p1
Das Skript: In diesem Beispiel sind 5 Bibliotheken nötig: XML
, reshape2
, ggplot2
, grid
und gridExtra
. Die beiden letztgenannten brauchst du nur dann, wenn du mehrere Bevölkerungspyramiden in einem Plot abbilden willst. Die Funktion get_data
wurde bereits erwähnt. Die beiden Zeilen
germany <- get_data("GM", 2016)
germany$Gender <- ifelse(germany$Gender == "Male", "Männlich", "Weiblich")
holen die Daten für Deutschland, Stand 2016 und deutschen die Geschlechter ein. Der anschließende Plot besteht aus zwei Barplots, die mittels coord_flip()
um 90 Grad gedreht werden. Die Zeile
scale_y_continuous(breaks = seq(-4000000, 4000000, 1000000), labels = paste0(as.character(c(4:0, 1:4)), "m"))
muss gegebenenfalls je nach Größe der Bevölkerung angepasst werden. Die Bevölkerungspyramide von Deutschland zeigt, dass die größte Altersgruppe die zwischen 50 und 54 Jahren ist mit gut 3,5 Millionen männlich wie weiblich. Und die gehen in 15 Jahren in Rente...Nach oben hin steigt der Anteil der Frauen deutlich an.
Hier noch ein Multiplot mit Bevölkerungspyramiden von Deutschland, China, Brasilien und Nigeria, erzeugt mit der Funktion grid.arrange
.
Die Bevölkerungspyramide von Nigeria hat noch eine echte Pyramidenform. Ein Großteil der Bevölkerung ist unter 20 Jahre alt. In China fällt auf, dass es deutlich mehr Männer als Frauen gibt – eine indirekte Folge der Ein-Kind-Politik. Ist das erste Kind ein Mädchen, wird es beseitigt und man probiert es noch einmal. Wie die birnenförmige Bevölkerungspyramide von Brasilien zu Stande kommt, ist mir nicht klar. Vielleicht hast du eine Erklärung?
Netter Beitrag