Workflow für statistische Analysen und das Verfassen von Berichten


185

Hat jemand Kenntnisse über Workflows für die Datenanalyse im Zusammenhang mit dem Verfassen von benutzerdefinierten Berichten? Der Anwendungsfall ist im Grunde folgender:

  1. Der Kunde gibt einen Bericht in Auftrag, der Datenanalysen verwendet, z. B. eine Bevölkerungsschätzung und zugehörige Karten für ein Wasserviertel.

  2. Der Analyst lädt einige Daten herunter, mungiert die Daten und speichert das Ergebnis (z. B. Hinzufügen einer Spalte für die Bevölkerung pro Einheit oder Unterteilen der Daten basierend auf Bezirksgrenzen).

  3. Die Analystin analysiert die in (2) erstellten Daten, nähert sich ihrem Ziel, sieht jedoch, dass mehr Daten benötigt werden, und geht daher auf (1) zurück.

  4. Wiederholen Sie den Vorgang, bis die Tabellen und Grafiken der Qualitätssicherung / Qualitätskontrolle entsprechen und den Kunden zufrieden stellen.

  5. Schreiben Sie einen Bericht mit Tabellen und Grafiken.

  6. Nächstes Jahr kommt der zufriedene Kunde zurück und möchte ein Update. Dies sollte so einfach sein wie das Aktualisieren der vorgelagerten Daten durch einen neuen Download (z. B. das Abrufen der Baugenehmigungen aus dem letzten Jahr) und das Drücken der Schaltfläche "NEU BERECHNEN", sofern sich die Spezifikationen nicht ändern.

Im Moment starte ich einfach ein Verzeichnis und ad-hoc es so gut ich kann. Ich hätte gerne einen systematischeren Ansatz, also hoffe ich, dass jemand dies herausgefunden hat ... Ich verwende eine Mischung aus Tabellenkalkulations-, SQL-, ARCGIS-, R- und Unix-Tools.

Vielen Dank!

PS:

Im Folgenden finden Sie ein grundlegendes Makefile, das nach Abhängigkeiten von verschiedenen Zwischendatensätzen (mit .RDataSuffix) und Skripten ( .RSuffix) sucht. Make verwendet Zeitstempel, um Abhängigkeiten zu überprüfen. Wenn Sie touch ss07por.csvdies tun , wird festgestellt, dass diese Datei neuer ist als alle davon abhängigen Dateien / Ziele, und die angegebenen Skripts ausführen, um sie entsprechend zu aktualisieren. Dies ist noch in Arbeit, einschließlich eines Schritts zum Einfügen in die SQL-Datenbank und eines Schritts zum Erstellen einer Vorlagensprache wie sweave. Beachten Sie, dass Make in seiner Syntax auf Registerkarten basiert. Lesen Sie daher das Handbuch, bevor Sie ausschneiden und einfügen. Viel Spaß und Feedback geben!

http://www.gnu.org/software/make/manual/html_node/index.html#Top

R = / home / wsprague / R-2.9.2 / bin / R.

persondata.RData: ImportData.R ../../DATA/ss07por.csv Functions.R
   $ R --slave -f ImportData.R

persondata.Munged.RData: MungeData.R persondata.RData Functions.R
      $ R --slave -f MungeData.R

report.txt: TabulateAndGraph.R persondata.Munged.RData Functions.R
      $ R --slave -f TabulateAndGraph.R> report.txt


10
Oh mein. Diejenigen, die hier eintreten, aufgepasst : Die Antworten auf diese Frage waren vor fünf Jahren ausgezeichnet. Sie sind jetzt alle völlig veraltet. Heutzutage würde ich dringend davon abraten, den Antworten hier zu folgen. Es gibt jetzt viel bessere Tools. Zunächst verweise ich auf ein Beispielprojekt mit Makefiles und Knitr .
Konrad Rudolph

R Notebooks , Odbc-Treiber , Git und Git LFS sind alle himmlisch für dieses Problem.
DaveRGP

Ich würde dringend empfehlen, das Projekt nach den hier beschriebenen Grundsätzen einzurichten ( github.com/ropensci/rrrpkg ). Das sogenannte "Forschungskompedium" ist ein Glücksfall, wenn es um reproduzierbare Datenwissenschaft geht
Kresten,

Antworten:


195

Ich teile meine Projekte im Allgemeinen in 4 Teile:

  1. load.R
  2. clean.R
  3. func.R
  4. do.R.

load.R: Kümmert sich um das Laden aller erforderlichen Daten. In der Regel handelt es sich um eine kurze Datei, in der Daten aus Dateien, URLs und / oder ODBC eingelesen werden. Abhängig vom Projekt an dieser Stelle schreibe ich entweder den Arbeitsbereich mit save()oder behalte die Dinge für den nächsten Schritt im Speicher.

clean.R: Hier leben all die hässlichen Dinge - sich um fehlende Werte kümmern, Datenrahmen zusammenführen, Ausreißer behandeln.

func.R: Enthält alle Funktionen, die zur Durchführung der eigentlichen Analyse erforderlich sind. source()Diese Datei sollte keine anderen Nebenwirkungen haben als das Laden der Funktionsdefinitionen. Dies bedeutet, dass Sie diese Datei ändern und neu laden können, ohne die Schritte 1 und 2 wiederholen zu müssen. Die Ausführung großer Datenmengen kann lange dauern.

do.R: Ruft die in func.R definierten Funktionen auf, um die Analyse durchzuführen und Diagramme und Tabellen zu erstellen.

Die Hauptmotivation für diese Einrichtung ist die Arbeit mit großen Datenmengen, wobei Sie die Daten nicht jedes Mal neu laden müssen, wenn Sie Änderungen an einem nachfolgenden Schritt vornehmen. Wenn ich meinen Code so unterteilt halte, kann ich zu einem längst vergessenen Projekt zurückkehren und load.R schnell lesen und herausfinden, welche Daten ich aktualisieren muss, und dann do.R betrachten, um herauszufinden, welche Analyse durchgeführt wurde.


12
Das ist ein wirklich guter Workflow. Ich habe Probleme beim Entwerfen eines Workflows und wenn ich die Leute um mich herum frage, antworten sie im Allgemeinen: "Was? Workflow? Huh?" Ich nehme an, sie denken nicht so viel darüber nach. Ich werde das Reichian LCFD-Modell übernehmen.
JD Long

1
Dies kommt meinem Workflow ziemlich nahe. Ich habe oft ein
Importskript

4
LCFD: Am wenigsten häufig verschmutzte Daten
William Doane

2
Es gibt ein schönes Präsentationsvideo + Folien von Jeromy Anglim, das diesen Workflow hier enthält. Vcasmo.com/video/drewconway/10362
David LeBauer


94

Wenn Sie einige Beispiele sehen möchten, stehen mir online einige kleine (und nicht so kleine) Datenbereinigungs- und Analyseprojekte zur Verfügung. In den meisten Fällen finden Sie ein Skript zum Herunterladen der Daten, eines zum Bereinigen und einige zum Erkunden und Analysieren:

Vor kurzem habe ich begonnen, die Skripte zu nummerieren, daher ist es völlig offensichtlich, in welcher Reihenfolge sie ausgeführt werden sollen. (Wenn ich wirklich Lust habe, mache ich es manchmal so, dass das Explorationsskript das Reinigungsskript aufruft, das wiederum das Download-Skript aufruft, wobei jedes die minimal erforderliche Arbeit erledigt - normalerweise indem es prüft, ob Ausgabedateien mit vorhanden sind file.exists. Meistens scheint dies jedoch übertrieben zu sein.

Ich verwende git für alle meine Projekte (ein Quellcodeverwaltungssystem), damit es einfach ist, mit anderen zusammenzuarbeiten, zu sehen, was sich ändert, und einfach auf frühere Versionen zurückzusetzen.

Wenn ich einen formellen Bericht erstelle, halte ich normalerweise R und Latex getrennt, aber ich stelle immer sicher, dass ich sourcemeinen R-Code verwenden kann, um den gesamten Code und die Ausgabe zu erstellen, die ich für den Bericht benötige. Für die Art von Berichten, die ich mache, finde ich das einfacher und sauberer als die Arbeit mit Latex.


Ich habe oben über Makefiles gesprochen, aber vielleicht möchten Sie sie untersuchen - es ist die traditionelle Sprache für die Abhängigkeitsprüfung. Auch - ich werde versuchen, ggplot2 zu lernen - sieht toll aus!
Forkandwait

Ich mag die Idee, Abhängigkeiten zwischen Dateien angeben zu können, aber m4 lernen zu müssen, ist ein großes Problem. Ich wünschte, es wäre so etwas wie Raken in R. geschrieben
Hadley

2
Für Abhängigkeiten können Sie dies auch in den R-Dateien tun. source("blah.R")Überprüfen Sie stattdessen zuerst , ob die erforderlichen Variablen vorhanden sind : if (!exists("foo")) { source("blah.R") }. Dadurch wird vermieden, dass Abhängigkeiten erneut ausgeführt werden, wenn sie bereits ausgeführt wurden.
naught101

17

Ich stimme den anderen Antwortenden zu: Sweave eignet sich hervorragend zum Verfassen von Berichten mit R. Das Wiederherstellen des Berichts mit aktualisierten Ergebnissen ist so einfach wie das erneute Aufrufen der Sweave-Funktion. Es ist vollständig in sich geschlossen, einschließlich aller Analysen, Daten usw. Und Sie können die Versionskontrolle der gesamten Datei durchführen.

Ich verwende das StatET-Plugin für Eclipse zum Entwickeln der Berichte, und Sweave ist integriert (Eclipse erkennt die Latexformatierung usw.). Unter Windows ist es einfach, MikTEX zu verwenden .

Ich möchte auch hinzufügen, dass Sie mit Beamer wunderschöne Berichte erstellen können . Das Erstellen eines normalen Berichts ist genauso einfach. Ich habe unten ein Beispiel eingefügt, das Daten von Yahoo! und erstellt ein Diagramm und eine Tabelle (mit quantmod). Sie können diesen Bericht folgendermaßen erstellen:

Sweave(file = "test.Rnw")

Hier ist das Beamer-Dokument selbst:

% 
\documentclass[compress]{beamer}
\usepackage{Sweave}
\usetheme{PaloAlto} 
\begin{document}

\title{test report}
\author{john doe}
\date{September 3, 2009} 

\maketitle

\begin{frame}[fragile]\frametitle{Page 1: chart}

<<echo=FALSE,fig=TRUE,height=4, width=7>>=
library(quantmod)
getSymbols("PFE", from="2009-06-01")
chartSeries(PFE)
@

\end{frame}


\begin{frame}[fragile]\frametitle{Page 2: table}

<<echo=FALSE,results=tex>>=
library(xtable)
xtable(PFE[1:10,1:4], caption = "PFE")
@

\end{frame}

\end{document}

6
Glauben Sie nicht, dass ein Sweave-Bericht reproduzierbar ist, bis Sie ihn auf einer sauberen Maschine testen. Es ist leicht, implizite externe Abhängigkeiten zu haben.
John D. Cook

16

Ich wollte nur hinzufügen, falls jemand es verpasst hat, dass es im Lernblog einen großartigen Beitrag über das Erstellen sich wiederholender Berichte mit Jeffrey Horners Braupaket gibt . Matt und Kevin haben beide oben das Gebräu erwähnt. Ich habe es selbst nicht viel benutzt.

Die Einträge folgen einem schönen Workflow, daher lohnt es sich zu lesen:

  1. Bereiten Sie die Daten vor.
  2. Bereiten Sie die Berichtsvorlage vor.
  3. Erstellen Sie den Bericht.

Die Erstellung des Berichts nach Abschluss der ersten beiden Schritte ist sehr einfach:

library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)

Bei der Behebung eines kleinen Grammatikfehlers habe ich die Adressierung von wordpress.com durcheinander gebracht. Der richtige Link lautet also learnr.wordpress.com/2009/09/09/…
learnr

14

Ich habe es für nützlich befunden, viele der hier vorgeschlagenen Tipps zu integrieren, um benutzerdefinierte Berichte zu erstellen.

Generieren von Berichten: Eine gute Strategie zum Generieren von Berichten umfasst die Kombination von Sweave, make und R.

Herausgeber: Gute Herausgeber für die Vorbereitung von Sweave-Dokumenten sind:

  • StatET und Eclipse
  • Emacs und ESS
  • Vim und Vim-R
  • R Studio

Code-Organisation: In Bezug auf die Code-Organisation finde ich zwei Strategien nützlich:


7

Ich benutze Sweave für die Berichterstellung, aber ich habe auch von dem Braupaket gehört - obwohl ich es noch nicht untersucht habe.

Im Wesentlichen habe ich eine Reihe von Umfragen, für die ich zusammenfassende Statistiken erstelle. Gleiche Umfragen, jedes Mal dieselben Berichte. Ich habe eine Sweave-Vorlage für die Berichte erstellt (was ein wenig Arbeit erfordert). Sobald die Arbeit erledigt ist, habe ich ein separates R-Skript, mit dem ich auf die neuen Daten hinweisen kann. Ich drücke "Go", Sweave gibt ein paar Score-.tex-Dateien aus und ich führe ein kleines Python-Skript aus, um sie alle zu pdflatexen. Mein Vorgänger verbrachte jedes Jahr ~ 6 Wochen mit diesen Berichten; Ich verbringe ungefähr 3 Tage (hauptsächlich mit der Bereinigung von Daten; Fluchtzeichen sind gefährlich).

Es ist sehr wahrscheinlich, dass es jetzt bessere Ansätze gibt, aber wenn Sie sich für diesen Weg entscheiden, lassen Sie es mich wissen - ich wollte einige meiner Sweave-Hacks durchführen, und das wäre ein guter Kick in die Hose so.


Würde gerne einige dieser "Sweave Hacks" sehen. Es bereitet mir Kopfschmerzen!
Brandon Bertelsen

7

Ich werde etwas in eine andere Richtung vorschlagen als die anderen Einreicher, basierend auf der Tatsache, dass Sie speziell nach dem Projektworkflow und nicht nach Tools gefragt haben . Angenommen, Sie sind relativ zufrieden mit Ihrem Dokumentproduktionsmodell, dann scheinen sich Ihre Herausforderungen möglicherweise eher auf Fragen der Versionsverfolgung, des Asset-Managements und des Überprüfungs- / Veröffentlichungsprozesses zu konzentrieren.

Wenn das richtig klingt, würde ich vorschlagen, ein integriertes Ticketing- / Quellcodeverwaltungs- / Dokumentations-Tool wie Redmine in Betracht zu ziehen . Das Zusammenhalten verwandter Projektartefakte wie ausstehender Aufgaben, Diskussionsthreads und versionierter Daten- / Codedateien kann eine große Hilfe sein, selbst für Projekte, die weit außerhalb der traditionellen "Programmier" -Bailiwick liegen.


5

Einverstanden, dass Sweave der richtige Weg ist, mit xtable zum Generieren von LaTeX-Tabellen. Obwohl ich nicht zu viel Zeit mit ihnen verbracht habe, sieht das kürzlich veröffentlichte tikzDevice- Paket sehr vielversprechend aus, insbesondere in Verbindung mit pgfSweave (das meines Wissens derzeit nur auf rforge.net verfügbar ist - es gibt ein Link zu R-Forge von dort, aber es reagiert im Moment nicht für mich).

Zwischen den beiden erhalten Sie eine konsistente Formatierung zwischen Text und Abbildungen (Schriftarten usw.). Beim Brauen könnten diese den heiligen Gral der Berichterstellung darstellen.


pgfSweave befindet sich derzeit in der "Entwicklungslücke", da die Entwickler keine Zeit hatten, das neue tikzDevice zu integrieren. Im Moment empfehlen wir, tikzDevice aus normalen Sweave-Dokumenten heraus zu verwenden. Der Benutzer muss lediglich die Verantwortung für das Öffnen / Schließen des Geräts und \ einschließlich {} der resultierenden Ausgabe übernehmen.
Sharpie

@ Sharpie: Gibt es Updates zum Entwicklungsstatus von pgfSweave? Es sieht gut aus, scheint aber auf keinem System zu funktionieren, das ich ausprobiert habe.
Ari B. Friedman

@ gsk3 Der andere Entwickler war sehr aktiv bei der Aktualisierung von pgfSweave und hat viel Arbeit geleistet, seit ich diesen Kommentar gepostet habe. Besuchen Sie github.com/cameronbracken/pgfSweave , um die Entwicklung zu verfolgen. Wenn das Paket für Sie nicht funktioniert, würden wir gerne einen Fehlerbericht erhalten, damit wir ihn beheben können.
Sharpie

@ Sharpie: Großartig, danke. Ich habe Ihre Nachricht an meinen Freund weitergeleitet, der mehr daran gearbeitet hat als ich. Wenn er nicht bald einen Fehlerbericht einreicht, werde ich einen zusammenstellen. Es sieht aus wie ein tolles Paket; Danke für all die harte Arbeit.
Ari B. Friedman


4

"make" ist großartig, weil (1) Sie es für alle Ihre Arbeiten in einer beliebigen Sprache verwenden können (im Gegensatz zu beispielsweise Sweave and Brew), (2) es ist sehr leistungsfähig (genug, um die gesamte Software auf Ihrem Computer zu erstellen) und (3) es vermeidet wiederholte Arbeiten. Dieser letzte Punkt ist mir wichtig, weil ein Großteil der Arbeit langsam ist; Wenn ich eine Datei latexe, möchte ich das Ergebnis in wenigen Sekunden sehen, nicht in der Stunde, die benötigt wird, um die Zahlen neu zu erstellen.


+1 für make; Ich sehe make jedoch nicht als inkompatibel mit Sweave an. Wenn ich Berichte erstelle, rufe ich Sweave (und andere Dinge) an.
Jeromy Anglim

3

Ich verwende Projektvorlagen zusammen mit R Studio. Derzeit enthält meine folgende Ordner:

  • info : pdfs, powerpoints, docs ... die von keinem Skript verwendet werden
  • data input : Daten, die von meinen Skripten verwendet, aber nicht von ihnen generiert werden
  • data output : Daten, die von meinen Skripten zur weiteren Verwendung generiert wurden, jedoch nicht als ordnungsgemäßer Bericht.
  • reports : Nur Dateien, die tatsächlich jemand anderem angezeigt werden
  • R : Alle R-Skripte
  • SAS : Weil ich manchmal muss: '(

Ich habe benutzerdefinierte Funktionen geschrieben, damit ich sie aufrufen smart_save(x,y)oder smart_load(x)speichern und RDS filesin und aus dem data outputOrdner (Dateien mit Variablennamen) laden kann , damit mich pathsmeine Analyse nicht stört .

Eine benutzerdefinierte Funktion new_projecterstellt einen nummerierten Projektordner, kopiert alle Dateien aus der Vorlage, benennt die RProjDatei um und bearbeitet die setwdAufrufe und setzt das Arbeitsverzeichnis auf ein neues Projekt.

Alle RSkripte befinden sich im ROrdner und sind wie folgt strukturiert:


00_main.R
  • setwd
  • ruft die Skripte 1 bis 5 auf

00_functions.R
  • Alle Funktionen und nur Funktionen gehen dorthin, wenn es zu viele gibt, werde ich sie in mehrere aufteilen, alle mit dem gleichen Namen 00_functions_something.R, insbesondere wenn ich vorhabe, aus einigen ein Paket zu machen, werde ich sie auseinander setzen

00_explore.R
  • Eine Reihe von Skriptblöcken, in denen ich Dinge teste oder meine Daten untersuche
  • Es ist die einzige Datei, in der ich unordentlich sein darf.

01_initialize.R
  • Vorab mit einem Aufruf eines allgemeineren initialize_general.RSkripts aus meinem Vorlagenordner, der die Pakete und Daten lädt, die ich immer verwende und die ich gerne in meinem Arbeitsbereich habe
  • Ladungen 00_functions.R(vorgefüllt)
  • Lädt zusätzliche Bibliotheken
  • globale Variablen setzen

02_load data.R
  • Lasten csv/txt xlsx RDS, gibt es eine vorbelegt kommentierte Zeile für jede Art von Datei
  • Zeigt an, welche Dateien im Arbeitsbereich erstellt wurden

03_pull data from DB.R
  • Dient dbplyrzum Abrufen gefilterter und gruppierter Tabellen aus der Datenbank
  • Einige vorab ausgefüllte kommentierte Zeilen zum Einrichten von Verbindungen und zum Abrufen.
  • Halten Sie clientseitige Vorgänge auf ein Minimum
  • Keine serverseitigen Vorgänge außerhalb dieses Skripts
  • Zeigt an, welche Dateien im Arbeitsbereich erstellt wurden
  • Speichert diese Variablen, damit sie schneller neu geladen werden können

Sobald es fertig ist, schalte ich einen query_dbBooleschen Wert aus und die Daten werden beim RDSnächsten Mal neu geladen .

Es kann vorkommen, dass ich Daten an DBs weiterleiten muss. Wenn ja, werde ich zusätzliche Schritte erstellen.


04_Build.R
  • Daten-Wrangling, all der Spaß dplyr/ das tidyrZeug geht dorthin
  • Zeigt an, welche Dateien im Arbeitsbereich erstellt wurden
  • Speichern Sie diese Variablen

Sobald es fertig ist, schalte ich einen buildBooleschen Wert aus und die Daten werden beim RDSnächsten Mal neu geladen .


05_Analyse.R
  • Zusammenfassen, modellieren ...
  • Bericht excelund csvDateien

95_build ppt.R
  • Vorlage für PowerPoint-Bericht mit officer

96_prepare markdown.R
  • setwd
  • lade Daten
  • Stellen Sie bei Bedarf Markdown-Parameter ein
  • render

97_prepare shiny.R
  • setwd
  • lade Daten
  • Stellen Sie bei Bedarf glänzende Parameter ein
  • runApp

98_Markdown report.Rmd
  • Eine Berichtsvorlage

99_Shiny report.Rmd
  • Eine App-Vorlage

2

Um einen kurzen vorläufigen Bericht oder eine E-Mail an einen Kollegen zu schreiben, finde ich, dass es sehr effizient sein kann, Diagramme in MS Word oder eine E-Mail- oder Wiki-Seite zu kopieren und einzufügen - oft ist ein Bitmap-Screenshot am besten (z. B. auf einem Mac oder Apple) -Schalt- (Strg) -4). Ich denke, das ist eine unterschätzte Technik.

Für einen endgültigeren Bericht ist es sehr wichtig, R-Funktionen zu schreiben, um alle Diagramme (als Dateien) einfach neu zu generieren. Das Codieren dauert länger.

Bei den größeren Workflow-Problemen gefällt mir Hadleys Antwort auf die Aufzählung der Code- / Datendateien für den Reinigungs- und Analyseablauf. Alle meine Datenanalyseprojekte haben eine ähnliche Struktur.


2

Ich werde meine Stimme hinzufügen, um zu schwenken. Für eine komplizierte, mehrstufige Analyse können Sie ein Makefile verwenden , um die verschiedenen Teile anzugeben. Kann verhindern, dass die gesamte Analyse wiederholt werden muss, wenn sich nur ein Teil geändert hat.


0

Ich mache auch das, was Josh Reich macht, nur ich mache das Erstellen meiner persönlichen R-Pakete, da es mir hilft, meinen Code und meine Daten zu strukturieren, und es ist auch ziemlich einfach, diese mit anderen zu teilen.

  1. Erstelle mein Paket
  2. Belastung
  3. reinigen
  4. Funktionen
  5. machen

Erstellen meines Pakets: devtools :: create ('Paketname')

Laden und Bereinigen: Ich erstelle Skripte im Daten-Raw / Unterordner meines Pakets zum Laden, Bereinigen und Speichern der resultierenden Datenobjekte im Paket mit devtools :: use_data (Objektname). Dann kompiliere ich das Paket. Von nun an stellt der Aufruf der Bibliothek (Paketname) diese Daten zur Verfügung (und sie werden erst bei Bedarf geladen).

Funktionen: Ich lege die Funktionen für meine Analysen in den R / -Unterordner meines Pakets und exportiere nur diejenigen, die von außen aufgerufen werden müssen (und nicht die Hilfsfunktionen, die unsichtbar bleiben können).

do: Ich erstelle ein Skript, das die in meinem Paket gespeicherten Daten und Funktionen verwendet. (Wenn die Analysen nur einmal durchgeführt werden müssen, kann ich dieses Skript auch in den Daten-Roh- / Unterordner einfügen, ausführen und die Ergebnisse im Paket speichern, um es leicht zugänglich zu machen.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.