エクセルを使って位置の平均を効率良く出す方法はある?

このQ&Aのポイント
  • エクセルを使って無限人中16人の位置の平均を求めたいです。具体的には、特定の条件を満たす数値の平均を計算したいです。
  • 0から1に無限に人が均等に分布しているものと想定し、特定の条件を満たす人々の中での平均をエクセルを使って効率良く求めたいです。
  • 人々の位置に対する平均値を効率的に計算する方法として、エクセルを使って条件付き平均を求めることができます。具体的には、特定の条件を満たす人々の中での平均値を計算する関数を使うことで、目的の計算結果を得ることができます。
回答を見る
  • ベストアンサー

エクセルを使って位置の平均を効率良く出したいです。

0から1に無限に人が均等に分布しているものとし、無限人中1位が限りなく1に近付き、無限人中ビリが限りなく0に近付くものとします。無限人の平均は1/2、ランダムに選ばれた2人で大きい方の平均は2/3、小さい方は1/3です。2度大きい方を選び、その選ばれた2人のうち大きい方は4/5、小さい方は8/15です。このような平均をエクセルを使って出したいのですが何か方法はないでしょうか?計算式が必要になるかと思います。無限人中16人を選び出しA1からP1に平均が出るようにしたいです。A1の入れ方と大小の条件の入れ方お願いします。大小の条件とはA1>B1、B1>C1、D1>C1などです。ちなみにこの場合A1から11/15、7/15、1/5、3/5になるかと思います。計算式はA1からP1を使った方程式になるかもしれません。

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

  • ベストアンサー
  • ramayana
  • ベストアンサー率75% (215/285)
回答No.5

ANo.1です。 ご質問「反復計算をONにしてエクセルで解いてもらう事は出来ないでしょうか?」 ワークシート関数だけの反復計算で解く方法は、思いつきません。簡単なVBAと組み合わせて近似計算する方法ならあります。(1)のようにワークシートに関数を入れておき、(2)のようなVBAを作成して、VBAの「近似」マクロを実行すると、A1からP1に近似結果が格納されます(A>B、B>C、D>Cの条件での期待値)。 (1) A1からP1に、「=A3/$A$12」、…、「=P3/$A$12」と入力 A4からP4に、「=RAND()」、…、「=RAND()」と入力 A6に「=(A4>B4)」、A7に「=(B4>C4)」、A8に「=(D4>C4)」と入力 A10に「=AND(A6, A7, A8)」と入力 A12に数字1000を入力(もっと大きな数字を入力すると、計算時間が長くなるが、精度は高くなる) (2) Sub 近似()   Const N As Integer = 16   Dim TMax As Integer    Dim T As Integer   Dim i As Integer   TMax = Cells(12, 1) 'A12    Range(Cells(3, 1), Cells(3, N)).ClearContents   Do While T < TMax     Application.ActiveSheet.Calculate     Application.Calculation = xlCalculationManual     If Cells(10, 1) Then  'A10         For i = 1 To N           Cells(3, i) = Cells(3, i) + Cells(4, i)        Next i         Cells(12, 2) = T 'B12      End If    Loop End Sub

その他の回答 (4)

  • ramayana
  • ベストアンサー率75% (215/285)
回答No.4

(ANo.3の続きです) Private Function Prv_NextNumber(Sample As Variant, N As Long, Place As Long, Value) As Long Dim i As Long Dim j As Long For j = Value + 1 To N For i = Place To 1 Step -1 If Sample(i) = j Then Exit For Next i If i = 0 Then Exit For Next j If j <= N Then Prv_NextNumber = j End Function

gashigeru
質問者

お礼

ありがとうございます。VBAがわかる人を探していました。ぜひ「VBAで順位の期待値を出したい。」で検索して答えて下さい。カルタ大会で使用しようと思っています。

  • ramayana
  • ベストアンサー率75% (215/285)
回答No.3

(ANo.2の続きです) '順列を列挙する 'Populationは、母集団(1次元配列)又は母集団サイズ(Long型) 'kは、サンプルサイズ Function Permutations(Population As Variant, ByVal k As Long) As Variant Dim Res As Variant Dim Sample As Variant Dim N As Long '母集団サイズ Dim G As Long 'サンプルの個数 Dim i As Long Dim j As Long Dim Shift As Long If IsArray(Population) Then N = UBound(Population) - LBound(Population) + 1 Else N = Population End If G = N - k + 1 For i = N - k + 2 To N G = G * i Next i ReDim Res(1 To G) ReDim Sample(1 To k) For i = 1 To k Sample(i) = i Next i Res(1) = Sample j = 1 Do Sample = Prv_NextSample(Sample, N) If VarType(Sample) = vbEmpty Then Exit Do Else j = j + 1 Res(j) = Sample End If Loop If IsArray(Population) Then Shift = LBound(Population) - 1 For j = 1 To UBound(Res) For i = 1 To k Res(j)(i) = Population(Res(j)(i) + Shift) Next i Next j End If Permutations = Res End Function Private Function Prv_NextSample(Sample As Variant, N As Long) As Variant Dim k As Long Dim i As Long Dim j As Long Dim l As Long Dim Res As Variant k = UBound(Sample) ReDim Res(1 To k) For i = k To 1 Step -1 l = Prv_NextNumber(Sample, N, i, Sample(i)) If l > 0 Then Exit For Next i If i > 0 Then For j = 1 To i - 1 Res(j) = Sample(j) Next j Res(i) = l For j = i + 1 To k Res(j) = Prv_NextNumber(Res, N, j, 0) Next j Prv_NextSample = Res End If End Function

gashigeru
質問者

お礼

すごいですね。僕にはさっぱりわかりません。A1からP1にA1からP1を使った方程式を入力し、反復計算をONにしてエクセルで解いてもらう事は出来ないでしょうか?まず方程式がわかりませんが。

  • ramayana
  • ベストアンサー率75% (215/285)
回答No.2

(ANo.1 の続きです。) Sub Main() Const N As Integer = 4 '条件に現れる人数 Dim CaseCount As Integer '条件に合致するケースの数 Dim Perms As Variant 'すべてのケース Dim Incidents(1 To N, 1 To N) As Integer '条件に合致するケース Dim AV(1 To N) As Double '期待値 Dim i As Integer Dim j As Integer Dim PermsTop As Range Dim IncidentsTop As Range Dim AVTop As Range '出力領域の設定 With ActiveSheet Set PermsTop = Cells(3, 2) Set IncidentsTop = PermsTop(1, N + 3) Set AVTop = IncidentsTop(N + 1, 1) PermsTop(-1, 0) = "すべてのケース" IncidentsTop(-1, 0) = "条件に合致するケース" For j = 1 To N PermsTop(0, j) = Chr(j + 64) IncidentsTop(0, j) = Chr(j + 64) IncidentsTop(j, 0) = "順位" & j AVTop(1, 0) = "期待値" Next j End With 'すべてのケースを列挙 Perms = Permutations(N, N) '条件に合致するケースを抜き出す For i = 1 To UBound(Perms) For j = 1 To N PermsTop(i, j) = Perms(i)(j) Next j 'If文の条件式は、問題に応じて変更する If _ Perms(i)(1) > Perms(i)(2) _ And Perms(i)(2) > Perms(i)(3) _ And Perms(i)(4) > Perms(i)(3) _ Then CaseCount = CaseCount + 1 For j = 1 To N Incidents(Perms(i)(j), j) = Incidents(Perms(i)(j), j) + 1 PermsTop.Parent.Range(PermsTop(i, 1), PermsTop(i, N)).Interior.ColorIndex = 3 Next j End If Next i '期待値の計算 For j = 1 To N For i = 1 To N IncidentsTop(i, j) = Incidents(i, j) AV(j) = AV(j) + i * Incidents(i, j) Next i AV(j) = AV(j) / (CaseCount * (N + 1)) AVTop(1, j) = AV(j) Next j End Sub

  • ramayana
  • ベストアンサー率75% (215/285)
回答No.1

「16人を選び出しA1からP1に平均が出るようにしたいです」の意味が、はっきりしません。 1 もし、1番目の人の平均、2番目の人の平均、…、16番目の人の平均を出したいなら、それぞれ、1/17、2/17、…、16/17にすれば良いだけです。 一般に、0から1の間で、一様に分布し、かつ独立な確率変数を値に持つn人を、小さいほうから順番に並べたとき、k番目の人の値の期待値(平均)E(n, k)は、 [1] E(n, k) = k/(n+1) で与えられます(証明は後述)。 2 もし、何らかの大小関係を満たすような条件の下で、それぞれの期待値を計算したいなら、基本的には[1]式を使うのですが、計算が複雑になります。例として、A>B、B>C、D>Dの場合に期待値を計算するVBAプログラムを示します。 Mainの中の、Nの値と、If文の条件式を変えることにより、いろいろな問題に対応できます。ただ、Nが小さいときに限られます。N=16だと、多分、動きません。 「2度大きい方を選び、その選ばれた2人のうち大きい方は4/5、小さい方は8/15」といった計算なら、プログラムの      Perms(i)(1) > Perms(i)(2) _    And Perms(i)(2) > Perms(i)(3) _   And Perms(i)(4) > Perms(i)(3) の部分を      Perms(i)(1) > Perms(i)(2) _    And Perms(i)(3) > Perms(i)(4) _   And Perms(i)(1) > Perms(i)(3) に変えます。 3 [1]式の証明 k番目の人の値がXであるということは、n人中k-1人がXより小さく、n-k人がXより大きいということです。また、 (1) k番目の人を選ぶ選び方はn通り。 (2) k番目の人が一人選ばれたという条件の下で、順位が上のk-1人を選ぶ選び方は、n-1からk-1を選ぶ組み合わせの数に等しく、(n-1)!/((k-1)!(n-k)!)通り。 (3) 残りのn-k人は、(1)と(2)が定まれば、自動的に定まり、1通りだけ。 (4) ある人の値がXだったとして、すでに選ばれたk-1人の値がXより小で、残りn-k人の値がXより大である確率は、X^(k-1)(1-X)^(n-k)。 以上のことと、ベイズの定理を使って、k番目の人の値Xの確率密度関数f(u)は、   f(u) = n(n-1)!/((k-1)!(n-k)!)×u^(k-1)(1-u)^(n-k) となります。Xの期待値E(n, k)は、   E(N, k) = ∫[0 to 1]uf(u)du なので、右辺の積分を計算して、[1] 式が得られます。

関連するQ&A

  • 条件を付けて組み合わせを絞って平均を出す関数は?

    ABCに123を当てはめるとAから123、132、213、231、312、321で平均Aから2、2、2です。 A<Bという条件を付けるとAから123、132、231で平均Aから(1、33)、(2、67)、2です。 さらにA<Cという条件を付けると123、132で平均Aから1、(2、5)、(2、5)です。 さらにB<Cという条件を付けると123だけとなり平均はAから1、2、3です。 このように大小の条件を付けて成り立つ組み合わせを絞り込み、平均だけを出したいのですがこんな事が可能なエクセル関数はないでしょうか?今回は説明のためにABCだけでしたが実際はAからPに1から16を当てはめたいです。

  • エクセルを使って順位の期待値を出したいです。

    ABCに123を当てはめるとAから123、132、213、231、312、321で平均Aから2、2、2です。 A<Bという条件を付けるとAから123、132、231で平均Aから(1、33)、(2、67)、2です。 さらにA<Cという条件を付けると123、132で平均Aから1、(2、5)、(2、5)です。 さらにB<Cという条件を付けると123だけとなり平均はAから1、2、3です。 このように大小の条件を付けて成り立つ組み合わせを絞り込み、平均だけを出したいのです。エクセルを使って条件を入れるだけで簡単に平均だけを出したいのですが何か方法はないでしょうか?今回は説明のためにABCだけでしたが実際はAからPに1から16を当てはめたいです。ある大会で順位の期待値を出すために使用しようと思っています。

  • エクセルで平均値の求め方は?

    エクセルで平均値の求め方がわかりません。 以下のような表の場合で、回答者の平均年齢を求めるにはどうしたらいいんでしょうか。 A   B 年齢  件数 16   5 17   10 18   11 19   10 20   14 21   8 22   9 23   18 24   13 25   18 26   19 これまでは、 (1)年齢×件数=nを計算し、C列に仮配置 (2)SUM(C1:C10)/SUM(B1:B10) で計算していました。 よくわかる解説ページを教えていただくだけでも結構ですので、よろしくお願いします。

  • 不良率の平均値の差の検定方法

    2種の製造方法で同じ製品を作った時の、『不良率の平均値P』に有意差があるかどうか検定しようとしています。 状況をもう少し具体的に例えますと、 製造日ごとの不良率(%)が以下のように推移したとして、 製造方法A:10,15,13,20,4,… 製造方法B:20,11,15,7,18,… AとBはどちらが良いのか?を調べています。 1.Pの分散の差のF検定 → 2.Pの平均値の差のt検定 をやればよいと思ったのですが、ここで疑問点が二つあります。 1.この方法で検定できるのは、正規分布するデータのみでしょうか? 2.不良率のような、定義域が限定された(0%~100%)データは正規分布するのでしょうか? 正規分布というと定義域が-無限大から+無限大までなければいけないような気がするのですが。 お詳しい方のご回答をお待ちしております。 宜しくお願いいたします。

  • 2つの乱数の範囲条件付き引き算平均値

    2つの乱数の範囲条件付き引き算平均値   α-β=D という式があります。ここでα,βは次のような範囲を持つ一様な乱数です。   A≧α≧0   B≧β≧B/2 D≦0の場合,Dは0に置換します。AとBは大小関係が示されていない正の整数です。 ここで,上のようにしてDを無限回算出し,平均を取るとどのような値になるか,AとBを用いて示したいです。 よろしくお願いします。

  • VBAで順位の期待値を出したい。

    VBAを使おうと思いましたがさっぱりわからず困っています。やりたい事はA1からP1の16セルに順位の期待値を出す事です。方法はこうです。まず1から16までをA1からP1までに重複しないようにあてはめ、全組み合わせの平均を出します。そうすると(8、5)、(8、5)、・・・となるはずです。次に大小の条件を付けます。例えばAがBに勝ったとしてA1<B1という条件を付けます。これだけで組み合わせが半減し、平均がA1から(5、67)、(11、33)、(8、5)、(8、5)、・・・となるはずです。さらにどんどん大小の条件を付け、組み合わせを絞り込みます。それで平均を出します。大小条件は簡単に入力出来た方がいいです。これらを可能にするにはどうしたら良いでしょうか?

  • Excelの平均値について。

    画像のようにA列の4:20にランダムの数字が表示されます。 そこで4の倍数の箇所だけの平均値をA2に表示したいのですが、どうすればよろしいでしょうか。 ただし、空白と0の場合は計算に入れないとします。

  • エクセル2007で%の平均値を求めたいのですが、うまくできません。

    エクセル2007で%の平均値を求めたいのですが、うまくできません。 先日下記の様な質問をさせて頂いたのですが、もう少し質問したいことがあったのに間違えて解決済にしてしまいました。 どなたか分かる方がいらっしゃいましたら教えてください。    A    B    C    D    E    F    G     H 1 目標  6.44%  4.50%  3.77%  5.15%  2.66%  2.79%  式を入れたいセル 2 実績  5.07%  6.00%  4.85%                 A2~G2の平均値 A1~G1は、=(F3/G6)みたいな数式が入っていて、%で表示されています。 B2~G2は、最初は空欄で毎月B、C、D、E、Fと一つずつ%が入っていきます。 上記で、H1のセルに、下記の様な結果を表示できる式を入れたいのですが、何かいい方法はないでしょうか? ・B2~G2が空白の時はB1~G1の平均値 ・B2にだけ数字が入っていてC2~G2が空白の時はB1の数字 ・B2~C2に数字が入っていてD2~G2が空白の時はB1~C1の平均値 ・B2~D2に数字が入っていてE2~G2が空白の時はB1~D1の平均値 ・B2~E2に数字が入っていてF2~G2が空白の時はB1~E1の平均値 ・B2~F2に数字が入っていてG2だけが空白の時はB1~F1の平均値 ・B2~G2全てに数字が入っている時はB1~G1の平均値 という質問に対して、 [H1]=AVERAGE(B1:INDEX(B1:G1,COUNT(B2:G2))) という式を教えて頂いたところ、うまくいきました。 半期分はこれでOKだったのですが、1年分だとHに半期の平均のセルが入るため、うまく表示できません。 ・B~Gが前期、Hが前期の平均 ・I~Nが後期、Oが後期の平均 さらに、Pに全期の平均を入れたい場合はどのようにしたらよいのでしょうか? [P1]=AVERAGE(B1:INDEX(B1:N1,COUNT(B2:G2,I2:N2))) にすると、Hのセルも入ってしまうため、後期に数字が入ると平均値の表示が1つずつずれてしまいます。 何回も申し訳ないのですが、どうぞよろしくお願いいたします。

  • エクセル 平均値を求めたい

    エクセルでセルに入っている値から平均値を求めたい。 この時、平均値を求めるにあたって条件があるのですが分かる方いらっしゃいますか? <条件> 0の値は無視して平均値を求める。 <セル値>     A 1   3 2   0 3   7 5   5 A1=3,A2=0,A3=7から平均値を求める時、値が入っている箇所のみ反映され 計算される方法が知りたいです。 上記値を合計すると10になり平均値は5になるようにA5に計算式を入れたいと思います。 「AVERAGE」「MEDIAN」を使用すると合計の数は10でいいのですが 割る数が0の行も含み3となってしまいます。 できれば0と入力されている所は無視して10÷2になるようにしたいのですが どう式を組んだらよろしいでしょうか? ちなみに範囲(A1~A3)を狭くすることなく算出できればと思っています。 よろしくお願いします。

  • 大小関係を平均値の定理を使って解く問題です

    「正の実数a,b,pに対して、A=(a+b)^p とB=2^(p-1)(a^p+b^p)の大小関係を調べよ。」 という問題で、解答は、 a<=bとしても一般性を失わない。a<bのとき、 B-A=2^(p-1)(a^p+b^p)-(a+b)^p=2^(p-1){a^p+b^p-2(a+b/2)} =2^p-1〔{b^p-(a+b/2)^p}-{(a+b/2)^p-a^p}〕 ここで平均値の定理により、a<c<a+b/2<d<bであるc,dが存在して、 B-A2^(p-1)*b-a/2*p(d^(p-1)-c^(p-1)―――――――*** より、 0<p<1のときB-A<0、p=1のときB-A=0、p>1のときB-A>0 したがって一般に a≠bのとき、0<p<1ならA>B、P=1ならA=B、p>1ならA<B またa=bのときA=Bは明らかである。 ―――――――***の部分がわかりません。 平均値の定理は3つの数の関係ではないのでしょうか。 5つの数でも関係が成り立つのでしょうか。 5つの数での解説は見当たらず困っています。 解説よろしくお願いします。