【お題】動物のキャッチフレーズ

配列の平均をそのままに分散だけ小さくするアルゴリズム

たとえば
500,500,1000,2000,6000
という配列があったとします。

仮にこの配列の分散を100と仮定します。

この配列を平均化したもの
2000,2000,2000,2000,2000
の分散を0と仮定します。

そこで質問です。
この配列のここでいう分散50の配列の算出方法はありませんでしょうか?

イメージとしては税金の再分配で例えると
分散0は完全な共産主義、分散100は税金なし、
分散50はその中間をとった感じです。

できれば、500が1000になるのと6000が5500になるのでは
同じ500の増減でも価値が違う感じも残しつつだとうれしいです。

すごくわかりづらい説明で、
自分でも質問の内容に無理があるとは感じているのですが、
もし、そのようなアルゴリズムがあれば教えていただきたいです。

以上、よろしくお願いします。

A 回答 (4件)

なるほど。


差分をルート2倍する方法は平均のみを基準にした場合ですが、あなたの欲しがっている変換はゼロを基準にしているようですね。共産主義云々のくだりからすると、100も基準にするのでしょうか。

対数を取る時点で学問的な根拠はないですから、最後に数倍することをためらう理由もないかと思います。あくまで変換なので、それでまずまず直観に合っていると思われるならそれに従うのが良いでしょう。
真面目に統計学に従わせようと思ったら、そのたびに方程式を解かなきゃいけないような気がします。「分散を半分にする」という変換自体が比較的怪しい操作ですから、あんまり生真面目にならないほうが良いですよ。

もし 0 と 100 を基準にしてきちんとした比率を保ちたいのであれば、平均と0,または平均と100との間にゴムでデータが張ってあるようなモデルを考えるとよさそうです。
引っ張る力を強くすると平均に近づいて、弱くすると0や100に近づきます。この例だと最大と最小からの変化の割合が一定に保たれるだけで平均はずれそうですが、感覚的にはこれに近そうに聞こえました。
    • good
    • 0

差をルート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 がいくらになったとき?」とか
> 「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」
これに答えていただくのが良いかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>差をルート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

ただし、やはりこのやり方では
最後の「つじつまを合わせるために数倍する」根拠が全くないので
変な感じがするのですが。

お礼日時:2010/10/05 00:53

「できれば」を無視すれば #1 の通りなので簡単.


「できれば」を組込もうとすると「500 が 1000 になるのと 6000 が 5500 になるのとでは『どのくらい』価値が違うの? 500 が 1000 になるのと『同じ』価値なのは, 6000 がいくらになったとき?」とか「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」とか, いろいろな疑問に答えてもらわないといかんかな.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

自分の質問に明らかに説明というか情報が足りていないのは分かっているんですが、
ただ漠然と、直感的に変にならない感じの結果がでてくるアルゴリズムがあれば
教えていただきたいんですが、
やっぱり無茶でしょうか。

イメージとしては、
その分散の0~100までの数値で共産主義度合いがあらわせるような感じなのですが。

自分としてはおそらく対数を使用すればいいんじゃないかくらいにしか
考えが及びません。

お礼日時:2010/10/04 01:50

アルゴリズムというか、ふつうに計算するだけですね。


統計学での「分散」の定義はご存知ですか?

一個一個の平均からの差をルート2で割れば、分散は半分になるんじゃないですかね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

おっしゃった方法でやってみました。

(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の部分が平均より増えていて気持ち悪いので
いいアルゴリズムとは思えないんですが、
なにかこう、直感的にいい感じできれいな方法など
他にあれば教えてほしいです。

わかりずづらく、あいまいで申し訳ございません。

お礼日時:2010/10/03 23:52

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