In diesem Post untersuchen wir einige Aspekte der explorativen Datenanalyse für den Datensatz oecd wellbeing
aus dem Jahr 2016.
Hinweis: Als Vertiefung gekennzeichnete Abschnitt sind nicht prüfungsrelevant.
Benötigte Pakete
Ein Standard-Paket zur grundlegenden Datenanalyse:
library(mosaic)
Datensatz laden
Der Datensatz kann hier bezogen werden.
Doi: https://doi.org/10.1787/data-00707-en.
Falls der Datensatz lokal (auf Ihrem Rechner) vorliegt, können Sie ihn in gewohnter Manier laden. Geben Sie dazu den Pfad zum Datensatz ein:
oecd <- read.csv("/Users/sebastiansaueruser/Documents/Publikationen/blog_ses/sebastiansauer.github.io/data/oecd-wellbeing.csv")
Liegt die Datendatei im gleichen Verzeichnis wie Ihre Rmd-Datei, dann brauchen Sie nur den Dateinamen, nicht den Pfad, anzugeben.
Erster Blick
inspect(oecd)
#>
#> categorical variables:
#> name class levels n missing
#> 1 Country factor 35 429 0
#> 2 Region factor 427 429 0
#> 3 region_type factor 2 429 0
#> 4 Code factor 429 429 0
#> distribution
#> 1 United States (12.1%), Mexico (7.7%) ...
#> 2 Luxembourg (0.5%), Mexico (0.5%) ...
#> 3 country_part (92.1%) ...
#> 4 AT11 (0.2%), AT12 (0.2%) ...
#>
#> quantitative variables:
#> name class min Q1 median Q3 max mean
#> 1 Education numeric 0 5.525 7.9 9.0 10 6.811972
#> 2 Jobs numeric 0 5.200 6.9 8.1 10 6.450350
#> 3 Income numeric 0 2.000 4.1 5.4 10 4.106993
#> 4 Safety numeric 0 5.700 8.3 9.5 10 7.049650
#> 5 Health numeric 0 3.100 6.3 8.2 10 5.726340
#> 6 Environment numeric 0 3.200 5.5 7.5 10 5.400699
#> 7 Civic_engagement numeric 0 3.100 5.0 7.2 10 5.054312
#> 8 Accessiblity_to_services numeric 0 5.700 7.2 8.3 10 6.527040
#> 9 Housing numeric 0 1.700 5.0 7.2 10 4.796721
#> 10 Community numeric 0 5.600 7.8 8.8 10 6.875765
#> 11 Life_satisfaction numeric 0 3.700 6.3 8.5 10 5.799765
#> sd n missing
#> 1 2.968513 426 3
#> 2 2.407170 429 0
#> 3 2.699757 429 0
#> 4 3.228861 429 0
#> 5 2.927557 429 0
#> 6 2.734365 429 0
#> 7 2.848784 429 0
#> 8 2.645392 429 0
#> 9 3.024460 427 2
#> 10 2.746413 425 4
#> 11 2.895454 425 4
Wie inspect()
aufzeigt, liegen also einige qualitative (kategoriale) und einige quantitative (metrische) Variablen vor. Die qualitativen Variablen sind für eine direkte Analyse weniger interessant; vielmehr ist es interessant, die Statistiken auf die Gruppen der qualitativen Variablen aufzusplitten.
Betrachten wir aber zu Beginn die metrischen Variablen einzeln (univariat).
Metrische Variablen einzeln (univariat)
Die typischen Statistiken zu den metrischen Variablen liegen uns von inspect()
bereits vor. Daher gehen wir weiter zur Visualisierung.
histogram(~Life_satisfaction, data = oecd)
Eine ähnliche Aussage liefert das Dichte-Diagramm:
densityplot(~Life_satisfaction, data = oecd)
Die Dichte gibt an, welcher Anteil der Beobachtungen an der jeweiligen Stelle der X-Achse lägen, wenn man eine Einheit betrachtet (z.B. die Lebenszufriedenheit von 5-6).
Möchte man anstelle von density
gerne counts
auf der Y-Achse haben im Histogramm, so ergänzt man folgendes Argument:
histogram(~Life_satisfaction, data = oecd, type = "count")
Vertiefung
Eine alternative Funktion, die “mehr kann” ist gf_XXX()
, wobei XXX
die Art des Diagramms meint, z.B. histogram
:
gf_histogram(~Life_satisfaction, data = oecd)
Histogramm nach Gruppen
Angenommen, man möchte Deutschland mit Frankfreich vergleichen im Hinblick auf die Lebenszufriedenheit:
oecd %>%
filter(Country == "Germany" | Country == "France") -> oecd_de_fr
Der vertikale Strich |
bedeutet hier “oder”.
histogram(~Life_satisfaction | Country, data = oecd_de_fr)
Vertiefung
Auch mit gf_XXX()
(besser bekannt als ggformula
) (s. hier kann man auf diese Art gruppieren:
gf_dhistogram(~Life_satisfaction | Country, data = oecd_de_fr)
dhistogram
steht für Dichte-Histogramm.
Einen Überblick über alle Diagrammtypen von gfformula
findet sich hier.
Alternativ kann man es auch so schreiben:
gf_dhistogram(~Life_satisfaction | Country, data = oecd_de_fr) %>%
gf_facet_wrap(~ Country)
Histogramm für alle Variablen
Um einen Überblick über die Verteilungen zu bekommen, bietet es sich an, sich alle anzuschauen. Das ist natürlich mit etwas Monotonie verbunden (den gleichen Befehle mehrfach wiederholen).
Vertiefung
Malen wir meinmal alle Histogramme auf einmal. Dazu brauchen wir ein weiteres Paket:
library(tidyverse)
Als erstes erzeugen wir einen langen Dataframe (der nur aus metrischen Variablen besteht):
oecd_de_fr %>%
select_if(is.numeric) %>%
gather() %>%
head(10)
#> key value
#> 1 Education 7.8
#> 2 Education 7.0
#> 3 Education 6.6
#> 4 Education 7.4
#> 5 Education 7.3
#> 6 Education 7.7
#> 7 Education 7.8
#> 8 Education 7.9
#> 9 Education 8.0
#> 10 Education 8.2
head(10)
liefert die ersten 10 Zeilen des Dataframes zurück.
Man beachte, dass in key
der Name der Variable steht und in value
der zugehörige Wert.
Dann plotten wir Histogramme, wobei wir nach den Ländern (key
) gruppieren. Aber zuerst speichenr wir uns den “langen” Datensatz ab:
oecd_de_fr %>%
select_if(is.numeric) %>%
gather() -> oecd_de_fr_long
Betrachten Sie diesen Daten einmal zur Übung.
Dann plotten wir in gewohnter Manier:
histogram(~ value | key, data = oecd_de_fr_long)
Forschungsfrage
Hat Deutschland in Vergleich zu anderen Ländern eine hohe Lebenszufriedenheit?
Die Frage ist noch recht unpräzise formuliert, aber dafür gibt sie Raum für eine Menge von Untersuchungsansätzen.
Datensatz filtern - nur Länder, keine Landesteile
Der Datensatz verstößt gegen die Regel, dass in jeder Zeile eine Beobachtungseinheit steht. In einigen Zeilen stehen Länder, in den meisten anderen aber Landesteile (wie Bayern, Baden-Württemberg etc.). Filtern wir uns nur die Länder, und exklduieren die Landesteile:
filter(oecd, region_type == "country_whole") -> oecd_short
Die Anzahl der Zeilen deses Datensatz oecd_short
gibt uns Aufschluss über die Anzahl der untersuchten Länder.
Vergleich der Lebenszufriedenheit der Länder
xyplot(Life_satisfaction ~ Country, data = oecd_short,
xlab = "Land", ylab = "Zufriedenheit")
Hm, sieht nicht übersichtlich aus. Besser wäre es, die Punkte absteigend zu sortieren.
Betrachten wir dazu die Variable country
näher: Es handelt sich um einen Faktor mit 35 Stufen, wie uns str(oecd)
verrät:
str(oecd)
#> 'data.frame': 429 obs. of 15 variables:
#> $ Country : Factor w/ 35 levels "Australia","Austria",..: 1 1 1 1 1 1 1 1 2 2 ...
#> $ Region : Factor w/ 427 levels "Abruzzo","Agder and Rogaland",..: 238 392 304 329 410 364 265 27 50 193 ...
#> $ region_type : Factor w/ 2 levels "country_part",..: 1 1 1 1 1 1 1 1 1 1 ...
#> $ Code : Factor w/ 429 levels "AT11","AT12",..: 10 11 12 13 14 15 16 17 1 2 ...
#> $ Education : num 8 8.1 7.8 7.3 7.6 6.5 8.1 9.5 8.8 8.5 ...
#> $ Jobs : num 8.1 7.9 8.1 7.8 8.8 7.6 8.7 9.3 7.8 8.2 ...
#> $ Income : num 6.8 5.9 6.3 6.1 7.9 5.4 8.2 10 5.7 5.9 ...
#> $ Safety : num 8.8 9.5 9.5 9 8.6 8.8 0 10 9.7 9.8 ...
#> $ Health : num 9 9.5 8.3 8.5 9.3 5.4 2.4 9.3 6.7 6.6 ...
#> $ Environment : num 9.8 8.6 9.9 9.4 9.6 10 9.2 9.1 3.5 2.6 ...
#> $ Civic_engagement : num 10 10 10 10 10 10 8.4 10 8.6 8.1 ...
#> $ Accessiblity_to_services: num 7.2 7.5 7.7 7.2 7.8 6.8 7.8 8.7 8 7.4 ...
#> $ Housing : num 7.2 7.8 8.3 8.3 8.9 8.3 5.6 8.3 6.1 5.6 ...
#> $ Community : num 8.9 9.3 8.6 8.6 8.5 8.6 10 9.8 8.3 7.8 ...
#> $ Life_satisfaction : num 7.8 8.5 8.1 8.5 7.8 9.6 7 9.6 7.8 8.1 ...
Offensichtlich sind diese alphabetisch geordnet - nach dieser Ordnung richtet sich die Ordnung im Plot-Befehl (xyplot
).
Ranking und Top-10-Prozent der Zufriedenheit
Schauen wir uns die “Happy-Top-10” an, die 10 Länder mit der höchsten Lebenszufriedenheit:
oecd_short %>%
arrange(-Life_satisfaction) %>%
select(Country, Life_satisfaction) %>%
head(10)
#> Country Life_satisfaction
#> 1 Denmark 10.0
#> 2 Switzerland 10.0
#> 3 Finland 9.7
#> 4 Netherlands 9.7
#> 5 Norway 9.7
#> 6 Canada 9.3
#> 7 Iceland 9.3
#> 8 Sweden 9.3
#> 9 Australia 8.8
#> 10 Austria 8.8
head(10)
liefert die ersten 10 Zeilen zurück.
Alternativ hätte man das auch so machen können:
oecd_short %>%
select(Country, Life_satisfaction) %>%
top_n(10)
#> Country Life_satisfaction
#> 1 Australia 8.8
#> 2 Austria 8.8
#> 3 Canada 9.3
#> 4 Denmark 10.0
#> 5 Finland 9.7
#> 6 Iceland 9.3
#> 7 Israel 8.8
#> 8 Netherlands 9.7
#> 9 New Zealand 8.8
#> 10 Norway 9.7
#> 11 Sweden 9.3
#> 12 Switzerland 10.0
top_n(10)
liefert die 10 höchsten Rangpläte zurück. Hier gab es doppelte Werte, daher, wurden mehr als 10 Werte zurückgeliefert.
quantile(~Life_satisfaction, data = oecd_short, probs = .90)
#> 90%
#> 9.7
Ah, Länder mit einer Lebenszufriedenheit von mind. 9.7 gehören zu den oberen Top-10-Prozent. Filtern wir mal entsprechend:
oecd_short %>%
filter(Life_satisfaction >= 9.7) %>%
select(Country, Life_satisfaction)
#> Country Life_satisfaction
#> 1 Denmark 10.0
#> 2 Finland 9.7
#> 3 Netherlands 9.7
#> 4 Norway 9.7
#> 5 Switzerland 10.0
Vertiefung
Ändern wir die Sortierung! Mit reorder()
kann man die Sortierung ändern (re-ordnen, daher der Name):
oecd_short %>%
mutate(Country_sorted = reorder(Country, Life_satisfaction)) -> oecd_short
Ist das jetzt geordnet? str()
verrät es uns:
str(oecd_short)
#> 'data.frame': 34 obs. of 16 variables:
#> $ Country : Factor w/ 35 levels "Australia","Austria",..: 1 2 3 4 5 6 7 8 10 11 ...
#> $ Region : Factor w/ 427 levels "Abruzzo","Agder and Rogaland",..: 26 28 40 56 88 98 100 121 124 128 ...
#> $ region_type : Factor w/ 2 levels "country_part",..: 2 2 2 2 2 2 2 2 2 2 ...
#> $ Code : Factor w/ 429 levels "AT11","AT12",..: 18 19 23 37 46 70 93 119 125 148 ...
#> $ Education : num 7.6 8.4 7.5 9.2 7.2 10 6.7 9.6 8.7 7.6 ...
#> $ Jobs : num 7.9 7.7 5 6.6 6.2 7.3 7.9 6.6 6.4 5.2 ...
#> $ Income : num 9.5 7.9 6.2 7.4 0.4 2.8 5.1 1 5.6 7 ...
#> $ Safety : num 8.4 10 5.7 6.5 0.6 6.1 10 0 10 8.4 ...
#> $ Health : num 9 7.2 6.6 8.5 4.2 2.7 5.8 2.1 7.3 9.3 ...
#> $ Environment : num 9.7 2.8 1.9 7.4 8.5 1.4 5.8 6.4 7.9 4.5 ...
#> $ Civic_engagement : num 10 6.2 9.7 4.7 0.1 2.6 8.9 3.7 4.8 7.5 ...
#> $ Accessiblity_to_services: num 6.9 7.2 7.6 8.1 0 6.7 8.3 7.6 9 6.9 ...
#> $ Housing : num 9.5 5.1 8.8 10 1.5 2.9 6.6 1.5 6.6 5.1 ...
#> $ Community : num 8.8 7.6 7.7 8.5 2.5 5.1 9.6 4.6 8.7 7.6 ...
#> $ Life_satisfaction : num 8.8 8.8 7.9 9.3 4.9 5.3 10 0.4 9.7 6.2 ...
#> $ Country_sorted : Factor w/ 35 levels "Hungary","Portugal",..: 23 24 20 27 12 13 33 4 30 15 ...
#> ..- attr(*, "scores")= num [1:35(1d)] 8.8 8.8 7.9 9.3 4.9 5.3 10 0.4 NA 9.7 ...
#> .. ..- attr(*, "dimnames")=List of 1
#> .. .. ..$ : chr "Australia" "Austria" "Belgium" "Canada" ...
Wie man sieht, ist Country_sorted
jetzt anders sortiert. Betrachten wir das Ergebnis:
xyplot(Life_satisfaction ~ Country_sorted, data = oecd_short,
xlab = "Land", ylab = "Zufriedenheit")
Schon besser. Man kann z.B. die Achsen nicht lesen 😭.
Vertiefung
Mit gf_XXX()
lassen sich die Achsen (um 90°) drehen mit + coord_flip()
:
gf_point(Life_satisfaction ~ Country_sorted, data = oecd_short) + coord_flip()
Schön 😄.
Man hätte das Sortieren und Achsen drehen auch in einem Haps machen können:
gf_point(Life_satisfaction ~ reorder(Country, Life_satisfaction),
data = oecd_short) + coord_flip()
Aber übersichtliches ist es, die Dinge nacheinander zu tun.
Vertiefung
Schön wäre es noch, im Bild den Mittelwert o.Ä. zu sehen:
gf_point(Life_satisfaction ~ reorder(Country, Life_satisfaction),
data = oecd_short) %>%
gf_hline(yintercept = 6.08, data = NA, color = "firebrick") + coord_flip()
Tja, die Wünsche hören nie auf… Wäre es nicht noch nett, wenn “Deutschland” hervorgehoben wäre, optisch, so dass es im Diagramm hervorsticht. Nehmen wir an, wir sind an diesem Land besonders interessiert.
oecd_short <-
oecd_short %>%
mutate(is_Germany = Country == "Germany")
Damit haben wir eine Spalte erstellt, die angibt, ob ein Land Deutschland ist (TRUE
) oder nicht (FALSE
). Diese neue Variable nehmen wir her, um die Farbe, Größe und Form der Punkte zu bestimmen:
oecd_short %>%
gf_point(Life_satisfaction ~ reorder(Country, Life_satisfaction),
color = ~is_Germany,
shape = ~is_Germany,
size = ~ is_Germany) %>%
gf_hline(yintercept = 6.08, data = NA, color = "grey60") %>%
gf_vline(xintercept = 16, data = NA, color = "grey80") +
coord_flip()
Boxplots anstelle von Histogrammen
Möchte man mehrere Gruppen (z.B. Länder vergleichen, so bietet sich der Boxplot an - mehrere Histogramme nebeneinander lassen sich nur schwer optisch vergleichen.)
bwplot(Life_satisfaction ~ Country, data = oecd)
Natürlich bietet es sich an, hier noch die Gruppen sortiert und die Achsen zu kippen.
Zusammenhang zweier metrischer Variablen
Hängt die Lebenszufriedenheit mit Civic_engagment
zusammen?
xyplot(Civic_engagement ~ Life_satisfaction, data = oecd_short)
Hm, es ist kein starker Trend zu erkennen.
Was sagt die Korrelation dazu:
cor(Civic_engagement ~ Life_satisfaction, data = oecd_short)
#> [1] 0.4021292
Immerhin, kein ganz unwesentlicher Wert.
Und so weiter
Dieses Prinzip xyplot(var1 ~ var, data = oecd_short)
könnte man jetzt weiterführen ad nauseam.
Vertiefung Pairs plot
Eleganter geht es so. Dafür benötigen wir Extra-Pakete:
library(sjPlot)
Dann erstellen wir einen Dataframe mit nur metrischen Variablen:
oecd_short %>%
select(-Country, -Region, -region_type, -Code, -Country_sorted) -> oecd_short_numeric
Übrigens kann (und muss man oft) mehrere Werte mit dem Befehl c()
zusammenfassen (c wie “combine”):
oecd_short %>%
select(-c(Country, Region, region_type, Code, Country_sorted)) -> oecd_short_numeric
Oder man wählt gleich nur die numerischen Variablen aus:
oecd_short %>%
select_if(is.numeric) -> oecd_short_numeric
sjp.corr(oecd_short_numeric)
Übrigens gibt selbiges Paket auch eine ganz schöne HTML-Tabelle mit den Korrelationskoeffizienten aus:
sjt.corr(oecd_short_numeric)
Education | Jobs | Income | Safety | Health | Environment | Civic_engagement | Accessiblity_to_services | Housing | Community | Life_satisfaction | |
---|---|---|---|---|---|---|---|---|---|---|---|
Education | 0.369* | 0.312 | 0.154 | 0.000 | -0.131 | -0.225 | 0.543*** | 0.129 | 0.381* | 0.163 | |
Jobs | 0.369* | 0.332 | 0.386* | 0.190 | 0.206 | 0.071 | 0.438** | 0.241 | 0.373* | 0.528** | |
Income | 0.312 | 0.332 | 0.522** | 0.582*** | 0.300 | 0.404* | 0.648*** | 0.838*** | 0.619*** | 0.571*** | |
Safety | 0.154 | 0.386* | 0.522** | 0.542*** | 0.082 | 0.282 | 0.624*** | 0.403* | 0.618*** | 0.432* | |
Health | 0.000 | 0.190 | 0.582*** | 0.542*** | 0.233 | 0.350* | 0.443** | 0.601*** | 0.371* | 0.470** | |
Environment | -0.131 | 0.206 | 0.300 | 0.082 | 0.233 | 0.207 | 0.077 | 0.496** | 0.449** | 0.400* | |
Civic_engagement | -0.225 | 0.071 | 0.404* | 0.282 | 0.350* | 0.207 | 0.326 | 0.388* | 0.150 | 0.402* | |
Accessiblity_to_services | 0.543*** | 0.438** | 0.648*** | 0.624*** | 0.443** | 0.077 | 0.326 | 0.502** | 0.609*** | 0.430* | |
Housing | 0.129 | 0.241 | 0.838*** | 0.403* | 0.601*** | 0.496** | 0.388* | 0.502** | 0.646*** | 0.566*** | |
Community | 0.381* | 0.373* | 0.619*** | 0.618*** | 0.371* | 0.449** | 0.150 | 0.609*** | 0.646*** | 0.656*** | |
Life_satisfaction | 0.163 | 0.528** | 0.571*** | 0.432* | 0.470** | 0.400* | 0.402* | 0.430* | 0.566*** | 0.656*** | |
Computed correlation used pearson-method with listwise-deletion. |
Vertiefung ggpairs
library(GGally)
Das sieht auch ganz nett aus:
ggpairs(oecd_short,
columns = c(5,6,7,15))
Zusammenhang zweier Variablen unter Berücksichtigung von Drittvariablen
Oben haben wir gesehen, dass Lebenszufriedenheit und Civiv Engagement zusammenhängen.
Aber vielleicht hängt dieser Zusammenhang wiederum von der finanziellen Absicherung ab? Nur wenn man materiell abgesichert ist, so könnte man argumentieren, wird bürgerliches Engagement (bzw. die Möglichkeit zu) eine Einflussgröße auf die Lebenszufriedenheit.
Um diese Frage zu untersuchen, teilen wir Income
in zwei Stufen, hoch und gering. Dann untersuchen wir jeweils den Zusammenhang von Lebenszufriedenheit und bürgerlichem Engagement.
Achtung! Eine metrische Variablen in zwei Hälften zu spalten birgt einen hohen Informationsverlust. Da wir aber nur eine grobe Untersuchung vorhaben (und uns noch nicht fortgeschrittener Technik bedienen wollen), bleiben wir erstmal bei dieser sog. Dichotomisierung.
Nehmen wir den Median des Einkommen als Teilungspunkt; man spricht von einem “Mediansplit”:
median(~Income, data = oecd_short)
#> [1] 5.15
Zuerst erstellen wir eine Variable Income_high
mit den Stufen 0 (nein) und 1 (ja):
oecd_short <-
oecd_short %>%
mutate(Income_high =
case_when( Income >= 5.15 ~ 1,
Income < 5.15 ~ 0))
Jetzt plotten wir den Zusammenhang:
xyplot(Life_satisfaction ~ Civic_engagement | Income_high, data = oecd_short)
Vertiefung: Korrelation pro Gruppe
Um die Korrelation pro Gruppe zu erhalten, könnten wir jeweils einen Dataframe pro Gruppe erzeugen (mit filter()
) und dann jeweils die Korrelation von Zufriedenheit und Engagement berechnen.
Eine andere, etwas elegantere Möglichkeit kann so aussehen:
oecd_short %>%
group_by(Income_high) %>%
summarise(cor_zuf_eng = cor(Life_satisfaction ~ Civic_engagement))
#> # A tibble: 2 x 2
#> Income_high cor_zuf_eng
#> <dbl> <dbl>
#> 1 0 0.367
#> 2 1 0.140
Interessanterweise ist die Korrelation durchaus verschieden in den beiden Gruppen.
Natürlich sind die beiden Gruppen nur Stichproben - es stellt sich die Frage, ob die Unterschiede nur durch Zufälligkeiten des Stichprobenziehens entstanden sind oder auch in der Grundgesatmtheit der “reichen” und “armen” Ländern existieren? Dazu später mehr!
Deskriptive Statistiken nach Ländern
Lebenszufriedenheit
Das ist relativ einfach:
favstats(Life_satisfaction ~ Country, data = oecd_short) -> oecd_favstats
oecd_favstats
#> Country min Q1 median Q3 max mean sd n missing
#> 1 Australia 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
#> 2 Austria 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
#> 3 Belgium 7.9 7.9 7.9 7.9 7.9 7.9 NA 1 0
#> 4 Canada 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 5 Chile 4.9 4.9 4.9 4.9 4.9 4.9 NA 1 0
#> 6 Czech Republic 5.3 5.3 5.3 5.3 5.3 5.3 NA 1 0
#> 7 Denmark 10.0 10.0 10.0 10.0 10.0 10.0 NA 1 0
#> 8 Estonia 0.4 0.4 0.4 0.4 0.4 0.4 NA 1 0
#> 9 Estonia TL3 NA NA NA NA NA NaN NA 0 0
#> 10 Finland 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 11 France 6.2 6.2 6.2 6.2 6.2 6.2 NA 1 0
#> 12 Germany 6.2 6.2 6.2 6.2 6.2 6.2 NA 1 0
#> 13 Greece 1.3 1.3 1.3 1.3 1.3 1.3 NA 1 0
#> 14 Hungary 0.0 0.0 0.0 0.0 0.0 0.0 NA 1 0
#> 15 Iceland 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 16 Ireland 7.9 7.9 7.9 7.9 7.9 7.9 NA 1 0
#> 17 Israel 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
#> 18 Italy 4.4 4.4 4.4 4.4 4.4 4.4 NA 1 0
#> 19 Japan 3.5 3.5 3.5 3.5 3.5 3.5 NA 1 0
#> 20 Korea 2.6 2.6 2.6 2.6 2.6 2.6 NA 1 0
#> 21 Luxembourg 7.5 7.5 7.5 7.5 7.5 7.5 NA 1 0
#> 22 Mexico 7.5 7.5 7.5 7.5 7.5 7.5 NA 1 0
#> 23 Netherlands 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 24 New Zealand 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
#> 25 Norway 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 26 Poland 2.2 2.2 2.2 2.2 2.2 2.2 NA 1 0
#> 27 Portugal 0.0 0.0 0.0 0.0 0.0 0.0 NA 1 0
#> 28 Slovak Republic 2.6 2.6 2.6 2.6 2.6 2.6 NA 1 0
#> 29 Slovenia 2.6 2.6 2.6 2.6 2.6 2.6 NA 1 0
#> 30 Spain 5.7 5.7 5.7 5.7 5.7 5.7 NA 1 0
#> 31 Sweden 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 32 Switzerland 10.0 10.0 10.0 10.0 10.0 10.0 NA 1 0
#> 33 Turkey 0.0 0.0 0.0 0.0 0.0 0.0 NA 1 0
#> 34 United Kingdom 7.1 7.1 7.1 7.1 7.1 7.1 NA 1 0
#> 35 United States 8.4 8.4 8.4 8.4 8.4 8.4 NA 1 0
Ach ja, sortieren ist noch sinnvoll:
oecd_favstats %>%
arrange(-mean) -> oecd_favstats
oecd_favstats %>%
head(10) # nur die ersten 10 Zeilen
#> Country min Q1 median Q3 max mean sd n missing
#> 1 Denmark 10.0 10.0 10.0 10.0 10.0 10.0 NA 1 0
#> 2 Switzerland 10.0 10.0 10.0 10.0 10.0 10.0 NA 1 0
#> 3 Finland 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 4 Netherlands 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 5 Norway 9.7 9.7 9.7 9.7 9.7 9.7 NA 1 0
#> 6 Canada 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 7 Iceland 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 8 Sweden 9.3 9.3 9.3 9.3 9.3 9.3 NA 1 0
#> 9 Australia 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
#> 10 Austria 8.8 8.8 8.8 8.8 8.8 8.8 NA 1 0
Lädt man noch das Paket knitr
, kann man sich eine schöne HTML- (oder Word-) Tabelle ausgeben lassen:
library(knitr)
oecd_favstats %>%
kable()
Country | min | Q1 | median | Q3 | max | mean | sd | n | missing |
---|---|---|---|---|---|---|---|---|---|
Denmark | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | NA | 1 | 0 |
Switzerland | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | NA | 1 | 0 |
Finland | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | NA | 1 | 0 |
Netherlands | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | NA | 1 | 0 |
Norway | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | 9.7 | NA | 1 | 0 |
Canada | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | NA | 1 | 0 |
Iceland | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | NA | 1 | 0 |
Sweden | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | 9.3 | NA | 1 | 0 |
Australia | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | NA | 1 | 0 |
Austria | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | NA | 1 | 0 |
Israel | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | NA | 1 | 0 |
New Zealand | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | 8.8 | NA | 1 | 0 |
United States | 8.4 | 8.4 | 8.4 | 8.4 | 8.4 | 8.4 | NA | 1 | 0 |
Belgium | 7.9 | 7.9 | 7.9 | 7.9 | 7.9 | 7.9 | NA | 1 | 0 |
Ireland | 7.9 | 7.9 | 7.9 | 7.9 | 7.9 | 7.9 | NA | 1 | 0 |
Luxembourg | 7.5 | 7.5 | 7.5 | 7.5 | 7.5 | 7.5 | NA | 1 | 0 |
Mexico | 7.5 | 7.5 | 7.5 | 7.5 | 7.5 | 7.5 | NA | 1 | 0 |
United Kingdom | 7.1 | 7.1 | 7.1 | 7.1 | 7.1 | 7.1 | NA | 1 | 0 |
France | 6.2 | 6.2 | 6.2 | 6.2 | 6.2 | 6.2 | NA | 1 | 0 |
Germany | 6.2 | 6.2 | 6.2 | 6.2 | 6.2 | 6.2 | NA | 1 | 0 |
Spain | 5.7 | 5.7 | 5.7 | 5.7 | 5.7 | 5.7 | NA | 1 | 0 |
Czech Republic | 5.3 | 5.3 | 5.3 | 5.3 | 5.3 | 5.3 | NA | 1 | 0 |
Chile | 4.9 | 4.9 | 4.9 | 4.9 | 4.9 | 4.9 | NA | 1 | 0 |
Italy | 4.4 | 4.4 | 4.4 | 4.4 | 4.4 | 4.4 | NA | 1 | 0 |
Japan | 3.5 | 3.5 | 3.5 | 3.5 | 3.5 | 3.5 | NA | 1 | 0 |
Korea | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | NA | 1 | 0 |
Slovak Republic | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | NA | 1 | 0 |
Slovenia | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | 2.6 | NA | 1 | 0 |
Poland | 2.2 | 2.2 | 2.2 | 2.2 | 2.2 | 2.2 | NA | 1 | 0 |
Greece | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | NA | 1 | 0 |
Estonia | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | NA | 1 | 0 |
Hungary | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | NA | 1 | 0 |
Portugal | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | NA | 1 | 0 |
Turkey | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | NA | 1 | 0 |
Estonia TL3 | NA | NA | NA | NA | NA | NaN | NA | 0 | 0 |