EMG / 筋電図
AI活用
Delsys筋電CSVをPythonで可視化し、AIで解析を加速する実践ガイド。
Delsysシステムで取得したEMG(筋電図)のCSVデータを、pandasとmatplotlibで読み込み・可視化する手順を一から解説する。あわせて、コード生成AIによる実装の効率化と、そこに潜む落とし穴も具体例つきで整理する。
YOFUKASI AI編集部 / 更新日:2026年7月13日 / 想定読了時間:約14分
01 Introduction — 導入
なぜ今、EMG可視化にAIを組み合わせるのか
結論から言えば、DelsysのEMG(筋電図)CSVデータをPythonで可視化する作業自体は、pandasとmatplotlibがあれば数十行のコードで完結する。だが実務では「列名がバージョンによって変わる」「複数チャンネルを比較したい」「コードを書く時間がない」といった壁にぶつかりやすい。ここに生成AIをコーディング支援として組み込むと、実装速度と試行錯誤の回数が大きく変わってくる。
編集部見解:EMG解析コードそのものは複雑ではないが、「どの列を読み、どう前処理し、何を見たいのか」を最初に言語化できるかどうかが、AIアシストの効果を左右する。
実例(編集部想定シナリオ):リハビリテーション施設の研究員が、Delsys Trigno(公式サイト)で取得した患者の8チャンネルEMGデータを毎週分析しているとする。従来は都度Excelでグラフを作成していたが、Pythonスクリプト化とAIによるコード補助を組み合わせたことで、1患者あたりのデータ確認作業が手作業の約半分の時間で完了するようになった、という運用は十分に現実的である。
02 Background — 背景・定義
EMGとDelsysシステムの基礎
EMG(筋電図、Electromyography)とは、筋肉が収縮する際に発生する電気信号を体表または筋内から計測する技術である。リハビリテーション、スポーツ科学、疲労評価、義手・義足の制御など幅広い分野で用いられている。
Delsysは、表面筋電(sEMG)センサの分野で研究機関・医療機関に広く採用されているメーカーである。同社のTrigno Wireless EMGシステムは、独自のワイヤレス伝送方式と固定電極間距離設計により、体動を伴う計測でも安定した信号取得を可能にしている。
本記事で扱うCSVには、X[s](時間)、EMG1〜EMG8(各チャンネルの筋電値)、Trigger(外部同期用トリガー信号)といった列が含まれる想定である。列名は測定ソフトウェアのバージョンによって変わり得るため、後述するようにコードを書く前に必ず実データの列構成を確認することが重要になる。
03 Mechanism — 仕組み・技術的背景
コードの内部処理を分解する
可視化スクリプトは大きく4つの工程に分かれる。
- ファイル選択:
tkinterのGUIダイアログでユーザにCSVを選ばせる。 - 読み込み:
pandas.read_csvで必要な列だけを抽出する。 - 格納:時間列とEMG列をそれぞれ変数に代入する。
- 描画:
matplotlib.pyplotで折れ線グラフとして表示する。
# モジュールのインポート
import os
import tkinter
import tkinter.filedialog
import tkinter.messagebox
import pandas as pd
import matplotlib.pyplot as plt
# ファイル選択ダイアログ
root = tkinter.Tk()
root.withdraw()
fTyp = [("", "*.csv")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo("read_file_csv.py", "対象ファイルを選択してください!")
file = tkinter.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
# CSV読み込み(必要な列のみ抽出)
usecols = ["X[s]", "EMG1: EMG 1", "EMG2: EMG 2", "EMG3: EMG 3",
"EMG4: EMG 4", "EMG5: EMG 5", "EMG6: EMG 6",
"EMG7: EMG 7", "EMG8: EMG 8", "Trigger: Analog.A 16"]
df = pd.read_csv(file, header=0, usecols=usecols)
time = df["X[s]"]
EMG1 = df["EMG2: EMG 2"]
# グラフ描画
plt.figure()
plt.plot(time, EMG1)
plt.rcParams["font.size"] = 10
plt.tight_layout()
plt.grid(True)
plt.title("EMG")
plt.xlabel("time[sec]")
plt.ylabel("amplitude")
plt.show()
| 工程 | 使用ライブラリ | 役割 |
|---|---|---|
| ファイル選択 | tkinter |
GUIによるファイルダイアログ表示 |
| データ読み込み | pandas |
CSVのパースと列抽出 |
| 前処理・フィルタ | scipy.signal |
ノイズ除去・帯域制限 |
| 可視化 | matplotlib |
折れ線グラフの描画 |

実例(事実ベース):Delsys Trigno系センサを対象にした低コストEMGシステムの妥当性検証研究では、フィルタのカットオフ周波数が20Hz〜450Hzに設定され、これはDelsys Trigno自体が用いる周波数帯に準拠していると報告されている(出典)。自作の可視化コードにscipy.signal.butterによるバンドパスフィルタを組み込む際は、この帯域を出発点にするとよい。
04 Comparison — 比較・選択肢
実装アプローチをどう選ぶか

| 項目 | A: 手動コーディング | B: AIアシスト実装 | C: ノーコード解析ツール |
|---|---|---|---|
| 初期学習コスト | 高い | 中程度 | 低い |
| カスタマイズ性 | 非常に高い | 高い(要検証) | 限定的 |
| 再現性・自動化 | 高い | 高い | ツール依存 |
| 誤り混入リスク | 実装者のミスに依存 | 列名誤解釈などAI特有の誤りに注意 | ブラックボックス化しやすい |
※本比較表は編集部見解に基づく整理であり、実際の効率は個人のスキルセットやデータ規模によって変動する。
PythonそのものはYOFUKASI AIの関連解説記事でも扱っている通り、EMGに限らず幅広いデータ処理の基盤となる言語である。公式サイト(python.org)から最新の安定版を入手できる。
05 Practice — 実践への落とし込み
5ステップで実装する

ステップ1:環境構築(所要時間 約5分)
pip install pandas matplotlib scipy を実行する。実例(編集部想定シナリオ):研究室の共有PCにPythonが未導入だった場合、公式サイトからPython 3.xをインストールし、上記コマンドを実行するだけで環境構築が完了する。
ステップ2:列名の事前確認(所要時間 約2分)
pd.read_csv(file, header=0).columns を一度実行し、実際の列名を目視確認する。実例(データを伴うシナリオ・編集部見解):測定ソフトのバージョン差により列名の末尾表記が変わるケースがあり、この1ステップを省くと後続処理でKeyErrorが発生しやすい。
ステップ3:必要列の抽出とAIによるコード補助(所要時間 約10分)
16チャンネル分のCSVから使用する8チャンネルのみをusecolsで指定する。実例(編集部見解):全列読み込みから必要8列への絞り込みにより、大容量CSV(数万行規模)での読み込み時間が体感的に半減するケースがある。生成AIにこのusecolsリストの雛形作成を依頼すると入力の手間を削減できるが、列名のタイポは必ず目視で照合する。
ステップ4:ノイズ除去フィルタの適用(所要時間 約10分)
scipy.signal.butterで20〜450Hzのバンドパスフィルタを設計し、sosfiltで適用する。実例(事実ベース):この帯域は第3章で紹介したDelsys Trigno系の検証研究でも採用されている値であり、まず妥当な出発点として使える。
ステップ5:可視化と保存(所要時間 約5分)
matplotlibでプロットし、plt.savefig()でPNG保存する。実例(編集部想定シナリオ):週次レポート用に複数チャンネルを1枚の図にまとめて出力するテンプレートをAIに生成させておくと、レポート作成の反復作業を短縮できる。
06 Pitfalls — 注意点・よくある誤解
見落としやすい3つの落とし穴

! 電極装着部位とサンプリング周波数の誤解:どの筋肉にどう電極を装着したかによって信号の振幅・形状は大きく変わる。またEMGの周波数帯域に見合わないサンプリングレート(目安として1kHz〜2kHz以上が推奨)では、必要な信号成分を取りこぼす。
! 基線ドリフト・動作アーチファクトの見落とし:被験者の動きや電極のズレによってベースラインがずれることがあり、フィルタリングやアーチファクト除去を怠ると誤った解釈につながる。
! AI生成コードを無検証で採用してしまう誤解:生成AIは列名や単位を文脈から推測するため、実データと異なる前提でコードを書いてしまうことがある。AIの出力はあくまで初稿として扱い、実データでの動作確認を必ず挟む運用が編集部の見解である。
07 FAQ
よくある質問
Q. DelsysのCSVファイルの列名がコード例と違う場合はどうすればよいですか?
A. Delsysの出力列名はソフトウェアのバージョンや設定によって変わることがあります。pandasでpd.read_csv(file, header=0)と列指定なしで一度読み込み、df.columnsで実際の列名を確認してから、usecolsやリネームの設定をコードに反映させてください。
Q. matplotlibの代わりにAIツールでグラフ作成を効率化できますか?
A. 可能です。生成AIアシスタントにCSVの列構成とやりたいことを伝えれば、matplotlibやplotlyの雛形コードを提案してもらえます。ただし列名や単位の解釈を誤ることがあるため、生成されたコードは必ず実データで検証し、出力される数値を人間が確認する運用が推奨されます。
Q. EMGデータのノイズ除去にはどのような手法がありますか?
A. 代表的な手法は、scipy.signalのButterworthバンドパスフィルタによる帯域制限と、動作アーチファクト除去のための高域フィルタです。Delsys Trigno系のセンサでは20〜450Hz程度の帯域が実測データの検証研究でも使用されており、目的とサンプリング周波数に応じてカットオフ周波数を調整します。
Q. AIに筋電データの解析結果の解釈まで任せてよいのでしょうか?
A. コードの生成や可視化の効率化にAIを使うことは有効ですが、医療・リハビリ領域での臨床的な解釈や診断的判断はAIに委ねるべきではありません。AIはあくまで前処理・可視化・仮説生成の補助と位置づけ、最終的な解釈は専門家が行う運用が編集部の見解です。
Q. 複数チャンネルのEMGを同時にAIで異常検知することはできますか?
A. 技術的には、複数チャンネルの特徴量(RMSや周波数成分など)を学習データとして機械学習モデルに入力し、異常な筋活動パターンを検知する研究例があります。ただし精度は電極配置やノイズ条件に大きく左右されるため、実運用前には十分な検証データでの評価が必要です。
参考文献
- Delsys, Inc.「Trigno EMG」delsys.com, 2025. https://delsys.com/trigno/
- Python Software Foundation「Python公式サイト」python.org. https://www.python.org/
- pandas開発チーム「pandas.read_csv — pandas documentation」pandas.pydata.org, 2026. https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
- Matplotlib Development Team「Pyplot tutorial — Matplotlib documentation」matplotlib.org, 2026. https://matplotlib.org/stable/tutorials/pyplot.html
- SciPy Developers「scipy.signal.butter — SciPy Manual」docs.scipy.org, 2026. https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html
- ユビキタスAI「センサーと機械学習をつかったジェスチャー認識」ubiquitous-ai.com, 2022. https://www.ubiquitous-ai.com/column/ai/machine_learning/gesture-recognition.html
- ResearchGate掲載論文「Validation of a Low-Cost Electromyography (EMG) System via a Commercial and Accurate EMG Device: Pilot Study」researchgate.net. https://www.researchgate.net/figure/Delsys-Trigno-Wireless-EMG-system-Technical-information_tbl3_337617518

コメント