ある大量の実数値データから「xが平均よりh以上離れているもの」という条件で抽出してyとの相関を見ようと考えています。しかし、データ元が複数あり、それぞれによってデータの散らばり具合がことなるので、採用されるデータが全体の10%になるように、データ元によってhの値を変えようと思っています。標準偏差を求めて、たとえば「h = 2.5標準偏差」という決め方でうまく行くかと思ったのですが、データ元によって尖度が結構異なるためうまく行きません。尖度と標準偏差、得たいデータが元データにしめるパーセンテージなどのパラメータから適切な閾値hを求める関数などはあるでしょうか?もしくはこの目的に用いることの出来るような別の方法があるでしょうか?あきらめて平均からの変化量でソートして上から10%を選ぶなどの方法を取るしかないのでしょうか…。

回答の条件
  • 1人5回まで
  • 登録:2006/05/11 19:02:35
  • 終了:2006/05/18 19:07:21

回答(4件)

id:hamtarozamurai No.1

hamtarozamurai回答回数107ベストアンサー獲得回数42006/05/11 19:13:30

ポイント23pt

「平均からの変化量でソートして上から10%を選ぶ」と同じかもしれませんが,とりあえず各群ごとにxをノーマライズして,全部並べて1/10点を求めるのではだめでしょうか?

ノーマライズしてやれば,10%を選ばなくても,ノーマライズしたx'全部とyをいっぺんにプロットできる,というメリットもあります。10%のところに線でも引いてやれば,10

%以下との傾向の違いがはっきりしそうですが。

id:westfish

ノーマライズというのがよくわかりませんが、最大のxが1、最小のxが-1になるように線形変換することでしょうか?すみません、それでどううまく行くのかがよくわかりません。「全部並べて」のところでソートしてしまうのでしょうか?

データ元が4000個程度あるので、機械的に10%を選びその選ばれたデータの統計量(とりあえずはyとの相関)を計算した結果の分布を眺めてみたいと思っています。ソートをするアプローチでは計算時間がかなりかかりそうですから、可能なら避けたいです…。

ただ、ソートした上で全部をプロットしてしまう(たとえばパレート図のように?)というアプローチは面白いかも知れません。考えてみます。

2006/05/11 22:53:47
id:amru05 No.2

amru05回答回数2ベストアンサー獲得回数02006/05/12 01:40:14

ポイント23pt

「ソートして10%選ぶ」方法しかないでしょう。4000個程度のソートなど瞬間です。問題は、どの様なTOOLを使用できるかです。perlやrubyなどのスクリプト言語ならsort機能が有るのでおそらく10~20行程度のプログラムで上記の機能は作成できるので色々サーチするより時間的に早いと思います。C++でもstlのsortが利用できますので。。。

westfishさんはどの様な環境、TOOLが使用可能なのですか?

rubyなら、以下の様なプログラムになります。。

# 実際のデータはファイルから読み込む事

datax=[7,8,9,0,3,1,2,3,4,5,6,2,4,6,8,9,3,5,6,6,7,8,9,3,1,2,3,4,5,6,2,4]

datay=[1,2,9,1,1,9,8,7,6,5,4,3,2,4,5,6,7,3,4,5,6,7,8,6,5,4,3,2,4,5,6,9]

#平均値を求める

totalx=0

datax.each{|val| totalx += val}

midx = totalx / datax.size

#ハッシュテーブル作成

has=Hash.new

#平均との差分でハッシュテーブルを作成する

for i in 0..datax.size-1

v = (datax[i] - midx).abs

has["#{v},#{i}"] = "#{datax[i]},#{datay[i]}"

end

# 10%のカウントを求める

lmt = datax.size * 0.1

cnt=0

# 上位の10%をプリントする

has.sort.reverse_each{|key,val|

cnt = cnt + 1

if (cnt<lmt)</p>

print val,"\n"

end

}

id:westfish

主に書くのはJavaとPythonですが、読むだけならなんとかなります。今回のプログラムではRPyというR言語とPythonのバインディングライブラリを使って、平均や標準偏差などの統計量をRに計算させています。

ソートして選ぶ方法しかないですか…残念です。データ量が4000個なのではなく、データ群の個数が4000個なので実際のデータはもっと膨大になりえます。最悪の場合ソートする方法でも構わないのですが、やはり時間がかかりますから…。

ご呈示いただいたソースコードを読ませていただきました。ハッシュのキーに文字列を使用されていますが、いちいち浮動小数点数から文字列への変換と逆変換をしなくてもRubyのArrayはハッシュ化可能なはずなので、要素が二つのArrayをキーにした方が早いのではないかと思います。また、ハッシュに入れてソートされていますが、おそらくArray間の大小関係はArrayの第1要素から順番に比較して決定されるだろうと思うので、単純に[v, datax[i], datay[i]]のArrayを作成してソートし、10%のところでスライスする方が早いのではないかと思います。

しかし実際問題として私はRubyを使っていないのでちょっとこのコードの使いどころがありません…せっかく書いていただいたのにすみません。

2006/05/12 13:17:40
id:hamtarozamurai No.3

hamtarozamurai回答回数107ベストアンサー獲得回数42006/05/12 09:28:04

ポイント22pt

ノーマライズは,(x-xmean)/sd の意味で用いました。

平均値が0,標準偏差1になります。

最初から10%しか見なければ,データの全貌を見失うと思いましたので。

ただ,上のやり方では,全体の10%という抽出になりますが,各群から10%ずつという抽出にはなりません。

各群の10%点になるhの求め方は,確率分布を仮定すれば,面積が片側10%になる点を求める関数があります。

例えばエクセルでは

chiinv(p, df):

自由度が df であるカイ二乗分布の上側確率が p になるパーセント点を計算する。

norminv(q, mean, sd)

平均値mean,標準偏差 sd の正規分布で,上側確率 1-qとなるパーセント点を計算する。norminv(p,mean,sd)はnormsinv(p) と同じ。

AT&T:精度管理の考え方 より引用

http://www.aandt.co.jp/jpn/qc/excel.htm

統計ソフトなら,データそのものから十分位点を求める関数もあったことと思います。確かSASやRで見たことがある気がします。

4000ものデータ元を処理するには,表計算ではきついかもしれません。やはり何か簡単なプログラミングを使われた方がいいのですが。

id:westfish

>確率分布を仮定すれば,面積が片側10%になる点を求める関数があります。

そう、これが知りたかったのです!

確率分布を観察したところ、尖度にかなりのばらつきがあるため正規性を仮定することは出来ないのですが、尖度より高い次元のモーメントを無視してもよいと仮定した場合に、片側5%の点を求める関数が知りたいのです。

なおデータ源の性質から、歪度は0と見なして構いません。

Rは使えるのでRの関数でも構いません。

一人あたりの回答数制限を引き上げておきましたのでご存じでしたらぜひご教授ください。

2006/05/12 13:23:28
id:hamtarozamurai No.4

hamtarozamurai回答回数107ベストアンサー獲得回数42006/05/13 03:35:14

ポイント22pt

答えようと思ったら回答数制限がまだ増えてなくて,いわしから1pとってあっちに書き込んでしまいました。以下に一応コピペします。

---

Rの関数一覧ってなかなか見つからないですね。自分も勉強になるので,いろいろ調べた結果,Rのhelpでqnormとかqchisqを引く,というのが結論です。

で,Rの場合,なぜか上側確率じゃなくて,下側確率みたいで,10%点を調べるには,0.9をパラメータで与えなくちゃいけないようです。qchisqの50は自由度

> qnorm(0.9)

[1] 1.281552

> qchisq(0.9,50)

[1] 63.16712

---

で,質問を読み返すと,なになに,尖度まで入れた4次の確率密度関数? すみませーん,私正規分布以上に高次の確率密度関数のことはわからないです。家なので,Rも入れてないし,統計の教科書もない。

でも,疑問なんですが,尖度にばらつきがあるというのは,データ元間の話であって,データ元内では正規分布を仮定して差し支えないのではないでしょうか?

それでももっと合わせたい,という向きのために,

「統計学関連なんでもあり」の過去ログ---009 観測データのスムージング(モーメントの一致)

という過去スレがありました。

http://aoki2.si.gunma-u.ac.jp/lecture/mb-arc/arc009/142.html

ここで北陸農試の竹澤さんが,ご紹介されてる本に,方法が書かれているのではないでしょうか。でも,割合ヒストグラムのスムージングとかやるぐらいだったら,単純に上から10%のデータを取り出した方が早いですね。

id:westfish

丁寧にありがとうございます。一つの群から得られたデータの分布を観察してみたところ、正規分布とはかけ離れた尖度の高い分布でした。そこで正規分布のqnormに相当するようなものが、4次のモーメントまでパラメータとする分布に対して存在しないかな?というのがこの質問の意図でした。

ご紹介のリンク先はほぼ同じ目的での質問ですね。結局、ソートで10%のデータを取り出すしかないかもしれませんね。

2006/05/13 10:12:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません