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

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

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

  2. 分析员下载一些数据,修改数据并保存结果(例如,为每个单位的人口添加一列,或者根据地区边界对数据进行子集)。

  3. 分析师分析(2)中创建的数据,接近她的目标,但是看到需要更多的数据,所以回到(1)。

  4. 清洗重复,直到表格和图形满足 QA/QC 和满足客户。

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

  6. 明年,快乐的客户回来了,想要一个更新。这应该是一样简单的更新上游数据通过一个新的下载(例如获得建设许可从去年) ,并按一个“重新计算”按钮,除非规格变化。

目前,我只是启动一个目录,然后尽可能地对其进行特别处理。我想要一个更系统的方法,所以我希望有人已经解决了这个问题... 我使用了电子表格,SQL,ARCGIS,R 和 Unix 工具的混合。

谢谢!

附注:

下面是一个基本的 Makefile,它检查对各种中间数据集(w/.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


43915 次浏览

我使用 转身作为报告生成方,但是我也听说过 啤酒软件包-尽管我还没有研究过它。

基本上,我有许多调查,我为它们制作摘要统计数据。同样的调查,每次都是同样的报告。我为这些报告构建了一个 Sweave 模板(这需要一些工作)。但是一旦工作完成,我就有了一个单独的 R 脚本,它可以让我指出新的数据。我按下“开始”斯维夫就会输出几个数字。我运行了一个小的 Python 脚本,把它们都放到 pdflatex 中。我的前任每年在这些报告上花费大约6周的时间; 我花费大约3天的时间(大部分时间用于清理数据; 转义字符是危险的)。

现在很可能有更好的方法,但是如果你决定走这条路线,让我知道-我一直打算把我的一些 Sweave 黑客,这将是一个很好的踢在裤子这样做。

同意 Sweave 的方法,使用 Xtable生成 LaTeX 表。虽然我没有花太多时间和他们一起工作,但是最近发布的 TikzDevice包看起来真的很有前途,尤其是当与 PgfSweave结合时(据我所知,目前只能在 rforge.net 上使用——那里有一个链接到 r- 锻造,但是现在对我来说没有响应)。

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

基于你特别询问了 项目工作流程而不是 工具这一事实,我将从其他提交者的角度提出一些不同的建议。假设您对自己的文档生产模型相对满意,那么您面临的挑战似乎更多地集中在版本跟踪、资产管理和评审/发布过程等问题上。

如果这听起来是正确的,我会建议研究一个集成的票务/源代码管理/文档工具,如 红雷。将相关的项目工件(如挂起的任务、讨论线程和版本化的数据/代码文件)保存在一起,即使对于远远超出传统“编程”范围的项目也是一个很大的帮助。

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

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

我还要补充一点,那就是 你可以用 Beamer 创建漂亮的报告。创建一个正常的报告也同样简单。我在下面包含了一个从 Yahoo! 获取数据并创建图表和表格的例子(使用 quantmod)。您可以这样构建这个报告:

Sweave(file = "test.Rnw")

这是激光飞船的文件:

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

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

最近我已经开始给脚本编号,所以它们应该按照什么顺序运行是完全明显的。(如果我真的感觉很棒,我有时会让探索脚本调用清理脚本,而清理脚本又调用下载脚本,每个脚本都做最少的必要工作——通常通过检查输出文件的存在与 file.exists。然而,大多数时候这看起来有点过分)。

我对所有的项目都使用 git (一个源代码管理系统) ,因此很容易与其他人协作,查看正在发生的变化,并很容易回滚到以前的版本。

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

在更“元”的层次上,您可能对 CRISP-DM流程模型感兴趣。

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

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

关于更大的工作流问题,我喜欢 Hadley 关于为清理和分析流枚举代码/数据文件的回答。我所有的数据分析项目都有一个类似的结构。

我会加入我的声音来挥舞。对于复杂的多步骤分析,您可以使用 Makefile来指定不同的部分。可以避免重复整个分析,如果只有一个部分改变。

我通常把我的项目分成四部分:

  1. 装弹 R
  2. 干净 R
  3. 函数 R
  4. DoR

R: 负责加载所需的所有数据。通常这是一个短文件,从文件、 URL 和/或 ODBC 读取数据。根据这个项目,我要么使用 save()写出工作区,要么在内存中保存下一步的内容。

R: 这就是所有丑陋的东西存在的地方——处理丢失的值、合并数据框架、处理离群值。

R: 包含执行实际分析所需的所有函数。除了加载函数定义之外,对这个文件进行 source()处理应该没有其他副作用。这意味着您可以修改这个文件并重新加载它,而不必回到重复的步骤1和2,这可能需要很长的时间来运行大型数据集。

R: 调用 fun.R 中定义的函数来执行分析并生成图表和表格。

这种设置的主要动机是为了处理大型数据,因此您不希望在每次更改后续步骤时都必须重新加载数据。另外,像这样将代码分隔开意味着我可以回到一个长期被遗忘的项目中,快速读取 load.R 并计算出需要更新的数据,然后查看 do.R 以计算执行了哪些分析。

我只是想补充一下,如果有人没注意到的话,那就是 Learr 博客上有一篇很棒的文章,是关于创建重复性报告的杰弗里 · 霍纳的啤酒包装。马特和凯文都在上面提到了啤酒。我自己也没怎么用过。

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

  1. 准备好数据。
  2. 准备报表模板。
  3. 把报告拿出来。

实际上,一旦完成前两个步骤,编写报告就非常简单:

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

“ make”之所以伟大,是因为(1)你可以在任何语言中使用它完成所有工作(不像 Sweave 和 Brew) ; (2)它非常强大(足以在你的机器上构建所有软件) ; (3)它避免了重复工作。最后一点对我来说很重要,因为很多工作都很慢; 当我对一个文件进行乳胶处理时,我喜欢在几秒钟内看到结果,而不是重新创建数字所需的时间。

对于创建自定义报表,我发现合并这里建议的许多现有技巧非常有用。

生成报告: 一个好的报告生成策略包括 Sweave、 make 和 r 的组合。

编辑: 编写 Sweave 文件的优秀编辑包括:

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

守则组织名称: 在代码组织方面,我发现有两种策略很有用:

我也做 Josh Reich 做的事情,只不过我做的是创建我的个人 R 包,因为它帮助我构建我的代码和数据,而且与其他人分享这些也很容易。

  1. 创建我的包
  2. 装弹
  3. 干净
  4. 功能

创建我的包: devtools: : create (‘ package _ name’)

加载和清理: 我在包的 data-raw/subfile 中创建脚本,以便使用 devtools: : use _ data (object _ name)加载、清理和存储包中的结果数据对象。然后我编译包。 从现在开始,调用库(package _ name)使这些数据可用(直到需要时才加载它们)。

Function: 我将用于分析的函数放到包的 R/子文件夹中,并且只导出那些需要从外部调用的函数(而不是助手函数,因为助手函数可以保持不可见)。

Do: 我创建一个脚本,它使用存储在包中的数据和函数。 (如果分析只需要完成一次,我也可以将这个脚本放入 data-raw/subfile 中,运行它,并将结果存储在包中,使其易于访问。)

我使用 R 工作室的项目模板,目前我的包含以下文件夹:

  • info: pdf,Powerpoint,docs... ... 这些都不会被任何脚本使用
  • data input: 将由我的脚本使用但不由它们生成的数据
  • data output: 由我的脚本生成的数据,以供进一步使用,但不作为正确的报告。
  • reports: 只有文件实际上将显示给其他人
  • 都是 R 脚本
  • 因为有时候我不得不:

我编写了自定义函数,这样我就可以调用 smart_save(x,y)smart_load(x)来保存或加载 RDS filesdata output文件夹(以变量名命名的文件) ,所以在分析期间我不会被 paths打扰。

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

所有 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(预填)
  • 加载额外的库
  • 设置全局变量设置全局变量

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

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

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

我可能不得不将数据重新提供给 DBs,如果是这样,我将创建额外的步骤。


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

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


05_Analyse.R
  • 总结一下,模特。
  • 报告 excelcsv文件

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

96_prepare markdown.R
  • setwd
  • 载入数据
  • 必要时设定降价参数
  • render

97_prepare shiny.R
  • setwd
  • 载入数据
  • 如果需要,设置闪亮的参数
  • runApp

98_Markdown report.Rmd
  • 报表模板

99_Shiny report.Rmd
  • 应用程序模板