- ベストアンサー
中央値(メジアン)
多分、中央値(メジアン)でいいと思うのですが、 睡眠時間 睡眠時間(時間)/ 5/6/7/8/9/10 人数(人) / 2/9/2/3/0/1 の中央値を出す場合、どのような関数を使えばよろしいでしょうか。よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#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)
あっそうですね。#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)
重ねての掲示ご迷惑かもしれませんが、#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)
#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) とすれば出てきます。
- DoragonFang
- ベストアンサー率41% (91/221)
中央値メジアンはデータ個数の中央の値です。 データ数が偶数の場合は、中央に当たる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)
エクセルだったら =median(5,5,6,6,6,6,6,6,6,6,6,6,7,7,8,8,8,10) ですね
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 睡眠時間がB1:G1、人数がB2:G2にあるとします。 全員の睡眠時間の合計が、 =SUMPRODUCT(B1:G1,B2:G2) で、人数の合計が、 =SUM(B2:G2) で計算されますから、1人あたりの睡眠時間の平均は、 =SUMPRODUCT(B1:G1,B2:G2)/SUM(B2:G2) になります。 (質問欄の例だと、「6.588・・・」) このようなことでしょうか?
補足
ありがとうございます。これを手動で並べ替えるのではく、自動ですることは可能でしょうか??重ねてお願いします。