アプリ版:「スタンプのみでお礼する」機能のリリースについて

中央値の大小関係について

n個のデータがあるとき、データの中央値 m を以下のように定義します。
中央値=
小さい方から (n+1)/2 個目のデータ 〔nは奇数〕
  小さい方から n/2 個目のデータと n/2+1 個目のデータの平均 〔nは偶数〕

次にn個のデータを n1個とn2個のデータに分割(n1+n2=n)し、
n1個のデータの中央値を m1
n2個のデータの中央値を m2
とします。

このとき、
 m1<m かつ m2<m
となることは有り得るのでしょうか?
某プログラム言語を使ってデータ分析をしていたところ上記のような結果が発生しました。
直感的にはないと思うのですが。プログラムミスでしょうか?よろしくお願いします。

A 回答 (4件)

> このとき、


>  m1<m かつ m2<m
> となることは有り得るのでしょうか?

あり得ないと思います。

n個のデータの「m未満の値のデータの集合」をL、
「m以上の値のデータの集合」をHとおきます。
中央値の求め方を考えると、

Lの要素数 < Hの要素数 … (*)

となる事が分かると思います。

ここでデータを、m1 < mかつm2 < mが成り立つように、
n1個のグループとn2個のグループに分割する事を考えます。

[方法1]
n1個のデータの方の中央値m1をmより小さくしたければ、
まず「Lからk個、Hからk個未満のデータを選ぶ」という方法が思い浮かびます。
こうすればとりあえずm1 < mが実現できます。
ここで選ばなかったデータ群が、
もうひとつのデータのグループ(n2個のデータのグループ)となります。

n1個のデータを選ぶ時に、HよりもLから多めにデータをとってしまっていました。
この事と(*)式より、n2個のデータのグループには
「Hの要素」が「Lの要素」より多く含まれることが分かります。
つまりこの時、n2個のデータのグループの中央値m2はmより大きくなってしまいます。
よって
「n1個のデータを選ぶときはLからk個、Hからk個未満のデータを選ぶ」
という方法ではm1 < mかつm2 < mは実現できません。

同様の理由で、
「n2個のデータを選ぶときはLからk個、Hからk個未満のデータを選ぶ」
という方法でもm1 < mかつm2 < mは実現できません。

[方法2]
[方法1]より、m1 < mかつm2 < mを実現するためには
「n1個のデータを選ぶ時はLからk個、Hからk個のデータを選ぶ」
「n2個のデータを選ぶ時はLから(n/2)-k個、Hから(n/2)-k個のデータを選ぶ」
という選択肢しか残されていません。
この時総データ数は偶数となるため、中央値mは
(max(L) + min(H)) / 2
で計算されます。

n1個のデータ総数は2k個なので、やはりデータ数は偶数個となります。
よってn1の中央値m1は

m1 = ((Lから選んだk個のデータの最大値) + (Hから選んだk個のデータの最小値))/2

で計算することになります。
ここでm1 < mが実現できるようにn1個のデータを選ぶ事を考えてください。
そのためにはLからk個要素を取ってくるときに、
max(L)未満の値のデータのみを選ぶ必要があります
(逆にmax(L)の値を持つデータをLから選んでしまうと、
m1 < mとならない事がすぐ分かると思います)。
しかしそうするとn2個のデータを選ぶ際、
Lからデータを選ぶ時に必ずmax(L)の値をもつデータを選ぶ事になります。
なのでm2 < mが実現できなくなります。

よってどんな方法でデータを分割しても
m1 < mかつm2 < mが成り立つ事はあり得ないと思います。
    • good
    • 0
この回答へのお礼

詳細な説明ありがとうございました。
解決いたしました。

お礼日時:2010/11/03 23:11

質問者様のプログラムの中で、浮動小数点型データを使っていないでしょうか?



ANo.1様、ANo.2様のとおり、「m1<m、m2<m」はあり得ませんが、「m1<m、m2<=m」はあり得ます。浮動小数点型では、数学的にm2 = mであっても、プログラムがm2 < mと判定することがよく起きるのです。これは、浮動小数点型が、原則として誤差を伴っているためです。

なお、10進法表記で誤差がないように見える数値でも、コンピュータ内部には2進法で格納されるため、実際は誤差が発生している場合が多いことに注意する必要があります。

次のBasicプログラムを見てください。

  Function Test() As String
    Dim X As Single      'Xは、単精度浮動小数点型(32ビット)
    Dim i As Integer
    X = 1
    For i = 1 To 3       '0.1を3回加える
      X = X + 0.1
    Next i 
    If X < 1.3 Then
      Test = "X < 1.3"
    ElseIf X = 1.3 Then
      Test = "X = 1.3"
    ElseIf X > 1.3 Then
       Test = "X > 1.3"
    End If
  End Function

X = 1.3 のはずですが、私のパソコンでは、X > 1.3 という答が返ってきます。
    • good
    • 0
この回答へのお礼

VBA例までを示していただきありがとうございます。
プログラムで誤差を極小化した数値計算を行うことは難しいのですね。
そこらへんの知識も知っておかなければとは思っているのですが、なかなか…

お礼日時:2010/11/03 23:15

ANo.1ですが訂正です



(誤) Lの要素数 < Hの要素数 … (*)
(正) Lの要素数 ≦ Hの要素数 … (*)

それから方法2を使おうとしてできるのは
(Lの要素数) = (Hの要素数)の時のみです。
(Lの要素数) < (Hの要素数)の時は
「n1個のデータを選ぶ時はLからk個、Hからk個のデータを選ぶ」
という事はできます。
しかしn2個のデータを選ぶ時、LとHから同じ個数のデータを取ることができません。
かならずHの方から多めにデータを取ります(式(*)より)。
なのでこの場合、m2 < mを満たす事ができないことが分かります。
    • good
    • 0

ありえないと思います。


全データの半分は中央値m以上の数ですから、
m1<m、m2<=mとなる場合はあります。
    • good
    • 0
この回答へのお礼

簡潔な説明ありがとうございました。
解決いたしました。

お礼日時:2010/11/03 23:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!