平均値を求めてみよう

平均値を求める方法をPerlプログラムを用いて説明します。

配列の平均値を求めてみよう。

以下のような配列を考えてみます。

my @array = (8, 1, 4, 5, 7);

配列の平均値を求めるサンプルプログラム

実際に配列から平均値を求めます。Statistics::Liteモジュールにmean関数がありますが、この例では利用しません。

今まで紹介していたList::Utilモジュールには平均値を求める関数はありません。

平均値はすべてのデータの値を足し、データの個数で割ることで求めることができます。

use strict;
use warnings;

my @array = (8, 1, 4, 5, 7); 
my $array_cnt = @array; # データの個数を求めています。

my $sum = 0;
my $avg = 0;

for my $num (@array) {
    $sum += $num;
}
$avg = $sum / $array_cnt;

print "$avg\n";

実行結果

5

すべてのデータを一つずつ足していき、最後にデータの個数で割っています。

平均値を求めるデータが配列の場合は" @配列名 "とすることでデータの個数(要素数)を取得できます。

表形式のデータから、特定の列の平均値を求めてみよう。

以下のデータを考えてみましょう。

nameage
bob9
tom13
alice11

配列,ハッシュのリファレンスで表すと以下のようになります。

$array_ref = [
  {name => 'bob',  age => 9},
  {name => 'tom',  age => 13},
  {name => 'alice',age => 11}
];

age列の平均値を求めるサンプルプログラム

参照するデータが複雑になったためデータアクセスも少し難しくなりましたが、

チェックする方法は先ほどと同じです。

use strict;
use warnings;

my $array_ref = [
  {name => 'bob', age => 9},
  {name => 'tom', age => 13},
  {name => 'alice',age => 11}
];

my $array_cnt = 0;
my $sum = 0;
my $avg = 0;

for my $info (@{$array_ref}) {
    $sum += $info->{'age'};
    $array_cnt += 1;
}
$avg = $sum / $array_cnt;

print "$avg\n";

実行結果

11

リファレンスを扱った以外は先ほどと同じ処理になります。

データの個数はデータを足した分だけカウントすることで求めています。

今回は配列リファレンスのため、データの個数については以下のようにデリファレンスし求めることもできます。

my $array_cnt = @{$array_cnt};

このプログラムは、コピー&ペーストして、PerlBanjoで、すぐに試すことができます。

関連情報