Apache Commons Frequencyのヒストグラム
1. 概要
2. プロジェクトの依存関係
この記事では、次の依存関係を持つMavenプロジェクトを使用します。
org.apache.commons
commons-math3
3.6.1
org.knowm.xchart
xchart
3.5.2
commons-math3ライブラリには、データセット内の変数の出現を判別するために使用するFrequency classが含まれています。 xchartライブラリは、GUIでヒストグラムを表示するために使用するものです。
commons-math3とxchartの最新バージョンは、MavenCentralにあります。
3. 変数の頻度の計算
このチュートリアルでは、特定の学校の生徒の年齢で構成されるデータセットを使用します。 さまざまな年齢層の頻度を確認し、ヒストグラムチャートでそれらの分布を観察したいと思います。
データセットをList collectionで表し、それを使用してFrequency classのインスタンスにデータを設定しましょう。
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);
});
上記のスニペットから、最初にFrequencyクラスのgetCount()を使用してobservationの頻度を決定します。 The method returns the total number of occurrence of the*observation*.
現在のobservation,を使用して、クラス幅(10.)に対する上限と下限を計算することにより、グループが属するグループを動的に決定します。
上限と下限が連結されてビンが形成され、updateDistributionMap()を使用してdistributionMapのobservationFrequencyと一緒に格納されます。
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:を使用してGUIでグラフを表示します
上記のヒストグラムから、80〜90歳の生徒はいないのに、50〜60歳の生徒が優勢であることがわかります。 これはほとんどの場合、博士課程または博士課程の学生になります。
また、ヒストグラムには正規分布があると言えます。
5. 結論
この記事では、Apachecommons-math3ライブラリのFrequency classの機能を活用する方法について説明しました。
ライブラリには、統計、ジオメトリ、遺伝的アルゴリズムなどの興味深いクラスがあります。 そのドキュメントはhereにあります。
完全なソースコードはover at Githubで入手できます。