加重移動平均で波形を描画する
加重移動平均を計算した結果をC#で描画します。
以前の投稿と同様にコロナの感染者数を使用します。
https://www.mhlw.go.jp/stf/covid-19/open-data.html
実行結果と加重移動平均のメリット/デメリット
感染者数を5日/25日/75日の加重移動平均で描画した結果は画像のようになりました。
重みは新しいデータになるほど比例して重くなるようにしています。
5日平均の場合、古いデータから順に重みが1/15、2/15、3/15、4/15、5/15となるようにしています。
700~1000日目を表示したものが以下になります。
単純移動平均に比べ、後の日付に重みをつけることにより変化に追従しやすくなっています。
時系列データの場合は、新しいデータを重視したい場合に使用します。
ただし、新しいデータが影響が大きいため注意が必要です。
重みを変えることにより古いデータを重視もできますが、あまり使うことはないかと思われます。
コード
関数のみ抜粋します。必要に応じて型は変更します。ジェネリックでもよいかと思います。
/// <summary>
/// 加重平均の結果を求める
/// </summary>
/// <param name="data">元となるデータリスト</param>
/// <param name="Length">平均化する対象の日数</param>
/// <returns>加重平均の結果リスト</returns>
private List<double> kaju(List<int> data, int Length)
{
List<double> result = new List<double>();
int sum = 0;
for (int i = 1; i <= Length; i++)
{
sum += i;
}
// 平均化したい日数分のデータ
double[] doubles = new double[Length];
// 平均化する
for (int i = 0; i < data.Count - Length; i++)
{
// 重みをかけながら配列に反映する
for (int j = 0; j < Length; j++)
{
doubles[j] = data[i + j] * (j + 1) / sum;
}
// 配列の合計値をresultに追加する
result.Add(doubles.Sum());
}
return result;
}