Belgische Biere
By Philipp Leppert in R Kartierung Webscraping
November 1, 2018
Beck’s, Krombacher, Warsteiner und Bitburger. In Deutschland dominieren große Brauereien das Angebot in Supermärkten und Gaststätten. In den letzten Jahren entstanden aber auch mehr und mehr kleine (Craftbier)-Brauereien und bieten eine Vielzahl interessanter Sorten neben dem guten alten Pils an. Bis ich hier auf den Geschmack gekommen bin, hat es eine ganze Weile gedauert. Alles fing mit einem Aufenthalt in der belgischen Hauptstadt anfang des Jahres an. Die Belgier und Belgierinnen brauen Bier? Wusste ich gar nicht. Aber hier gab es in jeder Bar eine Bierauswahl im Format einer Restaurant-Speisekarte. Wow! Welches soll man probieren? Was verbirgt sich hinter den Sorten Saison, Dubbel und Tripel? Gut, dass ich damals jemanden vor Ort hatte, der mich etwas in die Szene einführen konnte. Später habe ich mich gefragt:
- Wie viele Brauereien gibt es in Belgien?
- Welche Sorten werden am häufigsten gebraut?
- Wie hoch ist der durchschnittliche Alkoholgehalt?
- Wie sieht es in Deutschland aus?
Datenbeschaffung
Im französischen Wikipedia gibt es eine eine umfangreiche tabellarische Auflistung belgischer Biersorten, welche ich zunächst mit der Funktion htmltab()
extrahiert habe.
bier_liste <- list()
for (i in 2:28) {
bier_liste[[i]] <- htmltab(
doc = "https://fr.wikipedia.org/wiki/Liste_des_bi%C3%A8res_belges",
which = i, colNames = c("name","sorte","alkoholgehalt", "brauerei"),
encoding = "UTF-8"
)
}
Datenaufbereitung
Die Daten werden dann in einen Data Frame umgewandelt und beinhalten den Namen des Bieres, die Sorte, den Alkoholgehalt sowie die Brauerei. Die gewonnen Daten werden dann bereinigt und formatiert. Fertig ist der Bier-Datensatz für eine Analyse.
# Liste in Dataframe umwandeln
bier_df <- do.call("rbind", bier_liste)
# Spalten encoden
bier_df <- mutate_if(bier_df, is.character,
.funs = function(x){return(`Encoding<-`(x, "UTF-8"))}
)
# Alkoholgehalt bereinigen und formatieren
bier_df$alkoholgehalt <- bier_df$alkoholgehalt %>%
str_remove("%") %>%
str_replace("\\?", "") %>%
str_replace(",","\\.") %>%
str_remove("[a-z]") %>%
str_trim() %>%
as.numeric(.)
Es gibt eine Vielzahl von Sorten
und teilweise sind diese nicht ganz eindeutig voneinander abgrenzbar. Ich versuche daher aus den vorhanden Einträgen eine grobe Klassifizierung im Merkmal Stil
abzuleiten. Bspw. fasse ich die Ausprägungen abbaye
und Abbey
zu Abtei-Bier
zusammen. Ebenso verfahre ich mit brune
und noire
und erstelle die Kategorie Dunkelbier
. Hierzu verwende ich die Funktion str_detect()
aus dem R-Paket stringr
. Kommen unterschiedliche Typen für das gleiche Bier vor, so erfolgt die Klassifizierung entlang der programmierten Reihenfolge.
bier_df$sorte <- str_to_lower(bier_df$sorte)
bier_df %>%
mutate(stil = case_when(
str_detect(sorte, "india pale ale|ipa") ~ "Indian Pale Ale",
str_detect(sorte, "fermentation haute") ~ "Obergäriges Bier",
str_detect(sorte, "fermentation basse") ~ "Untergäriges Bier",
str_detect(sorte, "stout") ~ "Stout",
str_detect(sorte, "ambrée") ~ "Amberbier",
str_detect(sorte, "pils") ~ "Pils",
str_detect(sorte, "blanche") ~ "Weißbier",
str_detect(sorte, "trappiste") ~ "Trappistenbier",
str_detect(sorte, "abbaye|Abbey") ~ "Abteibier",
str_detect(sorte, "triple|quadruple") ~ "Belgisches Starkbier",
str_detect(sorte, "saison|faro|lambic|gueuze") ~ "Sauerbier/Fruchtbier",
str_detect(sorte, "kriek|fruitée|bière au miel|panaché") ~ "Sauerbier/Fruchtbier",
str_detect(sorte, "brune|noire|double|rouge|porter") ~ "Dunkelbier",
str_detect(sorte, "blonde|ale|lager") ~ "Helles",
str_detect(sorte, "spéciale|noël|christmas") ~ "Spezialbier",
str_detect(sorte, "bière de table") ~ "Dünnbier",
TRUE ~ "Sonstige Biere")
) -> bier_df
Unten findet man einen Ausschnitt des Datensatzes.
name | sorte | alkoholgehalt | brauerei | stil |
---|---|---|---|---|
La 44 Brune | fermentation haute brune | 5.5 | Brasserie de la Gleize | Obergäriges Bier |
Abbaye de Saint-Martin Blonde | abbaye | 7.0 | Brasserie de Brunehaut | Abteibier |
Achel 8 Bruin | trappiste, brune | 8.0 | Abbaye d'Achel | Trappistenbier |
Alvinne Lex'ke | blonde | 6.3 | Brasserie Alvinne | Helles |
Ardenne Stout | stout | 8.0 | Brasserie de Bastogne | Stout |
L'Attrait Impérial | india pale ale | 8.3 | Brasserie L'Attrait | Indian Pale Ale |
Belgoo Arboo | triple, ambrée | 8.1 | Brasserie La Binchoise pour la Brasserie Belgoobeer | Amberbier |
Datenanalyse
Zuerst betrachte ich die Verteilung des Alkoholgehalts der Biere. Für 21 Biere waren auf Wikipedia keine Angaben hinterlegt (NA
). Der durchschnittliche Alkoholgehalt der belgischen Biere liegt bei 6,8%. Ganz schön stark!
# Histogramm erstellen
ggplot(bier_df, aes(x = alkoholgehalt)) +
geom_histogram(color = "black", fill = "#E6AB02") +
geom_vline(aes(xintercept = mean(alkoholgehalt, na.rm = TRUE)),
color = "black", linetype = "dashed", size = 1) +
scale_x_continuous(breaks = c(0, 4, 8, 12, 16, 20, 24, 28)) +
labs(subtitle = paste(
"N=",dim(bier_df)[1]," (",sum(is.na(bier_df$alkoholgehalt))," NA)", sep = ""
),
x = "Alkoholgehalt (%)",
y = "Häufigkeit")
Unten findet sich eine Häufigkeitstabelle mit dem Merkmal Stil
. Pro Ausprägung hae ich zusätzlich den durchschnittlichen Alkoholgehalt berechnet. Bei 39 Bieren fehlt die Angabe zur Sorte
und 83 Biere wurden in die Restkategorie einsortiert. Für diese kann man möglicherweise noch einige Unterkategorien bilden oder einer bestehenden (passenden) Kategorie zuordnen. Betrachtet man den durchschnittlichen Alkoholgehalt pro Biersorte, so scheint die Klassifikation ziemlich stimmig zu sein. Je dunkler/heller das Bier desto höher/niedriger der Alkoholgehalt. Auch die belgischen Starkbiere (Tripel, Quadrupel) haben neben dem Stout den höchsten Alkoholgehalt.
stil | alkoholgehalt_mean | n |
---|---|---|
Stout | 8.97 | 39 |
Belgisches Starkbier | 8.56 | 134 |
Trappistenbier | 8.24 | 16 |
Spezialbier | 8.18 | 25 |
Indian Pale Ale | 7.64 | 29 |
Abteibier | 7.55 | 104 |
Dunkelbier | 7.43 | 180 |
Obergäriges Bier | 7.40 | 438 |
Amberbier | 7.15 | 97 |
Helles | 6.70 | 257 |
Sonstige Biere | 6.05 | 83 |
Sauerbier/Fruchtbier | 5.18 | 260 |
Weißbier | 5.17 | 80 |
Pils | 4.96 | 56 |
Untergäriges Bier | 4.88 | 20 |
Dünnbier | 1.89 | 19 |
Zuletzt wird der Name der Brauerei genutzt, um eine Karte von Belgien zu erstellen und dort alle Brauereistandorte einzuzeichnen. Die Adressangabe wird dabei mit der Google Geocoding API in Koordinaten umgewandelt. Es gibt 369 verschiedene Brauereien im Datensatz sowie 10 Biersorten ohne Angabe zur Braustätte. Für 98 Brauereien konnten keine Koordinaten gefunden werden.
# Extrahierte Koordinaten verknüpfen
karte_df <- left_join(bier_df, brauerei_koordinaten, by = "brauerei")
# Basiskarte Belgien
Get_Map_Country <- get_map(location = "Belgium", zoom = 6, maptype = "stamen_toner_background",
filename = "ggmapTemp", color = "bw", source = "stadia")
karte_belgien <- ggmap(ggmap = Get_Map_Country)
karte_belgien +
geom_point(data=karte_df, aes(x =longitude, y=latitude),
shape = "\u2302" ,size = 5, color = "#E6AB02") +
labs(title = "Brauereistandorte in Belgien",
x = "Längengrad",
y = "Breitengrad") +
scale_y_continuous(limits = c(48,52.5))
- Posted on:
- November 1, 2018
- Length:
- 5 minute read, 888 words
- Categories:
- R Kartierung Webscraping
- See Also: