1. Обзор

В этом уроке мы рассмотрим, как мы можем представить данные на гистограмме с помощью класса частоты Apache Commons.

Класс Frequency является частью математической библиотеки Apache Commons, рассматриваемой в этой статье.

Гистограмма — это диаграмма связанных столбцов, показывающая наличие диапазона данных в наборе данных. Она отличается от гистограммы тем, что используется для отображения распределения непрерывных количественных переменных, тогда как гистограмма используется для отображения категорийных данных.

2. Зависимости проекта

В этой статье мы будем использовать проект Maven со следующими зависимостями:

Библиотека commons-math3 содержит класс Frequency, который мы будем использовать для определения появление переменных в нашем наборе данных. Библиотека xchart — это то, что мы будем использовать для отображения гистограммы в графическом интерфейсе.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>
<dependency>
    <groupId>org.knowm.xchart</groupId>
    <artifactId>xchart</artifactId>
    <version>3.5.2</version>
</dependency>

Последнюю версию commons-math3 и xchart можно найти на Maven Central.

3. Вычисление частоты переменных

В этом уроке мы будем использовать набор данных, включающий возраст учащихся в определенной школе. Мы хотели бы видеть частоту различных возрастных групп и наблюдать за их распределением на гистограмме.

Давайте представим набор данных в виде коллекции List и используем ее для заполнения экземпляра класса Frequency:

Теперь, когда мы заполнили наш экземпляр класса Frequency, мы собираемся получить количество каждого возраста в корзине и суммируем его, чтобы получить общую частоту возрастов в определенной возрастной группе: Класс частоты. Метод возвращает общее количество вхождений наблюдения.

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

Используя текущее наблюдение, мы динамически определяем группу, к которой он принадлежит, определяя ее верхнюю и нижнюю границы относительно ширины класса, которая равна 10.

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

Верхняя и нижняя границы объединяются, чтобы сформировать бин , который хранится вместе сObservFrequency в DistributionMap с помощью updateDistributionMap().

Если бин уже существует, мы обновляем частоту, в противном случае мы добавляем его в качестве ключа и устанавливаем частоту текущего наблюдения в качестве его значения. Обратите внимание, что мы отслеживали обработанные наблюдения, чтобы избежать дублирования.

Класс Frequency также имеет методы для определения процента и совокупного процента переменной в наборе данных.

4. Построение гистограммы

Теперь, когда мы преобразовали наш необработанный набор данных в карту возрастных групп и их соответствующих частот, мы можем использовать библиотеку xchart для отображения данных в виде гистограммы:

~ ~~ Мы создали экземпляр CategoryChart с помощью построителя диаграмм, затем настроили его и заполнили данными для осей x и y.

Наконец, мы отображаем диаграмму в графическом интерфейсе с помощью SwingWrapper:

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

Из приведенной выше гистограммы видно, что нет учащихся в возрасте 80–90 лет, а учащихся в возрасте 50–60 лет нет. являются преобладающими. Скорее всего, это будут докторанты или постдокторанты.

Мы также можем сказать, что гистограмма имеет нормальное распределение.

5. Заключение

В этой статье мы рассмотрели, как использовать мощь класса Frequency библиотеки Apache commons-math3.

В библиотеке есть и другие интересные классы по статистике, геометрии, генетическим алгоритмам и другим. Его документацию можно найти здесь.

Полный исходный код доступен на Github.

«

The complete source code is available over at Github.