- ベストアンサー
配列の平均をそのままに分散だけ小さくするアルゴリズム
- 配列の平均を保ちながら分散を小さくするアルゴリズムについて教えてください。
- 具体的な例として、配列の分散が50となるような算出方法を知りたいです。
- 分散0は完全な共産主義、分散100は税金なしを表すイメージです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なるほど。 差分をルート2倍する方法は平均のみを基準にした場合ですが、あなたの欲しがっている変換はゼロを基準にしているようですね。共産主義云々のくだりからすると、100も基準にするのでしょうか。 対数を取る時点で学問的な根拠はないですから、最後に数倍することをためらう理由もないかと思います。あくまで変換なので、それでまずまず直観に合っていると思われるならそれに従うのが良いでしょう。 真面目に統計学に従わせようと思ったら、そのたびに方程式を解かなきゃいけないような気がします。「分散を半分にする」という変換自体が比較的怪しい操作ですから、あんまり生真面目にならないほうが良いですよ。 もし 0 と 100 を基準にしてきちんとした比率を保ちたいのであれば、平均と0,または平均と100との間にゴムでデータが張ってあるようなモデルを考えるとよさそうです。 引っ張る力を強くすると平均に近づいて、弱くすると0や100に近づきます。この例だと最大と最小からの変化の割合が一定に保たれるだけで平均はずれそうですが、感覚的にはこれに近そうに聞こえました。
その他の回答 (3)
- beefisdead
- ベストアンサー率63% (92/145)
差をルート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 がいくらになったとき?」とか > 「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」 これに答えていただくのが良いかと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
「できれば」を無視すれば #1 の通りなので簡単. 「できれば」を組込もうとすると「500 が 1000 になるのと 6000 が 5500 になるのとでは『どのくらい』価値が違うの? 500 が 1000 になるのと『同じ』価値なのは, 6000 がいくらになったとき?」とか「そもそも最初の例でどうなっていれば『できれば』も入ったことになるの?」とか, いろいろな疑問に答えてもらわないといかんかな.
お礼
回答ありがとうございます。 自分の質問に明らかに説明というか情報が足りていないのは分かっているんですが、 ただ漠然と、直感的に変にならない感じの結果がでてくるアルゴリズムがあれば 教えていただきたいんですが、 やっぱり無茶でしょうか。 イメージとしては、 その分散の0~100までの数値で共産主義度合いがあらわせるような感じなのですが。 自分としてはおそらく対数を使用すればいいんじゃないかくらいにしか 考えが及びません。
- beefisdead
- ベストアンサー率63% (92/145)
アルゴリズムというか、ふつうに計算するだけですね。 統計学での「分散」の定義はご存知ですか? 一個一個の平均からの差をルート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の部分が平均より増えていて気持ち悪いので いいアルゴリズムとは思えないんですが、 なにかこう、直感的にいい感じできれいな方法など 他にあれば教えてほしいです。 わかりずづらく、あいまいで申し訳ございません。
お礼
ご回答ありがとうございます。 >差をルート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 ただし、やはりこのやり方では 最後の「つじつまを合わせるために数倍する」根拠が全くないので 変な感じがするのですが。