質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1563閲覧

データ分析における波の種類の判別

raruto

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/08/24 09:57

編集2022/08/24 10:50

0

0

Pythonでのコード方法を教えていただきたいです。

現在データ分析を行っています。
データを取得し以下のような波が得られとします。

__/\   ____   /\__  ......
\/  \/   
|----①-----| |----②-------|

①と②の波を区別する方法はありますでしょうか?
最大値が先にくるか、最小値が先に来るかで判断しようと考えましたが、
配列でなどで考えようと思いましたが、Pythonで最大最小どちらが先なのか判断する方法が思いつきませんでした。

ちなみに、___これは表記上まっすぐにしてありますが、実際は細かく上下しており、配列を用いて前後の+ーで見分けるというのは厳しいと感じました。

他に判定する方法や、こうやればPythonで実装できるなど教えていただけたら幸いです。
また、できれば、①や②の一部分しかデータ取得できなかった場合にも判定できるようにしていただけたら助かります。
(先に波が上に動いたか下に動いたかなど)

わかりづらい文章で申し訳ないですが、お答えお願いいたします。
ここってどういう意味?などあれば気軽に質問していただければ・・・!

【追記】
jbpbさんのおっしゃる通り
①:水平凸凹水平
②:水平凹凸水平
という形で、細かく上下しているというのは、添付画像のように上下しているというイメージです!
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/08/24 10:03

残念ながら、1と2の波がどんな形のものなのか判別できません。 文字で表現したいのであれば、コードの挿入で言語をtextにするなどすればみやすくなるかもしれません。 もしくは、画像で貼るなど。
TakaiY

2022/08/24 10:03

また、波形のデータはどのようなデータになっているのでしょうか。
meg_

2022/08/24 10:21

「python 波形 分析」で検索すると様々な事例が出てきます。質問者さんの言う”波”が何のデータなのか不明なため役に立つかは分かりませんが、心拍分析できるモジュールなどもありますので色々試されてはいかがでしょうか?
jbpb0

2022/08/24 10:28

①:水平凸凹水平 ②:水平凹凸水平 かな?
raruto

2022/08/24 10:44

TakaiYさん 画像に関しては少々お待ちください。 megさん ありがとうございます!調べてみます jpbpさん その通りです。
guest

回答2

0

実際は細かく上下しており、配列を用いて前後の+ーで見分けるというのは厳しいと感じました。

Savitzky-Golay法で、平滑化(ノイズを減らす)と微分を同時にできます
十分にノイズを減らした微分値の絶対値がある値を超えたら、その時の微分値の符号(プラス/マイナス)で、①②のどちらの始まりかが判定できると思います
微分値がプラス:①
微分値がマイナス:②

【C++】【Eigen】Savitzky-Golay法を実装する
の「スムージングの例」の「1次微分」のグラフを見ると、単純な1次微分よりもノイズが抑えられることが分かります
(平滑化を強くすれば、もっとノイズは減ります)

時系列及び波形データの平滑化3手法(smoothing)
の「2. Savitzky-Golay filter」の「2.2 1階微分」に、pythonのコード例があります

「scipy.signal.savgol_filter()」の二つ目の引数(上記Webページのコード例では「フレーム長」と書かれてる)の数値(奇数のみ)を大きくすると、平滑化が強くなりノイズがより減りますが、微分後データの形状(急激な立ち上がり・立ち下がり等)が徐々に崩れるので、一般的にはそのバランスで数値を決めます
ただし、この質問の場合は①②の判別ができればいいので、多少微分後データの形状が崩れてもかまわないと思うので、あまり気にしなくてもいいような気がします
(平滑化重視で数値大きめにする)

 
なお、データが等間隔ではない場合は、おそらく「scipy.signal.savgol_filter()」は使えないと思います
その場合は、
pythonで曲線の各点の傾きを表すグラフを作成したいです
の私の回答の【追記】のコードを使えば計算できます

投稿2022/08/25 01:04

編集2022/08/25 01:12
jbpb0

総合スコア7658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ノイズ成分を気にしないで値の変化を取得したいのであれば、ノイズを取り除けばいいでしょう。
1つの方法は、ローパスフィルタを使うことです。「ローパスフィルタ」で検索すれば、適用方法はいろいろ出てくると思います。 大抵、FFT(高速フーリエ変換)を使います。
別の方法として、移動平均を使う方法があります。 FFTに比べて計算が簡単です。
これらの方法で、ノイズを除去してデータを確認すれば、変化の傾向が読み取りやすくなるでしょう。

投稿2022/08/24 13:38

TakaiY

総合スコア14578

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問