5,304 total views,  3 views today

例えば以下のような2次元配列があったとする(参考:猛暑日、真夏日等の日数の一覧)。

var manatsubi = [
                  [11, 57, 74, 81, 75], //2016年の札幌、東京、名古屋、大阪、福岡それぞれの真夏日数
                  [6, 47, 54, 58, 42], //2015年 〃
                  [12, 45, 68, 65, 48], //2014年 〃
                  [9, 58, 88, 88, 77], //2013年 〃
                  [20, 66, 76, 75, 63] //2012年 〃
];

このとき、各都市ごとに2012年~2016年の平均値や中央値を求めるのは、少々面倒そうだ。


ググってみたところ、1次元配列の平均値や中央値の求め方は見つかったが、2次元配列の場合の求め方が見当たらなかった。


なので、ここでは2次元配列の平均値と中央値を求める方法を紹介する。

平均値

1次元配列の平均値の求め方は分かったので、2次元配列を複数の1次元配列に分解してから、各配列の平均値を求め、平均値のみの配列を新たに作るという方法を取った。

var average = function(arr) { //引数として渡された配列の平均値(average)を算出
    var sum = 0;
    for (var i = 0,len = arr.length; i < len; i++) {
        sum += arr[i];
    }  
    return sum / arr.length; //平均値を返す
};

var average_arr = function(arr) { //2次元配列の列ごとの平均値を求める
    var arr_2d = [];
    for (var i = 0, len_1 = arr[i].length; i < len_1; i++) {
        var arr_temp = []; 
        for (var j = 0, len_2 = arr.length; j < len_2; j++) {
            arr_temp.push(arr[j][i]); //2次元配列の各列を1次元配列として抽出
        }
        arr_2d.push(average(arr_temp)); //2次元配列の各列ごとの平均値を抽出
    }
    return arr_2d; //平均値の配列を返す
}

ちなみに、上記の関数を使って各都市の真夏日の平均値を求めると、次のとおりとなる。

スポンサーリンク

var d1 = document.getElementById('avr');
d1.insertAdjacentHTML("beforeend", "<p>札幌:" + average_arr(manatsubi)[0] + "日、東京:" + average_arr(manatsubi)[1] + "日、名古屋:" + average_arr(manatsubi)[2] + "日、大阪:" + average_arr(manatsubi)[3] + "日、福岡:" + average_arr(manatsubi)[4] + "日</p>");

中央値

考え方は、平均値の場合と全く同じである。

var median = function(arr) {
    var array_length, mid;
    array_length = arr.length;
    new_array = arr.slice(0); //引数として渡された配列のコピーを作成
    new_array.sort(function(a, b){ //コピーした配列を降順に並べ替え
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
    });
    mid = Math.floor(array_length / 2); //降順に並んだ配列の中央に位置する要素のインデックス
    if (array_length % 2 == 1) {
        return new_array[mid]; //配列の要素数が奇数個の場合の中央値を返す
    } else {
        return (new_array[mid - 1] + new_array[mid]) / 2; //配列の要素数が偶数個の場合の中央値を返す
    }
}

var median_arr = function(arr) { //2次元配列の列ごとの中央値を求める
    var arr_2d = [];
    for (var i = 0, len_1 = arr[i].length; i < len_1; i++) {
        var arr_temp = [];
        for (var j = 0, len_2 = arr.length; j < len_2; j++) {
            arr_temp.push(arr[j][i]); //2次元配列の各列を1次元配列として抽出
        }
        arr_2d.push(median(arr_temp)); //2次元配列の各列ごとの中央値を抽出
    }
    return arr_2d; //中央値の配列を返す
}

上記の関数を使って求めた、各都市の真夏日の中央値は次のとおり。

var d2 = document.getElementById('med');
d2.insertAdjacentHTML("beforeend", "<p>札幌:" + median_arr(manatsubi)[0] + "日、東京:" + median_arr(manatsubi)[1] + "日、名古屋:" + median_arr(manatsubi)[2] + "日、大阪:" + median_arr(manatsubi)[3] + "日、福岡:" + median_arr(manatsubi)[4] + "日</p>");

まとめ

  • Javascriptで2次元配列の平均値と中央値を求めた
  • 平均値の求め方の紹介をした
  • 中央値の求め方の紹介をした