Histogrammes avec fréquence Apache Commons

1. Vue d'ensemble

Dans ce didacticiel, nous allons voir comment nous pouvons présenter des données sur un histogramme à l'aide de la classe Apache Commons Frequency.

La classe Frequency fait partie de la bibliothèque Apache Commons Math explorée dans cet article.

Un histogramme est un diagramme de barres connectées qui montre l'occurrence d'une plage de données dans un ensemble de données. Il diffère d'un graphique à barres en ce qu'il est utilisé pour afficher la distribution de variables quantitatives continues, tandis qu'un graphique à barres est utilisé pour afficher des données catégorielles.

2. Dépendances du projet

Dans cet article, nous utiliserons un projet Maven avec les dépendances suivantes:

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

La bibliothèque commons-math3 contient la classe Frequency que nous allons utiliser pour déterminer l'occurrence des variables dans notre ensemble de données. La bibliothèque xchart est ce que nous utiliserons pour afficher l'histogramme dans une interface graphique.

La dernière version de commons-math3 et xchart est disponible sur Maven Central.

3. Calcul de la fréquence des variables

Pour ce didacticiel, nous utiliserons un ensemble de données comprenant l'âge des élèves dans une école particulière. Nous aimerons voir la fréquence des différents groupes d'âge et observer leur distribution sur un histogramme.

Représentons l'ensemble de données avec une collection List et utilisons-le pour remplir une instance de la 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())));

Maintenant que nous avons rempli notre instance de la classe Frequency , nous allons obtenir le décompte de chaque âge dans un bac et le résumer afin que nous puissions obtenir la fréquence totale des âges dans un groupe d'âge particulier :

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

À partir de l'extrait ci-dessus, nous déterminons d'abord la fréquence de l' observation à l'aide de getCount () de la classe Frequency . La méthode renvoie le nombre total d'occurrences de l' observation .

À l'aide de l' observation actuelle , nous déterminons de manière dynamique le groupe auquel il appartient en déterminant ses limites supérieure et inférieure par rapport à la largeur de la classe - qui est de 10 .

Les limites supérieure et inférieure sont concaténées pour former un bac, qui est stocké à côté de observationFrequency dans un distributionMap à l'aide de updateDistributionMap () .

Si le bac existe déjà, nous mettons à jour la fréquence, sinon nous l'ajoutons comme clé et définissons la fréquence de l' observation actuelle comme sa valeur. Notez que nous avons suivi les observations traitées pour éviter les doublons.

La classe Frequency a également des méthodes pour déterminer le pourcentage et le pourcentage cumulé d'une variable dans un ensemble de données.

4. Tracé du graphique histogramme

Maintenant que nous avons traité notre ensemble de données brutes en une carte des groupes d'âge et de leurs fréquences respectives, nous pouvons utiliser la bibliothèque xchart pour afficher les données dans un histogramme:

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

Nous avons créé une instance d'un CategoryChart à l'aide du générateur de graphiques, puis nous l'avons configuré et l'avons rempli avec les données des axes x et y.

Nous affichons enfin le graphique dans une interface graphique à l'aide du SwingWrapper:

À partir de l'histogramme ci-dessus, nous pouvons voir qu'il n'y a pas d'élèves âgés de 80 à 90 ans alors que les élèves de 50 à 60 ans sont prédominants. Il s'agira très probablement d'étudiants au doctorat ou post-doctorat.

Nous pouvons également dire que l'histogramme a une distribution normale.

5. Conclusion

Dans cet article, nous avons examiné comment exploiter la puissance de la classe Frequency de la bibliothèque Apache commons-math3 .

Il existe d'autres classes intéressantes pour les statistiques, la géométrie, les algorithmes génétiques et autres dans la bibliothèque. Sa documentation peut être trouvée ici.

Le code source complet est disponible sur Github.