IV Niezależne Ogólnopolskie Mistrzostwa w Analizie Danych

Marcin Koralewski przygotował krótką relację z IV Niezależnych Ogólnopolskich Mistrzostw w Analizie Danych. Poniżej umieszczamy i relacje i treści finałowych zadań.
[zdjęcie po prawej pochodzi z albumu zawodów NOMAD]

Dnia 7 czerwca odbył się finał IV Niezależnych Ogólnopolskich Mistrzostw w Analizie Danych, tym samym dając kres kilkumiesięcznej wytężonej pracy członków Koła Naukowego Statystyki Matematycznej „Gauss”. Finaliści mierzyli się z zadaniami w dwóch kategoriach wiekowych: szkół ponadgimnazjalnych oraz studentów. Mistrzostwa mają na celu propagowanie statystyki jako dziedziny matematyki obecnej na co dzień w ludzkim życiu, przy wykorzystaniu programowania np. w R. I o ile zadania dla szkół ponadgimnazjalnych są zazwyczaj deterministyczne i opierają się na rachunku prawdopodobieństwa, to zarówno oni, jak i studenci muszą mierzyć się z nietrywialnymi problemami (z których czasami najbardziej niemożliwym do sforsowania jest przebrnięcie przez treść zadania).

W tym roku zwycięstwo w kategorii liceów przypadło Piotrowi Przestrzelskiemu oraz Erykowi Kijewskiemu z Suwałk, zaś w kategorii Szkół Wyższych Pawłowi Budzianowskiemu oraz Tomaszowi Stroińskiemu z UAM’u.
Szczególne gratulacje należą się zwycięskiej drużynie licealistów- jest to pierwsza drużyna w dziejach konkursu, która rozwiązała wszystkie 5 zadań, i to w zatrważającym tempie niecałych 2,5 godziny!

Dzięki hojności sponsorów, w tym Fundacji SmarterPoland, wszystkich udało się szczodrze nagrodzić.
Czytelników zachęcamy do zapoznania się z zadaniami, oraz spróbowania swoich sił przy ich rozwiązywaniu- ci zaś, którzy nie ukończyli jeszcze studiów, będą mieli okazję już w maju przyszłego roku ponownie stanąć w szranki z hobbystami statystyki z całego kraju 🙂 Szczególnie polecam zapoznać się z studenckim zadaniem FP2, o psującej się maszynie- sprawiło ono finalistom dość dużo problemów.

Zadania 1
Zadania 2

O książce ,,Antykruchość” Nassima Taleba

Mając w pamięci poprzednią książkę Nassima Taleba, czyli sławną ,,Black Swan” moje oczekiwania w stosunku do jego kolejnej książki ,,Antykruchości” były bardzo wysokie. Jakie są więc wrażenia z lektury tej pozycji?

Początek jest świetny. Autor zręcznie wyjaśnia czym jest tytułowa antykruchość. A czym jest? Oczywiście przeciwieństwem kruchości, ale jednocześnie jest przeciwieństwem którego się nie spodziewamy. Dla większości osób przeciwieństwem kruchości jest odporność. Przyzwyczajeni jesteśmy do myślenia w granicach odporność – kruchość i nie widzimy, że jest coś poza tymi granicami. Jeżeli kruchość oznacza, że duże zmiany pogarszaj/psują, to antykruchość oznacza, że duże zmiany poprawiają/usprawniają system. W statystyce odpowiedzią na wrażliwe i niestabilne estymatory są estymatory odporne. Ale teraz można zapytać się, czy istnieją estymatory antykruche? Którym skrajne obserwacje jedynie służą? Czy można i co można zrobić, by nasze wnioskowanie było antykruche? Pod względem poszerzania perspektywy początek jest świetny.

Środek jest niezły. Autor na ilustracjach wykazuje potencjalne źródła kruchości, takie jak wielkość i złożoność systemów. Punktuje zachłyśnięcie się złożonymi modelami predykcyjnymi, za którymi nie idzie żadna odpowiedzialność w przypadku błędnych predykcji. Pokazuje jak często stosowane miary jakości predykcji są błędne, a same systemy predykcyjne nie tylko niczego nie przewidują, ale mogą być wręcz szkodliwe tworząc złudzenie kontroli niepewności. Im bardziej złożone, tym bardziej niezrozumiałe i kruche.

Na poletku analizy danych ta diagnoza jest wyjątkowo trafna. Coraz więcej osób buduje złożone modele, wierząc że dzięki złożoności będą mogli lepiej przewidzieć pewne zjawiska. Jednocześnie nie zadając sobie pytań o znaczenie i podstawy losowości. Niewiele z osób, dumnie nazywających się ,,data scientist” czy podobnie (w tym worku są też statystycy, machine learningowcy i ci co uważają, że to narzędzia rozwiązują problemy), zastanawia się nad własnościami wartości p, konsekwencjami aksjomatów Kołmogorowa i ich przystawaniem do rzeczywistości. Nie jest źle, jeżeli złożoność modelu bierze się z naszej (nie)wiedzy o rzeczywistości, ale gorzej jeżeli jest zasłoną dymną.

W analizie danych brakuje odpowiednika Bertranda Russella (dopiero niedawno przeczytałem Logikomiks, o którym pewnie też niedługo napiszę, ale już teraz polecam), który pomógłby opanować chaos w podejściu do analiz. Wielu badaczy zachłyśniętych regularyzacją, randomizacją, boostingiem zapomina o tym, że najczęściej dane nie pochodzą z symulacji i że używanie metody X tylko dlatego, że kolega ją lubi lub myśli, że ją rozumie, może nie być wystarczającym uzasadnieniem. Czy żyjemy na rosnącej bańce pompowanej przez szarlatanów? Z drugiej strony, cyrulicy z czasem przekształcili się w chirurgów.

Końcówka słaba. Aby nie było zbyt słodko, dodam że nie wszystko w książce Taleba mi się podoba. Wręcz wiele rzeczy mi się nie podoba. Autor niepotrzebnie, moim zdaniem, wplata w książkę wątki dotyczące etyki czy swojego światopoglądu. Nie chodzi nawet o to czy się z autorem zgadzam czy nie, ale o to, że książka przez to traci na precyzji. Są kontrowersyjne poglądy (np. że silna chemioterapia w przypadku niektórych nowotworów czyni więcej zła niż dobrego i nie wszystko co nie jest bardzo groźne warto leczyć), które moim zdaniem powinny albo iść w parze z konkretnymi dowodami albo się nie pojawiać. A nie żerować w sferze uogólnień i opinii. Miejscowe braki dowodów są spójne z tokiem rozumowania autora, a mianowicie, stwierdzeniem, że to twórcy terapii powinni dowodzić, że jest ona korzystna biorąc pod uwagę wszelkie, też długoterminowe, wyniki. Autor przyjmuje, że wszelkie interwencje są domyślnie niekorzystne o ile nie udowodni się, że jest inaczej.

Zdaniem Taleba czytamy książki, które są choć w części zgodne z naszymi poglądami. Co w książce Tabela spodobało mi się na tyle, że przeczytałem całość? Prawdopodobnie pochwała różnorodności, dzięki której złożone systemy mogą osiągnąć tytułową antykruchość.

Gender gap and visualisation challenge @ useR!2014

7 days to go for submissions in the DataVis contest at useR!2014 (see contest webpage).
Note that the contest is open for all R users, not only conference participants.
Submit your solution soon!

PISA dataset allows to challenge some ,,common opinions”, like are boys or girls better in math / reading. But, how to compare differences between genders? Averages are not fancy enough 😉 Let’s use weighted quantiles calculated with function wtd.quantile() from the Hmisc package.

Below we present quantile-quantile plots for results in math and reading. Each point represents a single centile. X coordinate stands for centiles of male scores while Y coordinate correspond to female scores respectively. Black line is the diagonal, points on this line correspond to equal centiles in both distributions.
Points below black line correspond to centile for which boys are doing better than girls. Points above black line correspond to centiles for which girls are doing better. For reading the story is simple, girls are doing better for all centiles, whole distribution is shifted. But for math the story is different for different countries.

[UK – distribution of math scores for boys is shifted in comparison to females]

[Finland – distribution of math scores for boys is wider, weak boys are weaker than girls but strong one are stronger than corresponding girl’s centile]

[USA – somewhere between Finland and UK]

What is the story for your country?

And the R code.

library(Hmisc)
library(ggplot2)
library(reshape2)
 
# read students data from PISA 2012
# directly from URL
con <- url("http://beta.icm.edu.pl/PISAcontest/data/student2012.rda")
load(con)
 
# plot quantiles for a country
plotCountry <- function(cnt) {
  cutoffs <- seq(0,1,0.01)
  selected <- student2012[student2012$CNT == cnt, ]
  getQuants <- function(group) {
    selectedG <- selected[group, ]
    wtd.quantile(selectedG$PV1MATH, weights=selectedG$W_FSTUWT, probs=cutoffs)
  }
  ecdf1 <- getQuants(selected$ST04Q01 == "Male")
  ecdf2 <- getQuants(selected$ST04Q01 == "Female")
  df1 <- data.frame(cutoffs, Male = ecdf1, Female = ecdf2, subject="MATH")
  getQuants <- function(group) {
    selectedG <- selected[group, ]
    wtd.quantile(selectedG$PV1READ, weights=selectedG$W_FSTUWT, probs=cutoffs)
  }
  ecdf1 <- getQuants(selected$ST04Q01 == "Male")
  ecdf2 <- getQuants(selected$ST04Q01 == "Female")
  df2 <- data.frame(cutoffs, Male = ecdf1, Female = ecdf2, subject="READ")
  df <- rbind(df1, df2)
  ggplot(df, aes(x = Male, y = Female, col = subject, shape = subject)) + 
    geom_point() +
    xlim(350,650) + ylim(350,650) + 
    geom_abline(intercept=0, slope=1) + ggtitle(cnt)
}  
 
# plot results for selected countries  
for (cnt in c("Canada", "United Kingdom","United States of America", "Finland"))
  ggsave(plotCountry(cnt), filename=paste0("Quant", cnt, ".png"), width=600/72, height=600/72)

Esej 1: Wizualizacje, które tworzą historię

Pod adresem www.biecek.pl/Eseje/indexHistoria.html udostępniliśmy pierwszy esej o tytule ,,Wizualizacje, które tworzą historię”.

Można z niego dowiedzieć się kim była kobieta statystyk, która ocaliła tysiące ludzkich istnień, jak czytać hieroglify, oraz jak przedstawić historię kampanii Napoleońskiej na jednym wykresie. I jeszcze kilku innych rzeczy.

Mamy też konkurs w którym można wygrać papierową wersję całego zbioru esejów!

Aby wziąć udział w konkursie należy wymyślić interesujące zadanie, które weryfikuje wiedzę przedstawioną w eseju o historii grafiki statystycznej i przesłać mi opis tego zadania pocztą na adres Przemyslaw.Biecek na serwerze gmail.com do 5 lipca 2014 (z dopiskiem w tytule maila 'Konkurs’).

Wygra osoba, która zgłosi pomysł na zadanie, który najbardziej mi przypadnie do gustu (będzie oryginalny, można go wykonać samodzielnie lub w grupie, będzie weryfikował znajomość tego materiału). Eseje będę wykorzystywał jako podręcznik do kursu Techniki Wizualizacji Danych. Szukam teraz ciekawych, kreatywnych, interesujących zadań weryfikujących znajomość tematu z tego eseju. Przedstaw porównanie pięciu wybranych bitew w których brały udział polskie wojska, zaprojektuj koszulkę z wydrukiem ulubionej historycznej grafiki, naszkicuj węglem kopię mapy Minarda, zbuduj rekonstrukcję danych Florence Nightingale z klocków Lego… zadania powinny być ciekawe ale oczywiście i przede wszystkim sensowne. Czekam na zgłoszenia.

Ten esej to część zbioru ,,Odkrywać! Ujawniać! Objaśniać!” wydanego przez Fundację, dostępnego już w przedsprzedaż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.

Kto jest autorem tych grafik?

Za dwa dni odkrywamy pierwszy esej o historii grafiki statystycznej.

Na rozgrzewkę mały konkurs, można wygrać kubek. Poniżej przedstawiamy dwa fragmenty kamieni milowych z historii grafiki statystycznej.

Zadanie: podać autorów (imię i nazwisko) każdej z tych grafik (oryginałów). Odpowiedź należy umieścić w komentarzu. Pierwsza osoba, która poda poprawie obu autorów wygrywa. Proszę podać też email, bym mógł skontaktować się ze szczęśliwym zwycięzcą.



Metawstęp do wizualizacji danych w D3.js…

Dziś mamy przyjemność zaprezentować gościnny wpis Piotra Migdała. Wpis zawierać będzie zbiór 45 linków dotyczących biblioteki D3 i jej zastosowań. Biblioteka D3 to świetne narzędzie dla interaktywnych wykresów, ale można też użyć tej biblioteki do statycznych rysunków. Osobiście nie jestem fanem Java Scriptu, ale na razie nie widać silnej konkurencji o podobnych możliwościach (no może Processing…). Więc jeżeli myślimy o prezentacji danych w przeglądarce to warto poznać D3.

Metawstęp do wizualizacji danych w D3.js…

Piotr Migdał

D3.js (Data-Driven Documents) to biblioteka w języku JavaScript do wizualizacji danych. Zamiast dawać gotowce (czyli konkretne wykresy) pozwala łatwo manipulować podstawowymi elementami graficznymi i łączyć elementy HTMLa z danymi. Tym samym to raczej nie tyle gotowa wizualizacja, co narzędzie do tworzenia takowych.

(TagOverflow dla strony Stack Overflow i pytań powiązanych z tagiem [data-visualization]. Wielkość wierzchołka mówi o liczbie pytań, szerokość krawędzi – liczbie pytań mających oba tagi naraz, zaś odcień – o tym jak mocną są skorelowane.)

Czytaj dalej Metawstęp do wizualizacji danych w D3.js…

Proficiency levels @ PISA and visualisation challenge @ useR!2014

16 days to go for submissions in the DataVis contest at useR!2014 (see contest webpage).
The contest is focused on PISA data and students’ skills. The main variables that reflect pupil skills in math / reading / science are plausible values e.g. columns PV1MATH, PV1READ, PV1SCIE in the dataset.
But, these values are normalized to have mean 500 and sd 100. And it is not that easy to understand what the skill level 600 means and is 12 points in average a big difference. To overcome this PISA has introduced seven proficiency levels (from 0 to 6, see http://nces.ed.gov/pubs2014/2014024_tables.pdf) that base on plausible values with cutoffs 358, 420, 482, 545, 607, 669.
It is assumed that, for example, at level 6 ,,students can conceptualize, generalize, and utilize information based on their investigations and modeling of complex problem situations, and can use their knowledge in relatively non-standard contexts”.

So, instead of looking at means we can now take a look at fractions of students at given proficiency level. To have some fun we use sp and rworldmap and RColorBrewer packages to have country shapes instead of bars and dots that are supposed to represent pupils that take part in the study. The down side is that area does not correspond to height so it might be confusing. We add horizontal lines to expose the height.



And here is the R code

library(ggplot2)
library(reshape2)
library(rworldmap)
library(RColorBrewer)
map.world <- map_data(map = "world")
cols <- brewer.pal(n=7, "PiYG")
 
# read students data from PISA 2012
# directly from URL
con <- url("http://beta.icm.edu.pl/PISAcontest/data/student2012.rda")
load(con)
prof.scores <- c(0, 358, 420, 482, 545, 607, 669, 1000)
prof.levels <- cut(student2012$PV1MATH, prof.scores, paste("level", 1:7))
 
plotCountry <- function(cntname = "Poland", cntname2 = cntname) {
  props <- prop.table(tapply(student2012$W_FSTUWT[student2012$CNT == cntname],
         prof.levels[student2012$CNT == cntname], 
         sum))
  cntlevels <- rep(1:7, times=round(props*5000))
  cntcontour <- map.world[map.world$region == cntname2,]
  cntcontour <- cntcontour[cntcontour$group == names(which.max(table(cntcontour$group))), ]
  wspx <- range(cntcontour[,1])
  wspy <- range(cntcontour[,2])
  N <- length(cntlevels)
  px <- runif(N) * diff(wspx) + wspx[1]
  py <- sort(runif(N) * diff(wspy) + wspy[1])
  sel <- which(point.in.polygon(px, py, cntcontour[,1], cntcontour[,2], mode.checked=FALSE) == 1)
  df <- data.frame(long = px[sel], lat = py[sel], level=cntlevels[sel])  
  par(pty="s", mar=c(0,0,4,0))
  plot(df$long, df$lat, col=cols[df$level], pch=19, cex=3,
       bty="n", xaxt="n", yaxt="n", xlab="", ylab="")
}
 
par(mfrow=c(1,7))
#
# PISA and World maps are using differnt country names,
# thus in some cases we need to give two names
plotCountry(cntname = "Korea", cntname2 = "South Korea")
plotCountry(cntname = "Japan", cntname2 = "Japan")
plotCountry(cntname = "Finland")
plotCountry(cntname = "Poland")
plotCountry(cntname = "France", cntname2 = "France")
plotCountry(cntname = "Italy", cntname2 = "Italy")
plotCountry(cntname = "United States of America", cntname2 = "USA")

Jak często w Polsce występują depresje?

Temat depresji ostatnio często gości na łamach gazet, głównie za sprawą Justyny Kowalczyk. W różnych gazetach różni eksperci wskazują grupy narażone na wyższe ryzyko depresji. Skłoniło mnie to do poszperania za statystykami depresji.

Nie było łatwo/ Znalazłem statystyki z GUS z roku 2009 z raportu ,,Stan zdrowia ludności Polski w 2009 r.”. GUS ma też starsze raporty, ale tam depresja jest raportowana razem z nerwicami i są też raporty nowsze, ale te nie zawierają podziału na grupy wiekowe.

Graficzne podsumowanie poniżej.



Wakacje z wizualizacją danych!

Dziś o pewnym projekcie, który mamy nadzieję przypadnie Wam do gustu. Dzięki niemu będziecie mogli poznać reguły tworzenia dobrych prezentacji, nauczycie się rozpoznawać złe infografiki, dowiecie się wielu ciekawych faktów dotyczących wizualizacji danych.

Od ponad trzech lat zbieram materiały związane z grafiką statystyczną i prezentacją danych, ciekawe przykłady przekazywania wykresem istotnej informacji (czyli, jak sami rozumiecie, taśmowe kolorowe infografiki nie należą do tego zbioru).
Nazbierawszy materiałów, coraz bardziej zainteresowany tematem, dwa lata temu rozpocząłem pracę nad zbiorem wskazówek, pozwalających zrozumieć, co składa się na dobrą, czytelną i informatywną prezentację danych, a co powoduje, że prezentacja jest nieczytelna, chaotyczna czy płytka.

I tak, po dwóch latach pracy, powstał zbiór esejów ,,Odkrywać! Ujawniać! Objaśniać!”. Dla mnie osobiście, jest on uzupełnieniem i domknięciem cyklu książek związanych z umiejętnościami niezbędnymi do analizy danych, czyli umiejętnością programowania w odpowiednim języku (patrz ,,Przewodnik po pakiecie R”), modelowaniem statystycznym (patrz ,,Analiza danych z programem R”) oraz wizualną prezentacją danych (patrz ten zbiór esejów).

Zbiór ,,Odkrywać! Ujawniać! Objaśniać!” został wydany siłami Fundacji SmarterPoland.pl. Jest już dostępny w przedsprzedaż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 BAY&SA. Pierwszy rozdział pojawi się 19 czerwca, ostatni 23 października. Jeżeli podoba Wam się ta formuła i chcielibyście by powstało więcej materiałów w tej postaci wesprzyjcie fundacje darowizną.

Przy okazji publikacji każdego rozdziału planujemy małe (ale zawsze ciekawe) konkursy, w ramach których będzie można wygrać wersję papierową esejów lub inny gadżet.

Śledźcie więc naszego bloga! I przekażcie informację o esejach innym, potencjalnie zainteresowanym, osobom.