Yet another R blog

Packages • Praxis • Plots

Bevölkerungspyramiden plotten

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.

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

Bevölkerungspyramide Deutschland

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


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.

Bevölkerungspyramiden

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

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?

1 Kommentar

  1. Netter Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

*

*