Flux de travail pour l'analyse statistique et la rédaction de rapport

est-ce que quelqu'un a de la sagesse sur les workflows pour l'analyse des données liées à la rédaction de rapports personnalisés? Le cas d'utilisation est essentiellement ceci:

  1. commande Client un rapport qui utilise l'analyse des données, p. ex. une estimation de la population et des cartes connexes pour un district hydrographique.

  2. l'analyste télécharge des données, les munge et enregistre le résultat (par exemple en ajoutant une colonne pour la population par unité, ou en sous-traitant les données sont fondées sur les limites des districts).

  3. l'analyste analyse les données créées en (2), se rapproche de son objectif, mais voit que nécessite plus de données et donc remonte à (1).

  4. répéter le rinçage jusqu'à ce que les tableaux et les graphiques répondent aux normes D'AQ/CQ et satisfassent le client.

  5. rédiger un rapport comportant des tableaux et des graphiques.

  6. l'année prochaine, le client heureux revient et veut une mise à jour. Cela devrait être aussi simple que de mettre à jour les données en amont par un nouveau téléchargement (par exemple obtenir les permis de construire de l'année dernière), et en appuyant sur un bouton "Recalculer", à moins que les spécifications ne changent.

pour le moment, je ne fais que commencer un répertoire et l'improviser du mieux que je peux. Je voudrais une approche plus systématique, donc j'espère que quelqu'un a compris cela... J'utilise un mélange de tableurs, outils SQL, ARCGIS, R, et Unix.

Merci!

PS:

ci-dessous est un Makefile de base qui vérifie les dépendances sur divers ensembles de données intermédiaires (suffixe w/ .RData ) et scripts (suffixe .R ). Make utilise timestamps pour vérifier les dépendances, donc si vous touch ss07por.csv , il verra que ce fichier est plus récent que tous les fichiers / cibles qui en dépendent, et exécutera les scripts donnés afin de les mettre à jour conséquent. Il s'agit toujours d'un travail en cours, y compris une étape pour mettre dans la base de données SQL, et une étape pour un langage de template comme sweave. Notez que Make s'appuie sur des onglets dans sa syntaxe, lisez donc le manuel avant de couper et de coller. Profiter et donner de la rétroaction!

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

176
demandé sur pnuts 2009-09-16 02:14:26

14 réponses

je casse généralement mes projets en 4 morceaux:

  1. de la charge.R
  2. propre.R
  3. func.R
  4. ne.R

de la charge.R: charge toutes les données nécessaires. Généralement, il s'agit d'un fichier court, la lecture dans les données à partir de fichiers, URLs et/ou ODBC. Selon le projet à ce stade, je vais soit écrire l'espace de travail en utilisant save() ou tout simplement garder les choses en mémoire pour la prochaine étape.

propre.R: C'est là que toutes les choses laides vivent - s'occuper des valeurs manquantes, fusionner les cadres de données, Gérer les valeurs aberrantes.

func.R: Contient toutes les fonctions nécessaires pour effectuer l'analyse. source() 'ing ce fichier ne doit pas avoir d'effets secondaires autres que le chargement jusqu'à la définition d'une fonction. Cela signifie que vous pouvez modifier ce fichier et le recharger sans avoir à revenir en arrière une répétition des étapes 1 et 2 qui peuvent prendre du temps pour s'exécuter de grands ensembles de données.

ne.R: appelle les fonctions définies dans func.R effectuer l'analyse et produire des graphiques et des tableaux.

la principale motivation pour cette configuration est de travailler avec de grandes données par lesquelles vous ne voulez pas avoir à recharger les données chaque fois que vous faites un changement à une étape ultérieure. Aussi, garder mon code compartimenté comme ceci signifie que je peux revenir à un projet oublié depuis longtemps et lire la charge rapidement.R et de travail les données que je dois mettre à jour, puis regarder faire.R déterminer quelle analyse a été effectuée.

185
répondu Josh Reich 2009-09-16 17:34:34

si vous voulez voir quelques exemples, j'ai quelques petits (et pas si petits) projets de nettoyage et d'analyse de données disponibles en ligne. En plus, vous trouverez un script pour télécharger les données, une pour le nettoyer, et un peu de faire de l'exploration et de l'analyse:

récemment, j'ai commencé à numéroter les scripts, il est donc tout à fait évident dans quel ordre ils doivent être exécutés. (Si je me sens vraiment envie je vais parfois faire en sorte que le script d'exploration appellera le nettoyage script qui à son tour appelle le script de téléchargement, chacun faisant le travail minimal nécessaire - généralement en vérifiant la présence de fichiers de sortie avec file.exists . Cependant, la plupart du temps cela semble exagéré).

j'utilise git pour tous mes projets (un système de gestion de code source) donc c'est facile de collaborer avec d'autres, voir ce qui change et facilement revenir aux versions précédentes.

si je fais un rapport officiel, je garde habituellement R et latex séparés, mais je assurez-vous toujours que je peux source mon code R pour produire tout le code et la sortie dont j'ai besoin pour le rapport. Pour le genre de rapports que je fais, je trouve cela plus facile et plus propre que de travailler avec du latex.

92
répondu hadley 2009-09-16 02:09:41

je suis d'accord avec les autres répondants: Sweave est excellent pour la rédaction de rapport avec R. et reconstruire le rapport avec des résultats mis à jour est aussi simple que de Ré-appeler la fonction Sweave. Il est complètement autonome, y compris toutes les analyses, données, etc. Et vous pouvez contrôler la version de l'ensemble du fichier.

j'utilise le plugin StatET pour Eclipse pour développer les rapports, et Sweave est intégré (Eclipse reconnaît latex formating, etc). Sur Windows, c'est facile à utiliser MikTEX .

je voudrais ajouter, que vous pouvez créer de beaux rapports avec le Beamer . Créer un rapport normal est tout aussi simple. J'ai inclus un exemple ci-dessous qui tire des données de Yahoo! et crée un graphique et une table (en utilisant quantmod). Vous pouvez construire ce rapport comme ceci:

Sweave(file = "test.Rnw")

voici le document Beamer lui-même:

% 
\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}
17
répondu Shane 2009-09-15 23:56:33

je voulais juste ajouter, au cas où quelqu'un l'aurait manqué, que il y a un grand post sur le blog learnr sur la création de rapports répétitifs avec paquet brew de Jeffrey Horner . Matt et Kevin ont tous deux mentionné brew ci-dessus. Je ne l'ai pas vraiment utilisé moi-même.

les entrées suivent un flux de travail agréable, il est donc bien intéressant de lire:

  1. préparer les données.
  2. préparer le modèle de rapport.
  3. produire le rapport.

produire le rapport une fois les deux premières étapes terminées est très simple:

library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)
16
répondu Shane 2011-02-23 12:53:52

pour créer des rapports personnalisés, j'ai trouvé utile d'intégrer plusieurs des conseils existants suggérés ici.

Génération de rapports: Une bonne stratégie pour générer des rapports implique la combinaison de Sweave, make, et R.

Éditeur:

  • StatET and Eclipse
  • Emacs et ESS
  • Vim et Vim-R
  • R Studio

Code de l'organisation: En termes d'organisation du code, je trouve deux stratégies utiles:

13
répondu Jeromy Anglim 2017-05-23 10:31:10

j'utilise Sweave pour le rapport produisant côté de cela, mais j'ai aussi entendu parler de la brassage paquet - bien que je n'ai pas encore penché sur elle.

essentiellement, j'ai un certain nombre d'enquêtes pour lesquelles je produis des statistiques sommaires. Mêmes enquêtes, mêmes rapports à chaque fois. J'ai construit un Sweave modèle pour les rapports (qui prend un peu de travail). Mais une fois le travail terminé, j'ai un script R séparé qui me permet signalez les nouvelles données. J'appuie sur "Go", Sweave sort quelques points .les fichiers tex, et j'exécute un petit script Python pour les pdflatex. Mon prédécesseur a passé ~6 semaines chaque année sur ces rapports; je passe environ 3 jours (principalement sur les données de nettoyage; caractères de fuite sont dangereux).

il est très possible qu'il y ait de meilleures approches maintenant, mais si vous décidez d'emprunter cette voie, faites - le moi savoir-j'ai eu l'intention de mettre en place certains de mes hacks Sweave, et ce serait un bon coup de pied dans le pantalon pour le faire.

7
répondu Matt Parker 2009-09-15 22:50:28

je vais suggérer quelque chose dans une direction différente de celle des autres déclarants, basé sur le fait que vous avez demandé spécifiquement sur flux de travail du projet , plutôt que outils . En présumant que vous êtes relativement satisfait de votre modèle de production de documents, il semble que vos défis soient davantage axés sur les questions de suivi de version, de gestion des biens et de processus de révision/publication.

si cela cela semble correct, je suggère d'examiner un outil intégré de billetterie / gestion des sources/documentation comme Redmine . Conserver ensemble des artefacts liés au projet, tels que les tâches en attente, les fils de discussion et les fichiers de données/code suivis en versions, peut être d'une grande aide, même pour des projets bien en dehors du traditionnel "Bailliage de programmation".

7
répondu rcoder 2009-09-15 23:40:17

a convenu que Sweave est la voie à suivre, avec xtable pour générer des tables en LaTeX. Bien que je n'ai pas passé beaucoup de temps à travailler avec eux, le paquet récemment publié tikzDevice semble vraiment prometteur, en particulier lorsqu'il est couplé avec pgfSweave (qui, pour autant que je sache, n'est disponible que sur rforge.net en ce moment -- il y a un lien vers R-forge à partir de là, mais il ne répond pas pour moi en ce moment).

entre les deux, vous obtiendrez un formatage cohérent entre le texte et les figures (polices, etc.). Avec brew, ceux-ci pourraient constituer le Saint Graal de génération de rapport.

5
répondu kmm 2009-09-15 23:38:20

à un niveau plus" méta", vous pourriez être intéressé par le modèle de processus CRISP-DM .

4
répondu Jouni K. Seppänen 2009-09-16 04:53:55

"faire" est grande, parce que (1) vous pouvez l'utiliser pour tous vos travaux dans n'importe quelle langue (contrairement, disons, Sweave et Brew), (2) il est très puissant (à la construction de tous les logiciels installés sur votre machine), et (3) il évite de répéter le travail. Ce dernier point est important pour moi parce que beaucoup de travail est lent; quand j'ai un fichier latex, j'aime voir le résultat dans quelques secondes, pas l'heure qu'il faudrait pour recréer les chiffres.

4
répondu dank 2010-06-04 11:01:50

pour écrire un rapport préliminaire rapide ou un email à un collègue, je trouve qu'il peut être très efficace de copier-coller des tracés dans MS Word ou un email ou une page wiki -- souvent mieux est une capture d'écran bitmapped (par exemple sur mac, Apple-Shift-(Ctrl)-4). Je pense que c'est une technique sous-estimée.

pour un rapport plus final, il est très important d'écrire des fonctions R pour régénérer facilement toutes les placettes (sous forme de fichiers). Il ne faudra plus de temps pour coder.

sur les grandes questions de flux de travail, J'aime la réponse de Hadley sur l'énumération des fichiers de code/données pour le nettoyage et le flux d'analyse. Tous mes projets d'analyse de données ont une structure similaire.

2
répondu Brendan OConnor 2009-09-16 05:20:43

j'ajouterai ma voix à sweave. Pour une analyse complexe en plusieurs étapes, vous pouvez utiliser un makefile pour spécifier les différentes parties. Peut empêcher d'avoir à répéter toute l'analyse si une seule partie a changé.

2
répondu PaulHurleyuk 2009-09-16 17:22:03

j'utilise des modèles de projet avec R studio, actuellement le mien contient les dossiers suivants:

  • info : pdf, présentations powerpoint, documents... qui ne sera utilisé par aucun script
  • data input : données qui seront utilisées par mes scripts mais qui ne seront pas générées par eux
  • data output : données générées par mes scripts pour utilisation ultérieure mais pas comme un rapport approprié.
  • reports : seuls les fichiers qui seront réellement affichés à quelqu'un d'autre
  • R : tous les scripts R
  • SAS : parce que je dois parfois: "(

j'ai écrit des fonctions personnalisées pour que je puisse appeler smart_save(x,y) ou smart_load(x) pour enregistrer ou charger RDS files vers et depuis le dossier data output (fichiers nommés avec des noms variables) donc je ne suis pas gêné par paths pendant mon analyse.

une fonction personnalisée new_project crée un dossier de projet numéroté, copie tous les fichiers du modèle, renomme le fichier RProj et édite les appels setwd , et définit le répertoire de travail à nouveau projet.

tous les scripts R sont dans le dossier R , structuré comme suit:


00_main.R
  • setwd
  • appels scripts 1 à 5

00_functions.R
  • toutes les fonctions et seulement les fonctions vont là, s'il y en a trop je vais le séparer en plusieurs, tous nommés comme 00_functions_something.R , en particulier si je projette de faire un paquet de certains d'entre eux je vais les mettre à part

00_explore.R
  • un tas de morceaux de script où je teste des choses ou j'explore mes données
  • c'est le seul dossier où j'ai le droit d'être bordélique.

01_initialize.R
  • pré-rempli avec un appel à un script plus général initialize_general.R de mon dossier de modèle qui charge les paquets et les données que j'utilise toujours et ne vous dérange pas d'avoir dans mon espace de travail
  • charges 00_functions.R (remplies au préalable)
  • charge bibliothèques supplémentaires
  • ensemble variables globales

02_load data.R
  • charges csv/txt xlsx RDS , il y a une ligne commentée pour chaque type de fichier
  • affiche les fichiers qui ont été créés dans l'espace de travail

03_pull data from DB.R
  • utilise dbplyr pour récupérer des tableaux filtrés et groupés du DB
  • quelques lignes commentées remplies au préalable pour configurer les connexions et le fetch.
  • garder les opérations côté client au strict minimum
  • Pas de côté de serveur d'opérations en dehors de ce script
  • affiche les fichiers qui ont été créés dans l'espace de travail
  • enregistre ces variables afin qu'elles puissent être rechargées plus rapidement

une fois que c'est fait une fois que j'éteins un booléen query_db et les données seront rechargées de RDS la prochaine fois.

il peut arriver que je doive rediriger des données vers DBs, si c'est le cas, je vais créer des étapes supplémentaires.


04_Build.R
    "1519530920 de Données", les disputes, tout le plaisir dplyr / tidyr choses là
  • affiche les fichiers qui ont été créés dans l'espace de travail
  • enregistrer ces variables

une fois que c'est fait une fois que j'ai éteint un booléen build et les données seront rechargées de RDS la prochaine fois.


05_Analyse.R
  • Résumer, le modèle...
  • report excel et csv files

95_build ppt.R
  • modèle de rapport powerpoint utilisant officer

96_prepare markdown.R
  • setwd
  • données de charge
  • définir les paramètres de markdown si nécessaire
  • render

97_prepare shiny.R
  • setwd
  • données de charge
  • définir des paramètres brillants si nécessaire
  • runApp

98_Markdown report.Rmd
  • Un modèle de rapport

99_Shiny report.Rmd
  • Un modèle d'application
2
répondu Moody_Mudskipper 2017-11-11 12:55:40

je fais aussi ce que Josh Reich fait, seulement je fais cela en créant mes paquets R personnels, car cela m'aide à structurer mon code et mes données, et c'est aussi assez facile de les partager avec d'autres.

  1. créer mon paquet
  2. charge
  3. propre
  4. fonctions
  5. faire

créer mon paquet: devtools:: create ('package_name')

load and clean: je crée des scripts dans le data-raw/ sous-dossier de mon paquet pour charger, nettoyer et stocker les objets de données résultants dans le paquet en utilisant devtools::use_data(object_name). Puis je compilerai le paquet. Désormais, appeler la bibliothèque (package_name) rend ces données disponibles (et elles ne sont pas chargées tant que cela n'est pas nécessaire).

fonctions: j'ai mis les fonctions pour mes analyses dans le R/ sous-dossier de mon paquet, et n'exporte que celles qui doivent être appelées à partir extérieur (et non les fonctions d'aide, qui peuvent rester invisibles).

do: je crée un script qui utilise les données et les fonctions stockées dans mon paquet. (Si les analyses ne doivent être faites qu'une seule fois, je peux mettre ce script dans le data-raw/ subfolder, l'exécuter, et stocker les résultats dans le paquet pour le rendre facilement accessible.)

0
répondu jciloa 2016-10-09 17:07:22