Esej 5: Info-pomyłka

2 paź
2014

Przed chwilą udostępniliśmy esej o tytule ,,Info-pomyłka” pod adresem www.biecek.pl/Eseje/indexPomylka.html. Piąty z serii ,,Wakacje z wizualizacją”.

W tym eseju znaleźć można wiele przykładów błędów w prezentacji danych. Tak celowych manipulacji jak i nieumyślnych potknięć. Wszystkie prezentowane w tym eseju przykłady są z polskiego podwórka, więc lektura powinna być interesująca.

We wtorek zorganizowaliśmy konkurs pośrednio związany z tym esejem. W konkursie należało zaproponować artykuł w którym wykorzystywane są dane. Tym razem otrzymaliśmy 49 zgłoszeń. Co ciekawe każde inne i większość z bardzo różnych tematów (sporo artykułów – ciekawostek, trochę artykułów o polityce, ekonomii i sporcie). Żaden artykuł nie powtórzył się, co dla mnie jest zaskoczeniem (patrz paradoks urodzin, jaka jest szansa, że dwóch studentów z 25 osobowej grupy ma urodziny tego samego dnia?). Ale pozytywnym zaskoczeniem, ponieważ jest więcej materiału do opracowania.

W konkursie wygrał numerek 31, czyli osoba o mailu krzysztof.**********@gmail.com. Gratulujemy! Skontaktujemy się mailowo. Za trzy tygodnie kolejny, ostatni już konkurs.

Ten esej to część zbioru ,,Odkrywać! Ujawniać! Objaśniać!” wydanego przez Fundację, dostępnego już w sprzedaży. O tym jak go kupić można przeczytać na stronie http://biecek.pl/Eseje/ indexZakup.html. Co trzy tygodnie na stronie http://biecek.pl/Eseje/ będziemy publikować kolejny rozdział w postaci elektronicznej, bezpłatnie, na otwartej licencji CC BY&SA.

Czy wykresy służą do manipulowania danymi?
Zazwyczaj (niektórzy powiedzieliby ,,statystycznie”) nie, choć patrząc na niektóre wykresy, nieporadnie prezentujące proste dane, można mieć wątpliwości.

Dobrych wykresów jest coraz więcej, zarówno dlatego, że narzędzia nie pozwalają już popełniać podstawowych błędów, jak i też dlatego, że rośnie świadomość autorów wykresów. Ale wciąż znaleźć można zabawne lub przerażające info-pomyłki i to o nich jest szósty Esej ,,Info-Pomylka”, który odkryjemy za dwa dni.

Czas więc na konkurs.

Wykresy w polskiej prasie pojawiają się coraz częściej, między innymi dlatego, że rośnie dostępność danych, które można pokazać.
Ale nie wszystkie dane okazują się wystarczająco ciekawe by znaleźć się w gazetach lub portalach informacyjnych.
Dzisiejszy konkurs dotyczy właśnie danych liczbowych, które przebijają się do mediów drukowanych lub elektronicznych.

Aby wziąć udział w konkursie, należy znaleźć artykuł z polskojęzycznego portalu informacyjnego, który prezentuje jakieś liczby.
Czy to rankingi, czy wyniki konkursów sportowych, czy poparcie polityczne, czy informacje o demografii czy przestępczości, czy ekonomii, bez znaczenia.

Reguły:
1. W losowaniu biorą udział wszystkie odpowiedzi, nie ma poprawnych i niepoprawnych!.
2. Jedna osoba może wziąć udział tylko raz w tej zabawie.
3. Liczą się tylko głosy oddane dziś i jutro (30 września, 1 października).
4. Spośród odpowiedzi wylosuję jedną osobę, która otrzyma papierowe wydanie Esejów.

Po co?
Pracuję teraz nad zestawem wskazówek dotyczących czytania danych z artykułów prezentowanych w mediach. Okazuje się, że nie zawsze to jest proste, warto pewne rzeczy wyjaśnić.
Ale o jakich zastosowaniach danych w mediach warto opowiedzieć? Tutaj właśnie liczę na Wasze zgłoszenia konkursowe, mam nadzieję z nich odczytać z jakim typem artykułów zazwyczaj kojarzone są dane liczbowe.

Powodzenia w losowaniu. Książka czeka.

[Jeżeli powyższy formularz się nie wyświetla, proszę wysłać odpowiedź przez tę stronę]

Okladka
Jeżeli prowadzisz zajęcia związane z prezentacją, czytaniem lub analizą danych, czy to jako doktorant, nauczyciel akademicki, czy nauczyciel w szkole średniej; i chciałbyś otrzymać darmowe, papierowe wydanie ,,Zbioru esejów o sztuce prezentowania danych” to napisz do nas, na adres smarterpoland (na serwerze) gmail.com.

[update:] Z uwagi na liczbę zgłoszeń, oraz liczbę dostępnych promocyjnych egzemplarzy, ta oferta jest już nieaktualna.

W mailu prosimy o informacje:
1. Jakie zajęcia związane z danymi prowadzisz (nazwa, link do www jeżeli istnieje),
2. Gdzie pracujesz (szkoła/uczelnia/wydział),
3. Na jakie imię, nazwisko i adres wysłać Eseje. Adres musi być adresem uczelni/wydziału/szkoły.

Jeżeli znacie nauczycieli akademickich, potencjalnie zainteresowanych tematem prezentacji danych, to udostępnijcie ten post lub prześlijcie go dalej.

Za tydzień rozpoczyna się rok akademicki. Jednym z celów fundacji jest edukacja w obszarze analizy i prezentacji danych. Stąd pomysł, by wyposażyć w papierową wersję Esejów osoby prowadzące zajęcia związane z analizą danych lub wnioskowaniem opartym o dane. Czy to prowadzące zajęcia dla studentów czy dla uczniów szkół średnich. Mam nadzieję, że eseje staną się inspiracją do ciekawego wykładu dla uczniów czy studentów.

Liczba egzemplarzy, które planujemy rozesłać jest ograniczona.

Version 1.1 of the archivist package reached CRAN few days ago.
This package supports operations on disk based repository of R objects. It makes the storing, restoring and searching for an R objects easy (searching with the use of meta information). Want to share your object with article reviewers or collaborators? This package should help.
We’ve created some vignettes to present core use-cases. Here is one of them.

Lazy load with archivist

by Marcin Kosiński

Too big .Rdata file causing problems? Interested in few objects from a huge .Rdata file? Regular load() into Global Environment takes too long or crashes R session? Want to load or copy an object with unknown name? Maintaing environment with thousands of objects became perplexing and troublesome?

library(devtools)
if (!require(archivist)){
  install_github("archivist", "pbiecek")
  require(archivist)
  }
library(tools)

If stacked with any of the above applies, this use case is a must read for you.

The archivist package is a great solution that helps administer, archive and restore your artifacts created in R package.

Combining archivist and lazy load may be miraculous

If your .RData file is too big and you do not need or do not want to load the whole of it, you can simply convert the .RData file into a lazy-load database which serializes each entry separately and creates an index. The nice thing is that the loading will be on-demand.

# convert .RData -> .rdb/.rdx
lazyLoad = local({load("Huge.RData"); 
                  environment()})
tools:::makeLazyLoadDB(lazyLoad, "Huge")

Loading the database then only loads the index but not the contents. The contents are loaded as they are used.

lazyLoad("Huge")
objNames <- ls() #232 objects

Now you can create your own local archivist-like Repository which will make maintainig artifacts as easy as possible.

DIRectory <- getwd()
createEmptyRepo( DIRectory )

Then objects from the Huge.RData file may be archived into Repository created in DIRectory directory. The attribute tags (see Tags) specified as realName is added to every artifact before the saveToRepo() call, in order to remember its name in the Repository.

lapply( as.list(objNames), function(x){
  y <- get( x, envir = lazyLoad )
  attr(y, "tags") <- paste0("realName: ", x)
  saveToRepo( y, repoDir = DIRectory )} )

Now if you are interested in a specific artifact but the only thing you remember about it is its class was data.frame and its name started with letters ir then it is possible to search for that artifact using the searchInLocalRepo() function.

hashes1 <- searchInLocalRepo( "class:data.frame", DIRectory)
hashes2 <- searchInLocalRepo( "realName: ir", DIRectory, 
                               fixed = FALSE)

As a result we got md5hashes of artifacts which class was data.frame (hashes1) and md5hashes of artifacts which names (stored in tag named realName) starts with ir. Now we can proceed with an intersection on those two vectors of characters.

(hash <- intersect(hashes1, hashes2))
 
## [1] "32ac7871f2b4875c9122a7d9f339f78b"

After we got one md5hash corresponding to the artfiact we are interested in, we can load it using the loadFromLocalRepo() function.

myData <- loadFromLocalRepo( hash, DIRectory, value = TRUE )
summary(myData[,-5])
 
##  Sepal.Length   Sepal.Width    Petal.Length   Petal.Width 
## Min.   :4.30   Min.   :2.00   Min.   :1.00   Min.   :0.1  
## 1st Qu.:5.10   1st Qu.:2.80   1st Qu.:1.60   1st Qu.:0.3  
## Median :5.80   Median :3.00   Median :4.35   Median :1.3  
## Mean   :5.84   Mean   :3.06   Mean   :3.76   Mean   :1.2  
## 3rd Qu.:6.40   3rd Qu.:3.30   3rd Qu.:5.10   3rd Qu.:1.8  
## Max.   :7.90   Max.   :4.40   Max.   :6.90   Max.   :2.5

One can always check the realName tag of that artifact with the getTagsLocal() function.

getTagsLocal(hash, DIRectory, "realName")
 
##[1] "realName: iris"

If only specific artifacts from previously created Repository in DIRectory directory are needed in future, they may be copied to a new Repository in new directory. New, smaller Repository will use less memory and may be easier to send to contributors when working in groups. Here is an example of copying artifacts only from selected classes. Because DIRectory2 directory did not exist, the parameter force=TRUE was needed to force creating empty Repository. Vector hashesR contains md5hashes or artifacts that are related to other artifacts, which mean they are datasets used to compute other artifacts. The special parameter fixed = TRUE specifies to search in tags that start with letters relation.

hashes <- unlist(sapply(c("class:coxph", "class:function",
                   "class:data.frame"), searchInLocalRepo, 
                 repoDir = DIRectory))
hashesR <- searchInLocalRepo( "relation", 
              repoDir = DIRectory, fixed = FALSE)
DIRectory2 <- (paste0( DIRectory, "/ex"))
createEmptyRepo( DIRectory2, force = TRUE )
copyLocalRepo( DIRectory, DIRectory2, 
               c( hashes, hashesR ) )

You can even tar your Repository with tarLocalRepo() function and send it to anybody you want.

tarLocalRepo( DIRectory2 )

You can check the summary of Repository using the summaryLocalRepo() function. As you can see, some of the coxph artifacts have an addtional class. There are also 8 datasets. Those are artifacts needed to compute other artifacts and archived additionaly in the saveToRepo() call with default parameter archiveData = TRUE.

summaryLocalRepo( DIRectory2 )
 
## Number of archived artifacts in the Repository:  81 
## Number of archived datasets in the Repository:  11 
## Number of various classes archived in the Repository: 
##              Number
## data.frame      51
## function        19
## coxph           11
## coxph.null       1
## coxph.penal      4
## Saves per day in the Repository: 
##             Saves
## 2014-09-22    92

When Repository is no longer necessary we may simply delete it with deleteRepo() function.

deleteRepo( DIRectory )
deleteRepo( DIRectory2 )

Rrrrrrrrr, dam pracę

18 wrz
2014

Kontynuując temat ogłoszeń z ofertami pracy w okolicach R i analizy danych, dziś coś z KNF.

Poszukuję kandydatów do pracy w zespole zajmującym się projektowaniem, implementowaniem i utrzymywaniem modeli ryzyka rynkowego, kredytowego, ubezpieczeń na życie i ubezpieczeń osobowo-majątkowych.

Pożądane cechy kandydata:
– umiejętność pracy w grupie (matematyków)
– solidne opanowanie podstaw statystyki
– minimum kilkumiesięczne doświadczenie w implementowaniu modeli
– doświadczenie z C++ i R
– dociekliwość i kreatywność
– wykształcenie matematyczne lub ekonomiczne (ew. student studiów II stopnia)

Jeśli jesteś wstępnie zainteresowany i spełniasz minimum 4 powyższe cechy, to skontaktuj się ze mną wysyłając maila na adres: wielgosz.marek (na serwerze) gmail.com.

Serwis http://hedonometer.org/ prezentuje interesujące ilustracje o tym jak zmienia się nastrój/nastawienie wypowiedzi w różnych mediach (np. na Twitterze na przestrzeni roku). O analizie nastroju/nastawienia pisaliśmy na tym blogu nie raz, czy to w kontekście wydarzeń na Ukrainie, Euro 2012 czy olimpiadzie. W skrócie, na podstawie słów lub zwrotów z wypowiedzi oceniamy zabarwienie emecjonalne tej wypowiedzi na jednej lub kilku skalach.

Ostatnio znalazłem na hedonometer.org bardzo ciekawe wizualizacje książek dostępnych w ramach projektu Gutenberg (książki, które przeszły do domeny publicznej). Poniżej przykład dla esejów ,,O życiu i literaturze” (Notes on Life and Letters) Josepha Conrada.

Graficznie przedstawiony jest zabarwienie emecjonalne ,,wzdłuż” książki. Na wykresie widać, które fragmenty są weselsze/bardziej pozytywne a które nie. Można również zobaczyć jakich słów jest zdecydowanie więcej/mniej we wskazanych sekcjach i jak te słowa przekładają się na całościowy nastrój.

Screen Shot 2014-09-01 at 15.05.21

Screen Shot 2014-09-01 at 15.05.27

Więcej pod adresem http://hedonometer.org/books.html.

Esej: Od Kuchni

11 wrz
2014

Pod adresem www.biecek.pl/Eseje/ indexKuchnia.html udostępniliśmy esej o tytule ,,Od kuchni”. Piąty z serii ,,Wakacje z wizualizacją” (tak, niektórzy jeszcze mają wakacje).

We wtorek zorganizowaliśmy konkurs związany z tym esejem. W konkursie należało wskazać najładniejszy wykres, z pięciu dostępnych do wyboru. Każdy wykres przedstawiał 36 średnich za pomocą punktów. Każdy wykres wykorzystywał domyślnych ustawienia innej biblioteki/programu, lub zmiany tych ustawień, które można wykonać w 2-3 minuty (oczywiście, każdy z nich można by poprawić, ale nie to było celem).

W zabawie wzięło udział 270 osób. Z tej grupy 68% (183 osoby) uznały, że najbardziej podoba im się wykres wykonany w ggplot2, 8% (22 osoby) wybrały opcje ggplot2 połączoną z biblioteką imitującą minimalizm Tuftego (theme_tufte), 10% (28 osób) wybrało wykres wykonany w Excelu (pomimo problemów z osiami), 11% (29 osób) wybrało wykres przygotowany w Tableau (jedna z bardziej popularnych rysowarek) a 3% (8 osób) wybrało opcje plot.ly

plot_651547531

Pomysł na konkurs pojawił się po lekturze pracy Ihad Inbar, Noam Tractinsky and Joachim Meyer. Minimalism in information visualization: attitudes towards maximizing the data-ink ratio., która pokazuje, że przy całym naszym zachwycie minimalizemem Tuftego, większość osób woli mniej minimalistyczne wykresy. Okazuje się, że w grupie osób, które zechciały wziąć udział w ankiecie imitacja pomysłów Tuftego zajęła drugie miejsce, ale od końca. Zdecydowanym liderem jest domyślny wykres wyprodukowany przez bibliotekę ggplot2 (pomimo swoich wad, oparciu się o kolory nie kształty i to szare tło).

Pozytywnie zaskoczyła mnie liczba komentarzy pod poprzednim postem. Jednym z ciekawych komentarzy była sugestia, by na wykresie wykorzystać paski zamiast punktów (paski lepiej wypełniają obszar wykresu i jest na czym zawiesić oko). I tutaj dochodzimy do eseju ,,od kuchni”. W samym eseju omawiamy różne skale pomiarowe: ilorazową, interwałową i jakościową. Zastanawiamy się jakie charakterystyki pozwalają na poprawne przedstawienie wartości. Jeżeli nie mamy pomiarów w skali ilorazowej, to nie możemy używać pasków. Niestety pomiary PV umiejętności w badaniach PISA czy PIAAC nie są w skali ilorazowej, nie mają naturalnego punktu 0 i nie możemy wykorzystywać długości.

W konkursie wygrał numerek 70, czyli osoba o mailu radek.********@gmail.com. Gratulujemy! Skontaktujemy się mailowo. Niedługo kolejne konkursy.

Ciekawostka: Dlaczego ten esej otwiera 44 zdjęć wieży Eiffela? Byłem jakiś czas temu w Paryżu i chciałem zrobić dobre zdjęcie wieży Eiffela (tak wiem, nuda). Stwierdziłem, że najlepiej będzie zrobić dużo zdjęć wieży i zestawić je obok siebie, by porównać które i dlaczego mi się bardziej podoba.

Ten esej to część zbioru ,,Odkrywać! Ujawniać! Objaśniać!” wydanego przez Fundację, dostępnego już w sprzedaży. O tym jak go kupić można przeczytać na stronie http://biecek.pl/Eseje/ indexZakup.html. Co trzy tygodnie na stronie http://biecek.pl/Eseje/ będziemy publikować kolejny rozdział w postaci elektronicznej, bezpłatnie, na otwartej licencji CC BY&SA.

Za dwa dni odkrywamy Esej ,,Od Kuchni”, ze zbiorem wskazówek dotyczących projektowania wykresów. Ponieważ ostatni konkurs wypadł bardzo ciekawie, postanowiłem kolejny urządzić w podobnej formule. Ponownie więc mamy konkurs, w którym można wygrać papierową wersję Esejów o wizualizacji danych.

Aby wziąć udział w konkursie, należy odpowiedzieć na poniższe pytanie.
Reguły:
1. W losowaniu biorą udział wszystkie odpowiedzi, nie ma poprawnych i niepoprawnych!.
2. Jedna osoba może wziąć udział tylko raz w tej zabawie.
3. Liczą się tylko głosy oddane dziś i jutro (9-10 września).
4. Spośród odpowiedzi wylosuję jedną osobę, która otrzyma papierowe wydanie Esejów.

A jakie jest pytanie?

Poniżej jest przedstawionych pięć różnych layoutów proponowanych przez różne narzędzia do prezentacji danych. Każdy z nich przedstawia te same dane, o średnim wyniku poziomu umiejętności matematycznych w różnych krajach i różnych grupach wiekowych na bazie badania PIAAC (nomen omen ciekawe dane).

Zadanie: wskazać wykres, który Twoim zdaniem wygląda najlepiej (wybrać opcję w formularzu na końcu wpisu).


Opcja A

fig1


Opcja B

fig2


Opcja C


Opcja D

fig6


Opcja E



(btw: Zdaję sobie sprawę, że z każdym z tych wykresów coś jest nie tak i można by go poprawić. Ale dzięki temu wybór jest ciekawszy.)

Powodzenia w losowaniu. Książka czeka.

[Jeżeli powyższy formularz się nie wyświetla, proszę wysłać odpowiedź przez tę stronę]

Pod koniec maja odbyło się czwarte Spotkanie Entuzjastów R. Spotkanie było bardzo udane, ale przez nawał pracy związanej z Esejami… zapomniałem wrzucić materiały ze spotkania na sieć.

Teraz, przygotowując się do kolejnej serii spotkań w nowym roku akademickim (najbliższe już w październiku, niedługo ogłoszenie), uzupełniam braki.

Nagrania wideo i prezentacje z czwartego spotkania można obejrzeć i pobrać ze strony http://smarterpoland.pl/SER/ (oraz mirrora http://beta.icm.edu.pl/SER/).

Read the rest of this entry »

,,Panika pojawiła się na rynku w czwartek, kiedy na teren naszych wschodnich sąsiadów wtargnęły regularne wojska rosyjskie”. To cytat z portalu money.pl, z artykułu ,,Sytuacja na Ukrainie wystraszyła inwestorów z GPW, ale na krótko”. W artykule jest więcej o czwartkowej sesji na GPW z punktu widzenia indeksu WIG20, moją uwagę zwróciło między innymi zdanie ,,Była to najgorsza sesja w tym miesiącu. Powodem było wejście regularnych wojsk rosyjskich na terytorium Ukrainy”.

Oczywiście żółte światło ostrzegawcze zapaliło się gdy tylko zobaczyłem zwrot ,,powodem było”. Czy to skrót od ,,powodem były decyzje inwestorów, spowodowane decyzjami innych inwestorów, którzy uznali, że wydarzenia na Ukrainie spowodują spadki”?

Tylko jaka część z tego spadku to korekta wzrostów z początku tygodnia (pn +0.44, wt +0.77) a jaka część to ,,panika”? I koniec końców czy to -1.86 to rzeczywiście panika (zgodnie z SJP panika to ,,nagły, niepohamowany, często nieuzasadniony strach, ogarniający zwykle większą liczbę ludzi”)?

Całkiem niedawno, w eseju o percepcji danych, opisywałem przykłady nadinterpretacji różnych zdarzeń. Mając na świeżo opis doszukiwania się wpływu schwytania Hussajna na sytuacje na giełdzie, stwierdziłem, że warto przyjrzeć się bliżej temu co działo się ostatnio na WIG20.

Z portalu http://www.gpwinfostrefa.pl/ pobieram dane za ostatnie 10 lat (od września 2004 do sierpnia 2014) i rysuję zmiany indeksu WIG20. Na czerwono próg -1.86.

No cóż, czasem jest gorzej, czasem jest lepiej. W okresie tych 10 lat dzienna zmiana WIG20 w 8% przypadków była niższa niż -1.86. Czyli nie jest to jakieś niezwykłe zjawisko na giełdzie.

Ktoś może powiedzieć, że horyzont 10 lat jest absurdalny, bo na rynku akcji liczy to co się dzieje w tej chwili. Odnoszenie się do poprzednich lat i jakichś kryzysów tylko umniejsza wagi silnej reakcji giełdy na obecną sytuację.

Zobaczmy więc co się działo od początku roku, czyli mniej więcej okresu różnych wydarzeń na Ukrainie.

Na niebiesko linia wygładzonego trendu. W ostatnim miesiącu raczej na plusie, choć na Ukrainie sytuacja przez cały sierpień nie była zbyt optymistyczna.

Disclaimer dla tych co czytają za szybko:
1. Wpis powstał w piątek. W poniedziałek WIG 20 zakończył dzień z wynikiem +1.08%. Z ,,paniki” niewiele pozostało. Ale z pewnością analitycy jakoś to wyjaśnią.
2. Z pewnością wydarzenia na Ukrainie mają wpływ na nasz rynek.
3. Powyższy wpis to jedynie krytyczne spojrzenie na twierdzenie ,,Panika pojawiła się na rynku w czwartek, … Powodem było wejście regularnych wojsk rosyjskich na terytorium Ukrainy”.

I kod w R. Zwracam uwagę na theme_tufte(), która mi się bardzo podoba.

library(ggthemes)
library(ggplot2)
library(xlsx)
 
WIG20 <- read.xlsx("PL9999999987.xls", sheetIndex = 1)
WIG20$Data <- as.Date(as.character(WIG20$Data))
ggplot(WIG20, aes(x=Data, y=Zmiana, group= Nazwa)) + 
  geom_line() + theme_tufte() + 
  geom_hline(yintercept= -1.86, col="darkred")
 
ggplot(tail(WIG20,170), aes(x=Data, y=Zmiana, group= Nazwa)) + 
  geom_line() + geom_point() + theme_tufte() + 
  geom_smooth(span=0.4, method="loess", se=TRUE) +
  geom_hline(yintercept= 0, col="gray")
top