• ベストアンサー

中央値(メジアン)

多分、中央値(メジアン)でいいと思うのですが、 睡眠時間 睡眠時間(時間)/ 5/6/7/8/9/10 人数(人)    / 2/9/2/3/0/1 の中央値を出す場合、どのような関数を使えばよろしいでしょうか。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koganeton
  • ベストアンサー率29% (30/101)
回答No.6

#2の者です。一応自動にしてみました。 エクセルで各セルに   A B C ・・・最後のセル 1 5 6 7・・・end 2 2 9 2・・・ 最後のセルの上段にendといれてください。 Sub 中央値() ReDim x(100) As Variant Dim n As Long, l As Long, P As Long, Z As Long, datm As Long ' l = 1 P = 1 Do Until Cells(1, l) = "end" For n = 1 To Cells(2, l) x(P) = Cells(1, l) P = P + 1 Next n l = l + 1 Loop Z = P - 1 P = 1 For P = 1 To Z For r = P + 1 To Z If x(P) > x(r) Then datm = x(P) x(P) = x(r) x(r) = datm End If Next Next If (Z) Mod 2 = 0 Then Cells(3, 1) = "中央値は" Cells(4, 1) = (x(Z / 2) + x(Z / 2 + 1)) / 2 Cells(5, 1) = "です。" Else Cells(3, 1) = "中央値は" Cells(4, 1) = x(Z / 2) Cells(5, 1) = "です。" End If End Sub

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

あっそうですね。#5 の私のは、まだ間違えていますね。もとの中央値自体を知らないもので(^^;  End If '以下 差し替えです。  If UBound(myData) Mod 2 = 0 Then   multiMedian = (myData(k / 2) + myData(Int((k / 2) + 0.5))) / 2  Else    multiMedian = myData(Int((k / 2) + 0.5))  End If   'multiMedian = Application.Median(myData)  ↑ '一応これは残しておきます。If 以下全てがこれに置き換え可能です。 End Function これで大丈夫かな?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

重ねての掲示ご迷惑かもしれませんが、#4の手直ししました。列・行ともに対応します。最後の「'」の部分の行と出力行を入れ替えれば、並び替えが出来ますので、昇順でなくても可能になります。 '<標準モジュール> '------------------------------------------- Function multiMedian(ByVal 範囲 As Range) As Double  '1次側-基数, 2次側-回数,基数は、標準で昇順に並んでいること  '1次側に文字列を入れるとはじく。  '2次側に、0を入れてもカウントはしない。  Dim Rng As Range  Dim myData()  Dim i As Long, k As Long, j As Long  Dim h As Integer, v As Long  ReDim myData(1 To 1)  k = 1  Set Rng = 範囲  h = Rng.Columns.Count  v = Rng.Rows.Count  If v = 2 Then '縦に2行   For i = 1 To h    For j = 1 To Rng.Cells(2, i).Value     If VarType(Rng.Cells(2, i)) = vbDouble Then      ReDim Preserve myData(1 To k)      myData(k) = Rng.Cells(1, i).Value      k = k + 1     End If    Next j   Next i  ElseIf h = 2 Then '横に2列   For i = 1 To v    For j = 1 To Rng.Cells(i, 2).Value     If VarType(Rng.Cells(i, 2)) = vbDouble Then      ReDim Preserve myData(1 To k)      myData(k) = Rng.Cells(i, 1).Value      k = k + 1     End If    Next j   Next i  End If  multiMedian = myData(Int((k / 2) + 0.5))  'multiMedian = Application.Median(myData) 'こちら側は並び替えあり End Function

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#2 のkoganetonさんのアイデアをいただきました。m(__)m ユーザー定義関数です。今回は、本格的なものではないので、時間は、昇順に並んでいることが条件です。そうでない場合は、特別なロジックが必要になります。 マクロ-Visual Basic Editor 挿入-標準モジュールで以下を貼り付けます。 '<標準モジュール> '------------------------------------------- Function multiMedian(範囲 As Range) As Double '現在は計算は横のみ'下の行がその数 Dim Rng As Range Dim myData() Dim i As Long, k As Long, j As Long ReDim myData(1 To 1) k = 1 Set Rng = 範囲 h = Rng.Columns.Count v = Rng.Rows.Count  For i = 1 To h    For j = 1 To Rng.Cells(2, i)     ReDim Preserve myData(1 To k)     myData(k) = Rng.Cells(1, i).Value     k = k + 1    Next j   Next i multiMedian = myData(Int((k / 2) + 0.5)) End Function '------------------------------------------- 使い方は、一般の関数と同じように、 =MULTIMEDIAN(B1:G2) とすれば出てきます。

回答No.3

中央値メジアンはデータ個数の中央の値です。 データ数が偶数の場合は、中央に当たる2個のデータの平均値を取ります。 ということから、次のようなやり方で出せると思います。 まず、データが   A  B  C  D  E  F  G 1 時間 5  6  7  8  9  10 2 人数 2  9  2  3  0  1 となっているとします。 順番を決めるための補助として3行目を使います。 B3セルに =SUM(B2:G2) と入力します。 B4セルには =B3-B2 として、これをG3セルまでコピーします。 あとは中央値を求めたいセルに、 =(INDEX(B1:G1,MATCH(INT(B3/2),B3:G3,-1))+INDEX(B1:G1,MATCH(INT(B3/2)+1,B3:G3,-1)))/2 と入力すれば、計算できると思いますが。 INT(B3/2)で個数の半分を求め、それがB3:G3のうちのどの列に当たるかをMatch関数で得ています。 さらに次のINDEX関数では、INT(B3/2)+1で次の順番の数字の列を求めています。 この2つを足して、2で割れば、メジアンになります。

  • koganeton
  • ベストアンサー率29% (30/101)
回答No.2

エクセルだったら =median(5,5,6,6,6,6,6,6,6,6,6,6,7,7,8,8,8,10) ですね

kutakutakuta
質問者

補足

ありがとうございます。これを手動で並べ替えるのではく、自動ですることは可能でしょうか??重ねてお願いします。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 睡眠時間がB1:G1、人数がB2:G2にあるとします。 全員の睡眠時間の合計が、 =SUMPRODUCT(B1:G1,B2:G2) で、人数の合計が、 =SUM(B2:G2) で計算されますから、1人あたりの睡眠時間の平均は、 =SUMPRODUCT(B1:G1,B2:G2)/SUM(B2:G2) になります。 (質問欄の例だと、「6.588・・・」) このようなことでしょうか?

関連するQ&A