Histogrammer med Apache Commons-frekvens

1. Oversigt

I denne vejledning skal vi se på, hvordan vi kan præsentere data på et histogram ved hjælp af Apache Commons Frequency-klasse.

Det Frekvens klasse er en del af en del af Apache Commons Math-biblioteket, der er udforsket i denne artikel.

Et histogram er et diagram over tilsluttede bjælker, der viser forekomsten af ​​en række data i et datasæt. Det adskiller sig fra et søjlediagram ved, at det bruges til at vise fordelingen af ​​kontinuerlige, kvantitative variabler, mens et søjlediagram bruges til at vise kategoriske data.

2. Projektafhængigheder

I denne artikel bruger vi et Maven-projekt med følgende afhængigheder:

 org.apache.commons commons-math3 3.6.1 org.knowm.xchart xchart 3.5.2 

Det commons-math3 biblioteket indeholder Frekvens klasse, som vi bruger til at bestemme forekomsten af ​​variabler i vores datasæt. Det xchart bibliotek er det, vi bruger til at vise histogrammet i en GUI.

Den nyeste version af commons-math3 og xchart kan findes på Maven Central.

3. Beregning af hyppigheden af ​​variabler

Til denne vejledning bruger vi et datasæt bestående af elevernes alder på en bestemt skole. Vi vil gerne se hyppigheden af ​​forskellige aldersgrupper og observere deres fordeling på et histogramdiagram.

Lad os repræsentere datasættet med en Liste indsamling og brug den til at udfylde en forekomst af Frekvens klasse:

Liste datasætListe = Arrays.asList (36, 25, 38, 46, 55, 68, 72, 55, 36, 38, 67, 45, 22, 48, 91, 46, 52, 61, 58, 55); Frekvensfrekvens = ny frekvens (); datasætList.forEach (d -> frekvens.addValue (Double.parseDouble (d.toString ())));

Nu hvor vi har befolket vores forekomst af Frekvens klasse, vil vi få optællingen af ​​hver alder i en skraldespand og opsummere den, så vi kan få den samlede frekvens af aldre i en bestemt aldersgruppe:

datasætList.stream () .map (d -> Double.parseDouble (d.toString ())) .distinct () .forEach (observation -> {lang observationFrequency = frekvens.getCount (observation); int upperBoundary = (observation> classWidth) Math.multiplyExact ((int) Math.ceil (observation / classWidth), classWidth): classWidth; int lowerBoundary = (upperBoundary> classWidth)? Math.subtractExact (upperBoundary, classWidth): 0; String bin = lowerBoundary + "- "+ upperBoundary; updateDistributionMap (lowerBoundary, bin, observationFrequency);});

Fra uddraget ovenfor bestemmer vi først frekvensen af observation bruger getCount () af Frekvens klasse. Metoden returnerer det samlede antal forekomster af observation.

Brug af strømmen observation, vi bestemmer dynamisk den gruppe, den tilhører, ved at finde ud af dens øvre og nedre grænse i forhold til klassebredden - som er 10.

De øvre og nedre grænser sammenkædes for at danne en skraldespand, der opbevares ved siden af observationFrekvens i en distributionMap bruger updateDistributionMap ().

Hvis den beholder findes allerede opdaterer vi frekvensen, ellers tilføjer vi den som nøgle og indstiller frekvensen for den aktuelle observation som sin værdi. Bemærk, at vi holdt styr på de behandlede observationer for at undgå duplikater.

Det Frekvens klasse har også metoder til at bestemme procentdelen og den kumulative procentdel af en variabel i et datasæt.

4. Planlægning af histogramskemaet

Nu hvor vi har behandlet vores rå datasæt til et kort over aldersgrupper og deres respektive frekvenser, kan vi bruge xchart bibliotek for at få vist dataene i et histogramdiagram:

CategoryChart diagram = ny CategoryChartBuilder (). Bredde (800) .højde (600) .title ("Aldersfordeling") .xAxisTitle ("Aldersgruppe") .yAxisTitle ("Frekvens") .build (); chart.getStyler (). setLegendPosition (Styler.LegendPosition.InsideNW); chart.getStyler (). setAvailableSpaceFill (0,99); chart.getStyler (). setOverlapped (sand); Liste yData = ny ArrayList (); yData.addAll (distributionMap.values ​​()); Liste xData = Arrays.asList (distributionMap.keySet (). ToArray ()); chart.addSeries ("aldersgruppe", xData, yData); ny SwingWrapper (diagram). displaydiagram ();

Vi oprettede en forekomst af en Kategoridiagram ved hjælp af diagrambyggeren konfigurerede vi det og udfyldte det med dataene til x- og y-aksen.

Vi viser endelig diagrammet i en GUI ved hjælp af SwingWrapper:

Fra histogrammet ovenfor kan vi se, at der ikke er studerende i alderen 80-90 år, mens studerende i alderen 50-60 er dominerende. Dette vil sandsynligvis være doktorand- eller postdoktorale studerende.

Vi kan også sige, at histogrammet har en normalfordeling.

5. Konklusion

I denne artikel har vi set på, hvordan vi kan udnytte kraften i Frekvens klasse af Apache commons-math3 bibliotek.

Der er andre interessante klasser til statistik, geometri, genetiske algoritmer og andre i biblioteket. Dens dokumentation kan findes her.

Den komplette kildekode er tilgængelig på Github.