どうも、ブタきむちです。
今回は、Pythonでデータ分析に挑戦したいと思います。といっても簡単なデータ分析です。
心電図波形(ECG波形)のR波を検出するプログラムを作りました。
1.心電図波形とは
心電図波形(electrocardiogram : ECG)とは、心拍動に伴って周期的に変化する波形のことを指します。
心電図によって分かることは、心臓の興奮の発生と伝播の状態と、心臓における興奮の過程と異常を検出できます。
難しい表現ですが、よく医療系のドラマで見られる「どっくんどっくん」といっているような波形ですね。
波形はこんな感じです。
今回は、ピークが立っているR波をPythonで検出していきます。
2.データ解析の流れ
・ライブラリのインポート
・データの読み込み
・ピーク検出
・波形の表示
3.ソースコード
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import signal ecg = pd.read_csv("./ECG_sleep.csv") ecg = ecg[0:720] time = ecg["time"] wave = ecg["ecg"] time = np.array(time) wave = np.array(wave) #ピーク検出 maxid = signal.argrelmax(wave, order=50) #波形の表示 def peak_detect(x,y,lab,ID): plt.plot(x, y, label=lab, c="blue", alpha=0.5) plt.plot(x[ID], y[ID], "ro", label="peak_max") plt.xlabel("time") plt.ylabel("ECG") plt.legend(loc="upper right") peak_detect(time,wave,"ECG",maxid)
4.ソースコード詳細
ライブラリのインポート
ライブラリのインポートをしていきましょう。
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import signal
Point:import文の使い方
import モジュール名
from モジュール名 import オブジェクト名
SCVデータの読み込み
データの読み込みにはpandasを使用していきます。
ecg = pd.read_csv("./ECG_sleep.csv") ecg = ecg[0:720] time = ecg["time"] wave = ecg["ecg"]
今回使用したデータは詳細にはお見せできないですが、scvファイルには時間データ、ECG波形と呼吸波形が入っています。
まずcsvファイルは、pandasを使用して読み込みます。
Point:pandas.read_scv()の使い方
変数名 = pd.read_scv(path)
path : csvファイルの相対パス/絶対パス
データの変換
ECG波形と時間データのデータ型を変換していきます。
time = np.array(time) wave = np.array(wave)
ここで時間データと波形データのデータ型の変換する理由は、この後に出てくる関数: signal.argrelmax()関数が、PandasのSeriesやDataFrameに対応していないためです。
signal.argrelmax()関数には、ndarrayを入力値をして使用しなければなりません。
ピーク検出
ピーク検出には、signal.argrelmax()関数を使用します。
#ピーク検出 maxid = signal.argrelmax(wave, order=50)
ピーク検出を行うには、scipyのsignal.argrelmax()関数を使用することができます。
Point:signal.argrelmax()関数の使い方
変数 = signal.argrelmax(data, axis=0, order=1)
data:最大値を検出するためのデータ
order:int型で指定。次の極大値の判定範囲。最小値=1
axis : データを選択する軸。デフォルトは0。
戻り値:ndarraysのタプル型
波形の表示
ECG波形の表示を行います。
#波形の表示 def peak_detect(x,y,lab,ID): plt.plot(x, y, label=lab, c="blue", alpha=0.5) plt.plot(x[ID], y[ID], "ro", label="peak_max") plt.xlabel("time") plt.ylabel("ECG") plt.legend(loc="upper right") peak_detect(time,wave,"ECG",maxid)
波形の表示は、peak_detectという関数を定義して波形を表示しました。
結果はこんな感じです。
ちなみに、orederの値を変えると、どのようにピークが検出されるか試しました。
order値は、oreder=10, 30, 50, 100
order値を変更した各ECG波形はこちら。
次に、dataをダウンサンプリングした後に、ピーク検出するとどうなるか試しました。
oreder=5で検出しました。
下の波形はダウンサンプリングした波形になります。dataをダウンサンプリングすると、波形の増減に変化がみられるため同じ条件でも検出される結果が変わります。
5.おわりに
今回はscipyのsignal.argrelmax()関数を使用してECG波形のピーク検出を行いました。
ECG波形は身近な生体情報データになりつつあるので、Pythonのデータ分析を通して自分の生体情報を知るきっかけになるといいです。
コメント
閾値を設定しECGの波形を微分
その後に微分波形の0クロス点を検出する方法で
R波を検出するプログラムを見たいです。
や さん
ご意見いただき、ありがとうございます。
試してみます!