- ベストアンサー
エクセル等で、散布図にある2つの系の境界線は描けますか?
現在、エクセルのグラフ<散布図>上に、2つの性質の異なる系(A群、B群)のデータがプロットされ、表示されています。 これらの系の境界を求めたいのですが、やり方がどうにもわかりません。 ここで私が境界と言っているのは、グラフを何らかの数式で2分割して「これより上はAに属して、これより下はBに属す」というような境界です。 言葉だとなかなか説明しずらいのですが・・・作図の仕方、あるいは、境界線を求める分析の方法をご存知の方がいらっしゃったら、教えていただけないでしょうか。 グラフからは境界線は指数関数だと予測できます。もちろん実験のデータなので近似的なものになると思いますが・・・。 ちなみにA、B群の中でX、Yが同値なデータはありません。ばらばらです。 ●二つの系でそれぞれ近似曲線は描けますが、境界がだせません。。 ●判別分析を試みましたが、指数関数での判別関数の出し方がわかりませんでした。。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ANo.3のコメントについてです。 > 判別関数というのは、元のグラフの座標軸と関係なく、y<0、0<yで二つの群を分けるための式なんですよね・・・ ここで仰る "y" というのは、(もとのグラフの座標軸に使っているx,yのうちのyのことではなくて)x,yを使って計算される別の値でしょ?だから区別して"z"と書く事にしましょう。すると、"z"の計算方法は z = xとyの式 という格好をしている筈です。で、z<0、0<zで二つの群を分けるのですから、境目は z = 0 つまり xとyの式 = 0 というのが、判別関数の式なんです。これをプロットすれば良い。
その他の回答 (3)
- stomachman
- ベストアンサー率57% (1014/1775)
指数関数に見えると仰るのが確かであれば、 データ(x[i],y[i]) (i=1,2,…)から、z[i] = log(y[i])を計算して、(x[i], z[i]) (i=1,2,…)の二次元散布図を描くと直線で分けられる形になるでしょう。もし、やってみたけどどうもこれでは直線で分けられるようにならない、ということであれば、 z[i] = log(y[i]+c) (cは適当な定数) なんてのを試してみる手もあります。(cをいろいろ変えてやってみる。) 首尾よく、直線で分けられそうな格好になったとしましょう。で、その線形判別関数を決めるには、ご質問にある通り判別分析(つまりパーセプトロンの構成)をやっても良いでしょう。けれど、なにしろ二次元なんですから、このグラフをプリントして紙の上でえいやっ!と直線を引く(あるいはExcelのグラフ上にグラフィックツールで直線をひく)のが一番簡単です。そしてグラフの目盛りを読み取って直線の方程式を作り、念のためにこの直線のグラフも、excel上で先のグラフと一緒にプロットしてみればいいでしょう。得られた直線の方程式 z = A x + B は y = exp(A x + B) - c でxとyの式に直せます。 No.2さんの仰るSupport Vector Machine は、「散布図が毎日沢山発生して来て全部手で処理するのは大変で、しかもいつも指数関数っぽくなるとは限らない」というような事情であれば、検討に値すると思います。結構古い技法だけれど、直線で分けられないものも扱える、非常に高次元のデータまで扱える、「文字列の類似性」のような数値的でないものまで扱える、結構速く収束する。こりゃartificial neural networkよりいいんじゃないか、というので何年か前にリバイバルした、といったところです。フリーソフトや公開されているソースプログラムを手に入れるのは容易ですが、ガッツリ勉強しないと使いこなせないかも。
補足
大変参考になるご意見をありがとうございます! 現在、何度か試して、(x,z)座標で両群が見た目直線で分けられるところまで来ました。 ただ、自分でグラフに直線を引くとなると少しずらせば何通りも引けそうで、しかも信頼性がなくなってしまうのではと思い、判別分析で出そうとしております。 ただ、私の知識不足か、判別関数をグラフの上に描ける形に落とせません、、、 判別係数、標準化判別係数、定数項は出るのですが・・・。 判別関数というのは、元のグラフの座標軸と関係なく、y<0、0<yで二つの群を分けるための式なんですよね・・・ 座標軸に乗せる式に出来たら、後は教えてくださった方法で、(x,y)に戻そうと思うのですが。
- rabbit_cat
- ベストアンサー率40% (829/2062)
どこまで本気でやるかにもよりますが、 こういう識別学習の問題は、最近は、Support Vector Machine(SVM)ていうのが、大流行しています。 http://www.google.com/search?q=Support+Vector+Machine もし、分割線が指数関数と予測できてるなら、(X,logY)にすれば分割線は直線になるので、SVNのアルゴリズムがそのまま使えるでしょう。
お礼
ありがとうございました。 教えてただいて、いろいろ調べてみたのですが、今回は使えませんでした。 ですがこんなものがあるとは知らなかったので、勉強になりました! どうもありがとうございました。
- inara
- ベストアンサー率72% (293/404)
A群とB群はどちらも指数関数的な分布ですか(縦軸を対数表示にすると直線的なグラフになりますか)? そうであれば以下の方法を試してください。 A群とB群をそれぞれ指数関数で近似して係数(a1,b1,a2,b2)を求める(やり方はわかりますね?) A群:y=a1*e^(b1*x) B群:y=a2*e^(b2*x) 指数関数的にA群とB群のちょうど中間に来る関数は以下の式で表わされます。 y=√(a1*a2)*e^((b1+b2)*x/2) y=sqrt(a1*a2)*exp((b1+b2)*x/2) --- excelの式形式 この関数の数値列(xとyの組)をシート上に作ってプロットすれば、A群とB群のちょうど中間に来る指数関数が描けます。 こういうことでしょうか?
補足
どうもありがとうございます! ただ、残念なことに、各系はそこまで指数状に並んでいるわけではないんです・・・。 バラバラにそれぞれのエリアに散布されていて、その境界が指数と予測されるに過ぎません。 データがそれぞれのエリアに分散している場合、境界を出す方法は無いでしょうか・・。 ただ、この先どうしてもできなかった場合、inara様のおっしゃるようにやって、各近似線の中間の線を擬似的な境界としたいと思います。丁寧に式まで載せてくださってありがとうございます。助かります!
お礼
できました! 無事に結果を導くことが出来ました! ご丁寧に教えてくださって本当にありがとうございます。 助かりました。
補足
早速のお返事、ご親切にありがとうございます! 助かります(>_<。) そうです、zについての式を、y=aX+bのような形に直したかったのです。 やってみます! いよいよ出来そうな気がしてきました!