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

时间:2009-09-15 22:14:27

标签: r statistics data-visualization

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

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

  2. 分析师会下载一些数据,发送数据并保存结果(例如,为每单位人口添加一列,或根据地区边界对数据进行子集化)。

  3. 分析师分析(2)中创建的数据,接近她的目标,但看到需要更多数据,因此可以追溯到(1)。

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

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

  6. 明年,快乐的客户回来了,想要更新。这应该像通过新的下载更新上游数据一样简单(例如,获取去年的建筑许可),并按下“RECALCULATE”按钮,除非规格发生变化。

  7. 目前,我只是开始一个目录,并尽我所能。我想要一种更系统化的方法,所以我希望有人能够解决这个问题......我使用了电子表格,SQL,ARCGIS,R和Unix工具。

    谢谢!

    PS:

    下面是一个基本的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
    
    

14 个答案:

答案 0 :(得分:192)

我通常将我的项目分成4个部分:

  1. load.R
  2. clean.R
  3. func.R
  4. do.R
  5. load.R:负责加载所需的所有数据。通常,这是一个短文件,从文件,URL和/或ODBC读取数据。根据项目的不同,我将使用save()写出工作区,或者只是将内容保存在内存中以供下一步使用。

    clean.R:这是所有丑陋的东西所在 - 处理缺失的值,合并数据框架,处理异常值。

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

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

    此设置的主要动机是处理大型数据,您不希望每次更改后续步骤时都必须重新加载数据。另外,保持我的代码区分这样意味着我可以回到一个长期被遗忘的项目并快速读取load.R并找出我需要更新的数据,然后查看do.R以确定执行的分析。< / p>

答案 1 :(得分:94)

如果您想看一些示例,我可以在线获得一些小型(并非如此之小)的数据清理和分析项目。在大多数情况下,您会找到一个用于下载数据的脚本,一个用于清理数据的脚本,以及一些用于探索和分析的脚本:

最近我开始编写脚本编号,所以它们的运行顺序是完全明显的。 (如果我感觉真的很花哨,我有时会这样做,以便探索脚本会调用清理脚本,后者又调用下载脚本,每个人都做必要的最小工作 - 通常通过检查输出文件是否存在{ {1}}。但是,大多数情况下这看起来有点矫枉过正。)

我将git用于我的所有项目(源代码管理系统),因此很容易与其他人协作,查看更改内容并轻松回滚到以前的版本。

如果我做正式报告,我通常会将R和乳胶分开,但我总是确保我可以file.exists我的R代码来生成报告所需的所有代码和输出。对于我所做的各种报告,我发现这比使用乳胶更容易和更清洁。

答案 2 :(得分:17)

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

我使用Eclipse的StatET插件来开发报告,并集成了Sweave(Eclipse识别乳胶成型等)。在Windows上,it's easy to use MikTEX

我还要补充一点you can create beautiful reports with 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}

答案 3 :(得分:16)

我只是想在there's a great post on the learnr blog about creating repetitive reportsJeffrey Horner's brew package {{3}}的情况下添加{{3}}。马特和凯文都提到了上面的酿造。我自己并没有真正使用它。

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

  1. 准备数据。
  2. 准备报告模板。
  3. 制作报告。
  4. 在完成前两个步骤后,实际生成报告非常简单:

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

答案 4 :(得分:14)

为了创建自定义报告,我发现合并这里建议的许多现有技巧很有用。

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

<强>编辑: 准备Sweave文件的优秀编辑包括:

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

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

答案 5 :(得分:7)

我使用Sweave作为报告生成方面,但我也听说过brew包 - 虽然我还没有调查过。

基本上,我有一些调查,我可以为其生成汇总统计数据。相同的调查,每次都有相同的报告。我为报告构建了一个Sweave模板(需要一些工作)。但是一旦工作完成,我就有了一个单独的R脚本,可以让我指出新数据。我按下“Go”,Sweave会丢弃几个.tex文件,然后我运行一些Python脚本来pdflatex。我的前任每年花在这些报告上约6周;我花了大约3天(主要是清洁数据;逃脱角色是危险的)。

现在有可能有更好的方法,但如果你决定走这条路,请告诉我 - 我一直想把我的一些Sweave hacks,这将是一个很好的踢裤子这样做。

答案 6 :(得分:7)

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

如果这听起来不错,我建议您查看一个集成的票务/来源管理/文档工具,例如Redmine。将相关项目工件(例如待处理任务,讨论线程和版本化数据/代码文件)保存在一起对于远远超出传统“编程”管辖范围的项目可以提供很大帮助。

答案 7 :(得分:5)

同意Sweave是可行的方法,xtable用于生成LaTeX表。虽然我没有花太多时间使用它们,但最近发布的tikzDevice包看起来非常有前途,特别是当与pgfSweave结合使用时(据我所知,只有rforge.net可用)在这个时候 - 从那里有一个r-forge的链接,但它现在没有响应我)。

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

答案 8 :(得分:4)

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

答案 9 :(得分:4)

“make”非常棒,因为(1)您可以将它用于任何语言的所有工作(不像Sweave和Brew),(2)它非常强大(足以在您的机器上构建所有软件) ),以及(3)它避免重复工作。最后一点对我很重要,因为很多工作都很慢;当我输入文件时,我希望在几秒钟内看到结果,而不是重新创建数字所需的时间。

答案 10 :(得分:2)

为了向同事撰写快速初步报告或电子邮件,我发现将图表复制并粘贴到MS Word或电子邮件或维基页面非常有效 - 通常最好是一个位图截图(例如, mac,Apple-Shift-(Ctrl)-4)。我认为这是一种被低估的技术。

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

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

答案 11 :(得分:2)

我会加入我的声音。对于复杂的多步骤分析,您可以使用makefile指定不同的部分。如果只有一个部分发生变化,可以防止重复整个分析。

答案 12 :(得分:2)

我使用项目模板和R studio,目前我的包含以下文件夹:

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

我编写了自定义函数,因此我可以调用smart_save(x,y)smart_load(x)来保存或加载RDS files data output文件夹(以变量名命名的文件),以便我在分析过程中,我没有被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(预先填充)
  • 加载其他库
  • 设置全局变量
02_load data.R
  • 加载csv/txt xlsx RDS,每种类型的文件都有预先填写的注释行
  • 显示在工作区中创建了哪些文件
03_pull data from DB.R
  • 使用dbplyr从数据库中获取已过滤和分组的表
  • 一些预填充的注释行,用于设置连接和获取。
  • 保持客户端操作最低限度
  • 此脚本之外没有服务器端操作
  • 显示已在工作区中创建的文件
  • 保存这些变量,以便更快地重新加载

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

我必须向DB重新提供数据,如果是这样,我将创建其他步骤。

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
  • 应用模板

答案 13 :(得分:0)

我也做Josh Reich所做的事情,只有我这样做才能创建我的个人R-packages,因为它可以帮助我构建我的代码和数据,并且很容易与他人分享。

  1. 创建我的包
  2. 负载
  3. 清洁
  4. 功能
  5. 创建我的包:devtools :: create(&#39; package_name&#39;)

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

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

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