Histogrammes avec fréquence Apache Commons

Histogrammes avec fréquence Apache Commons

 

1. Vue d'ensemble

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

La classeFrequency class fait partie d'une partie de la bibliothèque Apache Commons Math explorée dans cearticle.

Un histogramme est un diagramme de barres connectées qui montre l'occurrence d'une plage de données dans un jeu 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 allons utiliser 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èquecommons-math3 contient la classeFrequency  que nous utiliserons pour déterminer l'occurrence des variables dans notre ensemble de données. La bibliothèquexchart est ce que nous allons utiliser pour afficher l'histogramme dans une interface graphique.

La dernière version decommons-math3 etxchart 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 aimerions 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 un balayageList et utilisons-le pour remplir une instance de la classeFrequency :

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

Now that we’ve populated our instance of the Frequency class, we’re going to get the count of each age in a bin and sum it up so we can get the total frequency of ages in a particular age group:

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 desobservation en utilisant lesgetCount() de la classeFrequency. The method returns the total number of occurrence of the*observation*. 

En utilisant lesobservation, actuels, nous déterminons dynamiquement 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é desobservationFrequency dans undistributionMap en utilisant lesupdateDistributionMap().

Si lebin existe déjà, nous mettons à jour la fréquence, sinon nous l'ajoutons comme clé et définissons la fréquence duobservation courant comme sa valeur. Notez que nous avons gardé une trace des observations traitées pour éviter les doublons.

La classeFrequency dispose également de méthodes pour déterminer le pourcentage et le pourcentage cumulé d'une variable dans un ensemble de données.

4. Tracer le graphique d'histogramme

Maintenant que nous avons transformé notre ensemble de données brutes en une carte des groupes d'âge et de leurs fréquences respectives, nous pouvons utiliser la bibliothèquexchart 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'unCategoryChart à l'aide du générateur de graphiques, puis nous l'avons configurée et l'avons remplie avec les données des axes x et y.

Nous affichons enfin le graphique dans une interface graphique en utilisant lesSwingWrapper:

image

L’histogramme ci-dessus montre qu’il n’ya pas d’élèves âgés de 80 à 90 ans et que les élèves âgés de 50 à 60 ans prédominent. Il s'agira très probablement d'étudiants de doctorat ou post-doctorants.

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 classeFrequency  de la bibliothèque Apachecommons-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éehere.

Le code source complet est disponibleover at Github.