-
Notifications
You must be signed in to change notification settings - Fork 1
/
03.Rmd
75 lines (44 loc) · 11.2 KB
/
03.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# Анализи што не може да се повторат {#nogood}
## Типична анализа (која никој, дури ни авторот, не може да ја повтори) {#typical}
Да погледнеме една хипотетичка но веројатно честа ситуација. Вие работите на некој проект што се однесува на податоци за сточарство во Македонија. Поврзани сте со локална дата база, имате големо парче податоци вчитани во меморија и работна средина со 10 закачени `R` пакети (библиотеки).
Ви стигнува ургентна е-пошта од колега кој бара да се направи сумирање на месечните трошоци на работа групирано по тип на трошок и по вработен. Вие велите, ах, ајде ова на брзина, ги снимате податоците во `Downloads` и почнувате:
```{r, eval=FALSE}
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`](https://www.rdocumentation.org/packages/readr/versions/1.3.1) [@R-readr] и [`dplyr`](https://www.rdocumentation.org/packages/dplyr/versions/0.7.8) [@R-dplyr]. Ние не ги вчитавме овие пакети бидејќи беа закачени во проектот на којшто работевме претходно (сетете се дека не отворивме нов проект). Зошто претпоставуваме дека колегите ќе ги имаат овие пакети закачени во нивната работна средина? **Проблем со кодот (рецептот) и со зависности (алатки)**.
Иако ова личи за тривијален пример, проблемите не се тривијални. Обидете се да екстраполирате кон сериозна анализа со 500 линии код и ќе видите дека е скоро невозможно да се следи процесот и повтори анализата (направи питате) без далеку поголема грижа околу кодот (рецептот).
Горе се главните проблеми кои ја прават нашата кратка анализа не-повторлива. Но има и уште неколку дополнителни забелешки:
4. Патеката `~/Downloads/trosoci-moja-firma.csv` е со голема веројатност надвор од работната папка за било кој од вработените. Веројатнио никој не работи во `Downloads`, туку во папка наменета за различни проекти.
5. Дополнително, многу е често папки како `Downloads` да се бришат/празнат со цел да не чуваме застарени датотеки коишто повторно можеме да ги преземеме. Значи за една недела, дури ни ние самите можеби нема да можеме да ја повториме анализата бидејќи датотеката ќе биде избришана.
6. На втората команда во нашиот код, ние ја користиме функцијата [`summarise_at`](https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/summarise_all) којашто е едноставен начин да дадеме инструкција да се сумираат цените. Но, зависно од верзијата на `R` и `dplyr`, функцијата `summarise_at` можеби нема да биде достапна. Доколку вашиот колега користи многу стара верзија на `dplyr`, функцијата `summarise_at` нема да биде дел од тој пакет со таа верзија, додека со најновата верзија на `dplyr`, ќе добиеме предупредување за `summarise_at` дека наскоро ќе биде заменета со подобра алтернатива. Се разбира овие детали не се толку битни, но веројатно е очигледна поентата дека треба да укажеме која верзија од некој пакет сме ја користеле за да може да се повтори нашата анализа.
7. Патеката која ја користиме за да ја зачуваме табелата е фиксна, што значи ако сакаме да ја повториме процедурата за некоја друга табела, при зачувување ќе ја пребришеме првата зачувана табела.
Значи, во навидно едноставна задача, што може да се заврши со три линии код, ние прекршивме неколку правила за безбедна пракса при анализирање на податоци. Во ова сценарио, дури ни оригиналниот автор на кодот не би можел да гарантира дека ќе може да ја повтори обработката на податоците во иднина.
## Типични пракси кои доведуваат до не-повторливи анализи {#indicators}
Корисно е да споменеме некои од главните пракси кои доведуваат до ситуации како примерот погоре. Доколку при анализа на податоци некој аспект од вашата средина наликува на некоја од овие забелешки, тогаш имајте предвид дека вашата анализа може да биде проблематична за повторување. Генерално, обидете се да ги идентификувате и корегирате ваквите проблеми што е можно порано, бидејќи никој од нас не сака да менува код од стотици линии или да заменува библиотека откако сме завршиле пола од работата.
- Податоците и кодот не се сместени во истиот директориум. На пример податоци во `C:/Data`, а код во `C:/Analizi`.
- Кодот користи апсолутни патеки за вчитување или зачувување на табели (на пример: `C:/Data/Мај2020/трошоци/`). Ваквите апсолутни патеки со голема сигурност не се портабилни.
- Код без документација (коментари кои типично почнуваат со #) или `README` фајл кој ќе укаже како, по кој редослед да се користат скриптите и кои податоци се користат во која скрипта или кој график.
- Код без повикани зависности (користени библиотеки) и без информација за верзиите на повиканите зависности.
- Објекти со податоци кои не се експлицитно вчитани со код (укажува на податоци кои се во нашата работна средина но веројатно _нема_ да бидат достапни за други).
- Работиме на нешто што вклучува случајност (randomness) но немаме наместено зачеток за генераторот на рандом бројки ([`set.seed`](https://www.rdocumentation.org/packages/simEd/versions/1.0.3/topics/set.seed) во `R`). Ова се случува секогаш кога делиме податоци на сетови за тренирање и тестирање во машинско учење на пример.
Очекуваме дека оваа листа ќе расте како што овој текст напредува понатаму.