中央値を求めてみよう
中央値を求める方法をPerlプログラムを用いて説明します。
配列の中央値を求めてみよう
以下のような配列を考えてみます。
my @array1 = (1, 4, 5, 7, 8); my @array2 = (1, 4, 6, 8, 9, 12);
配列の中央値を求めるサンプルプログラム
実際に配列から中央値を求めます。Statistics::Liteモジュールにmedian関数がありますが、この例では利用しません。
中央値は要素数が奇数の場合は要素の中央にある値となり、偶数の場合は中央にある2つの値の平均を中央値として求めることができます。
※コードの簡略化のため、ソート済みのデータを使用します。
use strict;
use warnings;
my @array1 = (1, 4, 5, 7, 8);
my @array2 = (1, 4, 6, 8, 9, 12);
my $median = 0;
sub get_median {
my ($array_ref) = @_;
my $array_cnt = @$array_ref;
my $ret_median = 0;
my $median_pos = int($array_cnt / 2);
if ( $array_cnt % 2 == 1) {
$ret_median = @$array_ref[$median_pos];
} else {
my $median_pos2 = $median_pos - 1;
$ret_median = (@$array_ref[$median_pos] + @$array_ref[$median_pos2]) / 2;
}
return $ret_median;
}
$median = get_median(\@array1);
print "array1の中央値は:" . "$median" . "\n";
$median = get_median(\@array2);
print "array2の中央値は:" . "$median" . "\n";
実行結果
array1の中央値は:5 array2の中央値は:7
最大値、最小値などのように値の比較を行う必要がなく、要素の配列の中央の要素を取得できます。
表形式のデータから、特定の列の中央値を求めてみよう。
以下のデータを考えてみましょう。
| name | age |
|---|---|
| bob | 9 |
| alice | 11 |
| tom | 13 |
配列,ハッシュのリファレンスで表すと以下のようになります。
$array_ref1 = [
{name => 'bob', age => 9},
{name => 'alice',age => 11},
{name => 'tom', age => 13}
];
age列の中央値を求めるサンプルプログラム
参照するデータが複雑になったためデータアクセスも少し難しくなりましたが、
チェックする方法は先ほどと同じです。
※偶数パターンも入れるため$array_ref2も追加しています。
use strict;
use warnings;
use Data::Dumper;
my $array_ref1 = [
{name => 'bob', age => 9},
{name => 'alice',age => 11},
{name => 'tom', age => 13}
];
my $array_ref2 = [
{name => 'bob', age => 9},
{name => 'alice',age => 11},
{name => 'tom', age => 13},
{name => 'carol', age => 15}
];
my $median = 0;
sub get_median {
my ($array_ref) = @_;
my $array_cnt = @$array_ref;
my $median_pos = int($array_cnt / 2);
my $ret_median = 0;
if ( $array_cnt % 2 == 1) {
$ret_median = $array_ref->[$median_pos]->{'age'};
} else {
my $median_pos2 = $median_pos - 1;
my $value1 = $array_ref->[$median_pos]->{'age'};
my $value2 = $array_ref->[$median_pos2]->{'age'};
$ret_median = ($value1 + $value2) / 2;
}
return $ret_median;
}
$median = get_median(\@$array_ref1);
print "array_ref1の中央値は:" . "$median" . "\n";
$median = get_median(\@$array_ref2);
print "array_ref2の中央値は:" . "$median" . "\n";
実行結果
array_ref1の中央値は:11 array_ref2の中央値は:12
リファレンスを扱った以外は先ほどと同じ処理になります。
このプログラムは、コピー&ペーストして、PerlBanjoで、すぐに試すことができます。
Perlデータ分析入門