Хистограми с честота на Apache Commons

1. Общ преглед

В този урок ще разгледаме как можем да представим данни на хистограма с помощта на класа за честота на Apache Commons.

Класът Честота е част от част от библиотеката на Apache Commons Math, изследвана в тази статия.

Хистограмата е диаграма на свързани ленти, която показва появата на набор от данни в набор от данни. Той се различава от стълбовидната диаграма по това, че се използва за показване на разпределението на непрекъснати количествени променливи, докато стълбовата диаграма се използва за показване на категорични данни.

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

В тази статия ще използваме проект на Maven със следните зависимости:

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

В Commons-math3 библиотеката съдържа Честота класа, че ние ще се използва за да се определи наличието на променливи в нашия набор от данни. В xchart библиотеката е това, което ще използваме за показване на хистограма в GUI.

Най-новата версия на commons-math3 и xchart може да бъде намерена в Maven Central.

3. Изчисляване на честотата на променливите

За този урок ще използваме набор от данни, включващ възрастта на учениците в конкретно училище. Бихме искали да видим честотата на различните възрастови групи и да наблюдаваме тяхното разпределение на хистограма.

Нека представим набора от данни с колекция от списъци и го използваме за попълване на екземпляр от класа на честотата :

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

Сега, след като попълнихме нашия екземпляр от класа на честотата , ще получим броя на всяка възраст в кошче и ще го обобщим, за да можем да получим общата честота на възрастите в определена възрастова група :

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 () от класа на честотата . Методът връща общия брой на появата на наблюдението .

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

Горната и долната граници са обединени, за да образуват кош, който се съхранява заедно с наблюдениетоЧестота в разпределителна карта, използвайки updateDistributionMap () .

Ако бинът вече съществува, ние актуализираме честотата, иначе го добавяме като ключ и задаваме честотата на текущото наблюдение като негова стойност. Имайте предвид, че ние следихме обработените наблюдения, за да избегнем дублирания.

Класът Честота също има методи за определяне на процента и кумулативния процент на променлива в набор от данни.

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. Заключение

В тази статия разгледахме как да използваме мощта на класа на честотата на библиотеката Apache commons-math3 .

В библиотеката има и други интересни класове за статистика, геометрия, генетични алгоритми и други. Документацията му може да бъде намерена тук.

Пълният изходен код е достъпен в Github.