Apache Commonsの頻度のヒストグラム

Apache Commons Frequencyのヒストグラム

 

1. 概要

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

Frequency classは、このarticleで探索されたApache CommonsMathライブラリの一部です。

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

2. プロジェクトの依存関係

この記事では、次の依存関係を持つMavenプロジェクトを使用します。


    org.apache.commons
    commons-math3
    3.6.1


    org.knowm.xchart
    xchart
    3.5.2

commons-math3ライブラリには、データセット内の変数の出現を判別するために使用するFrequency classが含まれています。 xchartライブラリは、GUIでヒストグラムを表示するために使用するものです。

commons-math3xchartの最新バージョンは、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()を使用して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でグラフを表示します

image

上記のヒストグラムから、80〜90歳の生徒はいないのに、50〜60歳の生徒が優勢であることがわかります。 これはほとんどの場合、博士課程または博士課程の学生になります。

また、ヒストグラムには正規分布があると言えます。

5. 結論

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

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

完全なソースコードはover at Githubで入手できます。