R Einführung Grundlagen Netzwerkanalyse Michael Kronenwett [email protected] Universität Trier 2012 Michael Kronenwett, Universität Trier, 2012 Was ist „R“? ● Eine Arbeitsumgebung mit statistischem Schwerpunkt ● Eine Programmiersprache ● Open-Source ● Homepage: http://www.r-project.org Michael Kronenwett, Universität Trier, 2012 RStudio ● ● RStudio ist eine grafische Benutzeroberfläche für R. (http://rstudio.org/) Starten von RStudio... Michael Kronenwett, Universität Trier, 2012 RStudio Unser R Skript Die R Console Michael Kronenwett, Universität Trier, 2012 Workspace Dokumentation Syntax ● Was sind die Vorteile? ● Was sind die Nachteile? Michael Kronenwett, Universität Trier, 2012 Skripteingabe ● Geben Sie das Folgende ein: ● 4+3+2.5 ● 12*13 ● 5*pi ● Markieren Sie die Zeile (per Maus oder per Strg+A) ● Klicken Sie auf „Run“ Michael Kronenwett, Universität Trier, 2012 Skripteingabe ● Übungen ● 4+3+2.5 – Wichtig: Anstatt Dezimalkomma verwenden wir Dezimalpunkt – Ausgabe: [1] 9.5 – [1]: Ein Ergebnis, das aus einem Element besteht – 9.5: Unser Ergebnis – Ein solches Ergebnis wird Skalar genannt. ● 30/5 ● (5*2)+100 ● ... Michael Kronenwett, Universität Trier, 2012 ● Variablen ● Variablen sind Platzhalter für Werte ● Geben Sie folgendes in die Konsole ein: alter <- 72 – Wir weißen der Variablen „alter“ mit dem Zeichen „<-“ den Wert „72“ zu. Erlaubte Zeichen: alter.der.person ● Nicht erlaubte Zeichen: Leerzeichen und alter_der_person Mit Variablen kann auch gerechnet werden: ● ● – Z.B. brutto <- netto *1.19 Michael Kronenwett, Universität Trier, 2012 Variablen ● ● Übung: Eine Person bestellt 5 Kuchenstücke. Ein Kuchenstück kostet 2,10€. Wie viel muss die Person bezahlen? Berechnen Sie den Endpreis mithilfe von Variablen. Michael Kronenwett, Universität Trier, 2012 Variablen ● ● Übung: Eine Person bestellt 5 Kuchenstücke. Ein Kuchenstück kostet 2,10€. Wie viel muss die Person bezahlen? Berechnen Sie den Endpreis mithilfe von Variablen. > kuchen.preis <- 2.10 > kuchen.anzahl <- 5 > preis <- kuchen.preis * kuchen.anzahl > preis [1] 10.5 Michael Kronenwett, Universität Trier, 2012 Vektor ● Mehrere Werte können in einem Vektor gespeichert werden. ● Bsp.: Das Alter von 3 Personen speichern: ● alter.personen <- c(43, 21, 53) ● c(): concatenate / „Aneinanderhängen“ ● Ist eine Funktion: – Funktionsname(Argument1, Argument2,...,Option1=..., Option2=...) – oder – Funktionsname(Argument1=Wert1, Argument2=Wert2, Option1=Wert3,...) Michael Kronenwett, Universität Trier, 2012 Vektor ● R stellt eine Hilfe-Funktion bereit. Geben Sie hierfür folgendes in die Konsole ein: ● help() ● help(c) Michael Kronenwett, Universität Trier, 2012 Vektor ● a <- c(2, 4, 5.5, 6) ● geschlecht<-factor(c("m","m","w","m","w","w")) ● Anzahl der Elemente ausgeben: length(a) ● Summe über alle Elemente bilden: sum(a) ● Multiplizieren: a*10 > a <- c(2, 4, 5.5, 6) >a [1] 2.0 4.0 5.5 6.0 > length(a) [1] 4 > sum(a) [1] 17.5 > a*10 [1] 20 40 55 60 > b <- a*10 >b [1] 20 40 55 60 Michael Kronenwett, Universität Trier, 2012 Vektor ● Weitere Beispiele: ● ● ● 5 Personen kaufen eine unterschiedliche Anzahl Kuchenstücke. Peter: 3 Stücke, Anna: 2 Stücke, Frau Müller: 4 Stücke, Karl: 1 Stück und Christina: 3 Stücke Ein Kuchenstück kostet 2,10€. Wie viel haben alle Personen zusammen gezahlt? Michael Kronenwett, Universität Trier, 2012 Vektor ● Beispiel: ● 5 Personen kaufen eine unterschiedliche Anzahl Kuchenstücke. Peter: 3 Stücke, Anna: 2 Stücke, Frau Müller: 4 Stücke, Karl: 1 Stück und Christina: 3 Stücke ● Ein Kuchenstück kostet 2,10€. Wie viel haben alle Personen zusammen gezahlt? > kuchen.stuecke <- c(3,2,4,1,3) > preis <- kuchen.stuecke*2.10 > sum(preis) [1] 27.3 Michael Kronenwett, Universität Trier, 2012 Vektor Weitere Berechnungsmöglichkeiten: ● 2 Vektoren miteinander multiplizieren: > a <- c(2, 4, 5.5, 6) > b <- c(100,200) > a*b [1] 200 800 550 1200 Bei unterschiedlich langen Vektoren wird der kürzere Vektor so oft durch gegangen, bis alle Elemente des größeren Vektors abgearbeitet wurden. Michael Kronenwett, Universität Trier, 2012 Matrix ● Was ist eine Matrix? a a a a 11 21 ... 12 ... 22 a a 1j 2j ... a i1 a ... i2 a ij Anwendung: Wenn wir mehrere Fällen haben, für die mehre Merkmale vorliegen. Michael Kronenwett, Universität Trier, 2012 Matrix Merkmal ... (z.B. Alter) Fall Person 1 Person 2 34 69 Merkmal ... ... a a 1j 2j ... Person i 77 ... a ij Anwendung: Wenn wir mehrere Fällen haben, für die mehre Merkmale vorliegen. Michael Kronenwett, Universität Trier, 2012 Matrix ● Wie erstellen wir eine Matrix? ● ...mit der matrix-Funktion ● help(matrix) > ein.vektor <- c(100,200,20,30,50,120) > eine.matrix <- matrix(ein.vektor,2,3) > eine.matrix [,1] [,2] [,3] [1,] 100 20 50 [2,] 200 30 120 > dim(eine.matrix) [1] 2 3 Michael Kronenwett, Universität Trier, 2012 Vektor / Matrix Auf einzelne Elemente innerhalb eines Vektors zugreifen: ● Vektor[Position] ● a[1] gibt das erste Element aus ● a[3] gibt das dritte Element aus... ● ● a[-3] gibt alle Elemente aus, außer das Element, das sich an der dritte Position befindet a[1:3] gibt das erste, das dritte und alle Elemente dazwischen aus. ● a[c(1,3)]: gibt das erste und das dritte Element aus ● a[5] <- 4 : Schreibe den Wert „4“ an die 5. Position Michael Kronenwett, Universität Trier, 2012 Vektor / Matrix Auf einzelne Elemente innerhalb einer Matrix zugreifen: ● Matrix[Zeile,Spalte] ● m[,1]: Erste Spalte ausgeben ● m[2,]: Zweite Zeile ausgeben ● m[2,2] <- 1 : In die zweite Zeile / zweite Spalte, den Wert „1“ schreiben Michael Kronenwett, Universität Trier, 2012 Filtern und Selektieren von Daten ● Logische Bedingungen: ● >, <, ==, <=, >=, != ein.vektor <- c(100,200,20,30,50,120) ein.vektor < 100 [1] FALSE FALSE TRUE TRUE TRUE FALSE Wir bekommen als Ergebnis einen logischen Vektor. Damit wir alle Werte ausgeben können, die kleiner 100 sind, machen wir nun folgendes: > kleiner.hundert <- ein.vektor<100 > kleiner.hundert [1] FALSE FALSE TRUE TRUE TRUE FALSE > ein.vektor[kleiner.hundert] [1] 20 30 50 Michael Kronenwett, Universität Trier, 2012 Filtern und Selektieren von Daten ● Logische Operatoren: ● & = UND ● | = ODER ● ! = NOT alter[kleiner.hundert & geschlecht=="w"] [1] 19 32 alter[kleiner.hundert | geschlecht=="w"] [1] 19 30 32 50 Michael Kronenwett, Universität Trier, 2012 Schleifen for (cc in 1:10){ print(cc) } #Einzelne Werte eines Vektors per Schleife ausgeben v <- c("Hans", "Peter", "Karl") for (cc in 1:3){ print(v[cc]) } Michael Kronenwett, Universität Trier, 2012 Daten einlesen ● Vorhandene Daten aus einer Datei einlesen: ● read.table ● help(read.table) Michael Kronenwett, Universität Trier, 2012 Daten einlesen ● read.table("dateiname") ● ● ● Warum csv2 und nicht csv? Wo befinden wir uns? ● getwd() ● Ort ändern: setwd(„c:\\pfad““) schulnoten <- read.table("Schulnote.txt") > schulnoten <- read.table("Schulnote.txt") > is.vector(schulnoten) [1] FALSE > names(schulnoten) [1] "V1" Michael Kronenwett, Universität Trier, 2012 Data-Frame ● ● ● Ein Data-Frame fasst mehrer Datentypen (z.B. Vekoren, Matrizen) zusammen. summary(data-frame-name) Zugriff auf die einzelnen Variablen: data.frame$variable > schulnoten$V1 [1] 2 3 2 3 2 2 3 2 3 1 2 3 3 3 3 3 4 4 3 1 3 1 4 3 2 3 2 3 3 2 Michael Kronenwett, Universität Trier, 2012 Data-Frame ● Mehrere Vektoren einlesen und in ein DataFrame packen: #Schulnoten aus Datei einlesen schulnoten <- read.table("Schulnote.txt") #... : Kennzeichnet eine Kommentarzeile! #Geschlecht aus Datei einlesen geschlecht<-read.table("Geschlecht.txt") Vorteil: - Erhöht die Lesbarkeit - Erhöht die Nachvollziehbarkeit #neue Vektoren anlegen schulnotev <- as.vector(schulnoten$V1) geschlechtv <- as.vector(geschlecht$V1) #neues Data-Frame anlegen daten<-data.frame(geschlechtv,schulnotev) Michael Kronenwett, Universität Trier, 2012 So oft wie möglich verwenden! Daten schreiben ● Einen Vektor schreiben: ● write(geschlechtv, "test.txt", 1) – ● Was bewirkt die „1“ ? Einen Data-Frame schreiben: ● write.table(daten, "test_daten.txt") Michael Kronenwett, Universität Trier, 2012 Pause http://www.hradetzky-naturfotografie.de/wp-content/uploads/2011/11/1883_bergnovember.jpg Michael Kronenwett, Universität Trier, 2012 Netzwerkanalyse mit R ● Funktionalität von R erweitern: ● Pakete („Packages“) einbinden 1. Paket installieren ● ● ● ● – RStudio: „Packages“ → „Install Packages“ „Packages“ → „Search“ Feld Paket aktivieren Per R Syntax: install.packages("network") Paket: „network“ (Butts/Hunter) Michael Kronenwett, Universität Trier, 2012 Netzwerkanalyse mit R ● Funktionalität von R erweitern: ● Pakete („Packages“) einbinden 2. Paket verwenden ● library(network) Michael Kronenwett, Universität Trier, 2012 Netzwerkanalyse mit R ● Und jetzt? ● help(network) ● http://www.jstatsoft.org/v24/i02/paper Michael Kronenwett, Universität Trier, 2012 Netzwerkanalyse mit R net <- network.initialize(5) #Netzwerk mit 5 Knoten initialisieren net plot(net) #Netzwerkgraph ausgeben add.edge(net, 2, 5) #Kante einfügen net[3,2] <- 1 #Kante einfügen net[,2] <- 1 #Kanten einfügen net[,] #Netzwerk in Matrixform ausgeben delete.edges(net, 1) Michael Kronenwett, Universität Trier, 2012 Netzwerkdaten laden ● ● net <- read.paj("D:\\unitrier\\Workshop\\SummerschoolTrier2012\\Uebung_Gesamtnetzwerk\\Uebungsdateien\\GNU R Daten und Syntax\\Schulklasse.net") net[,] Michael Kronenwett, Universität Trier, 2012 Netzwerkanalyse mit R library(network) #Netzwerk laden net <- read.paj(„pfad“) #Zusammenfassung allg. Netzwerkdaten summary(net) #Beziehungsmatrix anzeigen net[,] Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen ● Weiteres Paket einbinden: sna Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen #Degree degreev <- degree(net) #Betweenness betweennessv <- betweenness(net) #Dyadenzensus dyad.census(net) #Triadenzensus triad.census(net) Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen #Zentralisierung centralization(net, g=1, degree, cmode="indegree") help(centralization) … Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen #Degree degreev <- degree(net) #Betweenness betweennessv <- betweenness(net) #Dyadenzensus dyad.census(net) #Triadenzensus triad.census(net) Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen Wasserman & Faust, S. 566 Michael Kronenwett, Universität Trier, 2012 Akteursattribute laden #Akteursattribute einlesen: Geschlecht geschlecht <- read.table("...Geschlecht.txt") geschlechtv <- as.vector(geschlecht$V1) #Akteursattribute einlesen: Schulnoten schulnoten <- read.table("...Schulnote.txt") schulnotenv <- as.vector(schulnoten$V1) Michael Kronenwett, Universität Trier, 2012 Netzwerkmaßzahlen berechnen name <- network.vertex.names(net) size <- network.size(net) for(cc in 1:size){ print( c(name[cc], degree(net, nodes=cc, cmode="indegree") , degree(net, nodes=cc, cmode="outdegree")) ) } #eine andere Formatierung for(cc in 1:size){ print( c( name[cc], degree(net, nodes=cc, cmode="indegree") , degree(net, nodes=cc, cmode="outdegree") ) ) } Michael Kronenwett, Universität Trier, 2012 Netzwerke zeichnen #Netzwerkgraph zeichnen plot.network(net) help(plot.network) Michael Kronenwett, Universität Trier, 2012 Netzwerke zeichnen #Netzwerkgraph zeichnen, Knotengroesse abhaengig von Betweenness-Wert plot(net, vertex.cex=betweennessv) #Normalisieren betweennessv_n <- betweennessv / 100 #Netzwerkgraph zeichnen, Knotengroesse abhaengig von Betweenness-Wert plot(net, vertex.cex=betweennessv_n) #Netzwerkgraph zeichnen, Knotenfarbe abhaengig vom Geschlecht plot(net, vertex.cex=2, vertex.col=geschlechtv) #Netzwerkgraph zeichnen, Knotenfarbe abhaengig vom Geschlecht plot(net, vertex.cex=schulnotenv, vertex.col=geschlechtv) Michael Kronenwett, Universität Trier, 2012 Netzwerke zeichnen Ein anderes Layout für den Netzwerkgraph wählen: ● help(gplot.layout) Michael Kronenwett, Universität Trier, 2012 Netzwerke zeichnen #Circle-Layout plot(net, vertex.cex=schulnotenv, vertex.col=geschlechtv, coord=gplot.layout.circle(net)) #Fruchtermanreingold plot(net, vertex.cex=schulnotenv, label=network.vertex.names(net), vertex.col=geschlechtv, coord=gplot.layout.fruchtermanreingold(net,NULL)) Michael Kronenwett, Universität Trier, 2012 Literatur ● ● Dolic (2004) Statistik mit R, Oldenburg Verlag, München. Wasserman & Faust (1994) Social Network Analysis, Cambridge University Press, Cambridge. Michael Kronenwett, Universität Trier, 2012