A link that can tell more than dozens of lines of R code – what’s new in archivist?

Can you spot the difference between this plot:

And this one:

You are right! The latter has an embedded piece of R code.
What for?

It’s a call to a function aread from archivist – a package that manages external copies of R objects. This piece of code was added by the function addHooksToPrint(), that enriches knitr reports in links to all objects of a given class, e.g. ggplot.

You can copy this hook to your R session and you will automagically recreate this plot in your local session.

archivist::aread('pbiecek/SmarterPoland_blog/arepo/e44de65f1e56ea42d2df2598c083d1ce')

But it’s not all.
Actually here the story is just beginning.

Don’t you think, that this plot is badly annotated? It is not clear what is being presented. Something about terrorism, but for which year, are these results for all countries or there is some filtering? What is on axes? Why the author skip all these important information? Why he does not include the full R code that explains how this plot was created?

Actually, having this single link you can get answers for all these questions.

First, let’s download the plot and extract the data out of it.

pl <- archivist::aread('pbiecek/SmarterPoland_blog/arepo/e44de65f1e56ea42d2df2598c083d1ce')
digest::digest(pl$data)
## ceed21e997efd00940cdbcba497559c7

This data object is also in the repository so I can download it with the aread function.

dat <- archivist::aread('pbiecek/SmarterPoland_blog/arepo/ceed21e997efd00940cdbcba497559c7') head(dat)
#          country_txt sum_kills sum_wounds    n
# 1        Afghanistan      6208       6958 1926
# 2            Algeria        21         19   16
# 3            Bahrain         5         22   18
# 4         Bangladesh        76        695  465
# 5 Bosnia-Herzegovina         4          6    6
# 6       Burkina Faso         6          9    5

But here is the coolest part.
Having an object one can (in some cases) examine the history of this objects, i.e. check how it was created. Here is how to do this:

archivist::ahistory(md5hash = 'pbiecek/SmarterPoland_blog/arepo/ceed21e997efd00940cdbcba497559c7')

#   small_data                           [d2ad05ac3e93aeaca02f57aa4f9f58bf]
#-> dplyr::filter(iyear == "2015")       [01205474e0515ad29d3bae33ad4ba821]
#-> group_by(country_txt)                [e0d9c060107803889fbc7ffdea7a23f7]
#-> dplyr::summarise(sum_kills = sum(nkill, na.rm = TRUE), 
#                     sum_wounds = sum(nwound, na.rm = TRUE), 
#                     n = n())           [a78cf8a8e9cf10bdb1158af38422723d]
#-> dplyr::filter(sum_kills > 2, 
#                 sum_wounds > 2)        [ceed21e997efd00940cdbcba497559c7]

Now you can see what operations have been used to create data used in this plot. It’s clear how the aggregation has been done, what is the filtering condition and so on.
Also you have hashes to all objects created along the way, co you can download the partial results. This history is being recorded with an operator `%a%` that is working in a similar fashion to `%>%`.

We have the plot, now we know what is being presented, let’s change some annotations.

pl + ggtitle("Victims of terrorism in 2015\nCountries with > 2 Fatalities") + theme_bw()

The ahistory() function for remote repositories was introduced to archivist in version 2.1 (on CRAN since yesterday). Other new feature is the support for repositories in shiny applications. Now you can enrich your app in links to copies of R objects generated by shiny.
You can find more information about these and other features in the useR2016 presentation about archivist (html, video).
Or look for Marcin Kosiński talk during the european R users meeting in Poznań.

The data presented in here is just a small fraction of data from National Consortium for the Study of Terrorism and Responses to Terrorism (START) (2016) retrieved from http://www.start.umd.edu/gtd.

Z pamiętnika nauczyciela akademickiego

Jedną z zaproszonych prelegentek na useR 2016 była Deborah Nolan z referatem ,,Statistical Thinking in a Data Science Course’’. Dora jest profesorem na Berkeley, zajmuje się między innymi technikami nauczania statystyki i napisała świetną książkę ,,Teaching Statistics: A Bag of Tricks’’. Jest też orędowniczką wizualizacji danych i poznawania statystyki przez eksperyment. W swoim referacie poruszyła kilka kwestii, które są mi bliskie i które uważam za ważne, więc poniżej przedstawię je miksując z własnymi doświadczeniami z prowadzenia zajęć w poprzednim semestrze. Całą prezentacje Dory można obejrzeć tutaj a grafiki w tym wpisie pochodzą z jej prezentacji.

Swoją drogą, podczas useR zorganizowane były dwie sesje poświęcone nauczaniu statystyki z użyciem R, jedną nawet miałem przyjemność moderować. Lista referatów z tych sesji znajduje się tutaj. Można też obejrzeć nagrania.

Wróćmy do prezentacji Dory.
Jedną z praktyk dotyczących nauczania statystyki z którą chciała się rozliczyć, jest podejście, że analiza eksploracyjna i wizualizacja danych jest dla dzieci, można tego uczyć w przedszkolu, ale nie wypada uczyć tego matematyków na studiach. Na studiach jest miejsce wyłącznie na teorię. Słowo wyłącznie jest tu użyte dosłownie. Nie jeden z nas doświadczył zajęć ze statystyki w których nie pojawiły się żadne [!] dane. Zdaniem Dory teoria jest bardzo ważna, ale drogą do niej są doświadczenia i intuicje zrodzone z EDA.

Czasem, nawet jeżeli dane się pojawiają, to często w charakterze obiadu w puszce. Dane tak przygotowane by zastosować do tych konkretnych danych jedną, jedyną właściwą, konkretną metodę, pokazać wyniki i lecieć dalej.
Tymczasem prawdziwa analiza danych dla niebanalnych problemów wygląda zupełnie inaczej.
Czasem w ogóle nie wiadomo co trzeba zrobić. A nawet jeżeli już wiadomo co zrobić to często nie wiadomo jaką metodą. Samo ustalanie co i jak może stanowić najtrudniejszy problem, który jest do rozwiązania.

Ok, wiemy już, że na zajęciach ze statystyki chcemy użyć danych i że chcemy by problemy były niebanalne. Jak to zrobić? Pomysł jest w sumie prosty, wprowadzić projekty oparte o współczesne, duże, bogate, złożone dane, związane z otwartymi pytaniami badawczymi.

Skąd brać takie projekty? Na naszych zajęciach na MIM UW czy MiNI PW udało się nawiązać współpracę z Ministerstwem Zdrowia, firmą Applica, działem badawczym Centrum Nauki Kopernik, Entuzjastami Edukacji i zespołem USOSa. Każdy z partnerów dał zbiór danych i wsparcie przy pozyskaniu wiedzy dziedzinowej. Dużych i ciekawych danych było więc sporo, do danych były dołączone dosyć otwarte problemy do rozwiązania.
Każdy projekt miał trzy fazy, co pozwoliło na stopniowe usprawnianie opracowanego rozwiązania, podsłuchanie tego co zrobiły inne grupy i ewentualne zaadaptowanie ich rozwiązań. Miłym bonusem była możliwość zaproszenia ekspertów dziedzinowych ze współpracujących instytucje na prezentacje projektów, dzięki czemu można wymienić się doświadczeniami z analiz (udało się między innymi zaprosić dyrektora IBE, capo di tutti capi USOSa, zrobić prezentacje w CNK).
[btw: Teraz szukam partnerów do projektów na przyszły rok, więc jeżeli Wasza firma/organizacja robi ciekawe rzeczy z ciekawymi danymi to zapraszam do kontaktu].

Co ciekawe, dyskusja po referacie Dory krążyła wokół obawy (wspólnej dla wielu krajów) ,,Ale nasi przełożeni są matematykami, nasi koledzy są matematykami, nasi studenci są matematykami, czy im się to spodoba?”. Odpowiedź prowadzącej była prosta. Jednym się spodoba, innym nie. Ale warto dać studentom trochę różnorodności. Bo na obecnie przematematyzowanej statystyce osoby preferujące doświadczalne podejście do analizy danych mogą nie znaleźć inspiracji. Może więc warto im pokazać, że analiza danych ma wiele oblicz i różne oblicza kręcą różne osoby.

Jak te projekty przyjeli moi studenci? Czy chciało im się spędzać godziny nad projektem, by sprawdzać co tam jeszcze można z tych danych wycisnąć? Czy studentom przyzwyczajonym do dowodzenia twierdzeń takie zajęcia mogą się w ogóle spodobać jeżeli za problemem do analizy nie stoi Google albo Microsoft?

Jednym tak innym nie. Znaleźli się studenci traktujący projekty jako zło konieczne. Wczytaj dane, wytrenuj las losowy, pokaż wynik, zapomnij. Ale trafiły się grupy robiące z danymi cuda. Na statystyce II znalazły się grupy, które do predykcji używały modeli mieszanych, regresji Poissona czy thin plate splines, choć żadnej z tych metod nie omawialiśmy na wykładzie [!!! i o to chodzi]. Na R i Duże Dane kilka zespołów wykorzystało łańcuchy markowa (których nie omawialiśmy na naszych zajęciach) i wywiązała się dyskusja czy założenia tej metody są w określonej sytuacji spełnione czy nie.

Jaka jest więc pointa? Dajmy studentom trochę różnorodności. Obok klasycznych matematycznych wykładów ze statystyki zróbmy miejsce na trochę szaleństwa w eksploracje danych mniej lub bardziej na oślep licząc, tak by uczyć się poruszać w gąszczu prawdziwych problemów. A nuż im się ten gąszcz spodoba.

Przyszłość ggvis

data-science
W przybliżeniu taki tytuł nosił referat Hadleya Wickhama, ale w rzeczywistości był to referat o przyszłości universum pakietów tworzonych i współtworzonych przez Hadleya.
A jest to ciekawy kierunek, więc poniżej napiszę o nim trochę więcej. (btw: zaproponował by zamiast hadleyverse używać nazwy tidyverse. Dlaczego tidy? o tym poniżej).

Prezentacja była świetnie przygotowana. Była jedną z dwóch najlepszych tego useR (drugą była prezentacja Donalda Knutha, ale z zupełnie innego powodu).
Niedługo powinna być dostępna pod tym adresem.

Jednym z ciekawszych wątków był wybór stawiany przed R pomiędzy byciem językiem programowania a byciem językiem do interaktywnej analizy danych. Z pewnością R jest bardziej językiem eksploracji danych niż językiem programistów, stąd pozycje typu The R inferno, wytykające rozwiązania nie do pomyślenia w dojrzałych językach programowania. Niekonsekwencje, które przeszkadzają lub drażnią wielu programistów, są jednak czasem wprowadzane celowo, po to by ułatwić prace z danymi.

O jakie niekonsekwencje chodzi? Zagadka z prezentacji Hadleya jest następująca, co jest wynikiem poniższego kodu.

df <- data.frame(xyz="a")
df$x

Programiści przyzwyczajeni do klasycznych języków programowania spodziewaliby się, że wynikiem jest albo błąd (w obiekcie df nie ma slotu x, jest xyz) albo wektor z napisem. A tymczasem wynikiem jest factor z uwagi na domyślne parametry data.frame (uzupełnianie nazw argumentów i domyślna konwersja do faktorów). R core podjął lata temu decyzje by budować język ułatwiający analizę danych a nie pracę programistów, stąd niektóre błędy są maskowane i ,,naprawiane’’ po cichu w tle.

Drugim wyborem o którym mówił Hadley jest rozdźwięk pomiędzy byciem konserwatywnym a utopistą. Przy czym konserwatywny oznacza tu dbający o wsteczną zgodność z poprzednimi wersjami a utopista oznacza radosną budowę nowych rzeczy czasem bez zachowywania ciągłości z przeszłością. Użytkownicy ggplot2 i pochodnych pakietów na własnej skórze doświadczyli, że Hadley stawia się raczej bliżej utopisty adoptującego nowe rozwiązania, w przeciwieństwie do R core, które stara się zachować stabilność i wsteczną kompatybilność.

No właśnie, w przypadku obu wyborów kierunek tidyverse okazał się inny, niż ten który wybrał R code.

A tidyverse rośnie w siłę, zapowiedziane są pakiety gggeom i ggstat które mają zająć się właściwym uporządkowaniem tworzenia geometrii i tworzenia statystyk. data.frame zostanie zastąpiony przez tibble.
Funkcje będą jeszcze bardziej leniwe (w sensie leniwej ewaluacji) a struktury obiektów ujednolicone (do ramek danych) przez co będzie można pracować na bardziej spójnych strukturach.
To uniwersum rozwiązań rozrastać się będzie wewnątrz R, ale stanie się od reszty R coraz bardziej niezależne.
Pokryje kluczowe aktywności wykonywane przy analizie danych, opisane na wykresie rozpoczynającym ten blog (oczywiście autorstwa HW).
A co będzie później?
Obserwując tempo rozwoju tego universum, dowiemy się już wkrótce.