Гистограммы с частотой Apache Commons

Гистограммы с частотой Apache Commons

 

1. обзор

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

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

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

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

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


    org.apache.commons
    commons-math3
    3.6.1


    org.knowm.xchart
    xchart
    3.5.2

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

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

3. Расчет частоты переменных

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

Давайте представим набор данных с помощью коллекцииList и будем использовать ее для заполнения экземпляра класса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())));

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

Из приведенного выше фрагмента мы сначала определяем частотуobservation, используяgetCount() классаFrequency. The method returns the total number of occurrence of the*observation*. 

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

Верхняя и нижняя границы объединяются в корзину, которая сохраняется вместе сobservationFrequency вdistributionMap с использованиемupdateDistributionMap().

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

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

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

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

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

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

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

image

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

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

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

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

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

Доступен полный исходный кодover at Github.