1. Обзор
В этом уроке мы рассмотрим, как мы можем представить данные на гистограмме с помощью класса частоты Apache Commons .
Класс Frequency
является частью части библиотеки Apache Commons Math, рассматриваемой в этой статье .
Гистограмма — это диаграмма соединенных полос, показывающая наличие диапазона данных в наборе данных. Она отличается от гистограммы тем, что используется для отображения распределения непрерывных количественных переменных, тогда как гистограмма используется для отображения категорийных данных.
2. Зависимости проекта
В этой статье мы будем использовать проект Maven со следующими зависимостями:
<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
содержит класс Frequency
, который мы будем использовать для определения появления переменных в нашем наборе данных. Библиотека xchart
— это то, что мы будем использовать для отображения гистограммы в графическом интерфейсе.
Последнюю версию commons-math3 и xchart можно найти на Maven Central.
3. Расчет частоты переменных
Для этого урока мы будем использовать набор данных, состоящий из возраста учащихся в конкретной школе. Мы хотели бы видеть частоту различных возрастных групп и наблюдать за их распределением на гистограмме.
Давайте представим набор данных с коллекцией List
и используем ее для заполнения экземпляра класса 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())));
Теперь, когда мы заполнили наш экземпляр класса Frequency
, мы собираемся получить количество каждого возраста в ячейке и просуммировать его, чтобы мы могли получить общую частоту возрастов в определенной возрастной группе :
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);
});
Из приведенного выше фрагмента мы сначала определяем частоту наблюдения
, используя getCount()
класса Frequency
. Метод возвращает общее количество вхождений наблюдения .
Используя текущее наблюдение,
мы динамически определяем группу, к которой он принадлежит, определяя его верхнюю и нижнюю границы относительно ширины класса, которая равна 10 .
Верхняя и нижняя границы объединяются для формирования корзины, которая хранится вместе сObserventFrequency
в DistributionMap
с помощью updateDistributionMap()
.
Если бин
уже существует, мы обновляем частоту, в противном случае мы добавляем его в качестве ключа и устанавливаем частоту текущего наблюдения
в качестве его значения. Обратите внимание, что мы отслеживали обработанные наблюдения, чтобы избежать дублирования.
В классе 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:
Из приведенной выше гистограммы видно, что учащихся в возрасте 80–90 лет нет, а преобладают студенты в возрасте 50–60 лет. Скорее всего, это будут докторанты или постдокторанты.
Мы также можем сказать, что гистограмма имеет нормальное распределение.
5. Вывод
В этой статье мы рассмотрели, как использовать возможности класса Frequency
библиотеки Apache commons-math3
.
В библиотеке есть и другие интересные классы по статистике, геометрии, генетическим алгоритмам и другим. Его документацию можно найти здесь .
Полный исходный код доступен на Github .