Рабочий процесс для статистического анализа и составления отчетов


есть ли у кого-нибудь мудрость в отношении рабочих процессов для анализа данных, связанных с написанием пользовательских отчетов? Прецедент в основном таков:

  1. клиент заказывает отчет, который использует анализ данных, например, оценку населения и соответствующие карты для водного района.

  2. аналитик загружает некоторые данные, munges данные и сохраняет результат (например, добавление столбца для населения на единицу, или подмножество данных на основе района границы.)

  3. аналитик анализирует данные, созданные в (2), приближается к своей цели, но видит, что нужно больше данных и поэтому возвращается к (1).

  4. повторите полоскание, пока таблицы и графики не встретят QA/QC и не удовлетворят клиента.

  5. писать отчет, включающий таблицы и графики.

  6. в следующем году, счастливый клиент возвращается и хочет обновить. Это должно быть так же просто, как обновление восходящие данные по новой загрузке (например, получить разрешения на строительство с прошлого года) и нажав кнопку "пересчитать", если спецификации не изменятся.

на данный момент я просто запускаю каталог и ad-hoc это лучшее, что я могу. Я хотел бы более системный подход, поэтому я надеюсь, что кто-то понял это... Я использую сочетание электронных таблиц, 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 176

14 ответов:

обычно я разбиваю свои проекты на 4 части:

  1. загрузить.R
  2. очистить.R
  3. func.R
  4. сделать.R

загрузить.R: заботится о загрузке всех необходимых данных. Обычно это короткий файл, считывающий данные из файлов, URL-адресов и / или ODBC. В зависимости от проекта на данный момент я либо выпишу рабочее пространство с помощью save() или просто держать вещи в памяти для следующего шага.

очистить.R: это где все уродливые вещи живут-заботясь о пропущенных значениях, объединяя фреймы данных, обрабатывая выбросы.

func.Р: содержит все функции, необходимые для выполнения фактического анализа. source() ' ing этот файл не должен иметь никаких побочных эффектов, кроме загрузки определений функций. Это означает, что вы можете изменить этот файл и перезагрузить его, не возвращаясь к повторным шагам 1 и 2, которые могут занять много времени для больших наборов данных.

do.R: вызывает определенные функции в func.R для выполнения анализа и создания диаграмм и таблиц.

основной мотивацией для этой настройки является работа с большими данными, в результате чего вы не хотите перезагружать данные каждый раз, когда вы вносите изменения в следующий шаг. Кроме того, сохранение моего кода в таком виде означает, что я могу вернуться к давно забытому проекту и быстро прочитать нагрузку.R и выясните, какие данные мне нужно обновить, а затем посмотрите на do.R чтобы выяснить, какой анализ был выполнен.

Если вы хотите увидеть некоторые примеры, у меня есть несколько небольших (и не очень маленьких) проектов по очистке и анализу данных, доступных в интернете. В большинстве из них вы найдете скрипт для загрузки данных, один, чтобы очистить его, и несколько, чтобы сделать исследование и анализ:

недавно я начал нумерацию скриптов, так что совершенно очевидно, в каком порядке они должны быть запущены. (Если я чувствую себя действительно причудливым, я иногда сделаю так, что сценарий исследования вызовет сценарий очистки, который, в свою очередь, вызывает сценарий загрузки, каждый из которых выполняет минимальную необходимую работу-обычно путем проверки наличие выходных файлов с file.exists. Однако в большинстве случаев это кажется излишним).

Я использую git для всех моих проектов (система управления исходным кодом), поэтому его легко сотрудничать с другими, посмотреть, что меняется и легко откатиться к предыдущим версиям.

Если я делаю официальный отчет, я обычно держу R и latex отдельно, но я всегда уверен, что могу source мой R-код для создания всего кода и вывода, который мне нужен для отчета. Для видов отчетов, которые Я делаю, я нахожу это проще и чище, чем работать с латексом.

Я согласен с другими респондентами: Sweave отлично подходит для написания отчета с R. и восстановление отчета с обновленными результатами так же просто, как повторный вызов функции Sweave. Он полностью самодостаточен, включая весь анализ, данные и т. д. И вы можете контролировать версию всего файла.

Я использую плагин StatET для Eclipse для разработки отчетов, а Sweave интегрирован (Eclipse распознает формирование латекса и т. д.). На Окнах,Это простой в использовании Программы.

Я бы еще добавил, что вы можете создавать красивые отчеты с помощью 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}

Я просто хотел добавить, если кто не слышал, что в блоге learnr есть отличный пост о создании повторяющихся отчетов С пакет пива Джеффри Хорнера. Мэтт и Кевин оба упомянули Брю выше. На самом деле я не очень много его использовал.

записи следуют хороший рабочий процесс, так что это хорошо стоит прочитать:

  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
  • ВИМ и Вим-Р
  • R Студия

организация код: С точки зрения организации кода, я нахожу две стратегии полезными:

Я использую Sweave для отчетной стороны этого, но я также слышал о квас пакет-хотя я еще не заглядывал в него.

по сути, у меня есть ряд обследований, для которых я создаю сводную статистику. Же опросы, отчеты в любое время. Я построил шаблон Sweave для отчетов (что требует немного работы). Но как только работа будет выполнена, у меня есть отдельный скрипт R, который позволяет мне указывать на новые данные. Я нажимаю " Go", Sweave выводит несколько десятков .tex файлы, и я запускаю небольшой скрипт Python для pdflatex их всех. Мой предшественник потратил ~6 недель каждый год на эти отчеты; я трачу около 3 дней (в основном на очистку данных; escape-символы опасны).

очень возможно, что сейчас есть лучшие подходы, но если вы решите пойти по этому маршруту, дайте мне знать - я собирался поставить некоторые из моих потных хаков, и это было бы хорошим ударом в штаны, чтобы сделать это.

Я собираюсь предложить что-то в другом направлении от других отправителей, основываясь на том, что вы спросили конкретно о рабочего проекта, а не инструменты. Предполагая, что вы относительно довольны своей моделью производства документов, похоже, что ваши проблемы действительно могут быть сосредоточены больше на проблемах отслеживания версий, управления активами и процесса обзора/публикации.

Если это звучит правильно, я бы предложил изучение интегрированного инструмента продажи билетов / управления источниками / документации, такого как в Redmine. Хранение связанных артефактов проекта, таких как отложенные задачи, темы обсуждения и файлы версионных данных/кода, вместе может быть большим подспорьем даже для проектов, находящихся далеко за пределами традиционного "программирования" bailiwick.

согласился, что Swave-это путь, с xtable для создания таблиц LaTeX. Хотя я не провел слишком много времени, работая с ними, недавно выпущенный tikzDevice пакет выглядит действительно многообещающим, особенно в сочетании с pgfSweave (который, насколько я знаю, доступен только на rforge.net в это время-есть ссылка на r-forge оттуда, но она не отвечает за меня в данный момент).

между двумя, вы получите согласованное форматирование между текстом и рисунками (шрифты и т. д.). С brew они могли бы стать святым Граалем генерации отчетов.

на более "мета" уровне, вы можете быть заинтересованы в CRISP-DM модели процесса.

"make" отлично подходит, потому что (1) Вы можете использовать его для всей своей работы на любом языке (в отличие, скажем, Sweave и Brew), (2) он очень мощный (достаточно, чтобы построить все программное обеспечение на вашем компьютере), и (3) он избегает повторения работы. Этот последний пункт важен для меня, потому что большая часть работы идет медленно; когда я латекс файл, я хотел бы увидеть результат в течение нескольких секунд, а не час, который потребуется, чтобы воссоздать цифры.

для написания быстрого предварительного отчета или электронной почты коллеге Я считаю, что очень эффективно копировать и вставлять графики в MS Word или электронную почту или вики-страницу-часто лучше всего использовать растровый скриншот (например, на mac, Apple-Shift-(Ctrl)-4). Я думаю, что это недооцененная техника.

для более окончательного отчета очень важно написать функции R, чтобы легко восстановить все графики (как файлы). Это займет больше времени, чтобы закодировать это.

на больших проблемы с рабочим процессом, мне нравится ответ Хэдли на перечисление файлов кода/данных для потока очистки и анализа. Все мои проекты анализа данных имеют схожую структуру.

Я добавлю свой голос к sweave. Для сложного, многоступенчатого анализа вы можете использовать makefile для указания различных частей. Может предотвратить повторение всего анализа, если изменилась только одна часть.

я использую шаблоны проектов вместе с 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/txtxlsxRDS, есть предварительно заполненная комментированная строка для каждого типа файла
  • показывает, какие файлы hava были созданы в рабочей области

03_pull data from DB.R
  • использует dbplyr для извлечения отфильтрованных и сгруппированных таблиц из БД
  • некоторые предварительно заполненные комментарии линии для настройки соединений и выборки.
  • сохранить операции на стороне клиента до минимума
  • никаких операций на стороне сервера вне этого скрипта
  • показывает, какие файлы были созданы в рабочей области
  • сохраняет эти переменные, чтобы они могли быть перезагружены быстрее

как только это будет сделано, как только я выключу query_db boolean и данные будут перезагружены из RDS в следующий раз.

может случиться, что у меня есть чтобы повторно подать данные в DBs, если это так, я создам дополнительные шаги.


04_Build.R
  • данные пререкания, все самое интересное dplyr/tidyr вещи идет
  • показывает, какие файлы были созданы в рабочей области
  • сохранить эти переменные

как только это будет сделано, как только я выключу build boolean и данные будут перезагружены из RDS в следующий раз.


05_Analyse.R
  • обобщить, модель...
  • отчет excel и csv файлы

95_build ppt.R
  • шаблон для отчета powerpoint с помощью officer

96_prepare markdown.R
  • setwd
  • загрузка данных
  • при необходимости установите параметры markdown
  • render

97_prepare shiny.R
  • setwd
  • загрузка данных
  • установите блестящие параметры, если нужно
  • runApp

98_Markdown report.Rmd
  • шаблон отчета

99_Shiny report.Rmd
  • приложение шаблон

Я также делаю то, что делает Джош Райх, только я делаю это, создавая свои личные R-пакеты, поскольку это помогает мне структурировать мой код и данные, а также довольно легко делиться ими с другими.

  1. создать мой пакет
  2. загрузить
  3. очистить
  4. функции
  5. do

создание моего пакета: devtools:: create ('package_name')

load and clean: я создаю скрипты в data-raw / подпапке моего пакета для загрузка, очистка и хранение результирующих объектов данных в пакете с помощью devtools:: use_data(object_name). Затем я компилирую пакет. Отныне вызов библиотеки (имя_пакета) делает эти данные доступными (и они не загружаются до необходимости).

функции: я помещаю функции для моего анализа в R/ подпапку моего пакета и экспортирую только те, которые должны быть вызваны извне (а не вспомогательные функции, которые могут оставаться невидимыми).

do: I создайте скрипт, который использует данные и функции, хранящиеся в моем пакете. (Если анализ нужно выполнить только один раз, я могу поместить этот скрипт также в папку data-raw/ subfolder, запустить его и сохранить результаты в пакете, чтобы сделать его легко доступным.)