繁体   English   中英

统计分析和报告编写工作流程

[英]Workflow for statistical analysis and report writing

是否有人对与自定义​​报告编写相关的数据分析工作流有任何智慧? 用例基本上是这样的:

  1. 客户委托使用数据分析的报告,例如水域的人口估计和相关地图。

  2. 分析人员下载一些数据,对数据进行删节并保存结果(例如,为每单位人口增加一列,或根据地区边界对数据进行分组)。

  3. 分析人员分析了在(2)中创建的数据,接近了她的目标,但发现需要更多数据,因此回到(1)。

  4. 重复冲洗,直到表格和图形符合QA / QC并满足客户要求。

  5. 编写包含表格和图形的报告。

  6. 明年,满意的客户会回来并要求更新。 这应该很简单,例如通过新的下载来更新上游数据(例如,从去年获得建筑许可),然后按“重新计算”按钮,除非规格更改。

目前,我只是启动一个目录,并尽其所能对其进行临时设置。 我想要一个更系统的方法,所以我希望有人能解决这个问题……我使用了电子表格,SQL,ARCGIS,R和Unix工具。

谢谢!

PS:

下面是一个基本的Makefile,用于检查对各种中间数据集(带.RData后缀)和脚本( .R后缀)的依赖性。 Make使用时间戳检查依赖关系,因此,如果您touch ss07por.csv ,它将看到此文件比依赖它的所有文件/目标都新,并执行给定的脚本以相应地更新它们。 这项工作仍在进行中,包括将其放入SQL数据库的步骤,以及诸如sweave之类的模板语言的步骤。 请注意,Make的语法依赖制表符,因此在剪切和粘贴之前请先阅读手册。 享受并给予反馈!

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

我通常将我的项目分为4部分:

  1. 负载
  2. 清洁
  3. 功能

load.R:负责加载所有需要的数据。 通常,这是一个短文件,可从文件,URL和/或ODBC中读取数据。 此时,根据项目的不同,我将使用save()写出工作区,或者仅将其保留在内存中以进行下一步。

clean.R:这是所有丑陋事物的住所-照顾缺失值,合并数据框,处理异常值。

func.R:包含执行实际分析所需的所有功能。 除了加载函数定义,此文件的source()不应有任何副作用。 这意味着您可以修改此文件并重新加载它,而不必返回重复的步骤1和2,对于大型数据集,这可能需要很长时间才能运行。

do.R:调用func.R中定义的函数以执行分析并生成图表。

进行此设置的主要动机是使用大数据,因此您不需要每次对后续步骤进行更改时都不必重新加载数据。 同样,将我的代码分隔开来意味着我可以回到一个长期被遗忘的项目并快速读取load.R并确定需要更新的数据,然后查看do.R来确定执行了哪些分析。

如果您想看一些示例,我可以在线上找到一些小(但不是那么小)的数据清理和分析项目。 在大多数情况下,您会找到一个脚本来下载数据,一个脚本来清理数据,还有一些脚本来进行探索和分析:

最近,我开始为脚本编号,因此完全可以按照它们应该运行的顺序进行操作。 (如果我真的很喜欢,我有时会这样做,以便探索脚本将调用清理脚本,而清理脚本又会依次调用下载脚本,每个脚本都会做最少的工作-通常通过检查输出文件和file.exists的存在来完成。 file.exists 。但是,大多数情况下,这似乎过分file.exists

我将git用于我的所有项目(源代码管理系统),因此它易于与他人协作,查看正在发生的变化并轻松回滚到以前的版本。

如果我做一个正式的报告,我通常把R和乳胶分开,但我总是确保我能source我的R代码里面产生的所有代码和输出,我需要的报告。 对于我所做的各种报告,我发现这比使用乳胶更容易,更干净。

我同意其他响应者的观点:Sweave非常适合使用R编写报告。重建具有更新结果的报告就像调用Sweave函数一样简单。 它是完全独立的,包括所有分析,数据等。您可以对整个文件进行版本控制。

我使用Eclipse的StatET插件来开发报告,并且集成了Sweave(Eclipse可以识别乳胶格式等)。 在Windows上, 使用MikTEX很容易

我还要补充一点, 您可以使用Beamer创建漂亮的报告 创建普通报告同样简单。 我在下面提供了一个示例,该示例从Yahoo!提取数据。 并创建图表和表格(使用quantmod)。 您可以按照以下方式构建此报告:

Sweave(file = "test.Rnw")

这是Beamer文档本身:

% 
\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}

我只是想补充一下,以防万一有人错过它, 在学习者博客上有一篇很棒的文章,关于Jeffrey Horner的酿造包 创建重复报告 马特和凯文都在上面提到了酿造。 我自己实际上并没有使用太多。

这些条目遵循一个不错的工作流程,因此非常值得一读:

  1. 准备数据。
  2. 准备报告模板。
  3. 产生报告。

完成前两个步骤后,实际上生成报告非常简单:

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

对于创建自定义报告,我发现合并此处建议的许多现有技巧很有用。

生成报告:生成报告的好策略涉及Sweave,make和R的组合。

编辑器:准备Sweave文档的优秀编辑器包括:

  • StatET和Eclipse
  • Emacs和ESS
  • Vim和Vim-R
  • R工作室

代码组织:就代码组织而言,我发现两种策略很有用:

我将Sweave用作报告的生成方,但我也一直在听说Brew软件包-尽管我尚未对其进行研究。

从本质上讲,我有一些调查可以为其提供汇总统计信息。 相同的调查,每次相同的报告。 我为报告构建了一个Sweave模板(需要一些工作)。 但是一旦工作完成,我将拥有一个单独的R脚本,该脚本可以让我指出新数据。 我按“ Go”,Sweave转储了一些分数.tex文件,然后运行了一些Python脚本以将所有pdflatex。 我的前任每年在这些报告上花费大约6周的时间; 我花了大约3天的时间(大部分时间用于清洁数据;转义符很危险)。

现在很有可能有更好的方法,但是如果您决定走这条路,请告诉我-我一直打算放一些我的Sweave hacks,这将是一条很好的选择所以。

基于您专门询问项目工作流程而非工具的事实,我将提出与其他提交者不同方向的建议。 假设您对文档制作模型相对满意,那么听起来您的挑战实际上可能更多地集中在版本跟踪,资产管理和审阅/发布过程上。

如果听起来正确,我建议您考虑使用像Redmine这样的集成票务/源管理/文档工具。 将相关的项目工件(例如待处理的任务,讨论线程和版本化的数据/代码文件)保持在一起,即使对于不在传统的“编程”百力域之外的项目也可以提供很大的帮助。

同意Sweave是必经之路,使用xtable生成LaTeX表。 尽管我没有花太多时间与他们合作,但最近发布的tikzDevice软件包看起来确实很有希望,尤其是与pgfSweave结合使用 (据我所知,该软件包目前仅在rforge.net上可用-有一个从那里链接到r-forge,但此刻暂时没有响应。

在这两者之间,您将获得文本和图形(字体等)之间一致的格式。 对于brew来说,这些可能构成报告生成的圣杯。

在更高的“元”级别,您可能对CRISP-DM流程模型感兴趣。

“ make”之所以出色,是因为(1)您可以将其用于任何语言的所有工作中(不同于Sweave和Brew),(2)它非常强大(足以在您的计算机上构建所有软件),并且(3)避免重复工作。 最后一点对我很重要,因为很多工作都很缓慢; 当我对文件进行乳胶处理时,我希望在几秒钟内看到结果,而不是重新创建图形所花费的时间。

对于写给同事的快速初步报告或电子邮件,我发现将图复制并粘贴到MS Word或电子邮件或Wiki页面中非常有效-通常最好是位图截图(例如在Mac,Apple上) -Shift-(Ctrl)-4)。 我认为这是一种被低估的技术。

对于更最终的报告,编写R函数以轻松地重新生成所有图(作为文件)非常重要。 确实需要更多时间来编写代码。

对于较大的工作流问题,我喜欢Hadley关于枚举清洗和分析流程的代码/数据文件的答案。 我所有的数据分析项目都具有类似的结构。

我将添加声音以进行弯曲。 对于复杂的多步骤分析,可以使用makefile指定不同的部分。 如果只更改了一部分,则可以避免重复整个分析。

我将项目模板与R Studio一起使用,当前我的模板包含以下文件夹:

  • info :PDF,PowerPoint,文档...将不会被任何脚本使用
  • data input :将由我的脚本使用但不会由它们生成的数据
  • data output :由我的脚本生成的数据可供进一步使用,但不能作为适当的报告。
  • reports :仅将实际显示给其他人的文件
  • R :所有R脚本
  • SAS :因为有时我必须这样做:'(

我编写了自定义函数,因此可以调用smart_save(x,y)smart_load(x)来将RDS files保存到data output文件夹或从data output文件夹中加载RDS files (以变量名命名的文件),因此在分析过程中,我不会被paths打扰。

定制函数new_project创建一个编号项目文件夹,从模板复制所有文件,重命名RProj文件并编辑setwd调用,并将工作目录设置为新项目。

所有R脚本都位于R文件夹中,其结构如下:


00_main.R
  • setwd
  • 调用脚本1至5

00_functions.R
  • 所有函数和唯一函数都去了那里,如果太多,我将其分成几个部分,每个都命名为00_functions_something.R ,特别是如果我打算从其中一些制作一个程序包,则将它们分开

00_explore.R
  • 一堆脚本块,我在其中进行测试或浏览数据
  • 这是我被允许凌乱的唯一文件。

01_initialize.R
  • 从我的模板文件夹预填充了对更通用的initialize_general.R脚本的调用,该脚本加载了我一直使用且不介意在我的工作区中使用的包和数据
  • 加载00_functions.R (预00_functions.R
  • 加载其他库
  • 设置全局变量

02_load data.R
  • 加载csv/txt xlsx RDS ,每种类型的文件都有一个预填充的注释行
  • 显示在工作空间中创建了哪些文件

03_pull data from DB.R
  • 使用dbplyr从数据库中获取经过过滤和分组的表
  • 一些预填充的注释行以建立连接和获取。
  • 保持客户端操作最少
  • 该脚本之外没有服务器端操作
  • 显示在工作区中已创建的文件
  • 保存这些变量,以便可以更快地重新加载它们

一旦完成,我将关闭query_db布尔值,下次数据将从RDS重新加载。

我可能不得不将数据重新馈送到数据库中,如果这样,我将创建其他步骤。


04_Build.R
  • 数据dplyr ,所有有趣的dplyr / tidyr东西都去了
  • 显示在工作区中已创建的文件
  • 保存这些变量

一旦完成,我将关闭build布尔值,下次数据将从RDS重新加载。


05_Analyse.R
  • 总结,模型...
  • 报告excelcsv文件

95_build ppt.R
  • 使用officer Powerpoint报告模板

96_prepare markdown.R
  • setwd
  • 加载数据
  • 根据需要设置markdown参数
  • render

97_prepare shiny.R
  • setwd
  • 加载数据
  • 根据需要设置闪亮的参数
  • runApp

98_Markdown report.Rmd
  • 报告模板

99_Shiny report.Rmd
  • 应用模板

我也做Josh Reich所做的事情,只是创建个人R包,因为这样做可以帮助我构造代码和数据,并且与他人共享它们也很容易。

  1. 创建我的包裹
  2. 加载
  3. 清洁
  4. 职能

创建我的包:devtools :: create('package_name')

加载和清理:我在程序包的data-raw /子文件夹中创建脚本,以使用devtools :: use_data(object_name)在程序包中加载,清理和存储结果数据对象。 然后我编译该包。 从现在开始,调用library(package_name)使这些数据可用(并且直到必要时才加载它们)。

函数:我将用于分析的函数放入程序包的R /子文件夹中,仅导出需要从外部调用的那些函数(而不导出那些可以保持不可见的辅助函数)。

要做:我创建一个脚本,该脚本使用存储在程序包中的数据和函数。 (如果分析只需要做一次,我也可以将此脚本放入data-raw /子文件夹中,运行它,并将结果存储在包中,以使其易于访问。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM