Alur kerja untuk analisis statistik dan penulisan laporan

186

Adakah yang punya kebijakan tentang alur kerja untuk analisis data terkait penulisan laporan khusus? Use-case pada dasarnya adalah ini:

  1. Klien memberikan laporan yang menggunakan analisis data, misalnya estimasi populasi dan peta terkait untuk distrik air.

  2. Analis mengunduh beberapa data, mengarsipkan data, dan menyimpan hasilnya (mis. Menambahkan kolom untuk populasi per unit, atau menyusun data berdasarkan batas-batas kabupaten).

  3. Analis menganalisis data yang dibuat dalam (2), mendekati tujuannya, tetapi melihat bahwa membutuhkan lebih banyak data dan kembali ke (1).

  4. Bilas ulangi sampai tabel dan gambar memenuhi QA / QC dan memuaskan klien.

  5. Menulis laporan dengan menggabungkan tabel dan grafik.

  6. Tahun depan, klien yang bahagia kembali dan menginginkan pembaruan. Ini harus sesederhana memperbarui data hulu dengan unduhan baru (mis. Dapatkan izin bangunan dari tahun lalu), dan menekan tombol "RECALCULATE", kecuali spesifikasi berubah.

Saat ini, saya baru saja memulai direktori dan ad-hoc yang terbaik yang saya bisa. Saya ingin pendekatan yang lebih sistematis, jadi saya berharap seseorang telah menemukan ini ... Saya menggunakan campuran spreadsheet, SQL, ARCGIS, R, dan alat Unix.

Terima kasih!

PS:

Di bawah ini adalah Makefile dasar yang memeriksa dependensi pada berbagai set data menengah (w / .RDatasuffix) dan skrip ( .Rsuffix). Manfaatkan cap waktu untuk memeriksa dependensi, jadi jika Anda touch ss07por.csv, ia akan melihat bahwa file ini lebih baru dari semua file / target yang bergantung padanya, dan jalankan skrip yang diberikan untuk memperbaruinya. Ini masih dalam proses, termasuk langkah untuk memasukkan ke dalam database SQL, dan langkah untuk bahasa templating seperti sweave. Perhatikan bahwa Make mengandalkan tab dalam sintaksnya, jadi baca manual sebelum memotong dan menempel. Nikmati dan berikan umpan balik!

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 Fungsi persondata.RData.R
      $ R --slave -f MungeData.R

report.txt: TabulateAndGraph.R persondata.Munged.RData Functions.R
      $ R --slave -f TabulateAndGraph.R> report.txt

forkandunggu
sumber
11
Astaga. mereka yang masuk ke sini, waspadalah : jawaban atas pertanyaan ini luar biasa lima tahun yang lalu. Mereka sekarang benar - benar ketinggalan zaman. Saat ini, saya akan sangat menyarankan untuk mengikuti salah satu jawaban di sini. Sekarang ada alat yang jauh lebih baik tersedia. Sebagai permulaan, saya akan merujuk ke proyek contoh menggunakan Makefiles dan Knitr .
Konrad Rudolph
R Notebook , driver odbc , git dan git Jika semuanya dikirim untuk masalah ini.
DaveRGP
Saya akan sangat menyarankan untuk menyiapkan proyek sesuai dengan prinsip-prinsip yang diuraikan misalnya di sini ( github.com/ropensci/rrrpkg ). Apa yang disebut "kompilasi penelitian" adalah anugerah ketika melakukan ilmu data yang dapat direproduksi
Kresten

Jawaban:

195

Saya biasanya memecah proyek saya menjadi 4 bagian:

  1. load.R
  2. bersih
  3. func.R
  4. lakukan

load.R: Mengurus pemuatan di semua data yang diperlukan. Biasanya ini adalah file pendek, membaca data dari file, URL, dan / atau ODBC. Bergantung pada proyek pada titik ini saya akan menulis ruang kerja menggunakan save()atau hanya menyimpan hal-hal dalam memori untuk langkah selanjutnya.

clean.R: Di sinilah semua hal-hal buruk hidup - mengurus nilai-nilai yang hilang, menggabungkan frame data, menangani outlier.

func.R: Berisi semua fungsi yang diperlukan untuk melakukan analisis yang sebenarnya. source()File ini seharusnya tidak memiliki efek samping selain memuat definisi fungsi. Ini berarti bahwa Anda dapat memodifikasi file ini dan memuatnya kembali tanpa harus mengulangi langkah 1 & 2 yang dapat memakan waktu lama untuk dijalankan untuk set data yang besar.

do.R: Memanggil fungsi yang didefinisikan dalam func.R untuk melakukan analisis dan menghasilkan grafik dan tabel.

Motivasi utama untuk pengaturan ini adalah untuk bekerja dengan data besar di mana Anda tidak ingin harus memuat ulang data setiap kali Anda membuat perubahan ke langkah berikutnya. Juga, menjaga kompartemen kode saya seperti ini berarti saya dapat kembali ke proyek yang lama dilupakan dan dengan cepat membaca load.R dan mencari tahu data apa yang perlu saya perbarui, dan kemudian melihat do.R untuk mengetahui analisis apa yang dilakukan.

Josh Reich
sumber
12
Itu alur kerja yang sangat bagus. Saya telah berjuang dengan merancang alur kerja dan ketika saya bertanya kepada orang-orang di sekitar saya, mereka umumnya menjawab, "apa? Alur kerja? Huh?" Jadi saya pikir mereka tidak terlalu memikirkan hal ini. Saya akan mengadopsi model LCFD Reichian.
JD Long
1
ini cukup dekat dengan alur kerja saya, saya sering memiliki skrip impor, skrip analisis dan skrip pelaporan
kpierce8
4
LCFD: Data yang Paling Sering Terjadi Kesalahan
William Doane
2
Ada video presentasi + slide yang bagus oleh Jeromy Anglim yang menggabungkan alur kerja ini di sini vcasmo.com/video/drewconway/10362
David LeBauer
95

Jika Anda ingin melihat beberapa contoh, saya memiliki beberapa proyek pembersihan dan analisis data kecil (dan tidak terlalu kecil) yang tersedia secara online. Pada sebagian besar, Anda akan menemukan skrip untuk mengunduh data, satu untuk membersihkannya, dan beberapa untuk melakukan eksplorasi dan analisis:

Baru-baru ini saya sudah mulai menomori skrip, jadi sangat jelas urutan mana yang harus dijalankan. (Jika saya merasa sangat senang, kadang-kadang saya akan membuatnya sehingga skrip eksplorasi akan memanggil skrip pembersih yang pada gilirannya memanggil skrip unduhan, masing-masing melakukan pekerjaan minimal yang diperlukan - biasanya dengan memeriksa keberadaan file keluaran dengan file.exists. Namun, sering kali ini sepertinya berlebihan).

Saya menggunakan git untuk semua proyek saya (sistem manajemen kode sumber) sehingga mudah untuk berkolaborasi dengan orang lain, melihat apa yang berubah dan dengan mudah memutar kembali ke versi sebelumnya.

Jika saya melakukan laporan formal, saya biasanya menjaga R dan lateks terpisah, tetapi saya selalu memastikan bahwa saya dapat sourcekode R saya untuk menghasilkan semua kode dan output yang saya butuhkan untuk laporan. Untuk jenis laporan yang saya lakukan, saya menemukan ini lebih mudah dan bersih daripada bekerja dengan lateks.

Hadley
sumber
Saya berkomentar tentang Makefile di atas, tetapi Anda mungkin ingin melihatnya - itu adalah bahasa tradisional yang memeriksa ketergantungan. Juga - saya akan mencoba belajar ggplot2 - terlihat hebat!
forkandunggu
Saya suka gagasan memiliki cara untuk menentukan dependensi antara file, tetapi harus belajar m4 adalah mematikan besar. Saya berharap ada sesuatu seperti raken yang ditulis dalam R.
hadley
2
Untuk dependensi, Anda juga dapat melakukannya di dalam file R. Alih-alih melakukan source("blah.R"), memeriksa apakah variabel yang diperlukan (s) ada pertama: if (!exists("foo")) { source("blah.R") }. Itu menghindari ketergantungan kembali menjalankan jika mereka sudah berjalan.
naught101
17

Saya setuju dengan responden lain: Sweave sangat baik untuk penulisan laporan dengan R. Dan membangun kembali laporan dengan hasil yang diperbarui adalah semudah memanggil kembali fungsi Sweave. Ini sepenuhnya mandiri, termasuk semua analisis, data, dll. Dan Anda dapat mengontrol versi seluruh file.

Saya menggunakan plugin StatET untuk Eclipse untuk mengembangkan laporan, dan Sweave terintegrasi (Eclipse mengenali format lateks, dll). Di Windows, mudah digunakan MikTEX .

Saya juga ingin menambahkan, bahwa Anda dapat membuat laporan yang indah dengan Beamer . Membuat laporan normal juga sesederhana itu. Saya menyertakan contoh di bawah ini yang menarik data dari Yahoo! dan membuat bagan dan tabel (menggunakan quantmod). Anda dapat membuat laporan ini seperti:

Sweave(file = "test.Rnw")

Ini dokumen Beamer itu sendiri:

% 
\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}
Shane
sumber
6
Jangan percaya bahwa laporan Sweave dapat direproduksi sampai Anda mengujinya di mesin yang bersih. Sangat mudah untuk memiliki dependensi eksternal implisit.
John D. Cook
16

Saya hanya ingin menambahkan, jika ada orang yang melewatkannya, bahwa ada posting yang bagus di blog learnr tentang membuat laporan berulang dengan paket minuman Jeffrey Horner . Matt dan Kevin sama-sama menyebutkan minuman di atas. Sebenarnya saya belum terlalu sering menggunakannya.

Entri mengikuti alur kerja yang bagus, jadi layak dibaca:

  1. Siapkan data.
  2. Siapkan templat laporan.
  3. Hasilkan laporan.

Sebenarnya menghasilkan laporan setelah dua langkah pertama selesai sangat sederhana:

library(tools)
library(brew)
brew("population.brew", "population.tex")
texi2dvi("population.tex", pdf = TRUE)
Shane
sumber
Dalam memperbaiki kesalahan tata bahasa kecil saya mengacaukan pengalamatan wordpress.com. Jadi tautan yang benar adalah learnr.wordpress.com/2009/09/09/...
learnr
14

Untuk membuat laporan khusus, saya merasa berguna untuk menggabungkan banyak tips yang ada yang disarankan di sini.

Membuat laporan: Strategi yang baik untuk menghasilkan laporan melibatkan kombinasi Sweave, make, dan R.

Editor: Editor yang baik untuk menyiapkan dokumen Sweave meliputi:

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

Organisasi kode: Dalam hal organisasi kode, saya menemukan dua strategi yang berguna:

Jeromy Anglim
sumber
7

Saya menggunakan Sweave untuk sisi laporan-memproduksi ini, tapi saya juga pernah mendengar tentang minuman paket - meskipun saya belum melihat ke dalamnya.

Pada dasarnya, saya memiliki sejumlah survei yang menghasilkan ringkasan statistik. Survei yang sama, laporan yang sama setiap saat. Saya membuat template Sweave untuk laporan (yang membutuhkan sedikit kerja). Tetapi begitu pekerjaan selesai, saya memiliki skrip R terpisah yang memungkinkan saya menunjukkan data baru. Saya tekan "Go", Sweave mengeluarkan beberapa file .tex skor, dan saya menjalankan skrip Python kecil untuk pdflatex semuanya. Pendahulu saya menghabiskan ~ 6 minggu setiap tahun untuk laporan-laporan ini; Saya menghabiskan sekitar 3 hari (kebanyakan untuk membersihkan data; karakter melarikan diri berbahaya).

Sangat mungkin bahwa ada pendekatan yang lebih baik sekarang, tetapi jika Anda memutuskan untuk pergi dengan rute ini, beri tahu saya - saya bermaksud untuk memasang beberapa hack Sweave saya, dan itu akan menjadi tendangan yang bagus untuk dilakukan begitu.

Matt Parker
sumber
Akan sangat senang melihat beberapa "Sweave hacks" ini. Itu membuat saya sakit kepala!
Brandon Bertelsen
7

Saya akan menyarankan sesuatu dalam arah yang berbeda dari submitter lain, berdasarkan pada fakta bahwa Anda bertanya secara spesifik tentang alur kerja proyek , daripada alat . Dengan asumsi Anda relatif senang dengan model produksi dokumen Anda, sepertinya tantangan Anda benar-benar lebih terpusat pada masalah pelacakan versi, manajemen aset, dan proses peninjauan / penerbitan.

Jika itu kedengarannya benar, saya akan menyarankan mencari ke alat tiket / manajemen sumber / dokumentasi terintegrasi seperti Redmine . Menyimpan artefak proyek terkait seperti tugas yang tertunda, utas diskusi, dan file data / kode versi bersama dapat sangat membantu bahkan untuk proyek di luar bailiwick "pemrograman" tradisional.

rcoder
sumber
5

Setuju bahwa Sweave adalah jalannya, dengan xtable untuk menghasilkan tabel LaTeX. Meskipun saya belum menghabiskan terlalu banyak waktu untuk bekerja dengan mereka, paket tikzDevice yang baru-baru ini dirilis terlihat sangat menjanjikan, terutama jika digabungkan dengan pgfSweave (yang, sejauh yang saya tahu hanya tersedia di rforge.net saat ini - ada tautan ke r-forge dari sana, tetapi saat ini tidak menanggapi untuk saya).

Di antara keduanya, Anda akan mendapatkan pemformatan yang konsisten antara teks dan angka (font, dll.). Dengan minuman, ini mungkin merupakan cawan suci pembuatan laporan.

kmm
sumber
pgfSweave saat ini dalam "pengembangan limbo" karena pengembang belum punya waktu untuk memasukkan tikzDevice baru. Untuk saat ini kami sarankan menggunakan tikzDevice dari dalam dokumen Sweave normal - pengguna hanya harus bertanggung jawab untuk membuka / menutup perangkat dan \ termasuk {} hasil yang dihasilkan.
Sharpie
@Sharpie: Adakah pembaruan tentang status pengembangan pgfSweave? Ini terlihat hebat, tetapi tampaknya tidak berfungsi pada sistem apa pun yang saya coba.
Ari B. Friedman
@ gsk3 Pengembang lain telah sangat aktif dalam menjaga pembaruan pgfSweave dan telah melakukan banyak pekerjaan sejak saya memposting komentar itu. Pergilah ke github.com/cameronbracken/pgfSweave untuk melacak pengembangan. Jika paket tidak berfungsi untuk Anda, kami ingin mendapatkan laporan bug sehingga kami dapat memperbaikinya.
Sharpie
@ Sharpie: Bagus, terima kasih. Saya meneruskan pesan Anda ke teman saya yang lebih banyak mengerjakannya daripada saya. Jika dia tidak segera melaporkan laporan bug maka saya akan mengumpulkannya. Sepertinya paket yang bagus; terima kasih untuk semua kerja kerasnya.
Ari B. Friedman
4

Pada tingkat yang lebih "meta", Anda mungkin tertarik pada model proses CRISP-DM .

Jouni K. Seppänen
sumber
4

"make" hebat karena (1) Anda dapat menggunakannya untuk semua pekerjaan Anda dalam bahasa apa pun (tidak seperti, katakanlah, Sweave and Brew), (2) sangat kuat (cukup untuk membangun semua perangkat lunak pada mesin Anda), dan (3) itu menghindari pekerjaan yang berulang. Poin terakhir ini penting bagi saya karena banyak pekerjaan yang lambat; ketika saya lateks file, saya ingin melihat hasilnya dalam beberapa detik, bukan jam yang dibutuhkan untuk membuat ulang angka.

lembab
sumber
+1 untuk make; Namun, saya tidak melihat make sebagai kompatibel dengan Sweave. Alih-alih ketika saya menghasilkan laporan, buat panggilan Sweave (dan hal-hal lain).
Jeromy Anglim
3

Saya menggunakan template proyek bersama dengan R studio, saat ini milik saya berisi folder berikut:

  • info : pdfs, powerpoints, docs ... yang tidak akan digunakan oleh skrip apa pun
  • data input : data yang akan digunakan oleh skrip saya tetapi tidak dihasilkan oleh skrip saya
  • data output : data yang dihasilkan oleh skrip saya untuk penggunaan lebih lanjut tetapi bukan sebagai laporan yang tepat.
  • reports : Hanya file yang benar-benar akan ditampilkan kepada orang lain
  • R : Semua skrip R.
  • SAS : Karena saya terkadang harus: '(

Saya menulis fungsi khusus sehingga saya bisa menelepon smart_save(x,y)atau smart_load(x)menyimpan atau memuat RDS fileske dan dari data outputfolder (file dinamai dengan nama variabel) jadi saya tidak terganggu pathsselama analisis saya.

Fungsi kustom new_projectmembuat folder proyek bernomor, menyalin semua file dari templat, mengganti nama RProjfile dan mengedit setwdpanggilan, dan mengatur direktori kerja ke proyek baru.

Semua Rskrip ada di Rfolder, disusun sebagai berikut:


00_main.R
  • setwd
  • memanggil skrip 1 hingga 5

00_functions.R
  • Semua fungsi dan fungsi hanya pergi ke sana, jika ada terlalu banyak saya akan memisahkannya menjadi beberapa, semua bernama seperti 00_functions_something.R, khususnya jika saya berencana untuk membuat paket dari beberapa dari mereka saya akan memisahkannya

00_explore.R
  • sekelompok potongan skrip tempat saya menguji sesuatu atau menjelajahi data saya
  • Ini satu-satunya file yang saya boleh berantakan.

01_initialize.R
  • Diisi sebelumnya dengan panggilan ke initialize_general.Rskrip yang lebih umum dari folder templat saya yang memuat paket dan data yang selalu saya gunakan dan tidak keberatan ada di ruang kerja saya
  • beban 00_functions.R(prefilled)
  • memuat perpustakaan tambahan
  • mengatur variabel global

02_load data.R
  • banyak csv/txt xlsx RDS, ada baris komentar prefilled untuk setiap jenis file
  • menampilkan file mana yang telah dibuat di ruang kerja

03_pull data from DB.R
  • Penggunaan dbplyruntuk mengambil tabel yang difilter dan dikelompokkan dari DB
  • beberapa baris komentar sebelumnya untuk mengatur koneksi dan mengambil.
  • Usahakan operasi sisi klien minimal
  • Tidak ada operasi sisi server di luar skrip ini
  • Menampilkan file mana yang telah dibuat di ruang kerja
  • Menyimpan variabel-variabel ini sehingga mereka dapat dimuat ulang lebih cepat

Setelah selesai, saya mematikan query_dbboolean dan data akan dimuat kembali dari RDSwaktu berikutnya.

Itu bisa terjadi bahwa saya harus refeed data ke DB, Jika demikian saya akan membuat langkah tambahan.


04_Build.R
  • Perselisihan data, semua kesenangan dplyr/ tidyrhal-hal terjadi di sana
  • menampilkan file mana yang telah dibuat di ruang kerja
  • simpan variabel-variabel ini

Setelah selesai, saya mematikan buildboolean dan data akan dimuat kembali dari RDSwaktu berikutnya.


05_Analyse.R
  • Ringkaslah, model ...
  • laporan exceldan csvfile

95_build ppt.R
  • template untuk laporan powerpoint menggunakan officer

96_prepare markdown.R
  • setwd
  • memuat data
  • atur parameter penurunan harga jika diperlukan
  • render

97_prepare shiny.R
  • setwd
  • memuat data
  • atur parameter mengkilap jika perlu
  • runApp

98_Markdown report.Rmd
  • Templat laporan

99_Shiny report.Rmd
  • Templat aplikasi
Moody_Mudskipper
sumber
2

Untuk menulis laporan pendahuluan cepat atau email ke kolega, saya menemukan bahwa sangat efisien untuk menyalin dan menempelkan plot ke MS Word atau halaman email atau wiki - seringkali yang terbaik adalah screenshot yang dipetakan dengan bitmap (mis. Pada mac, Apple -Shift- (Ctrl) -4). Saya pikir ini adalah teknik yang diremehkan.

Untuk laporan yang lebih akhir, menulis fungsi R untuk dengan mudah membuat ulang semua plot (sebagai file) sangat penting. Memang butuh lebih banyak waktu untuk membuat kode ini.

Pada masalah alur kerja yang lebih besar, saya suka jawaban Hadley tentang penghitungan kode / file data untuk aliran pembersihan dan analisis. Semua proyek analisis data saya memiliki struktur yang serupa.

Brendan OConnor
sumber
2

Saya akan menambahkan suara saya ke sweave. Untuk analisis multi-langkah yang rumit, Anda dapat menggunakan makefile untuk menentukan bagian-bagian yang berbeda. Dapat mencegah keharusan mengulangi seluruh analisis jika hanya satu bagian yang berubah.

PaulHurleyuk
sumber
0

Saya juga melakukan apa yang dilakukan Josh Reich, hanya saya yang membuat paket-R pribadi saya, karena membantu saya menyusun kode dan data saya, dan juga cukup mudah untuk membagikannya dengan orang lain.

  1. buat paket saya
  2. beban
  3. bersih
  4. fungsi
  5. melakukan

membuat paket saya: devtools :: create ('package_name')

memuat dan membersihkan: Saya membuat skrip dalam data-mentah / subfolder dari paket saya untuk memuat, membersihkan, dan menyimpan objek data yang dihasilkan dalam paket menggunakan devtools :: use_data (object_name). Lalu saya kompilasi paket. Mulai sekarang, perpustakaan panggilan (package_name) membuat data ini tersedia (dan mereka tidak dimuat sampai diperlukan).

fungsi: Saya memasukkan fungsi untuk analisis saya ke dalam R / subfolder dari paket saya, dan mengekspor hanya yang perlu dipanggil dari luar (dan bukan fungsi pembantu, yang bisa tetap tidak terlihat).

lakukan: Saya membuat skrip yang menggunakan data dan fungsi yang disimpan dalam paket saya. (Jika analisis hanya perlu dilakukan satu kali, saya dapat memasukkan skrip ini ke dalam data-raw / subfolder, jalankan, dan simpan hasilnya dalam paket agar mudah diakses.)

jciloa
sumber