I mitt prosjekt skal jeg se på et datasett som er hentet fra Kaggle. Datasettet er en CSV-fil med 14 kolonner som inneholder data om studenters akademiske prestasjoner og hvordan de bruker fritiden. Datasettet har fokus på en hobby: Gaming. Med data om blant annet karakterer, oppmøte, hvor mange timer brukt på videospill, hvor sosial studenten er og mye mer. Med disse dataene ønsker jeg å undersøke hvordan de påvirker studentenes karakterer.
Jeg har hatt fokus på formidling av resultatene ved å legge inn interaktive elementer i denne HTML-rapporte.
For å få de interaktive elementene må filen index.html åpnes gjennom en web-server.
For å gjøre dette kjører du denne koden i terminalen der HTML-filen ligger: python3 -m http.server 8000.
Nå kan du i nettleseren gå til http://localhost:8000 for å se filen med interaktive elementer.
De er også avhengig av at root filene dette prosjektet genererer finnes i samme mappe.
Datasettet prosjektet bruker
Denne filen leser en csv-fil og behandler det med RDataFrame objektet. Lager filen analysert_data.root
Denne filen leser en csv-fil og gjør det til et TTree objekt. Lager filene CSVTree.root og tree_analysert.root
For å presentere resultatene på en ryddig måte har jeg valgt at ingen av filene produserer plot lokalt på maskinen siden resultatene uansett skal vises på denne html-siden. ROOT har et eksisterende javascript bibliotek JSROOT som lager interaktive elementer fra root-filer. Denne html-filen leser objektene fra de tre root-filene og lar leseren velge hvilket objekt som skal vises fra en rullegardinmeny. Alle plot kan med JSROOT zoomes, flyttes og interageres med av brukeren, ved å holde musepekeren over et datapunkt vil det også dukke opp utfyllende informasjon.
Måten dette virker er at hver rullegardin er tilknyttet hver sin root-fil. Den første menyen velger elementer fra CSVTree.root, den andre fra tree_analysert.root og den siste fra analysert_data.root. Ved å velge et objekt i menyen sjekker JSROOT om det er et objekt i root-filen med samme navn som value-variabelen fra menyen. Hvis det er det endres plottet i vinduet til dette ved endrePlot funksjonene som bruker JSROOT sin draw funksjon til å plotte. Det er en endrePlot funksjon per vindu, totalt 3, en for hver fil.
Dette prosjektet benytter seg av to av root sine klasser for å behandle data. TTree og RDataFrame. TTree er et robust og allsidig objekt og RDataFrame er nytt i root og tar inspirasjon fra mer moderne databehandlingsverktøy f.eks. pandas i python.
Først og fremst er RDataFrame mye mer effektivt med tanke på prosessorkraft, de fleste funksjonene er «lazy acktion» som betyr at kommandoen settes til minnet, men ikke utføres før en «non-lazy action» utføres. Dette lar deg kjøre gjennom større datasett mer effektivt. I tillegg kan man kjøre RDataFrame flertrådet i prosessoren noe TTree ikke kan. Slik prosjektet endte opp brukte jeg RDataFrame til å lese csv filen og så begynte jeg å behandle ett og ett plott med kurvetilpasninger (FIT) og da var det enklest å fortsette med RDataFrame. Når jeg ønsket å produsere et histogram per kolonne ville dette vært tungvint å gjøre manuelt så jeg lagde en løkke (loop). Dette var mer allsidig og enkelt med et TTree så jeg endte opp med å bruke TTree også. Rett verktøy til rett jobb rett og slett
For å behandle data må den være på en form som root kan bruke. For å lese csv-filen brukes RDataFrame også når det skal lages til et TTree. Dette er fordi i den innebygde funksjonen til TTree som leser csv må man fjerne første linje av datasettet der kolonnenes navn er definert og legge de til TTree manuelt. RDataFrame gjør dette automatisk. Når man bruker RDataFrame skriver den TTree til en root fil for deg.
Alle plot skal vises med JSROOT, men alle objektene må genereres. Jeg bruker en kombinasjon av TTree og RDataFrame til dette. I filen tree_loop.C bruker lages et TTree av dataen og en løkke til å lage 2D histogrammer som sammenlikner karakter kolonnen med alle andre kolonner. Videre ønsket jeg å se nærmere på hvordan studenter bruker tiden sin påvirker karakterer. Dette ser jeg nærmere på i csv_analyse.C. Her bruker jeg RDataFrame til å lage error-bar plot og tilpasse linjer til de. Alle tilpasningene er funnet ved "trial an error" siden det ikke følger noen form for fordeling og noen av datapunktene er sporadiske.
Datasettet kan illustreres som et histogram per kolonne. Her har JSROOT lest CSVTree.root og plotter direkte hver branch (kolonne) som et histogram rett fra javascript koden avhengig av hvilket histogram du velger.
Bruk menyen under for å utforske de ulike kolonnene i datasettet.
Videre i tree_loop.C blir alle kolonnene i datasettet sammenliknet med karakter kolonnen. Alle sammenlikningene gjøres til et histogram (TH2F) og et profil-plot (TProfile). Histogrammet er bare to histogram på hver sin akse med antall tellinger representert i farge. Et profil-plot har et histogram på x-aksen, men på y aksen er gjennomsnittskarakteren til hver bin fra histogrammet. Det ser derfor ut som et error-bar plot. Her leser JSROOT tree_analysert.root
Bruk menyen under for å se sammenhengene med karakter.
Videre er det i csv_analyse.C plottet ett ekstra histogram i 3D som kan beveges interaktivt. I csv_analyse.C vil jeg se på hvordan studenter bruker tiden sin og hvordan det påvirker karakterer. Derfor kjører jeg mange Fit() operasjoner på profil-plotene fra forrige del hvis x-aksen har "time" som enhet. Disse blir laget på nytt i denne filen ved å bruke RDataFrame isteden for TTree fordi det ga mer kontroll over antallet bins og x-aksens grenseverdier. Noen av Fit() funksjonene trengte flere kurver. Noen passer bra og andre har diskontinuiteter der jeg ikke klarte å finne rett parametre for fit. Til slutt samles alle i ett plot (TMultiGraph). Her leser JSROOT analysert_data.root
I første innlevering hadde Chromium baserte nettlesere problemer med de interaktive javascript elementene JSROOT lagde. Dette er fordi måten jeg orginalt hentet JSROOT script på bryter med Chrome sine sikkerhetsregler. Dette er linjen som er feil og må fjernes:
<script type="text/javascript" src="https://root.cern/js/latest/scripts/JSRoot.core.js"></script>
Denne må byttes ut med en importering av de modulene jeg ønsker. Ved å endre starten av javascript delen til:
<script type="module">
import {draw, openFile} from 'https://root.cern/js/latest/modules/main.mjs'
...
</script>
Dette gjør at script delen ikke lenger er global så funksjonene definert der inne for å endre plot må gjøres globale ved å legge de til window.
Med et datasett med så mange kolonner er det veldig mange samenhenger som kan utforskes. Dette betyr utrolig mange potensielle plot og illustrasjoner. Det hadde vært mulig å se på mye mer som f.eks. oppmøte og stress. Siden dette emnet handler mer om databehandlingen er jeg fornøyd med mengden plot og sammenhenger undersøkt.
Dette prosjektet har vært for det meste vellykket, bortsett fra problemene med å vise JSROOT elementene i chrome. Plotene og linjetilpasningene har gjort det mulig å se på sammenlikninger mellom fritidsbruk og karakterer. Jeg er også veldig fornøyd med måten jeg fikk JSROOT til å fungere slik at det ikke er behov for å lage alle plot som png, med den fordelen av at alle plotene kan interageres med av leseren som kan se på punkt/søyle verdier, zoome og flytte på elementer i nettleservinduet.