- ベストアンサー
中央値の大小関係について
- n個のデータの中央値について説明します。奇数の場合は中央の値、偶数の場合は中央の2つの値の平均です。
- また、n個のデータをn1個とn2個に分割し、それぞれのデータの中央値をm1とm2とします。
- 質問者はm1 < m かつ m2 < m が成り立つことに疑問を持っています。
- みんなの回答 (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が成り立つ事はあり得ないと思います。
その他の回答 (3)
- ramayana
- ベストアンサー率75% (215/285)
質問者様のプログラムの中で、浮動小数点型データを使っていないでしょうか? 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 という答が返ってきます。
お礼
VBA例までを示していただきありがとうございます。 プログラムで誤差を極小化した数値計算を行うことは難しいのですね。 そこらへんの知識も知っておかなければとは思っているのですが、なかなか…
- R_Earl
- ベストアンサー率55% (473/849)
ANo.1ですが訂正です (誤) Lの要素数 < Hの要素数 … (*) (正) Lの要素数 ≦ Hの要素数 … (*) それから方法2を使おうとしてできるのは (Lの要素数) = (Hの要素数)の時のみです。 (Lの要素数) < (Hの要素数)の時は 「n1個のデータを選ぶ時はLからk個、Hからk個のデータを選ぶ」 という事はできます。 しかしn2個のデータを選ぶ時、LとHから同じ個数のデータを取ることができません。 かならずHの方から多めにデータを取ります(式(*)より)。 なのでこの場合、m2 < mを満たす事ができないことが分かります。
- mikeyan
- ベストアンサー率41% (19/46)
ありえないと思います。 全データの半分は中央値m以上の数ですから、 m1<m、m2<=mとなる場合はあります。
お礼
簡潔な説明ありがとうございました。 解決いたしました。
お礼
詳細な説明ありがとうございました。 解決いたしました。