Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

Jaanus “Sops” Kolmene käib jõusaalis kolm korda nädalas. Järgmisel kuul sisustab ta ka reede õhtupooliku raskusi tõstes, sest tema rinnalihas on statistiku jaoks liiga nõrk. Nimelt otsib korvpalliklubi Brooklyn Nets oma ridadesse statistikut, kes analüüsiks korvpalliandmeid ja aitaks seeläbi optimiseerida meeskonna mängustrateegiat. Kandidaadi nõuete seas on ka 50 kg rinnalt surumine.

Kuna rinnalihase nõue on ehk peagi täidetud, tahab Jaanus enne intervjuule minekut saada praktilist kogemust NBA andmete analüüsimisel. Ta teab, et NBA mängude kohta kogutakse SportVU tehnoloogia abil detailset statistikat.

Ta tahab koostada iga mängija ja meeskonna kohta profiili: kust visatakse ning kust tabatakse. Just nagu tegi NY Times’i graafikaosakond:

Selles praktikumis uurime, kuidas teha sarnast joonist R-i vahenditega.

Tutvumine andmestikuga

Kasutame NBA 2013/14 hooaja andmeid. Andmestikus on järgnevad tunnused:

  • name - korvpalluri nimi
  • team_name - korvpalluri meeskonna nimi
  • opponent - vastasmeeskonna nimi
  • game_date - mängu kuupäev
  • shot_made_flag - kas vise läks korvi
  • shot_type - kas oli 2-punkti või 3-punkti vise
  • x - viske x-koordinaat
  • y - viske y-koordinaat

Laadi alla andmestik nba_2013.csv ja loe töökeskkonda.

Ülesanne 1 (1 punkt)

Visualiseeri NBA meeskonna Miami Heat viskekohti hajuvusdiagrammi abil kasutades tunnuseid x ja y. Iga sooritatud vise näita täpikesena.

Näpunäited:

  • kasuta käsku coord_fixed(ratio = 1).
# sinu kood

Ülesanne 2 (2 punkti)

Diskretiseeri mänguväljak (jaga mänguväljak tükkideks).

Tükid moodusta nii, et ümarda x- ja y-koordinaat kümnelisteni. Iga kastikese kohta arvuta:

  • visete arv
  • tabavusprotsent

Näpunäited:

  • uuri, mida teeb käsk round(21:30, -1).
  • kasuks tuleb paketi dplyr funktsionaalsus (mutate, group_by, summarise)
# sinu kood

Ülesanne 3 (2 punkti)

Visualiseeri eelmise ülesande tulemusena saadud andmeid. Iga diskretiseeritud kastikese kohta joonista ring. Ringi pindala olgu proportsionaalne visete arvuga.

Näpunäited:

  • uuri, mida teeb käsk scale_size_area(),
  • kasuta funktsiooni theme(), et eemalda jooniselt telgede tekst, tick’d, joonise raam ja ruudustik (grid),
  • määra ylim(-50,300).

Kasuta visualiseerimisel järgnevat koodi mänguväljaku loomiseks:

library(grid) 
library(jpeg) 
library(RCurl)

#loome mänguväljaku
courtImg.URL <- "https://thedatagame.files.wordpress.com/2016/03/nba_court.jpg"
court <- rasterGrob(readJPEG(getURLContent(courtImg.URL)),
                    width=unit(1,"npc"), height=unit(1,"npc"))
                    
valjak <- ggplot(miami, aes(x = x, y = y)) + 
  annotation_custom(court, -250, 250, -50, 420) + geom_point()
  
# sinu kood

Ülesanne 4 - suuruse muutmine (2 punkti)

a.) NY Timesi graafikaosakond on jaganud visete arvu kolme kategooriasse: low, medium, high. Vali välja piirid, mille põhjal jaotatakse visete arv kolme kategooriasse (low, medium, high). Iga kategooria jaoks vali sobiv pindala suurus (kontrolli, et tulemus oleks visuaalselt kena). Kirjuta funktsioon get_radius, mis vastavalt valitud raadiusele ning kategooriate piiridele tagastab andmestiku, kus tunnus “uus_raadius” vastab kategooria raadiusele.

get_radius = function(andmed, r1, r2, r3, piir1, piir2){
  # Kui visete_arv<=piir1, siis uus_raadius=r1,
  # kui piir1 > visete_arv <=piir2, siis uus_raadius=r2,
  # kui visete_arv>piir2, siis uus_raadius=r3
  
  # sinu kood
}

b.) Visualiseeri nüüd viskepositsioone sarnaselt eelmisele ülesandele, kui ringidel on vaid 3 erinevat suurust.

# sinu kood

Ülesanne 5 - värvid (1 punkti)

Uuri, mida tähistavad NY Times’i graafikul punane ja roheline värv.

Lisa nüüd ringidele värv vastavalt visketabavusele. Kasuta sarnast värvigammat, näiteks värvikoodid #E82123, #F1E471 ja #329932.

Näpunäide:

  • uuri, mida teeb käsk scale_color_gradient2().

Ülesanne 6 - kuusnurgad (3 punkti)

Kasuta nüüd ringide asemel kuusnurki.

Meeldetuletus kuusnurkadest:

ggplot() võimaldab parameetri shape abil määrata erinevaid geomeetrilisi kujutusviise (näit. ruut, kolmnurk), kuid valikute seas ei leidu kuusnurka. Oleme ette andnud funktsiooni kuusnurk, mis sisestades kuusnurga keskpunkti koordinaadid ja pindala, väljastab kuusnurga tippude koordinaadid. Paraku ise defineeritud geomeetriliste objektide kujutamiseks geom_point() ei sobi.

Näpunäited:

  • uuri, mida teeb funktsioon geom_polygon()
  • uuri, mida teeb funktsioon kuusnurk ühe vaatluse korral
  • moodusta uus andmestik, kus olemasoleva andmestiku iga rida on dubleeritud 6 korda, et kuusnurga iga tipu kohta oleks sama info
  • kuusnurkade eristamiseks tuleks lisada grupeeriv tunnus, mida ggplot joonist tehes parameetri group puhul kasutada
  • kuusnurki saab seest värvida parameetri fill abil ja kontuure parameetri color abil.
  • uuri, mida teeb funktsioon scale_fill_gradient2()
kuusnurk = function(x, y, pindala){
    r = sqrt(2*sqrt(3)/9*pindala)
    x_coord = x + c(0, sqrt(3)/2*r, sqrt(3)/2*r, 0, -sqrt(3)/2*r, -sqrt(3)/2*r) 
    y_coord = y + c(r, r/2, -r/2, -r, -r/2, r/2)
    return(data.frame(x_kuusnurk=x_coord,y_kuusnurk=y_coord))
  }

# Sinu kood

Boonusülesanne 1 - shiny rakendus (3 punkti)

Loo shiny rakendus kasutades ülesandes 6 saadud tulemust. Rakendus peaks esitama valitud meeskonna ning mängija korral profiili: kust visatakse ning kust tabatakse.