![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
配列の平均をそのままに分散だけ小さくするアルゴリズム
たとえば
500,500,1000,2000,6000
という配列があったとします。
仮にこの配列の分散を100と仮定します。
この配列を平均化したもの
2000,2000,2000,2000,2000
の分散を0と仮定します。
そこで質問です。
この配列のここでいう分散50の配列の算出方法はありませんでしょうか?
イメージとしては税金の再分配で例えると
分散0は完全な共産主義、分散100は税金なし、
分散50はその中間をとった感じです。
できれば、500が1000になるのと6000が5500になるのでは
同じ500の増減でも価値が違う感じも残しつつだとうれしいです。
すごくわかりづらい説明で、
自分でも質問の内容に無理があるとは感じているのですが、
もし、そのようなアルゴリズムがあれば教えていただきたいです。
以上、よろしくお願いします。
No.4ベストアンサー
- 回答日時:
なるほど。
差分をルート2倍する方法は平均のみを基準にした場合ですが、あなたの欲しがっている変換はゼロを基準にしているようですね。共産主義云々のくだりからすると、100も基準にするのでしょうか。
対数を取る時点で学問的な根拠はないですから、最後に数倍することをためらう理由もないかと思います。あくまで変換なので、それでまずまず直観に合っていると思われるならそれに従うのが良いでしょう。
真面目に統計学に従わせようと思ったら、そのたびに方程式を解かなきゃいけないような気がします。「分散を半分にする」という変換自体が比較的怪しい操作ですから、あんまり生真面目にならないほうが良いですよ。
もし 0 と 100 を基準にしてきちんとした比率を保ちたいのであれば、平均と0,または平均と100との間にゴムでデータが張ってあるようなモデルを考えるとよさそうです。
引っ張る力を強くすると平均に近づいて、弱くすると0や100に近づきます。この例だと最大と最小からの変化の割合が一定に保たれるだけで平均はずれそうですが、感覚的にはこれに近そうに聞こえました。
No.3
- 回答日時:
差をルート2で割る、というのは、価値の違いを含めた方法のつもりだったんですけどね。
6000と1000を、4800と1300くらいに変換するのは、統計学的な意味で分散を半分にするには妥当なところでしょう。
> できれば、500が1000になるのと6000が5500になるのでは
> 同じ500の増減でも価値が違う感じも残しつつだとうれしいです。
それとも、比率は同じにしておきたいということですか??
6000が0.8倍になったなら、1000も0.8倍になる、とか、
6000と平均との差が0.8倍になったなら、他の差も0.8倍になる、とか?
(上のほうの例は平均がずれるので明らかに無理ですけどね)
何はともあれ、
> 「500 が 1000 になるのと 6000 が 5500 になるのとでは『どのくらい』価値が違うの?
> 500 が 1000 になるのと『同じ』価値なのは, 6000 がいくらになったとき?」とか
> 「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」
これに答えていただくのが良いかと思います。
ご回答ありがとうございます。
>差をルート2で割る、というのは、価値の違いを含めた方法のつもりだったんですけどね。
>6000と1000を、4800と1300くらいに変換するのは、統計学的な意味で分散を半分にするには妥当なところでしょう。
上記に関してなんですが、たとえば下記の配列の場合
1
2000
2000
2000
3999
平均との差をルート2で割ると
586.4935444
2000
2000
2000
3413.506456
のようになるんですが、1つ目は1→586で500倍になってるにも関わらず、
5つ目は3999→3413で少し減っただけなので、
漠然とですが、少し不公平な気がします。
> 「500 が 1000 になるのと 6000 が 5500 になるのとでは『どのくらい』価値が違うの?
> 500 が 1000 になるのと『同じ』価値なのは, 6000 がいくらになったとき?」とか
> 「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」
上記をよく考えてみたのですが、
自分の考えている妥当な値は対数に直した後に
平均との差分をルート2で割り、
合計が減っているのでつじつまを合わせるために数倍した
下記の配列になる気がします。
826.9079814
826.9079814
1349.94954
2203.828963
4792.405534
ただし、やはりこのやり方では
最後の「つじつまを合わせるために数倍する」根拠が全くないので
変な感じがするのですが。
No.2
- 回答日時:
「できれば」を無視すれば #1 の通りなので簡単.
「できれば」を組込もうとすると「500 が 1000 になるのと 6000 が 5500 になるのとでは『どのくらい』価値が違うの? 500 が 1000 になるのと『同じ』価値なのは, 6000 がいくらになったとき?」とか「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」とか, いろいろな疑問に答えてもらわないといかんかな.
回答ありがとうございます。
自分の質問に明らかに説明というか情報が足りていないのは分かっているんですが、
ただ漠然と、直感的に変にならない感じの結果がでてくるアルゴリズムがあれば
教えていただきたいんですが、
やっぱり無茶でしょうか。
イメージとしては、
その分散の0~100までの数値で共産主義度合いがあらわせるような感じなのですが。
自分としてはおそらく対数を使用すればいいんじゃないかくらいにしか
考えが及びません。
No.1
- 回答日時:
アルゴリズムというか、ふつうに計算するだけですね。
統計学での「分散」の定義はご存知ですか?
一個一個の平均からの差をルート2で割れば、分散は半分になるんじゃないですかね。
回答ありがとうございます。
おっしゃった方法でやってみました。
(500)939.3398282
(500)939.3398282
(1000)1292.893219
(2000)2000
(6000)4828.427125
ですが、これだと下の部分が反映できていないかと感じましたので
>できれば、500が1000になるのと6000が5500になるのでは
>同じ500の増減でも価値が違う感じも残しつつだとうれしいです。
各値の対数をとって、その平均との差をルート2で割ってみたのですが、
653.2640586
653.2640586
1066.471161
1741.042879
3786.039511
となり合計が
7900.081669
なりました。
これでは都合が悪いので平均を合わせるために
全部に10000/7900.081669
をかけてみたら下みたいな感じになりました。
(500)826.9079814
(500)826.9079814
(1000)1349.94954
(2000)2203.828963
(6000)4792.405534
対数でやってみると平均が少なくなりつじつまを合わせるために無理やり
全体を増やしたのと、2000の部分が平均より増えていて気持ち悪いので
いいアルゴリズムとは思えないんですが、
なにかこう、直感的にいい感じできれいな方法など
他にあれば教えてほしいです。
わかりずづらく、あいまいで申し訳ございません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
subの配列引数をoptionalで使う...
-
アルゴリズム、配列のフローチ...
-
特定のセル範囲で4文字以上入力...
-
VB6 配列を初期化したい
-
ListViewで、非表示列って作れ...
-
Excel2003VBA Variantについて
-
VBA 1次元配列を2次元に追加する
-
ArrayListの初期値に二次元配列...
-
《エクセル2000》A列・B列の商...
-
エクセル又はOpenOfficeで条件...
-
Dim は何の略ですか?
-
ビンゴ
-
配列に同じ値を入れる方法
-
verilogで配列の任意の8bitを取...
-
バックプロパゲーションの中間...
-
Excel・Word リサーチ機能を無...
-
Pythonでの文字列からfloatへの...
-
特定のPCだけ動作しないVBAマク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
ListViewで、非表示列って作れ...
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
subの配列引数をoptionalで使う...
-
VB6 配列を初期化したい
-
配列を任意の数値で埋める方法
-
2次元動的配列の第一引数のみを...
-
Dim は何の略ですか?
-
VBのFunctionで、配列を引数...
-
Excel-VBAの配列「Public Const...
-
Excel VBA配列をFunctionに渡す
-
エクセルで最小値から0を除く方法
-
Array配列の末尾に追加したい。
-
《エクセル2000》A列・B列の商...
-
配列内の内容を全て表示する方法
-
VBAで多次元配列のインデックス...
おすすめ情報