Juni 2019
Band 34, Nummer 6
[Künstlich Intelligent]
Untersuchen von Daten mit R
Von Frank La La | Juni 2019 | Code abrufen
Seit der allerersten Kolumne zur Rubrik „Künstlich intelligent“ waren alle Codebeispiele, die ich zur Verfügung gestellt habe, in Python geschrieben. Denn Python gilt zurzeit als die Sprache von Data Science und KI. Aber nicht ausschließlich: Sprachen wie Scala und R haben in diesem Bereich ebenfalls einen hohen Stellenwert. Für Entwickler, die sich fragen, warum sie eine weitere Programmiersprache erlernen sollten: R weist einzigartige Aspekte auf, die mir auf meinem Berufsweg, der bisher Java, C#, Visual Basic, Python und Perl umfasst, nirgendwo sonst begegnet sind. Da R eine Sprache ist, die Lesern wahrscheinlich im Bereich von Data Science begegnen wird, denke ich, dass es sich lohnt, sie hier zu untersuchen.
R selbst ist eine Implementierung der Programmiersprache S, die in den 1970er Jahren für die statistische Verarbeitung bei Bell Labs entwickelt wurde. S wurde entwickelt, um Entwicklern, die damals mit Fortran für die statistische Verarbeitung gearbeitet haben, eine interaktive Erfahrung zu bieten. Auch wenn wir interaktive Programmierumgebungen heute als selbstverständlich voraussetzen, war das Konzept damals revolutionär.
R wurde 1992 von Ross Ihaka und Robert Gentleman an der University of Auckland (Neuseeland) konzipiert. Der Name leitet sich von der ersten Initiale seiner Schöpfer ab und verweist auch spielerisch auf den Namen S. Version 1.0.0 von R wurde im Jahr 2000 veröffentlicht und erfreut sich seitdem einer breiten Akzeptanz in Forschungsabteilungen, was zum Teil auf die breite Palette der integrierten statistischen Algorithmen zurückzuführen ist. R lässt sich auch über Funktionen und Erweiterungspakete leicht erweitern.
Rund um R hat sich eine stabile Entwicklergemeinde gebildet, wobei CRAN (Comprehensive R Archive Network) das beliebteste Repository für R-Pakete ist. CRAN verfügt über verschiedene Pakete, die von der bayesschen Vorhersage bis hin zur Spektralverarbeitung für die hochauflösende Durchflussinfusions-Massenspektrometrie reichen. Eine vollständige Liste der in CRAN verfügbaren R-Pakete finden Sie online unter bit.ly/2DGjuEJ. Es genügt zu sagen, dass R und CRAN robuste Tools für alle Data Science- und wissenschaftlichen Forschungsprojekte bereitstellen.
Erste Schritte mit R
Der vielleicht schnellste Weg, R-Code auszuführen, ist über ein Jupyter Notebook in Azure Notebook Service. Informationen zu Jupyter Notebooks finden Sie in meinem Artikel vom Februar 2018 zu diesem Thema unter msdn.com/magazine/mt829269. Achten Sie jedoch dieses Mal darauf, dass Sie beim Erstellen eines neuen Notebooks R als Sprache auswählen. Das R-Logo sollte oben rechts im Browserfenster angezeigt werden. Geben Sie den folgenden Code in eine leere Zelle ein, und führen Sie ihn aus:
# My first R code
print("hello world")
x <- 3.14
y = 1.21
x
y
Die Ausgabe sollte den traditionellen Gruß „hello world“ sowie die Werte 3,14 und 1,21 enthalten. Nichts davon sollte für einen Softwareentwickler neuartig oder einzigartig sein. Beachten Sie, dass der Zuweisungsoperator auch „<-“ sein kann und nicht nur das häufiger verwendete Gleichheitszeichen. Beide Operatoren haben syntaktisch die gleiche Bedeutung. Beachten Sie auch, dass das Zeichen # einen Kommentar einleitet und für den Rest der Zeile gilt.
Vektoren sind eindimensionale Arrays, die numerische Daten, Zeichendaten oder logische Daten enthalten können. Sie werden mit der c-Funktion erstellt. Das c steht für „combine“ (kombinieren). Geben Sie den folgenden Code in eine neue Zelle ein, und führen Sie ihn aus:
num_vec <- c(1,2,3.14) # numeric vector
char_vec <- c("blog","podcast","livestream") # character vector
bool_vec <- c(TRUE,TRUE,FALSE) #logical vector
#print out values
num_vec
char_vec
bool_vec
Die angezeigten Werte sollten mit den im Code festgelegten Werten übereinstimmen. Sie fragen sich vielleicht, ob Vektoren gemischte Typen enthalten können. Geben Sie den folgenden Code in eine neue Zelle ein:
mix_vec <- c(1,"lorem ispum",FALSE)
mix_vec
Während der Code ausgeführt wird, werden scharfsichtige Leser einfache Anführungszeichen um jedes Element im Vektor bemerken. Dies gibt an, dass die Werte in Zeichenwerte konvertiert wurden. R verwendet die Funktion „typeof“, um den Typ einer bestimmten Variablen zu überprüfen. Geben Sie den folgenden Code zum Überprüfen der Vektoren ein, die bereits erstellt wurden:
typeof(num_vec)
typeof(char_vec)
typeof(bool_vec)
typeof(mix_vec)
Eine weitere nützliche Funktion ist „ls“, die alle Objekte der aktuellen Arbeitsumgebung anzeigt. Geben Sie „ls()“ in eine neue Zelle ein, führen Sie die Funktion aus, und beachten Sie, dass die Ausgabe die vier soeben definierten Vektoren sowie die in der ersten Zelle definierten Variablen x und y enthält.
Arbeiten mit Daten
Die beste Möglichkeit, die wahre Leistungsfähigkeit und Eleganz der R-Sprache zu erfahren, ist die Untersuchung und Manipulation von Daten. R erleichtert das Laden von Datasets und vermittelt schnell ein Verständnis für deren Dimensionen, Struktur und statistische Eigenschaften. Für die nächsten Beispiele verwende ich ein Dataset, das mir vertraut und lieb ist: grundlegende Statistiken zu meinen Bloggeraktivitäten. Ich betreibe und betreue seit 2004 einen Technologieblog und habe grundlegende Statistiken darüber geführt, wie oft ich jeden Monat Beiträge veröffentlicht habe. Darüber hinaus habe ich die Anzahl der Tage in jedem Monat und den durchschnittlichen Wert für Posts pro Tag (Post Per Day, PPD) hinzugefügt. PPD ist die Anzahl von Beiträgen in einem bestimmten Monat, dividiert durch die Anzahl der Tage in diesem Monat. Ich haben die CSV-Datei in der Projektbibliothek in Azure Notebook Service unter bit.ly/2V76d2G gespeichert.
Geben Sie den folgenden Code in eine neue Zelle ein, um die Daten in einen R-DataFrame (eine tabellarische Datenstruktur mit Spalten für Variablen und Zeilen für Beobachtungen) zu laden, und zeigen Sie die ersten sechs und die letzten drei Datensätze mit den head- bzw. tail-Funktionen an:
postData <- read.csv(file="franksworldposts.csv", header=TRUE, sep=",")
head(postData)
tail(postData, 3)
Mit der str-Funktion kann ich die grundlegende Struktur und die Datentypen des DataFrame anzeigen. Geben Sie den folgenden Code in eine neue Zelle ein:
str(postData)
Die Ausgabe sollte zeigen, dass der DataFrame 183 Beobachtungen oder Zeilen aufweist und aus vier Variablen oder Spalten besteht. Die Variablen Posts und Days.in.Month sind Integerwerte, während PPD ein numerischer Typ ist. Die Variable Month ist ein Faktor mit 183 Stufen, wobei der Faktor ein Datentyp ist, der kategorischen Variablen in der Statistik entspricht. Faktoren sind das funktionale Äquivalent zu kategorischen Daten in Python Pandas und können entweder Zeichenfolgen oder Integerwerte sein. Sie eignen sich ideal für Variablen mit einer begrenzten Anzahl von eindeutigen Werten oder (in R-Terminologie) Stufen. In diesem DataFrame stellt das Feld Month einen Monat zwischen Februar 2004 und April 2019 dar. Da sich Datumsangaben nicht wiederholen, gibt es keine doppelten kategorischen Werte.
Da meine Daten nun geladen sind, kann ich sie sortieren und abfragen, um sie weiter zu untersuchen. Vielleicht kann ich einige Erkenntnisse daraus gewinnen. Wenn ich zum Beispiel die 10 besten Monate anzeigen möchte, in denen ich in meinem Blog am produktivsten war, könnte ich eine absteigende Sortierung für die Spalte Posts durchführen. Geben Sie zu diesem Zweck den folgenden Code in eine neue Zelle ein, und führen Sie ihn aus:
sortedPostData <- postData[order(-postData$Posts),]
head(sortedPostData, 10)
Die 10 aktivsten Monate liegen alle innerhalb der letzten drei Jahre. Um das Dataset weiter zu untersuchen, kann ich einen Filtervorgang durchführen, um festzustellen, in welchen Monaten 100 oder mehr Beiträge veröffentlicht wurden. In R übernimmt die subset-Funktion genau das. Geben Sie den folgenden Code ein, um diesen Filter anzuwenden, und weisen Sie die Ausgabe einem neuen DataFrame namens over100 zu:
over100 <- subset(postData, subset = Posts >= 100)
over100
Die Ergebnisse sehen ähnlich wie die vorherige Ausgabe für die besten 10 Monate aus. Um die Anzahl der Zeilen zu überprüfen, verwenden Sie die Funktion nrow, um die Anzahl der Zeilen im DataFrame wie folgt zu zählen:
nrow(over100)
Die Ausgabe zeigt an, dass es 11 Zeilen gibt, in denen es in einem bestimmten Monat 100 oder mehr Blogbeiträge gab. Mit 100 Beiträgen verfehlt der Mai 2005 knapp die 10 aktivsten Monate und nimmt Platz 11 ein. Das Überschreiten des Schwellenwerts von 100 Beiträgen pro Monat war ein Meilenstein, den ich 11 Jahre lang nicht mehr erreichen würde. Gibt es ein Muster für die Intensität des Blogs und die Abnahme und Zunahme von Beiträgen? Untersuchen wir die Daten weiter.
Jetzt wäre ein guter Zeitpunkt, um herauszufinden, wie einzelne Zeilen und Spalten in einem DataFrame angezeigt werden. Um beispielsweise die erste Zeile im DataFrame anzuzeigen, geben Sie den folgenden Code ein, um den Inhalt der gesamten Zeile anzuzeigen:
postData[1,]
Beachten Sie, dass der Index für den DataFrame bei 1 beginnt und nicht bei 0, wie in den meisten anderen Programmiersprachen. Um nur das Feld Posts für die erste Zeile anzuzeigen, geben Sie den folgenden Code ein:
postData[1,2]
Um alle Werte im Feld Posts anzuzeigen, verwenden Sie die folgende Codezeile:
postData[,2]
Alternativ können Sie auch die folgende Syntax verwenden, um die Spalten anhand ihres Namens anzuzeigen. Geben Sie die folgende Codezeile ein, und bestätigen Sie, dass ihre Ausgabe mit der Ausgabe aus der vorherigen Zeile übereinstimmt:
postData$Posts
Da R seine Wurzeln in der statistischen Verarbeitung hat, gibt es viele integrierte Funktionen, um die grundlegende Form und die Eigenschaften der Daten anzuzeigen. Verwenden Sie den folgenden Code, um ein besseres Verständnis der Daten in der Spalte Post zu erhalten:
mean(postData$Posts)
max(postData$Posts)
min(postData$Posts)
summary(postData$Posts)
Vergleichen Sie dies nun mit der Spalte PPD:
mean(postData$PPD)
max(postData$PPD)
min(postData$PPD)
summary(postData$PPD)
Aus den Daten ersehen wir, dass die Anzahl der Beiträge von einem Beitrag pro Monat bis zu 225 Beiträgen im Laufe von 15 Jahren variiert. Und wenn ich nur das erste Jahr untersuchen möchte? Geben Sie den folgenden Code ein, um nur die Datensätze für das erste Jahr der Blogtätigkeit anzuzeigen, zusammen mit statistischen Zusammenfassungen für die Felder Post und PPD:
postData[1:12,]
summary(postData[1:12,2]) # Posts
summary(postData[1:12,4]) # PPD
Während die Zahlen hier bereits eine Geschichte erzählen, verrät ein Diagramm sehr oft mehr über Trends und Muster. Glücklicherweise verfügt R über umfangreiche integrierte Funktionen für die grafische Darstellung. Sehen wir uns diese Funktionen näher an.
Visualisieren von Daten
Das Erstellen von Diagrammen ist in R sehr einfach und kann mit einer einzigen Zeile Code erfolgen. Beginnen wir, indem wir die Beitragszahlen und PPD-Werte für das erste Jahr verwenden. Dies ist der zugehörige Code:
plot(postData[1:12,2], xlab="Month Index", ylab="Posts",
main="Posts in the 1st Year")
plot(postData[1:12,4], xlab="Month Index", ylab="PPD",
main="PPD in the 1st Year")
Die Ausgabe sollte Abbildung1 ähneln.
Abbildung 1: Grafische Darstellung der Spalten Posts und PPD
Für das erste Jahr des Bloggens zeigt das Diagramm, dass die Beitragsaktivität im ersten Jahr stetig gewachsen ist, mit einer steilen Wachstumskurve zwischen dem dritten und sechsten Monat. Nach einer Abnahme im Spätsommer fand das Jahr 2004 einen starken Abschluss. Außerdem zeigen die Diagramme, dass es eine hohe Korrelation zwischen der Anzahl der Beiträge in einem Monat und der Anzahl der Beiträge pro Tag gibt. Dies mag zwar intuitiv erkennbar sein, aber es ist interessant, diese Tatsache in grafischer Form darzustellen.
Nun möchte ich ein Diagramm der Blogbeiträge für die gesamten 15 Jahre anzeigen und untersuchen, ob sich ein Muster über einen längeren Zeitraum ergibt. Geben Sie den folgenden Code ein, um den gesamten Zeitraum grafisch darzustellen:
plot(postData[,2], xlab="Month Index", ylab="Posts",
main="All Posts")
Die Ergebnisse, die in Abbildung 2 dargestellt werden, zeigen einen klaren Trend, wenn nicht sogar ein genau definiertes Muster. Die Bloggeraktivität begann mit recht vielen Beiträgen, ging aber stetig zurück und nahm vor rund 30 Monaten wieder zu. Der Trend der letzten Zeit geht deutlich nach oben. Es gibt auch den einen signifikanten Ausreißer.
Abbildung 2: Beiträge in 15 Jahren
Korrelationsmatrix
Vorhin habe ich eine Korrelation zwischen den Spalten Posts und PPD festgestellt. R verfügt über eine integrierte Funktion zum Anzeigen einer Korrelationsmatrix, d.h. einer Tabelle, die Korrelationskoeffizienten zwischen Variablen darstellt. Jede Zelle in der Tabelle zeigt die Korrelation zwischen zwei Variablen an.
Eine Korrelationsmatrix fasst Daten schnell zusammen und zeigt Beziehungen zwischen Variablen. Werte, die näher an 1 liegen, besitzen eine hohe Korrelation, während Werte, die näher an 0 liegen, eine niedrige Korrelation aufweisen. Negative Werte geben eine negative Korrelation an. Um die Korrelationsmatrix für den postData-DataFrame anzuzeigen, ist es zunächst notwendig, die numerischen Felder in einem eigenen DataFrame zu isolieren und dann die cor-Funktion aufzurufen. Geben Sie den folgenden Code in eine neue Zelle ein, und führen Sie ihn aus:
postsCor <- postData[, c(2, 3 ,4)]
cor(postsCor)
Die Ausgabe zeigt eine nahezu perfekte Korrelation zwischen Posts und PPD, während Days.In.Month eine leicht negative Korrelation zu PPD aufweist.
Zusammenfassung
Während sich die Syntax und der Ansatz von R möglicherweise von herkömmlichen Programmiersprachen unterscheiden, finde ich diese Sprache eine elegante Lösung für Data Wrangling und mathematische Verarbeitung. Für Softwareingenieure, deren Ziel der Aufbau einer Karriere in Data Science ist, stellt R eine wichtige Fähigkeit dar und sollte erlernt werden.
In diesem Artikel habe ich einige Grundlagen der Programmiersprache R untersucht. Ich habe gezeigt, wie integrierte Funktionen zum Laden und Untersuchen von Daten in DataFrames verwendet werden können, wie durch Statistiken Einblicke ermöglicht werden und wie Diagramme gezeichnet werden. Tatsächlich wurde der gesamte Code in diesem Artikel in dem geschrieben, was als „Basis“-R bezeichnet wird, da er nicht von Paketen von Drittanbietern abhängig ist. Einige Benutzer bevorzugen jedoch die „Tidyverse“-Suite von Paketen, die einen anderen Stil verwendet. Diese werde ich in einer späteren Kolumne untersuchen.
Frank La Vigne arbeitet bei Microsoft als AI Technology Solutions-Experte und unterstützt Unternehmen dabei, mehr zu erreichen, indem durch Analysen und KI Daten optimal genutzt werden. Er ist auch Co-Host des DataDriven-Podcasts. Er bloggt regelmäßig auf FranksWorld.com, und Sie können ihm auf seinem YouTube-Kanal „Frank's World TV“ (FranksWorld.TV) folgen.
Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Andy Leonard, David Smith
David Smith ist Cloud Advocate bei Microsoft und hat sich auf die Themen Künstliche Intelligenz und Machine Learning spezialisiert. Seit 2009 ist er Herausgeber des Blogs „Revolutions“ (blog.revolutionanalytics.com), in dem er regelmäßig über Data Science-Anwendungen mit Schwerpunkt auf der Programmiersprache R schreibt. Außerdem ist er Gründungsmitglied des R Consortium. Folgen Sie David Smith auf Twitter: @revodavid.