Поглавје 3 Анализи што не може да се повторат

3.1 Типична анализа (која никој, дури ни авторот, не може да ја повтори)

Да погледнеме една хипотетичка но веројатно честа ситуација. Вие работите на некој проект што се однесува на податоци за сточарство во Македонија. Поврзани сте со локална дата база, имате големо парче податоци вчитани во меморија и работна средина со 10 закачени R пакети (библиотеки).

Ви стигнува ургентна е-пошта од колега кој бара да се направи сумирање на месечните трошоци на работа групирано по тип на трошок и по вработен. Вие велите, ах, ајде ова на брзина, ги снимате податоците во Downloads и почнувате:

trosoci <- read_csv("~/Downloads/trosoci-moja-firma.csv")

trosoci_sumirani <- trosoci %>% 
  group_by(vraboten, tip_na_trosok) %>% 
  summarise_at("cena", "sum") %>% 
  arrange(vraboten, tip_na_trosok)

write_csv(trosoci_sumirani, 
          path = "~/Download/trosoci-moja-firma-sumirani.csv")

За пет минути сте готови со минимална дистракција, па дури и не мрднавте од претходниот проект. Ја праќате новата табела на колегата. Супер. Фала многу.

Половина час подоцна стигнува е-пошта од претпоставениот со пофалба за брзо завршената работа и соработката со колегата. Шефицата исто вели ајде прати ни го кодот за да го забрзаме процесот во иднина и да не одземаме време од комплексните анализи кои ви се примарна задача. Вие го копирате кодот од историја на вашето Rstudio и го праќате:

trosoci <- read_csv("~/Downloads/trosoci-moja-firma.csv")

trosoci_sumirani <- trosoci %>% 
  group_by(vraboten, tip_na_trosok) %>% 
  summarise_at("cena", "sum") %>% 
  arrange(vraboten, tip_na_trosok)

write_csv(trosoci_sumirani, 
          path = "~/Download/trosoci-moja-firma-sumirani.csv")

Но, како што можеби веќе очекувате, приказната не завршува тука. Стигнува нова пошта со пораката: "Кај мене ова не работи?!?“ Зошто? Па има неколку можни причини:

  1. Првата линија код чита податоци од ~/Downloads/trosoci-moja-firma.csv. Зошто претпоставуваме дека колегите ќе ја имаат таа табела во тој фолдер? Проблем со податоците (состојките)

  2. Првата линија код чита податоци од ~/Downloads/trosoci-moja-firma.csv. Зошто претпоставуваме дека колегата ќе работи на Linux а не Windows на пример, па дури и да ги имаат податоците во Downloads патеката до тој фолдер ќе биде различна (на пр. C:\Downloads) не ~/Downloads)? Проблем со податоците (состојките) и со кодот (рецептот)

  3. Во кодот што го пративме, не вчитуваме никакви пакети, иако користиме функции од два нестандардни пакети во R: readr (Wickham, Hester, and Francois 2018) и dplyr (Wickham, François, et al. 2020). Ние не ги вчитавме овие пакети бидејќи беа закачени во проектот на којшто работевме претходно (сетете се дека не отворивме нов проект). Зошто претпоставуваме дека колегите ќе ги имаат овие пакети закачени во нивната работна средина? Проблем со кодот (рецептот) и со зависности (алатки).

Иако ова личи за тривијален пример, проблемите не се тривијални. Обидете се да екстраполирате кон сериозна анализа со 500 линии код и ќе видите дека е скоро невозможно да се следи процесот и повтори анализата (направи питате) без далеку поголема грижа околу кодот (рецептот).

Горе се главните проблеми кои ја прават нашата кратка анализа не-повторлива. Но има и уште неколку дополнителни забелешки:

  1. Патеката ~/Downloads/trosoci-moja-firma.csv е со голема веројатност надвор од работната папка за било кој од вработените. Веројатнио никој не работи во Downloads, туку во папка наменета за различни проекти.

  2. Дополнително, многу е често папки како Downloads да се бришат/празнат со цел да не чуваме застарени датотеки коишто повторно можеме да ги преземеме. Значи за една недела, дури ни ние самите можеби нема да можеме да ја повториме анализата бидејќи датотеката ќе биде избришана.

  3. На втората команда во нашиот код, ние ја користиме функцијата summarise_at којашто е едноставен начин да дадеме инструкција да се сумираат цените. Но, зависно од верзијата на R и dplyr, функцијата summarise_at можеби нема да биде достапна. Доколку вашиот колега користи многу стара верзија на dplyr, функцијата summarise_at нема да биде дел од тој пакет со таа верзија, додека со најновата верзија на dplyr, ќе добиеме предупредување за summarise_at дека наскоро ќе биде заменета со подобра алтернатива. Се разбира овие детали не се толку битни, но веројатно е очигледна поентата дека треба да укажеме која верзија од некој пакет сме ја користеле за да може да се повтори нашата анализа.

  4. Патеката која ја користиме за да ја зачуваме табелата е фиксна, што значи ако сакаме да ја повториме процедурата за некоја друга табела, при зачувување ќе ја пребришеме првата зачувана табела.

Значи, во навидно едноставна задача, што може да се заврши со три линии код, ние прекршивме неколку правила за безбедна пракса при анализирање на податоци. Во ова сценарио, дури ни оригиналниот автор на кодот не би можел да гарантира дека ќе може да ја повтори обработката на податоците во иднина.

3.2 Типични пракси кои доведуваат до не-повторливи анализи

Корисно е да споменеме некои од главните пракси кои доведуваат до ситуации како примерот погоре. Доколку при анализа на податоци некој аспект од вашата средина наликува на некоја од овие забелешки, тогаш имајте предвид дека вашата анализа може да биде проблематична за повторување. Генерално, обидете се да ги идентификувате и корегирате ваквите проблеми што е можно порано, бидејќи никој од нас не сака да менува код од стотици линии или да заменува библиотека откако сме завршиле пола од работата.

  • Податоците и кодот не се сместени во истиот директориум. На пример податоци во C:/Data, а код во C:/Analizi.

  • Кодот користи апсолутни патеки за вчитување или зачувување на табели (на пример: C:/Data/Мај2020/трошоци/). Ваквите апсолутни патеки со голема сигурност не се портабилни.

  • Код без документација (коментари кои типично почнуваат со #) или README фајл кој ќе укаже како, по кој редослед да се користат скриптите и кои податоци се користат во која скрипта или кој график.

  • Код без повикани зависности (користени библиотеки) и без информација за верзиите на повиканите зависности.

  • Објекти со податоци кои не се експлицитно вчитани со код (укажува на податоци кои се во нашата работна средина но веројатно нема да бидат достапни за други).

  • Работиме на нешто што вклучува случајност (randomness) но немаме наместено зачеток за генераторот на рандом бројки (set.seed во R). Ова се случува секогаш кога делиме податоци на сетови за тренирање и тестирање во машинско учење на пример.

Очекуваме дека оваа листа ќе расте како што овој текст напредува понатаму.

Литература

Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2020. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.

Wickham, Hadley, Jim Hester, and Romain Francois. 2018. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.