Histogrammer med Apache Commons-frekvens

1. Oversikt

I denne opplæringen skal vi se på hvordan vi kan presentere data på et histogram ved hjelp av Apache Commons Frequency-klasse.

De Frekvens klasse er en del av en del av Apache Commons Math-biblioteket som er utforsket i denne artikkelen.

Et histogram er et diagram over sammenkoblede søyler som viser forekomsten av en rekke data i et datasett. Det skiller seg fra et søylediagram ved at det brukes til å vise fordelingen av kontinuerlige, kvantitative variabler mens et søylediagram brukes til å vise kategoriske data.

2. Prosjektavhengigheter

I denne artikkelen bruker vi et Maven-prosjekt med følgende avhengigheter:

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

De commons-math3 biblioteket inneholder Frekvens klasse som vi bruker for å bestemme forekomsten av variabler i datasettet vårt. De xchart biblioteket er det vi vil bruke til å vise histogrammet i en GUI.

Den siste versjonen av commons-math3 og xchart finner du på Maven Central.

3. Beregne frekvensen av variabler

For denne opplæringen bruker vi et datasett som består av studentenes alder på en bestemt skole. Vi vil gjerne se hyppigheten av forskjellige aldersgrupper og observere fordelingen av dem på et histogramdiagram.

La oss representere datasettet med en Liste samling og bruke den til å fylle ut en forekomst av Frekvens klasse:

Liste datasettListe = 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 (); datasetList.forEach (d -> frequency.addValue (Double.parseDouble (d.toString ())));

Nå som vi har befolket vår forekomst av Frekvens klasse, skal vi telle hver alder i en søppel og oppsummere det slik at vi kan få den totale frekvensen av aldre i en bestemt aldersgruppe:

datasetList.stream () .map (d -> Double.parseDouble (d.toString ())) .distinct () .forEach (observation -> {long observationFrequency = frequency.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 utdraget over bestemmer vi først frekvensen av observasjon bruker getCount () av Frekvens klasse. Metoden returnerer det totale antallet forekomster av observasjon.

Bruke strømmen observasjon, vi bestemmer dynamisk gruppen den tilhører ved å finne ut av dens øvre og nedre grense i forhold til klassebredden - som er 10.

Den øvre og nedre grense er sammenkoblet for å danne en søppel som lagres ved siden av observasjonFrekvens i en distributionMap bruker updateDistributionMap ().

Hvis den søppel eksisterer allerede oppdaterer vi frekvensen, ellers legger vi den til som nøkkel og setter frekvensen til strømmen observasjon som sin verdi. Merk at vi holdt oversikt over de bearbeidede observasjonene for å unngå duplikater.

De Frekvens klasse har også metoder for å bestemme prosentandelen og kumulativ prosentandel av en variabel i et datasett.

4. Plotte histogramoversikten

Nå som vi har behandlet vårt rå datasett til et kart over aldersgrupper og deres respektive frekvenser, kan vi bruke xchart bibliotek for å vise dataene i et histogramdiagram:

CategoryChart chart = new CategoryChartBuilder (). Width (800) .thight (600) .title ("Age Distribution") .xAxisTitle ("Age Group") .yAxisTitle ("Frequency") .build (); chart.getStyler (). setLegendPosition (Styler.LegendPosition.InsideNW); chart.getStyler (). setAvailableSpaceFill (0,99); chart.getStyler (). setOverlapped (true); Liste yData = ny ArrayList (); yData.addAll (distributionMap.values ​​()); Liste xData = Arrays.asList (distributionMap.keySet (). ToArray ()); chart.addSeries ("aldersgruppe", xData, yData); ny SwingWrapper (diagram) .displayChart ();

Vi opprettet en forekomst av en CategoryChart ved å bruke kartbyggeren, konfigurerte vi den og fylte den ut med dataene for x- og y-aksen.

Vi viser endelig diagrammet i en GUI ved hjelp av SwingWrapper:

Fra histogrammet ovenfor kan vi se at det ikke er studenter i alderen 80 - 90 år mens studenter i alderen 50 - 60 er dominerende. Dette vil mest sannsynlig være doktorgradsstudenter eller postdoktorgradsstudenter.

Vi kan også si at histogrammet har en normalfordeling.

5. Konklusjon

I denne artikkelen har vi sett på hvordan vi kan utnytte kraften til Frekvens klasse av Apache commons-math3 bibliotek.

Det er andre interessante klasser for statistikk, geometri, genetiske algoritmer og andre i biblioteket. Dokumentasjonen finner du her.

Den komplette kildekoden er tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found