Functie boxplotdata
Functie boxplotdata#
Je gaat een functie boxplotdata lst maken, met als resultaat een lijst van 5 getallen betreffende de lijst lst, achtereenvolgens:
kleinste getal van
lsteerste kwartiel
tweede kwartiel (mediaan) van
lstderde kwartiel
grootste getal van
lst
Deze getallen vormen de basis voor het tekenen van de boxplot.
Als voorbeeld kun je het programma (boxplotdata.elm](http://goloca.org:443/examples/boxplotdata.elm) gebruiken: je voert een lijst met getallen in (gescheiden door komma’s), en krijgt deze 5 getallen als resultaat terug.
Voor als voorbeeld in: 7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6
Dit geeft als resultaat: [1,3.5,6,7,9]
Voor het bepalen van het kleinste getal, mediaan, enz., begin je met het sorteren van de invoerlijst. Hiervoor kun je de functie List.sort gebruiken. (Later kun je je eigen sorteerfunctie maken.)
Definieer aparte functies voor elk de 5 getallen die je moet berekenen uit deze gesorteerde lijst.
De functie boxplotdata is dan een eenvoudige combinatie van deze functies (zie verderop).
Je kunt gebruik maken van de volgende functies:
import List exposing (take, drop, length, reverse, minimum, maximum, sort, map, head, tail)
import Maybe exposing (withDefault)
We gebruiken hier de voorbeeld-data die je hierboven gezien hebt.
data = [7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6]
[7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6]
: List number
Als eerste stap maken we daarvan een gesorteerde lijst
sortData = List.sort data
[1,2,2,3,3,4,5,5,5,6,6,6,6,7,7,7,8,8,8,9]
: List number
kleinste: het kleinste getal van de lijst is het eerste getal in de gesorteerde lijst. Als de lijst leeg is, neem je 0 als resultaat.
Opmerking. De functie List.head levert een resultaat op van type Maybe, omdat de lijst ook leeg kan zijn. De uitdrukking Maybe.withDefault 0 x levert een getal op: 0 als de maybe-waarde x gelijk is aan Nothing.
first : List Float -> Float
first lst = 0
<function> : List Float -> Float
first [1,2,3,4,5]
0 : Float
kleinste = first sortData
0 : Float
grootste: het grootste getal is het laatste van de gesorteerde lijst - ofwel, het eerste van de reverse van deze gesorteerde lijst. (Gebruik List.reverse).
last : List Float -> Float
last lst = 0
<function> : List Float -> Float
last [1,2]
0 : Float
grootste = last sortData
0 : Float
mediaan. De mediaan van een reeks getallen is het “middelste” getal naar waarde: het aantal getallen kleiner of gelijk aan de mediaan is gelijk aan het aantal getallen groter of gelijk aan de mediaan.
Als de lijst getallen geordend (gesorteerd) is, en uit een oneven aantal getallen bestaat, dan is de mediaan het middelste getal. Voor een even aantal getallen is de mediaan het gemiddelde van beide middelste getallen: \((m1 + m2)~/~2\)
Met behulp van de List-functies take en drop kun je een lijst eenvoudig in twee delen splitsen. Voorbeeld:
take 2 [1,2,3,4]
[1,2] : List number
drop 2 [1,2,3,4]
[3,4] : List number
Het gemiddelde van het laatste element van de eerste lijst en het eerste element van de tweede lijst is de mediaan:
((last (take 2 [1,2,3,4])) + (first (drop 2 [1,2,3,4]))) / 2
0 : Float
Voor het splitsen van een lijst getallen in twee (bijna) gelijke helften gebruik je, in combinatie make take en drop, de geheeltallige deling //.
De deling a // 2 geeft het resultaat van de geheeltallige deling door 2:
4 // 2
2 : Int
5 // 2
2 : Int
De rest na deling wordt gegeven door de modBy-functie. Hiermee kun je nagaan of een getal even of oneven is:
modBy 2 4
0 : Int
modBy 2 5
1 : Int
Op basis hiervan kun je nu de mediaan definiëren:
median : List Float -> Float
median lst = 0
<function> : List Float -> Float
median [1,2,3,4]
0 : Float
median [1,2,3,4,5]
0 : Float
Controleer of deze functie ook werkt voor randgevallen zoals de lege lijst, of een lijst met 1 element.
median []
0 : Float
median [1]
0 : Float
mediaan = median sortData
0 : Float
kwartiel1, kwartiel3. De eerste en derde kwartielen kun je nu uitrekenen als de mediaan van de eerste helft en de mediaan van de tweede helft van de geordende lijst. Als deze lijst een oneven lengte heeft, neem dan steeds de grootste helft voor het nemen van de kwartiel-mediaan.
q1 : List Float -> Float
q1 lst = 0
<function> : List Float -> Float
q1 [1,2,3,4,5]
0 : Float
kwartiel1 = q1 sortData
0 : Float
q3 : List Float -> Float
q3 lst = 0
<function> : List Float -> Float
q3 [1,2,3,4]
0 : Float
kwartiel3 = q3 sortData
0 : Float
Vergelijk het onderstaande lijst met het resultaat van het gegeven programma:
[kleinste, kwartiel1, mediaan, kwartiel3, grootste]
[0,0,0,0,0] : List Float
boxplotdata. De functie boxplotdata zorgt voor het sorteren van de lijst, en combineert vervolgens de functies die je gemaakt hebt tot een lijst:
boxplotdata lst =
let sortlst = sort lst
in
[first sortlst, q1 sortlst, median sortlst, q3 sortlst, last sortlst]
<function> : List Float -> List Float
boxplotdata [1,2,3,4,5]
[0,0,0,0,0] : List Float
Hieronder zie je het resultaat van boxplotdata met de eerder gegeven testdata. Controleer het resultaat:
boxplotdata [7,3,8,6,8,5,4,5,3,6,2,6,9,1,2,7,5,8,7,6]
[0,0,0,0,0] : List Float