Histogramme mit Apache Commons-Frequenz

1. Übersicht

In diesem Tutorial werden wir untersuchen, wie wir mithilfe der Apache Commons Frequency-Klasse Daten in einem Histogramm darstellen können.

Die Frequenzklasse ist Teil eines Teils der in diesem Artikel untersuchten Apache Commons Math-Bibliothek.

Ein Histogramm ist ein Diagramm verbundener Balken, das das Auftreten eines Datenbereichs in einem Datensatz zeigt. Es unterscheidet sich von einem Balkendiagramm dadurch, dass es die Verteilung kontinuierlicher quantitativer Variablen anzeigt, während ein Balkendiagramm zur Anzeige kategorialer Daten verwendet wird.

2. Projektabhängigkeiten

In diesem Artikel verwenden wir ein Maven-Projekt mit den folgenden Abhängigkeiten:

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

Die commons-math3- Bibliothek enthält die Frequenzklasse , mit der wir das Auftreten von Variablen in unserem Datensatz bestimmen. Die xchart- Bibliothek wird verwendet, um das Histogramm in einer GUI anzuzeigen.

Die neueste Version von commons-math3 und xchart finden Sie auf Maven Central.

3. Berechnung der Häufigkeit von Variablen

Für dieses Tutorial verwenden wir einen Datensatz, der das Alter der Schüler an einer bestimmten Schule enthält. Wir möchten die Häufigkeit verschiedener Altersgruppen sehen und ihre Verteilung in einem Histogramm beobachten.

Stellen wir das Dataset mit einer Listensammlung dar und füllen damit eine Instanz der Frequenzklasse :

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

Nachdem wir unsere Instanz der Frequenzklasse ausgefüllt haben, werden wir die Anzahl jedes Alters in einem Bin abrufen und zusammenfassen, damit wir die Gesamthäufigkeit des Alters in einer bestimmten Altersgruppe ermitteln können :

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

Aus dem obigen Snippet bestimmen wir zunächst die Häufigkeit der Beobachtung mit getCount () der Frequenzklasse . Die Methode gibt die Gesamtzahl des Auftretens der Beobachtung zurück .

Unter Verwendung der aktuellen Beobachtung bestimmen wir dynamisch die Gruppe, zu der sie gehört, indem wir ihre oberen und unteren Grenzen relativ zur Klassenbreite herausfinden - die 10 beträgt .

Die oberen und unteren Grenzen werden zu einem Bin verkettet, der zusammen mit der ObservationFrequency in einer DistributionMap mit updateDistributionMap () gespeichert wird .

Wenn der Behälter bereits vorhanden ist, aktualisieren wir die Frequenz, fügen ihn als Schlüssel hinzu und legen die Frequenz der aktuellen Beobachtung als Wert fest. Beachten Sie, dass wir die verarbeiteten Beobachtungen verfolgt haben, um Duplikate zu vermeiden.

Die Frequenzklasse verfügt auch über Methoden zum Bestimmen des Prozentsatzes und des kumulativen Prozentsatzes einer Variablen in einem Datensatz.

4. Zeichnen Sie das Histogramm

Nachdem wir unseren Rohdatensatz zu einer Karte der Altersgruppen und ihrer jeweiligen Häufigkeit verarbeitet haben, können wir die Daten mithilfe der xchart- Bibliothek in einem Histogrammdiagramm anzeigen:

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

Wir haben mit dem Diagramm-Generator eine Instanz eines CategoryChart erstellt , diese dann konfiguriert und mit den Daten für die x- und y-Achse gefüllt.

Wir zeigen das Diagramm schließlich in einer GUI mit dem SwingWrapper an:

Aus dem obigen Histogramm können wir ersehen, dass es keine Schüler im Alter von 80 bis 90 Jahren gibt, während Schüler im Alter von 50 bis 60 Jahren vorherrschen. Dies werden höchstwahrscheinlich Doktoranden oder Postdoktoranden sein.

Wir können auch sagen, dass das Histogramm eine Normalverteilung hat.

5. Schlussfolgerung

In diesem Artikel haben wir uns angesehen, wie Sie die Leistung der Frequenzklasse der Apache commons-math3- Bibliothek nutzen können.

Es gibt andere interessante Klassen für Statistik, Geometrie, genetische Algorithmen und andere in der Bibliothek. Die Dokumentation finden Sie hier.

Der vollständige Quellcode ist bei Github erhältlich.