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

186

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

  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 = / дом / 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

forkandwait
источник
11
Боже мой те, кто входит сюда, остерегаются : ответы на этот вопрос были превосходны пять лет назад. Теперь они полностью устарели. В настоящее время я настоятельно рекомендую не следовать ни одному из ответов здесь. Теперь есть гораздо лучшие инструменты. Для начала я сошлюсь на пример проекта с использованием Makefiles и Knitr .
Конрад Рудольф
R Ноутбуки , драйверы odbc , git и git lfs - это небеса, посланные за эту проблему.
DaveRGP
Я настоятельно рекомендую настроить проект в соответствии с изложенными здесь принципами, например, здесь ( github.com/ropensci/rrrpkg ). Так называют «исследование compedium» является находкой при выполнении воспроизводимых наук данных
Крестно

Ответы:

195

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

  1. load.R
  2. clean.R
  3. func.R
  4. do.R

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

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

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

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

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

Джош Райх
источник
12
Это действительно хороший рабочий процесс. Я изо всех сил пытался спроектировать рабочий процесс, и когда я спрашиваю окружающих, он обычно отвечает: «Что? Рабочий процесс? Я так понимаю, они не думают об этом слишком много. Я собираюсь принять модель LCFD рейха.
JD Long
1
это довольно близко к моему рабочему процессу, у меня часто есть сценарий импорта, сценарий анализа и сценарий отчетности
kpierce8
4
LCFD: наименьшие распространенные данные
Уильям Доан
2
Здесь есть хорошее презентационное видео + слайды от Джерома Англима, который включает этот рабочий процесс здесь vcasmo.com/video/drewconway/10362
David LeBauer
2
@ Вот так вот: files.meetup.com/1685538/Rmeetup_Workflow_fullscreen.pdf
Дэвид Лебауэр,
95

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

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

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

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

Hadley
источник
Я прокомментировал Makefiles выше, но вы можете посмотреть их - это традиционный язык проверки зависимостей. Кроме того - я собираюсь попробовать изучить ggplot2 - выглядит великолепно!
forkandwait
Мне нравится идея иметь возможность указывать зависимости между файлами, но изучение m4 - это большая проблема. Хотелось бы, чтобы в R было написано что-то вроде raken
Хэдли,
2
Для зависимостей вы также можете сделать это в файлах R. Вместо того чтобы делать source("blah.R"), проверьте , существуют ли искомая переменная (s) первый: if (!exists("foo")) { source("blah.R") }. Это позволяет избежать повторного запуска зависимостей, если они уже запущены.
naught101
17

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

Я использую плагин StatET для Eclipse для разработки отчетов, и 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}
Шейн
источник
6
Не верьте, что отчет Sweave можно воспроизвести, пока вы не протестируете его на чистой машине. Легко иметь неявные внешние зависимости.
Джон Д. Кук
16

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

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

  1. Подготовьте данные.
  2. Подготовьте шаблон отчета.
  3. Подготовить отчет.

На самом деле создание отчета после завершения первых двух шагов очень просто:

library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)
Шейн
источник
Исправляя небольшую грамматическую ошибку, я испортил адресацию wordpress.com. Так что правильная ссылка - learnr.wordpress.com/2009/09/09/…
learnr
14

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

Генерация отчетов. Хорошая стратегия создания отчетов включает комбинацию Sweave, make и R.

Редактор: Хорошие редакторы для подготовки документов Sweave включают в себя:

  • StatET и Eclipse
  • Emacs и ESS
  • Вим и Вим-Р
  • R Studio

Организация кода. С точки зрения организации кода я считаю полезными две стратегии:

Джером англим
источник
7

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

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

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

Мэтт Паркер
источник
Хотелось бы увидеть некоторые из этих "Sweave hacks". Это дает мне головную боль!
Брэндон Бертельсен
7

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

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

rcoder
источник
5

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

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

KMM
источник
В настоящее время pgfSweave находится в «подвешенном состоянии», поскольку разработчики не успели внедрить новый tikzDevice. На данный момент мы предлагаем использовать tikzDevice из обычных документов Sweave - пользователь просто должен взять на себя ответственность за открытие / закрытие устройства и \ включая {} полученный результат.
Шарпи
@Sharpie: Есть ли какие-либо обновления статуса разработки pgfSweave? Это выглядит великолепно, но, похоже, не работает ни на одной из систем, которые я пробовал.
Ари Б. Фридман
@ gsk3 Другой разработчик очень активно обновлял pgfSweave и проделал большую работу с тех пор, как я опубликовал этот комментарий. Зайдем github.com/cameronbracken/pgfSweave для отслеживания развития. Если пакет не работает для вас, мы хотели бы получить отчет об ошибке, чтобы мы могли исправить его.
Шарпи
@ Шарпи: Отлично, спасибо. Я отправил ваше сообщение моему другу, который вложил в него больше работы, чем я. Если он не подаст сообщение об ошибке в ближайшее время, я соберу его. Это выглядит как отличный пакет; Спасибо за всю тяжелую работу.
Ари Б. Фридман
4

На более «мета» уровне вас может заинтересовать модель процесса CRISP-DM .

Йоуни К. Сеппанен
источник
4

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

промозглый
источник
+1 за марку; Тем не менее, я не вижу make несовместимым со Sweave. Скорее, когда я создаю отчеты, звоните Sweave (и другие вещи).
Джером Энглим
3

Я использую шаблоны проектов вместе с R studio, в настоящее время мой содержит следующие папки:

  • info : pdfs, 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 следующий раз.

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


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

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


05_Analyse.R
  • Подводя итог, модель ...
  • отчет excelи csvфайлы

95_build ppt.R
  • шаблон для отчета PowerPoint с использованием officer

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

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

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

99_Shiny report.Rmd
  • Шаблон приложения
Moody_Mudskipper
источник
2

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

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

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

Брендан Оконнор
источник
2

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

PaulHurleyuk
источник
0

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

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

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

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

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

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

jciloa
источник