R i JavaScript u sjajnoj (Shiny) NBA analizi – Deo I

Programski jezik R je, tokom poslednjih desetak godina, doživeo ekspanziju i postao jedan od najčešće korišćenih “analitičkih” jezika. Prema ovogodišnjoj StackOverflow anketi, R se nalazi na listi ispred svih jezika sa kojima se često poredi, kao što su Matlab i Octave. Zahvaljujući svom specifičnom funkcionalnom pristupu kao i veoma brojnim i raznovrsnim korisnicima, R se posebno istakao kroz uspešnu primenu u akademskim krugovima, gde se intenzivno koristi u svim oblastima nauke o podacima (DataScience), od društvenih, preko prirodnih nauka, kao i u mnogim primenjenim disciplinama. Kao ilustraciju dovoljno je pogledati liste CRAN (Comprehensive R Archive Network) paketa. Pored klasične naučne primene, za analizu prikupljenih podataka, R se može koristiti i u edukativne svrhe, posebno u eri dominacije web-tehnologija, koje, za R, mogu biti “prozor u svet”. Dinamična priroda i fleksibilnost savremenih Javascript tehnologija omogućavaju konstruisanje efektivnih korisničkih aplikacija i apleta, koji se mogu povezati sa analitičkom osnovom koju pruža R. Upravo je način ovog povezivanja, kao i aktivan pristup obradi i analizi podataka i tema ovog teksta.

Po svom dizajnu R nije prilagodjen kreiranju korisničkih aplikacija, a posebno ne savremenom reaktivnom programiranju, gde se očekuje dinamčko ažuriranje vrednosti promenljivih, usklađeno sa akcijama korisnika. Upravo zbog toga razvijen je paket Shiny koji omogućava kreiranje interaktivnih web-aplikacija direktno iz bilo kog R okruženja, kao što su R studio (najkorišćeniji R IDE) ili ESS. Shiny kombinuje kreiranje korisničkog okruženja sa analitičkom logikom, koristeći se intuitivnim konvencijama čime se izbegava komplikovan proces konfiguracije, karakterističan za mnoge web-tehnologije. Pored toga, Shiny može direktno komunicirati sa pridruženim JS kodom, putem namespace promenljive koja sadrži više metoda za transfer informacija i podataka.

Shiny NBA logo

Sportske statistike kao primer dostupnih i kvalitetnih podataka

Beleženje sportskih statistika ima veoma dugu tradiciju, a njihova analiza i posebno mogućnost predviđanja budućih rezultata i evaluacija performansi timova i sportista, danas predstavlja jednu od najbrže rastućih disciplina nauke o podacima. Baze sportskih podataka su dobro organizovane i lako dostupne na globalnoj mreži, a razvoj sportske metrike doprinosi razvoju cele nauke o podacima. Najpoznatiji primer izuzetno dobre SQL baze je Lahmanova baza bejzbol statisika, od 1871 do 2006, koja se koristi i u profesionalnoj analitici i u edukativne svrhe. Još neke od poznatih stranica su Fangraphs i Basketball reference. Edukativni potencijal ovakvih podatka ogleda se u pružanju zanimljive i dobro strukturirane osnove za kreiranje mnogih softverskih rešenja i analitičkih strategija. Za analizu u okviru ovog teksta izabrane su dve tabele podataka sa stranice Basketbal reference, i to uobičajene mere performansi košarkaških timova NBA lige, za tim (Team Per Game Stats) i za protivnika (Opponent Per Game Stats), u sezoni 2016/2017. Obe tabele su preuzete u .csv formatu i uključene u izvorni kod Shiny aplikacije.

Performanse NBA timova kroz analizu glavnih komponenti

Funkcionalnost i dizajn ove Shiny aplikacije podređeni su ciljevima analize ali i dinamičnom i efektnom korisničkom iskustvu. Kako bismo opisali obrazac variranja u performansama NBA timova i eventualno otkrili neke pravilnosti ili obrazac grupisanja, iskoristićemo tehniku analize glavnih komponenti (Principal Components Analysis). PCA je jedna od osnovnih metoda multivarijantne statističke analize koja primarno služi redukciji većeg broja dimenzija (promenljivih) nekog skupa podataka, kako bi se ukupna varijabilnost sagledala kroz manji broj promenljivih. Svaki NBA tim je, u izabranim tabelama, opisan sa 17 veličina, a naš cilj će biti pronalaženje odgovora na sledeća pitanja:

  1. Da li postoji grupisanje timova prema performansama?
  2. Da li se i kako mogu opisati performanse timova kroz manji broj promenljivih koje predstavljaju linearne kombinacije originalnih 17 (glavne komponente)?
  3. Kakav je uticaj svake od izmerenih veličina na ukupnu performansu i eventualni konačni plasman.

Na ova pitanja se odgovor može naći i korišćenjem statistika za tim i statistika protivnika, čime će opis performansi timova biti obuhvaćen i sa aspekta napada i sa aspekta odbrane.

Struktura Shiny aplikacije

Način kreiranja Shiny aplikacija, kao i instruktivna uputstva za sve nivoe iskustva rada sa ovim paketom, mogu se naći u okviru zvanične dokumentacije, a posebno u člancima i lekcijama. Zbog visokog kvaliteta zvanične dokumnetacije, ovde će biti reči samo o osnovnim idejama paketa i specifičnostima aplikacije za analizu glavnih komponenti.

Kako bi se aplikacija pokrenula iz izvornog koda neophodno je instalirati R i u okviru njega pakete Shiny i jsonlite. Sam kod dostupan je na GitHub repozitorijumu, a jedna od veoma korisnih Shiny funkcija je runGitHub() koja direktno pokreće aplikaciju bez potrebe za kloniranjem repozitorijuma, čime se prethodno pripremljen sadržaj može lako predstaviti npr. prilikom predavanja ili prezentacija. Pokretanjem

runGitHub("nbastream", "paulidealiste")

aplikacija će se pokrenuti u bilo kom R okruženju (prvi string je naziv repozitorijuma a drugi je GitHub korisničko ime). U okviru okruženja R studio, dovoljno je otvoriti jednu od dve osnovne datoteke (server.R ili ui.R) i kliknuti na dugme Run app koje će se automatki pojaviti. U nastavku teksta biće opisani samo osnovni principi dok je preporuka direktna inspekcija koda, koji je bogat komentarima.

Shiny aplikacija sastoji se iz dve funkcionalne celine, odnosno uobičajene R funkcije – server, sa primarnom analitčkom logikom i ui, sa dizajnom aplikacije. Ove funkcije se mogu kreirati u okviru jedne .R datoteke, ali se mogu naći i u dve odvojene (što je stariji pristup), pod uslovom da se nalaze u istom direktorijumu, što će biti naš slučaj.

U datoteci ui.R nalazi se osnovna funkcija dizajna aplikacije (front-end):

shinyUI(fluidPage(
  # dizajn korisničkog okruženja
))

Već funkcija fluidPage() predstavlja Shiny strukturni element čija se lista može naći u zvaničnoj dokumentaciji u kategoriji UI Layout. Shiny nudi veliki broj funkcija za kreiranje različitih elemenata i njihov razmeštaj, od kojih većina funkcioniše slično kao i u okviru okruženja Bootstrap 3, koje predstavlja osnovu dizajna Shiny aplikacija. Tako se Bootstrap definisane CSS klase mogu koristiti za stilizovanje Shiny elemenata, a korišćenjem Shiny tags sistema moguće je dodavati i uobičajene HTML elemente. Pored strukturnih i korisničkih (input) elemenata Shiny poseduje i specifične elemente za prikaz (output) pomoću kojih se direktno mogu prikazati R grafici i formatirane tabele prema trenutno aktuelnim rezultatima. Sav dizajn izgleda aplikacije kreira se korišćenjem ugnježdenih poziva ovih strukturnih funkcija prema sledećem principu:

fluidPage(
  fluidRow(
    column(12,
      div(
        actionButton("button1", "Dugme 1", ...)
      )
    )
  )
)

Navedeni kod rezultovaće kreiranjem stranice sa jednim div elementom klase row koji sadrži jednu kolonu (div klase column) koji sadrži div sa jednim dugmetom.

Datoteka server.R sadrži osnovnu funkciju serverske logike, pokreće se prva prilikom pokretanja aplikacije i odlikuje se sledećim potpisom:

shinyServer(function(input, output, session) {
  # izvodjenje analize i kao i reaktivni (data-binding) izrazi
})