中央値を求める
データ数が奇数のときは
データ数が偶数のときは
今回は
について学びましょう。
1. 配列のソート
Perlにはsort()という関数が実装されていますが,これはそのまま使っても何の役にも立ちません。ベクトルの要素を昇順(つまり小さい順)に並び換えたい場合は次のようにしてください。
@list=sort{$a<=>$b}@dat; #@datはソートの対象となるデータ #@listに昇順にソートしたデータを格納
2. if構文
if構文はある条件によって異なる処理を実行させるために使用します。
$x=10; #条件が2つの場合 if($x<=10){ print "xは10以下です。"; }else{ print "xは10以上です。"; } #条件が3つ以上の場合 if(x<10){ print "xは10より小さい。"; }else if(x==10){ print "xは10です。"; }else{ print "xは10より大きい。"; }
☆中央値を求めるプログラムを作ってみよう
中央値を求めるプログラムは少し難しいです。最初に格納されているデータ数が偶数か奇数かを判定し,そのデータを昇順に並び換える必要があります。また,本来は中央に位置するデータのタイ(同順位となるもの)が存在する場合も考えなければいけませんが,今回はタイがある場合は考えずに作ってみてください。タイが存在する場合は後ほど、、、
-プログラム例
@dat=(1,2,3,4,5,6); @list=sort{$a<=>$b}@dat; #データを昇順にソート $n=@dat; #データの個数をnに代入 if($n%2==0){ #データの個数が偶数の場合 $x1=$n/2; $x2=$n/2+1; $median_g=($list[$x1-1]+$list[$x2-1])*0.5; print "median=$median_g \n"; }else{ #データの個数が奇数の場合 $x=$n/2; $median_k=$list[$x]; print "median=$median_k \n"; } print "注意:タイが存在する場合は正しい値を求められません。";
-出力結果
@ @dat=(3,4,1,6,8,9,7)の場合
C:\Perl>sample.pl median=6 注意:タイが存在する場合は正しい値を求められません。
A @dat=(1,2,3,4,5,6)の場合
C:\Perl>sample.pl median=3.5 注意:タイが存在する場合は正しい値を求められません。
-Rで確認
> x<-c(3,4,1,6,8,9,7) > median(x) [1] 6 > y<-c(1,2,3,4,5,6) > median(y) [1] 3.5