もよいめも

不定期更新ものづくりブログ

【Arduino】Arduinoで中央値などの記述統計をする方法

皆さん、Arduinoでプログラミングをしているときに、中央値とか最大値とかの「記述統計」をしたいと思ったことはないでしょうか。

私が軽く調べたところ、Arduino ideで記述統計をする方法を解説しているサイトは全然なく、私自信やり方がわからず苦労しましたので、今回ここにその方法を書いておこうと思います。

記述統計をしてくれるライブラリー

Arduino ideには簡単な統計をしてくれるライブラリーがあります。

それはずばり「QuickStats」ライブラリーです。

(公式の解説ページArduino Playground - QuickStats)

このライブラリーでは、平均、幾何平均、最大値、最小値、標準偏差、標準誤差、変動係数、絶対値、中央値などを求めることができます。

導入方法

まず、ここからライブラリーのデータをzip形式でダウンロードします。

github.com

そして、Arduino ideのメニューのスケッチ→ライブラリーをインクルード→zip形式のファイルをインストールからダウンロードしたファイルを選択します。ソフトを再起動させれば導入は完了です。

使い方

今回は私の情報量の関係で使い方を説明するのは、平均、最大値、最小値、中央値、絶対値のみとさせていただきます。
なお今回は、センサー等で取得した値についてこのライブラリーを使うといった場合で説明します。

#include "QuickStats.h"//ライブラリーをインクルード
int numreadings = 10;//記述統計をしたい値を入れるための配列を作成
float readings[10];
float n;//センサー等の値代入用の変数を作成

void setup ( ) {
  Serial.begin(115200);
}

void loop ( ) {
  for (int i = 0; i <= 9; i++) {
    //ここらへんでセンサー等の値を取得して変数nに代入
    readings[i] = n; //センサー等の値を配列に代入(このnをiに変えることでプログラムのテストを行うことができます)
  }
  QuickStats stats;//QuickStatsを初期化
  Serial.print("平均値:");
  Serial.println(stats.average(readings, numreadings));//平均値を表示
  Serial.print("最小値:");
  Serial.println(stats.minimum(readings, numreadings));//最小値を表示
  Serial.print("最大値:");
  Serial.println(stats.maximum(readings, numreadings));//最大値を表示
  Serial.print("中央値:");
  Serial.println(stats.median(readings, numreadings));//中央値を表示
}

ちなみに変数nをコメントの通りにiにかえると
平均値が4.5
最小値が0
最大値が9
中央値が4.5
といった値が返ってくると思います。
配列に代入した値が0~9なのでちゃんと計算されてますね。
使用例としては、複数の値の中央値や平均値をとることでセンサーの値のブレの軽減などに使えるかなと思います。

では、よいArduinoライフを!