Istogrammi con Apache Commons Frequency

1. Panoramica

In questo tutorial, vedremo come presentare i dati su un istogramma con l'aiuto della classe Frequenza di Apache Commons.

La classe Frequency fa parte della libreria Apache Commons Math esplorata in questo articolo.

Un istogramma è un diagramma di barre collegate che mostra l'occorrenza di un intervallo di dati in un insieme di dati. Si differenzia da un grafico a barre in quanto viene utilizzato per visualizzare la distribuzione di variabili quantitative continue mentre un grafico a barre viene utilizzato per visualizzare dati categoriali.

2. Dipendenze del progetto

In questo articolo, utilizzeremo un progetto Maven con le seguenti dipendenze:

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

La libreria commons-math3 contiene la classe Frequency che utilizzeremo per determinare l'occorrenza di variabili nel nostro set di dati. La libreria xchart è ciò che useremo per visualizzare l'istogramma in una GUI.

L'ultima versione di commons-math3 e xchart può essere trovata su Maven Central.

3. Calcolo della frequenza delle variabili

Per questo tutorial, utilizzeremo un set di dati che comprende l'età degli studenti in una determinata scuola. Ci piacerebbe vedere la frequenza dei diversi gruppi di età e osservare la loro distribuzione su un grafico a istogramma.

Rappresentiamo il set di dati con una raccolta List e usiamolo per popolare un'istanza della classe Frequency :

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

Ora che abbiamo popolato la nostra istanza della classe di frequenza , otterremo il conteggio di ogni età in un contenitore e lo sommeremo in modo da poter ottenere la frequenza totale delle età in un particolare gruppo di età :

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); });

Dallo snippet sopra, determiniamo prima la frequenza dell'osservazione utilizzando getCount () della classe Frequency . Il metodo restituisce il numero totale di occorrenze dell'osservazione .

Usando l' osservazione corrente , determiniamo dinamicamente il gruppo a cui appartiene calcolandone i limiti superiore e inferiore rispetto alla larghezza della classe, che è 10 .

I limiti superiore e inferiore vengono concatenati per formare un bin, che viene memorizzato insieme all'osservationFrequency in una distributionMap utilizzando updateDistributionMap () .

Se il bin esiste già, aggiorniamo la frequenza, altrimenti lo aggiungiamo come chiave e impostiamo la frequenza dell'osservazione corrente come suo valore. Tieni presente che abbiamo tenuto traccia delle osservazioni elaborate per evitare duplicati.

La classe Frequency dispone anche di metodi per determinare la percentuale e la percentuale cumulativa di una variabile in un set di dati.

4. Tracciare il grafico dell'istogramma

Ora che abbiamo elaborato il nostro set di dati non elaborato in una mappa dei gruppi di età e delle rispettive frequenze, possiamo utilizzare la libreria xchart per visualizzare i dati in un grafico a istogramma:

CategoryChart chart = new 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); List yData = new ArrayList(); yData.addAll(distributionMap.values()); List xData = Arrays.asList(distributionMap.keySet().toArray()); chart.addSeries("age group", xData, yData); new SwingWrapper(chart).displayChart();

Abbiamo creato un'istanza di un CategoryChart utilizzando il generatore di grafici, quindi l'abbiamo configurato e popolato con i dati per gli assi x e y.

Infine visualizziamo il grafico in una GUI utilizzando SwingWrapper:

Dall'istogramma sopra, possiamo vedere che non ci sono studenti di età compresa tra 80 e 90 anni mentre gli studenti di età compresa tra 50 e 60 anni sono predominanti. Molto probabilmente saranno studenti di dottorato o post-dottorato.

Possiamo anche dire che l'istogramma ha una distribuzione normale.

5. conclusione

In questo articolo, abbiamo esaminato come sfruttare la potenza della classe di frequenza della libreria Apache commons-math3 .

Ci sono altre classi interessanti per statistica, geometria, algoritmi genetici e altri nella libreria. La sua documentazione può essere trovata qui.

Il codice sorgente completo è disponibile su Github.