Prosjekt i PHYS291: Databehandling i fysikk

Gaming vs. Akademiske prestasjoner

Introduksjon

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.

Metode

Beskrivelse av filer

Gaming_Academic_Performance.csv

Datasettet prosjektet bruker

csv_analyse.C

Denne filen leser en csv-fil og behandler det med RDataFrame objektet. Lager filen analysert_data.root

tree_loop.C

Denne filen leser en csv-fil og gjør det til et TTree objekt. Lager filene CSVTree.root og tree_analysert.root

JSROOT

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.

Databehandling

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.

RDataFrame vs TTree

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

CSV til root

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.

Plot og tilpasning av linjer

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.

Resultater

Datasettet som histogrammer

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.

Sammenlikning av kolonner

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 databehandling

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

Problem med chrome

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.

Diskusjon

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.

Konklusjon

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.