【バイオインフォ実習】第4回:Bio.EntrezでAPI連携!FASTAデータの自動取得パイプライン構築とRefSeq採番規則の完全理解
前回(第3回)は、FASTA形式の基本構造とBiopythonの SeqRecord オブジェクトによるパース方法を学びました。第4回の今回は、いよいよPythonコードからNCBI(米国国立生物工学情報センター)のAPIを呼び出し、本物の遺伝子データ(FASTA)を自動取得・解析するパイプラインを作成します。
Webブラウザでダウンロードする手間を省き、コード一発で公共データベースと連携する「ITエンジニアらしい実務的な手法」をマスターしていきましょう。
1. 今回扱うサンプルデータ:ヒトTP53遺伝子(NM_000546.6)
今回取得するのは、ヒトのTP53遺伝子(mRNA)のデータです。この NM_000546.6 という記号は、NCBIが管理するRefSeq(Reference Sequence)データベースにおける固有のルール(採番規則)に従って厳密に決められています。単なるランダムなIDではなく、コード自体に意味が埋め込まれています。
① 記号の解読(RefSeqの採番規則)
- 1. プレフィックス
NM_(mRNAの意味):
先頭の2文字+アンダースコアは、データの種類(分子種)を表しています。NM_:RefSeq curated mRNA(構造が手動・実験的に検証・整理された「mRNA」の配列データ)NP_:RefSeq curated protein(タンパク質データ。TP53ならNP_000537など)NC_:Complete Genomic Molecule(ゲノム全体・染色体レベルのデータ)XM_:Predicted mRNA(計算機で予測された未検証のmRNAデータ)
NM_とついているだけで「これは信頼性の高い、検証済みのmRNA(転写産物)データだな」と分かります。 - 2. 連番
000546(識別ID):
NM_の後ろに続く6桁(または8桁)の数字は、特定の遺伝子・転写産物を一意に識別するための固有IDです。000546は、ヒトの TP53遺伝子(主要な転写産物バリアント1) に割り当てられた専用の番号です。 - 3. バージョン番号
.6(改訂履歴):
ドット(.)の後ろの数字は、データの更新(リビジョン)回数を示しています。新しい実験データやゲノム解読技術の向上によって配列情報やアノテーション(注釈)が修正・更新されると、.1→.2→.3… とカウントアップしていきます。.6は、「TP53のこのmRNAデータが過去に5回修正され、現在第6版のデータである」ことを意味します。
② なぜTP53がサンプルに選ばれるのか?
この TP53 という遺伝子は、がん研究やバイオインフォマティクスにおいて「最も有名で、最も重要」と言っても過言ではない超重要遺伝子です。ITで言えば、「Hello World」 や 「サンプルコードで言うところの User クラス / main() 関数」 に相当する、バイオ界の超定番サンプルです。
- 1. 「ゲノムの守護者(Guardian of the Genome)」と呼ばれる超有名遺伝子:
TP53 は、細胞がガン化するのを防ぐがん抑制遺伝子です。DNAが傷ついた時に細胞周期を止めたり、修復不能な場合は細胞死(アポトーシス)を誘導したりする「エラー制御システム」の役割を果たします。 - 2. ヒトのがんの半数以上で変異が見られる:
あらゆる「がん研究」で真っ先に解析される遺伝子です。そのため、実験データ、論文、データベースの注釈(アノテーション)が世界一充実しており、チュートリアルや教科書で真っ先に取り上げられます。 - 3. 配列長が手頃で学習に最適:
転写産物(mRNA)の長さが 約 2,500 bp(塩基) と、短すぎず長すぎない非常に手頃なサイズです。プログラムのAPIで取得しても一瞬でダウンロードでき、メモリを圧迫せずにコードのテストができます。
2. NCBI APIからFASTAを取得するPythonコード
Biopython には、NCBIのWeb API(E-utilities)と通信するための Bio.Entrez モジュールが用意されています。これを使えば HTTP リクエストの構築を自作することなく、数行でデータを取り込めます。
# 1. NCBIマナーとしてメールアドレスを設定(必須)
Entrez.email = "your_email@example.com"
# 2. Entrez.efetch APIでNCBIからFASTAデータを取得
with Entrez.efetch(db="nuccore", id="NM_000546.6", rettype="fasta", retmode="text") as handle:
# 3. レスポンスストリームを SeqIO.read で直にパース
record = SeqIO.read(handle, "fasta")
# 4. 解析結果の確認
print(f"ID: {record.id}")
print(f"Description: {record.description}")
print(f"Sequence (先頭50文字): {record.seq[:50]}...")
print(f"Length: {len(record.seq)} bp")
3. 実行結果の確認
Description: NM_000546.6 Homo sapiens tumor protein p53 (TP53), transcript variant 1, mRNA
Sequence (先頭50文字): CTCAAAAGTCTAGAGCCACCGTCCAGGGAGCAGGTAGCTGCTGGGCTCCG...
Length: 2512 bp
4. コードとデータ処理のポイント
一連のコードの中で、Web APIとBiopythonがどのように連動しているかをエンジニア目線で解説します。
Entrez.emailの設定規則:
NCBIのAPIを利用する際は、利用者の識別用としてメールアドレスの設定が義務付けられています(過剰アクセス時の連絡用)。これを怠るとAPI制限や遮断の対象となるため、必ず設定しておきましょう。Entrez.efetch()(HTTP GETリクエスト):
NCBIのデータベース(db="nuccore")に対して、指定ID(NM_000546.6)のデータをFASTAテキスト形式(rettype="fasta", retmode="text")で問い合わせるAPI呼び出しです。- ストリームの直接パース:
efetchが返すレスポンスハンドル(ストリーム)を、一旦ローカルファイルに保存することなくそのままSeqIO.read(handle, "fasta")に流し込んでいます。これにより、メモリ上で完結するパイプラインが組めます。 - 塩基長(2,512 bp):
実際の実行結果から確認できる通り、正確に2,512 bpのmRNA配列が一瞬で取得され、SeqRecordオブジェクトとして扱えるようになります。スライス(record.seq[:50])を使って先頭配列(CTCAAAAG...)の確認も容易です。
5. ITエンジニア的まとめ
今回の実習のポイントは以下の通りです。
- RefSeq IDの意味を理解する:
NM_000546.6のような文字列は、分子種(NM_)、固有ID(000546)、改訂版(.6)を示す意味のある識別子。 - 公共DBからの自動取得:
Bio.Entrezを使えば、手動ダウンロード不要でコード内から直接Web API経由でデータを取得できる。 - ストリーム処理によるパイプライン化: APIレスポンスをそのまま
SeqIOパーサーに渡してSeqRecordオブジェクト化可能。
これで「APIから実データを取得してプログラムに載せる」というデータインポートの手順が確立できました。
次回は【バイオインフォ実習】第5回:複数配列が含まれるマルチFASTAファイルのループ処理(SeqIO.parse)と統計解析に挑戦します!