【映画】『グリーンブック』アカデミー賞作品賞!!傑作の理由 >>

エクセルで最小値を抽出する方法

みなさん教えてください。
今エクセルで下図のような正弦波のグラフ図中の赤矢印部(ピーク値)
で一番小さくなる最小値を抽出したいと思っています。

しかし、方法がわかりません。
MIN関数を使用すると、一番小さい0が出てきます。
データの境目(~以上)と指定してオートフィルタでデータを抽出しようとしても、
データのプロット数が多すぎて境目をみつけるだけでも苦労し、うまくいきませんでした。

何か簡単に抽出できる良い方法はないでしょうか。
みなさんお力をかしてください。よろしくお願いします。


<波形元データ> ※オシロスコープで測定したデータ(CSVファイル:データ数2000行弱)
時間 電圧
0 0.03626667
0.0002 0.037975
0.0004 0.035025
0.0006 0.03514167
0.0008 0.03781667
0.001 0.03830833
0.0012 0.03346667
0.0014 0.03460833
0.0016 0.03616667
0.0018 0.0342
0.002 0.03035
・ ・
・ ・
・ ・

「エクセルの最小値抽出方法について」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (11件中1~10件)

回答No9,10です。


AおよびB列にお示しのデータがるのですから、C1セルに示した式を入力して下方にオートフィルドラッグで、最小値の式は D1セルに =MIN(c:C) となりますね。大変失礼をいたしました。
    • good
    • 1

No9です。

より精度を高めるにはB1セルに次の式を入力して下方にオートフィルドラッグします。

=IF(ISERROR(OFFSET(B1,-4,0)),"",IF(AND(AND(OFFSET(B1,-1,0)<B1,B1>OFFSET(B1,1,0)),AND(OFFSET(B1,-2,0)<B1,B1>OFFSET(B1,2,0)),AND(OFFSET(B1,-3,0)<B1,B1>OFFSET(B1,3,0)),AND(OFFSET(B1,-4,0)<B1,B1>OFFSET(B1,4,0))),B1,""))

C1セルには =MIN(B:B)
    • good
    • 1

A1セルから下方にデータがあるとして、作業列としてB1セルには次の式を入力して下方にオートフィルドラッグします。



=IF(ISERROR(OFFSET(B1,-4,0)),"",IF(AND(OFFSET(B1,-4,0)<B1,B1>OFFSET(B1,4,0)),B1,""))

これでピークごとに1,2個のデータが表示されますので、C1セルに =MIN(B:B) を入力すれば最小値が表示されますね。
    • good
    • 0

ちなみに移動平均については判りますね?


ご相談で掲示されたサンプルのデータで,仮に4点で移動平均を取ってみると添付図のようになり,生のピークが0.03830833を記録しているのに対して0.036531251という計算値をこの山のピーク値だとします。

それでご質問の山の切り方ですがごくごく簡易な方法としては,やはりご質問に掲示されているようなグラフが得られているとすると,0.3の時間間隔の中に10山見えていますから一周期が目安0.03,データのサンプリングタイムが0.002なので,おおざっぱに言ってしまえば0.03÷0.002=150データごとに一山あると見てしまえそうです。

C列に移動平均を計算してあるとすると
開始を51行目からにしてみると
=MAX(C51:C200) で一山目のピーク値
=MAX(C201:C350) で二山目のピーク値
 :
が拾えると期待できます。

また,もっと荒い(10点とかの)移動平均でグラフを平滑にしてしまい,それでゼロを切るそれぞれの時刻を拾ってしまうのでも,多分今考えられた方法で上手く出来ると思います。
「エクセルの最小値抽出方法について」の回答画像8
    • good
    • 0

あまり自信はないが微分係数が正ー0-負に変化するところが、局地的な極大として考えることから、


第2行目からデータがあるとして
B2セルに=IF(AND(A1<A2,A2>A3),A2,"")ト入れて下方向に式を複写
例データ
A列  B列
1
2
3
4
5
66
5
3
2
3
4
5
6
7
8
99
このB列でMaxをとる。
    • good
    • 0

データがB2:B20000として


=SUMPRODUCT(MIN(10000^((B2:B20000<=B1:B19999)+(B2:B20000<B3:B20001))*(B2:B20000+1))-1)
    • good
    • 0

No.1です!



前回の投稿は無視してください。
正弦波なるものを理解していませんでした。
失礼しました。m(__)m
    • good
    • 0

基本はピーク(極値)の検出,つまり「上りから下りに変わる点」を拾いたいワケですが,実際のデータではそう簡単には行きません。



○比較的簡単な方法
 データが大まかにゼロを切る点から次のゼロを切る点が「一つの山(もしくは谷)」ですから,その区間ごとに最大値(若しくは最小値)を拾ってしまいます。
 山を含んでいれば良いので,区切りが多少ずれていても問題ありません。
 一つ一つの山の高さを拾い出せば,あとはその中から一番小さいの(MIN)を拾うだけです。


○ノイズの問題
生データを直接採取していた場合の主な問題の一つとして,しばしば主たる周波数の上に高周波のノイズが乗っています。つまり単純に「増加から減少に転じた」(前のデータと次のデータを単純に引き算して増減を判断する)だけで検出しようとすると,細かいノイズのイチイチのピークを拾ってしまいます。また前述の方法で生の最大値を拾ってしまうと,ノイズ分だけ上乗せした値を拾う可能性が高くなります。

この問題を解決するため,測定系にローパスフィルタをかませて適切なレンジでノイズ切りをしてあれば,そのままデータを使えます。
データ(つまりグラフ)をよく見てノイズが乗っているような時は,簡易にはノイズ周波数をつぶせそうな個数で「移動平均」をとってもしまう場合もあります。

この回答への補足

keithinさん

ご回答ありがとうございます。とてもうれしいです。

上記「比較的簡単な方法」の一つひとつの山を拾う方法ですが、具体的に
エクセル関数など方法を教えて頂けませんでしょうか。

自分でもいつの山(測定電圧値が0付近になるところ)を探す方法を考えて
いるのですが、うまくいきません。

申し訳ありません。

よろしくお願いいたします。

補足日時:2011/02/18 03:44
    • good
    • 0

作業列を使って、頂点を抜き出してそこから最小値を探しては?


添付画像の例では、C3セルに=IF(MAX(B2:B4)=B3,B3,"") と入れて下にコピーしています。
この式は前後合わせて3点のデータを比較し、自行の値が一番大きければ頂点と判断して値を表示しています。
実際には前後3点程度ではちょっとした山も拾ってしまうでしょうからもっと幅を広げた方が良いと思います。
「エクセルの最小値抽出方法について」の回答画像3
    • good
    • 0

こんな感じではどうでしょうか。

外れていたら無視してください。

3列目を作業列として、3列目に各ピークの値を取り出す方法です。

3列目2行目に

=IF(AND(B2>B1,B2>B3),B2,"")
下へ必要数ドラッグ

これでC列に各ピークの値が表示される

後はMIN関数で。
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで極大値を拾うには

 今エクセルで、グラフ化すると、
横軸:時間 
縦軸:電圧
で sinカーブのような波形となる数値データがあります。この振幅(山)の大きさは時間によって微妙に違います。振幅の平均値を取りたいのですが、何かいい方法ありますか?要は半周期での極大値を拾って、それを平均すればよいのですが方法が分かりません。

Aベストアンサー

グラフの元となったシートで、極大値は「左側のセルより大きく、かつ右側のセルより小さい」と言えると思います。

従って、a列に時刻、b列に電圧が入力されているとして
c2セルに
=if(and(b2>=b1,b2=<b3),b2,"")
と入力して、そのセルを最終行の1行前までコピーしたらよいと思います。

そしてc列の平均を取ればいいでしょう

極小値はd列に
=if(and(b2>=b1,b2=<b3),b2,"")
ですね。

なおb1にはダミーで数字のZEROを入れて下さい。

平均は
=AVERAGE(c2:cX) Xは最終データ行数
で求められます

Qピークの検出方法

ある離散時系列データf(x)があったとき、単純に考えれば
f'(x)=f(x+1)-f(x)<0.0001,f''(x)=f'(x+1)-f'(x)<0
となるxを求めればピークのxが検出できると思いますが、
f(x)が滑らかでない場合はどんな方法でピークが検出できますでしょうか?

Aベストアンサー

>f'(x)=f(x+1)-f(x)<0.0001, f''(x)=f'(x+1)-f'(x)<0 ....

基本はこれでOKなので、「f(x)が滑らかでない場合」に引っかかりそうなケースを考えてみましょう。

[誤検出しそうな例]
(1) サンプリングしたデータでは、ピークでの増分が 0.0001 未満とは限らない。(つまり、とんがり気味のピークは検出できない)
(2) 真のピークではなく、裾野の細かいうねりまで検出するおそれがある。

[対策例]
(1) 単純に、f'(x)が正から負へ極性反転したらピークとみなす。
(2) #1 さんの「平滑化」処理を適用する。
(2)' あるいは、f'(x)が正から負へ極性反転したピークの高さに閾値を設定しておく。(つまり、細かなピークは無視する)

ピーク検出には、適用分野に応じたノウハウが多数あるようです。

Q曲線グラフからピーク値を求める方法

VB6のプログラムでちょっとつまづいているのでどなたか分かる方いらっしゃいましたら助言お願いいたします。

今、sinカーブのような曲線があるとします。
このsinカーブの極大値、極小値をもとめたいんですが;

微分を使わずに簡単に行ういい方法ってないでしょうか?
ちなみに自分は y座標方向のデータをyy(800)の配列にすべてのデータを入れておいて
yの最大値をymax(50)のように配列しておき

範囲を手入力で指定し、for 文でループさせ、その中に条件式を書いて
求めています。実際にはこんな感じです。
これは最大値をもとめるときのものです
ymax(0)=0
 for i= 0 to 800
if ymax(0)<y(i) then yymax(0)=y(i)
end if
next i

というような簡単な並べ替えでやっています。
範囲指定をせずこのような並べ替えの方法でうまく求める方法ってないものでしょうか?
長々とかいてしまいましたがどなたか分かる方いらっしゃいましたら
よろしくお願いします。

VB6のプログラムでちょっとつまづいているのでどなたか分かる方いらっしゃいましたら助言お願いいたします。

今、sinカーブのような曲線があるとします。
このsinカーブの極大値、極小値をもとめたいんですが;

微分を使わずに簡単に行ういい方法ってないでしょうか?
ちなみに自分は y座標方向のデータをyy(800)の配列にすべてのデータを入れておいて
yの最大値をymax(50)のように配列しておき

範囲を手入力で指定し、for 文でループさせ、その中に条件式を書いて
求めています。実際にはこん...続きを読む

Aベストアンサー

微分といってもさほど難しく無いように思いますが

Y成分の現時点と次との傾きが0または逆転する部分を見つければいいのではないでしょうか

800個のデータがあるのであれば

dim oldAngle as Double, Angle as Double
dim cnt as integer
oldAngle = y(1) - y(0)
cnt = 0
for n = 1 to 799 ' 800-1
  angle = y(n+1) - y(n)
  if Sgn(oldAngle) <> sgn(Angle) or Angle = 0 then
    ymax(cnt) = y(n)
    cnt = cnt + 1
  end if
next

# Angle=0は Round(Angle,8)などで丸めておいてからのほうがいいかも

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)

QエクセルでもVBAでもいいのですが

どうしても出来ないので教えていただきたいのですが

エクセルでA列に延々と数値データが入っています
グラフにするとノイズのような小さな山が続いて次に大きな山が二つでき
またノイズのような小さな山が続く

ってこんな感じの数値データなのですが
このデータから一つ目の大きな山の最大値を抽出したいんです
一つ目の山の方が大きいとは限らないので
MAX関数は使えません
山はデータ中のどこにできるかわからないので
何行から何行までって限定することもできません

わかり辛い表現で申し訳ないのですが
よろしくお願いします

Aベストアンサー

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2006/9/3 ユーザー名 :
'

'
NoizeCut = 2

lastl = Range("A65536").End(xlUp).Row
Range("B1").FormulaR1C1 = "=MAX(C[-1])/" & NoizeCut
Range("B2:B" & lastl).FormulaR1C1 = "= IF(RC[-1]<R1C,0,RC[-1])"
Range("C2:C" & lastl).FormulaR1C1 = "=IF(RC[-1]=0,0,R[-1]C+1)"

yama1num = WorksheetFunction.Max(Range("C2:C" & lastl))
yama1row = WorksheetFunction.Match(yama1num, Range("C2:C" & lastl), 0) - yama1num + 2
Debug.Print yama1num, yama1row
Range("C" & yama1row & ":C" & yama1row + yama1num - 1).ClearContents
yama2num = WorksheetFunction.Max(Range("C2:C" & lastl))
yama2row = WorksheetFunction.Match(yama2num, Range("C2:C" & lastl), 0) - yama2num + 2
Debug.Print yama2num, yama2row

If yama2row < yama1row Then
yama1row = yama2row
yama1num = yama2num
End If
MsgBox "最初の山の最大値は" & WorksheetFunction.Max(Range("A" & yama1row & ":A" & yama1row + yama1num - 1))


End Sub
でっちあげです。NoizeCutは調整願います。

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2006/9/3 ユーザー名 :
'

'
NoizeCut = 2

lastl = Range("A65536").End(xlUp).Row
Range("B1").FormulaR1C1 = "=MAX(C[-1])/" & NoizeCut
Range("B2:B" & lastl).FormulaR1C1 = "= IF(RC[-1]<R1C,0,RC[-1])"
Range("C2:C" & lastl).FormulaR1C1 = "=IF(RC[-1]=0,0,R[-1]C+1)"

yama1num = WorksheetFunction.Max(Range("C2:C" & lastl))
yama1row = WorksheetFunction.Match(yama1num, Range("C2:C" & lastl)...続きを読む

Qvbaで極大値を抽出する方法

数千の値を持つcsvファイルを所持しております。(A1-A5000位までに値が入っている)
値をグラフ化するとサインカーブの様な曲線が描かれる数値群なのですが
その中から

・極大となる値を始めから5つ
・その極大値に対する行の数

の二点を取り出すものを作りたいのですが、うまく行きません。
基本的にはおよそ100ごとに極大をとるのですが
ノイズが入っており極大から極小に向けて常に減少を続ける訳でなく
たまに増加してる点が現れていたりします。

流れとしては

A1から100個を探して、その中の極大を探す
A101から100個を探して極大を・・・

みたいな風にやりたいのですが、もしよろしければご教授頂けないでしょうか。

Aベストアンサー

VBAではなくて、関数案ですが
B列に
=MAX(A1:A100) と入れて下までコピーします。
C列に
=INDEX(B:B,(ROW(A1)-1)*100+1)
と入れて下までコピーすれば、10行ごとの値がでます。

>ノイズが入っており極大から極小に向けて常に減少を続ける訳でなく
>たまに増加してる点が現れていたりします。
たぶん、やりたいことは、実験値の中からノイズと思われる異常値を除去したいと
いう事ではないでしょうか。
エクセル 異常値 除去 或いは ノイズ 除去
などで検索すると、いくつかの方ほが紹介されています。

考え方も色々ですが、例えば
A1:A100 の平均値と分散(或いは標準偏差値)を求めて
実験値が分散の範囲外であれば、空白にするとかであれば
B列に
=IF(A2>AVERAGE(A2:A101)+STDEV(A2:A101),"",A2)
といったような関数を下までコピーすれば、想定した異常値を空白にできます。

Q手軽に曲線の平滑化をしたい

手軽に曲線の平滑化をしたい

下図のような曲線に平滑化を施し、なめらかな曲線になるような値にしたいです。
エクセルには、A列に時間t、B列に時間ごとに得られたデータが出力されているとします。
エクセルの機能またはそれ以外の方法で簡単にできる方法はあるでしょうか?
知っている方教えてください。よろしくお願いします。

Aベストアンサー

Excelグラフの散布図から
グラフエリアを右クリック→グラフの平滑化で如何ですか

Qエクセル 0や空白のセルをグラフに反映させない方法

以下の点でどなたかお教えください。

H18.1~H20.12までの毎月の売上高を表に記載し、その表を元にグラフを作成しています。グラフに反映させる表の範囲はH18.1~H20.12の全てです。
そのためまだ経過していない期間のセルが空白になり、そこがグラフに反映され見づらくなります。
データを入力する都度グラフの範囲を変更すればいいのですが、うまく算式や設定等で空白や0円となっているセルをグラフに反映させない方法はありますか?

お手数ですが、よろしくお願いいたします。

Aベストアンサー

売上高のセルは数式で求められているのですよね?
それなら
=IF(現在の数式=0,NA(),現在の数式)
としてみてください。
つまり、0の場合はN/Aエラーにしてしまうんです。N/Aエラーはグラフに反映されません。

QExcelで最大値の入っている数値の右側にある項目名を拾いたい。

Excelで最大値の入っている数値の右側にある項目名を拾いたい。

下のようなデータがあります。(A列は年、Bは何かの生産量・・とします)

1 2000 7
2 2001 11
3 2002 14
4 2003 10
5 2004 9
6 2005 8

生産量(B列)の最大値を求めるのは=MAX(B1:B7)で"14"が得られると思いますが、求めているのは"14"の入っている年の"2002"という数字を隣のC1に入れたいと思います。
どのような関数が必要でしょうか?

Aベストアンサー

こんばんは!
一例です。

↓の画像でC2セルに表示するようになりますが・・・

C2セルの数式は
=INDEX($A$2:$A$1000,MATCH(MAX(B2:B1000),B2:B1000,0))
にしています。
(エラー処理はしていません)
A列の1000行目まで対応できるようにしていますが、
データ量によって範囲指定の領域はアレンジしてみてください。

以上、参考になれば幸いです。m(__)m

Qエクセルでノイズ値を除去する方法。

エクセルでノイズ値を除去できませんか。
ノイズ値除去をしたく、ネットで調べるとフーリエ変換という言葉が出てきます。
しかし、今一よくわかりません。
具体的には、
「2、5、7、5、8、21、6、10」という8個の数値があった場合に、
「21」をノイズ値として除去したいです。
実際にできるのでしょうか。
やり方を教えてください。宜しくお願いします。

Aベストアンサー

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のような作業だと考えて下さい.

運よく二山になったら,山の隙間のどこかに閾値(しきい値)をとって,上側の山を切り落とします.
これはローパスフィルタのような作業です.

二山にならず,肩のこぶのようになっていたら,
ここから先はエクセルでは無理かと思いますが,
ガウス分布やガンマ分布をあてはめて,二山をフィットします.
次にそれらの関数を使って,閾値を決めます.
閾値は,第1種の過誤(α)と第2種の過誤(β)が同じになるように決め,
原信号の犠牲比率とノイズの混入比率を同等にします.
次に,閾値から上側を切り落とします.

このように,ノイズの除去には原信号の犠牲が伴い,
それに対する配慮が必要であることを分かって頂けたと思います.
3σの外を切るような乱暴な話ではありません.

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のよ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング