1. 概要

このチュートリアルでは、Apache Commons Frequency クラスを使用して、ヒストグラムにデータを表示する方法を見ていきます。

Frequency クラスは、このarticleで説明されているApacheCommonsMathライブラリの一部です。

ヒストグラムは、データセット内のデータの範囲の出現を示す接続されたバーの図です。 棒グラフは、連続的な量的変数の分布を表示するために使用され、棒グラフはカテゴリデータを表示するために使用されるという点で棒グラフとは異なります。

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 ライブラリは、GUIでヒストグラムを表示するために使用するものです。

commons-math3およびxchartの最新バージョンは、MavenCentralにあります。

3. 変数の頻度の計算

このチュートリアルでは、特定の学校の生徒の年齢で構成されるデータセットを使用します。 さまざまな年齢層の頻度を確認し、ヒストグラムチャートでそれらの分布を観察したいと思います。

データセットをリストコレクションで表し、それを使用して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);
  });

上記のスニペットから、最初に FrequencyクラスのgetCount()を使用して観測の頻度を決定します。 このメソッドは、発生の総数を返します。 観察。 

現在の観測値を使用して、クラス幅(10 )に対する上限と下限を計算することにより、グループが属するグループを動的に決定します。

上限と下限は連結されてビンを形成し、 updateDistributionMap()を使用してdistributionMapobservationFrequencyと一緒に格納されます。

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. 結論

この記事では、Apache commons-math3ライブラリのFrequencyクラスの機能を活用する方法について説明しました。

ライブラリには、統計、幾何学、遺伝的アルゴリズムなどの興味深いクラスが他にもあります。 そのドキュメントはここにあります。

完全なソースコードは、Githubから入手できます。