Histogrammen met Apache Commons-frequentie

1. Overzicht

In deze tutorial gaan we bekijken hoe we gegevens op een histogram kunnen presenteren met behulp van de Apache Commons Frequency-klasse.

De Frequentie class maakt deel uit van een deel van de Apache Commons Math-bibliotheek die in dit artikel wordt onderzocht.

Een histogram is een diagram van verbonden balken dat het voorkomen van een reeks gegevens in een gegevensset laat zien. Het verschilt van een staafdiagram doordat het wordt gebruikt om de verdeling van continue, kwantitatieve variabelen weer te geven, terwijl een staafdiagram wordt gebruikt om categorische gegevens weer te geven.

2. Projectafhankelijkheden

In dit artikel gebruiken we een Maven-project met de volgende afhankelijkheden:

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

De commons-math3 bibliotheek bevat de Frequentie klasse die we zullen gebruiken om het voorkomen van variabelen in onze dataset te bepalen. De xchart bibliotheek is wat we zullen gebruiken om het histogram in een GUI weer te geven.

De nieuwste versie van commons-math3 en xchart is te vinden op Maven Central.

3. Berekening van de frequentie van variabelen

Voor deze tutorial gebruiken we een dataset met de leeftijd van de leerlingen op een bepaalde school. We willen graag de frequentie van verschillende leeftijdsgroepen zien en hun verdeling op een histogramgrafiek observeren.

Laten we de dataset voorstellen met een Lijst collectie en gebruik deze om een ​​instantie van de Frequentie klasse:

Lijst datasetList = Arrays.asList (36, 25, 38, 46, 55, 68, 72, 55, 36, 38, 67, 45, 22, 48, 91, 46, 52, 61, 58, 55); Frequentie frequentie = nieuwe frequentie (); datasetList.forEach (d -> frequentie.addValue (Double.parseDouble (d.toString ())));

Nu we ons exemplaar van het Frequentie klas, we gaan de telling van elke leeftijd in een bak krijgen en deze samenvatten, zodat we de totale frequentie van leeftijden in een bepaalde leeftijdsgroep kunnen krijgen:

datasetList.stream () .map (d -> Double.parseDouble (d.toString ())) .distinct () .forEach (observatie -> {lange observatieFrequency = frequentie.getCount (observatie); int upperBoundary = (observatie> classWidth )? Math.multiplyExact ((int) Math.ceil (observatie / classWidth), classWidth): classWidth; int lowerBoundary = (upperBoundary> classWidth)? Math.subtractExact (upperBoundary, classWidth): 0; String bin = lowerBoundary + "- "+ upperBoundary; updateDistributionMap (lowerBoundary, bin, observationFrequency);});

Uit het bovenstaande fragment bepalen we eerst de frequentie van de observatie de ... gebruiken getCount () van de Frequentie klasse. De methode retourneert het totale aantal keren dat de observatie.

Met behulp van de huidige observatie, we bepalen dynamisch tot welke groep het behoort door de boven- en ondergrenzen te bepalen ten opzichte van de klassebreedte - dat is 10.

De boven- en ondergrenzen worden aaneengeschakeld om een ​​bak te vormen, die naast de observatie Frequentie in een distributiekaart de ... gebruiken updateDistributionMap ().

Als het bak bestaat al, we updaten de frequentie, anders voegen we deze toe als sleutel en stellen we de frequentie van de stroom in observatie als zijn waarde. Merk op dat we de verwerkte waarnemingen hebben bijgehouden om duplicaten te voorkomen.

De Frequentie class hebben ook methoden om het percentage en het cumulatieve percentage van een variabele in een gegevensset te bepalen.

4. Het histogramdiagram plotten

Nu we onze onbewerkte dataset hebben verwerkt tot een kaart met leeftijdsgroepen en hun respectievelijke frequenties, kunnen we de xchart bibliotheek om de gegevens in een histogramgrafiek weer te geven:

CategoryChart chart = nieuwe CategoryChartBuilder (). Width (800) .height (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); Lijst yData = nieuwe ArrayList (); yData.addAll (distributionMap.values ​​()); Lijst xData = Arrays.asList (distributionMap.keySet (). ToArray ()); chart.addSeries ("leeftijdsgroep", xData, yData); nieuwe SwingWrapper (grafiek) .displayChart ();

We hebben een instantie gemaakt van een CategoryChart met behulp van de diagrambouwer, hebben we het geconfigureerd en gevuld met de gegevens voor de x- en y-as.

We geven de grafiek eindelijk weer in een GUI met behulp van de SwingWrapper:

Uit het bovenstaande histogram kunnen we zien dat er geen studenten in de leeftijd van 80-90 jaar zijn, terwijl studenten in de leeftijd van 50-60 overheersen. Dit zullen hoogstwaarschijnlijk promovendi of postdoctorale studenten zijn.

We kunnen ook zeggen dat het histogram een ​​normale verdeling heeft.

5. Conclusie

In dit artikel hebben we bekeken hoe we de kracht van de Frequentie klasse van Apache commons-math3 bibliotheek.

Er zijn andere interessante klassen voor statistiek, geometrie, genetische algoritmen en andere in de bibliotheek. De documentatie is hier te vinden.

De volledige broncode is beschikbaar op Github.