90 KAPITEL 3. BIVARIATE ANALYSE 3.4 Bivariate Datenanalyse in R Beginnen wir mit dem Zusammenhang zwischen einem qualitativem und einem quantitativem Merkmal. Wir wollen das Alter der weiblichem Teilnehmer mit dem Alter der männlichen Teilnehmer vergleichen. Wir haben auf Seite 2.3 die Werte des Merkmals Alter dem Vektor Alter und auf Seite 57 die Werte des Merkmals Geschlecht dem Vektor Geschlecht zugewiesen. Auf Seite 60 haben wir gesehen, wie man aus einem Vektor Komponenten auswählen kann, die bestimmte Bedingungen erfüllen. Wir selektieren mit dieser vorgehensweise das Alter der Frauen > alter.w<-alter[geschlecht=="w"] > alter.w [1] 23 26 31 24 23 25 31 29 28 28 28 38 27 und das Alter der Männer > alter.m<-alter[geschlecht=="m"] > alter.m [1] 30 33 37 28 23 26 32 29 26 37 38 27 aus dem Vektor Alter. Wir können die üblichen Maßzahlen wie Mittelwert, Median, Stichprobenvarianz und Standardabweichung berechnen. > mean(alter.w) [1] 27.76923 > mean(alter.m) [1] 30.5 > median(alter.w) [1] 28 > median(alter.m) [1] 29.5 > var(alter.w) [1] 16.52564 > var(alter.m) [1] 24.27273 > sd(alter.w) [1] 4.065174 > sd(alter.m) [1] 4.926736 Die Boxplots in Abbildung 3.1 auf Seite 67 erstellen wir durch:
3.4. BIVARIATE DATENANALYSE IN R 91 > boxplot(alter.w,alter.m,names=c("frauen","maenner"), horizontal=true) Mit dem Argument horizontal kann man steuern, ob die Boxplots waagerecht oder senkrecht gezeichnet werden sollen. Betrachten wir nun die qualitativen Merkmale Geschlecht und Titanic. Hier können wir bei der Analyse von den Rohdaten oder der Kontingenztabelle ausgehen. Beginnen wir mit den Rohdaten. Wir erzeugen einen Vektor Titanic mit den Werten des Merkmals Titanic. > Titanic<-c("n","j","j","n","n","j","j","n","j","n","j","j", "j","j","j","j","n","j","n","j","j","j","j","j","n") Die Kontingenztabelle erzeugen wir folgendermaßen mit der Funktion table: > h<-table(geschlecht,titanic) > h Titanic Geschlecht m 5 7 w 12 1 Die Variable h ist eine Matrix. Eine Matrix besteht aus Zeilen und Spalten. Die Matrix h besitzt 2 Zeilen und 2 Spalten. Auf Elemente einer Matrix greifen wir wie Vektoren durch Indizierung zu, wobei wir die Informationen, die sich auf Zeilen beziehen, von den Informationen, die sich auf Spalten beziehen, durch Komma trennen. Um auf das Element in der ersten Zeile und zweiten Spalte zuzugreifen, geben wir also ein: > h[1,2] [1] 7 Alle Elemente der ersten Zeile erhalten wir durch > h[1,] 5 7 und alle Elemente der zweiten Spalte durch > h[,2] m w 7 1
92 KAPITEL 3. BIVARIATE ANALYSE Wir können die Häufigkeitstabelle auch direkt als Matrix eingeben. In R erzeugt man eine Matrix mit der Funktion matrix. Der Aufruf der Funktion matrix ist matrix(data,nrow=1,ncol=1,byrow=f) Dabei ist data der Vektor mit den Elementen der Matrix. Das Argument nrow gibt die Anzahl der Zeilen und das Argument ncol die Anzahl der Spalten der Matrix an. Standardmäßig wird eine Matrix spaltenweise eingegeben. Sollen die Zeilen aufgefüllt werden,so muss das Argument byrow auf den Wert TRUE gesetzt werden. Wir geben also ein > h<-matrix(c(5,12,7,1),2,2) > h [,1] [,2] [1,] 5 7 [2,] 12 1 Wir sehen, dass die Dimensionen der Matrix keine Namen haben. Wir weisen den Dimensionen von h mit der Funktion dimnames Namen zu. Der Aufruf von dimnames für eine Matrix mat ist dimnames(mat)<-list(zn,sn) Dabei sind ZN und SN Vektoren mit den Namen der Zeilen beziehungsweise Spalten der Matrix mat. In der Regel werden dies Vektoren sein, die Zeichenketten enthalten. Die Funktion list verbindet ihre Argumente zu einer Liste. Eine Liste besteht aus Komponenten, die unterschiedliche R-Objekte sein können. In einer Liste kann man zum Beispiel Vektoren und Matrizen zu einem Objekt zusammenfassen. Schauen wir uns dies für das Beispiel an. Folgender Aufruf ordnet den Dimensionen von h die entsprechenden Namen zu: > dimnames(h)<-list(c("m","w"),c("j","n")) > h m 5 7 w 12 1 Wir wollen nun die Randhäufigkeiten bestimmen. Hierzu verwenden wir die Funktion apply. Der allgemeine Aufruf von apply ist
3.4. BIVARIATE DATENANALYSE IN R 93 apply(x, MARGIN, FUN) Dabei sind X die Matrix und MARGIN die Dimension der Matrix, bezüglich der die Funktion angewendet werden soll. Dabei steht 1 für die Zeilen und 2 für die Spalten. Das Argument FUN ist der Name der Funktion, die auf MARGIN von X angewendet werden soll. Um den Vektor der Zeilensummen von h zu erhalten, geben wir also ein: > apply(h,1,fun=sum) m w 12 13 Den Vektor der Spaltensummen erhalten wir durch > apply(h,2,fun=sum) 17 8 Um die bedingten relativen Häufigkeiten zu erhalten, verwenden wir die Funktion sweep. Der Aufruf von sweep für eine Matrix ist sweep(m, MARGIN, STATS, FUN) Dabei sind M die Matrix und MARGIN die Dimension der Matrix, bezüglich der die Funktion angewendet werden soll. Dabei steht 1 für die Zeilen und 2 für die Spalten. Das Argument STATS ist ein Vektor, dessen Länge der Größe der Dimension entspricht, die im Argument MARGIN gewählt wurde, und das Argument FUN ist der Name der Funktion, die auf MARGIN von M angewendet werden soll. Standardmäßig wird die Subtraktion gewählt. Die Funktion sweep bewirkt, dass die Funktion FUN angewendet wird, um die Komponenten des Vektors aus der gewählten Dimension von M im wahrsten Sinne des Wortes herauszufegen. Die Matrix der auf die Zeilen bedingten relativen Häufigkeiten erhält man also durch: > h.bz<-sweep(h,1,apply(h,1,fun=sum),fun="/") > h.bz j n m 0.4166667 0.58333333 w 0.9230769 0.07692308
94 KAPITEL 3. BIVARIATE ANALYSE Die Matrix der auf die Spalten bedingten relativen Häufigkeiten erhält man analog durch: > h.bs<-sweep(h,2,apply(h,2,fun=sum),fun="/") > h.bs m 0.2941176 0.875 w 0.7058824 0.125 Das vergleichende Paretodiagramm in Abbildung 3.3 auf Seite 71 erhalten wir folgendermaßen mit Hilfe der Funktion barplot: > h.bz<-h.bz[c(2,1),] > barplot(t(h.bz),legend.text=c("j","n"),col=1:2,beside=t, names.arg=c("frauen","maenner")) Hierbei wird die Matrix m durch den Befehl t(m) transponiert. Es werden also Zeilen und Spalten der Matrix vertauscht. Dies ist nötig, da die Funktion barplot die bedingten Verteilungen in den Spalten erwartet. Das Argument legend.text erstellt eine Legende der Merkmalsausprägungen des interessierenden Merkmals. Durch das Argument col werden die farben für die Säulen festgelegt. Das Argument beside zeichnet die Säulen nebeneinander, wenn es auf TRUE steht. Das vergleichende Paretodiagramm in Abbildung 3.4 auf Seite 72 erhalten wir durch folgende Befehlsfolge: > wahl<-matrix(c(13,55,10,30,3,20,11,24,5,24,23,35),2,6) > partei<-c("cdu","spd","fdp","gruene","keine","weiss nicht") > dimnames(wahl)<-list(geschlecht=c("w","m"),wahl=partei) > h<-sweep(wahl,1,apply(wahl,1,fun=sum),fun="/") > o<-rev(order(h[1,])) > barplot(t(h[,o]),legend.text=partei[o],col=1:6,beside=t, names.arg=c("w","m")) Hier muss noch der Befehl o<-rev(order(wahl[1,])) kommentiert werden. Hier werden zwei bisher unbekannte Funktionen verwendet. Für einen numerischen Vektor v liefert der Aufruf
3.4. BIVARIATE DATENANALYSE IN R 95 order(v) einen Vektor, dessen i-te Komponente angibt, an der wievielten Stelle das i-t kleinste Element im Vektor steht. Für den Vektor > v [1] 7 4 6 3 5 liefert der Aufruf > order(v) folgendes Ergebnis [1] 4 2 5 3 1 Mit der Funktion order können wir sowohl die bedingten relativen Häufigkeiten als auch die Namen der Merkmalsausprägungen in die richtige Ordnung bringen. Wir müssennur berücksichtigen, dass wir mit dem gröss ten Element beginen müssen. Der Aufruf rev(v) bringt die Elemente des Vektors v in die umgekehrte Reihenfolge. > rev(v) [1] 5 3 6 4 7 Die Abbildung 3.5 auf Seite 73 erhalten wir durch folgende Befehlsfolge: > barplot(h[,o],legend.tex=c("w","m"),col=1:2,beside=t, names.arg=partei[o]) Abbildung 3.6 auf Seite 74 erhalten wir durch folgende Befehle > Titanic<-c("n","j","j","n","n","j","j","n","j","n","j","j", "j","j","j","j","n","j","n","j","j","j","j","j","n") > Geschlecht<-c("m","w","w","m","m","m","w","m","w","m","w", "m","m","w","w","m","m","m","w","w","w","w","w","w","m") > h<-table(geschlecht,titanic) > mosaicplot(h,main="")
96 KAPITEL 3. BIVARIATE ANALYSE Schauen wir uns den Zusammenhang zwischen quantitativen Merkmalen an. Wir betrachten das Beispiel 17 auf Seite 75 und erzeugen in R die Variablen Flaeche und Miete: > Miete<-c(530,520,420,500,440,650) > Flaeche<-c(55,40,30,23,26,45) Das Streudiagramm in Abbildung 3.9 auf Seite 76 erhält man durch: > plot(flaeche,miete) Den Wert der Kovarianz zwischen den Merkmalen Fäche und Miete liefert die Funktion var: > var(flaeche,miete) [1] 610 R verwendet bei der Bestimmung der Kovarianz folgende Formel: d x,y = 1 n 1 n (x i x) (y i y) i=1 Den Wert des Korrelationskoeffizienten zwischen den Merkmalen Fäche und Miete liefert die Funktion cor: > cor(flaeche,miete) [1] 0.6065908 Um den Korrelationskoeffizienten von Spearman für die Merkmale Fäche und Miete bestimmen zu können, benötigt man zuerst die Ränge der Beobachtungen bei beiden Merkmalen. Diese erhält man mit der Funktion rank. > rank(flaeche) [1] 6 4 3 1 2 5 Wendet man die Funktion cor auf die Ränge an, so erhält man den Korrelationskoeffizienten von Spearman: > cor(rank(flaeche),rank(miete)) [1] 0.7142857