重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

多分、中央値(メジアン)でいいと思うのですが、

睡眠時間

睡眠時間(時間)/ 5/6/7/8/9/10
人数(人)    / 2/9/2/3/0/1

の中央値を出す場合、どのような関数を使えばよろしいでしょうか。よろしくお願いします。

A 回答 (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
    • good
    • 0

あっそうですね。

#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

これで大丈夫かな?
    • good
    • 0

重ねての掲示ご迷惑かもしれませんが、#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
    • good
    • 0

#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)
とすれば出てきます。
    • good
    • 0

中央値メジアンはデータ個数の中央の値です。


データ数が偶数の場合は、中央に当たる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で割れば、メジアンになります。
    • good
    • 0

エクセルだったら


=median(5,5,6,6,6,6,6,6,6,6,6,6,7,7,8,8,8,10)
ですね

この回答への補足

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

補足日時:2005/05/09 17:24
    • good
    • 0

こんにちは。

maruru01です。

睡眠時間がB1:G1、人数がB2:G2にあるとします。
全員の睡眠時間の合計が、

=SUMPRODUCT(B1:G1,B2:G2)

で、人数の合計が、

=SUM(B2:G2)

で計算されますから、1人あたりの睡眠時間の平均は、

=SUMPRODUCT(B1:G1,B2:G2)/SUM(B2:G2)

になります。
(質問欄の例だと、「6.588・・・」)

このようなことでしょうか?
    • good
    • 0

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

今、見られている記事はコレ!