OECD Wellbeing - Explorative Analyse

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