バイオインフォマティクスにおいて、データ解析やシミュレーションは欠かせません。その中でも「乱数生成」は、シミュレーション、データのシャッフル、サンプリングなど多くの場面で役立ちます。Pythonには乱数生成を簡単に扱えるrandom
モジュールが用意されており、初学者から熟練者まで幅広く活用されています。本記事では、random
モジュールの基本的な使い方から応用的な活用方法までを解説します。
1. randomモジュールの基本的な使い方
まずは、random
モジュールをインポートするところから始めましょう。
import random
(1) 乱数を生成する
乱数の基本は「ランダムな数を生成する」ことです。
random.random()
0以上1未満のランダムな小数(浮動小数点数)を生成します。
print(random.random())
# 例: 0.4723943822943881
この関数は、確率モデルや正規化された値を扱う際に便利です。
random.randint(a, b)
指定した範囲 [a, b]
の整数をランダムに返します。
print(random.randint(1, 10))
# 例: 3
(2) シーケンスからランダムに選ぶ
バイオインフォマティクスでは、DNA配列やタンパク質配列を扱うことが多いです。こうしたシーケンスからランダムな要素を選択するのに役立つ関数をいくつか紹介します。
random.choice(seq)
シーケンス(リスト、文字列など)からランダムな要素を1つ選びます。
dna_bases = ['A', 'T', 'G', 'C']
print(random.choice(dna_bases))
# 例: G
random.choices(seq, k=n)
複数の要素をランダムに選びます。k
は選ぶ要素の数です。
print(random.choices(dna_bases, k=5))
# 例: ['A', 'T', 'C', 'G', 'A']
2. 応用的な使い方
次に、より実践的な場面でのrandom
モジュールの活用法を見ていきましょう。
(1) シーケンスのシャッフル
DNA配列をランダムに並べ替えるシミュレーションを考えます。random.shuffle()
はリストの順序をランダムに並べ替えます。
dna_sequence = ['A', 'T', 'G', 'C', 'A', 'T']
random.shuffle(dna_sequence)
print(dna_sequence)
# 例: ['T', 'A', 'C', 'A', 'G', 'T']
このように、シャッフルされた配列を使って変異シミュレーションやランダムなサンプリングを実施できます。
(2) 重み付きランダム選択
現実の生物学的データでは、特定の塩基やアミノ酸の出現頻度が均等でない場合があります。このような場合には、random.choices()
で重み(確率)を指定します。
weights = [0.3, 0.2, 0.4, 0.1] # A, T, G, Cの出現確率
weighted_random = random.choices(dna_bases, weights=weights, k=10)
print(weighted_random)
# 例: ['G', 'A', 'A', 'T', 'C', 'G', 'A', 'G', 'G', 'T']
これにより、実験データや観測データに基づいたリアルなシミュレーションが可能になります。
(3) 再現性を確保する
乱数生成の再現性を確保するには、random.seed()
を使用します。これは、シミュレーション結果の再現性が重要なバイオインフォマティクスで特に有用です。
random.seed(42) # シード値を固定
print(random.random())
print(random.randint(1, 10))
# 同じシード値を使えば、同じ結果が得られる
(4) ランダムDNA配列の生成
実際に乱数を使ってランダムなDNA配列を生成してみましょう。
長さnのランダムDNA配列を生成
以下のコードでは、長さn
のランダムなDNA配列を作成します。
def generate_random_dna(length):
bases = ['A', 'T', 'G', 'C']
return ''.join(random.choices(bases, k=length))
dna_sequence = generate_random_dna(20)
print(dna_sequence)
# 例: ATGCGTACGATCGTACGTAG
(5) モンテカルロ法で遺伝子発現シミュレーション
最後に、モンテカルロ法を用いた簡単なシミュレーションを考えます。例えば、特定の塩基配列が出現する確率を計算したい場合です。
以下は、ランダムに生成したDNA配列内で特定のモチーフ(例: “ATG”)が出現する確率をシミュレーションで求めるコードです。
def monte_carlo_motif_simulation(motif, sequence_length, iterations):
count = 0
for _ in range(iterations):
sequence = generate_random_dna(sequence_length)
if motif in sequence:
count += 1
return count / iterations
motif = "ATG"
sequence_length = 50
iterations = 1000
probability = monte_carlo_motif_simulation(motif, sequence_length, iterations)
print(f"The probability of finding '{motif}' in a sequence of length {sequence_length} is approximately {probability:.2%}")
まとめ
random
モジュールは、シンプルでありながら多機能で、バイオインフォマティクスの多くの場面で活躍します。基本的な乱数生成からシーケンス操作、シミュレーションまで幅広い用途があり、特にデータのランダム化や再現性のあるシミュレーションに役立ちます。
バイオインフォマティクスを学ぶ際には、このようなプログラムを活用して解析力を高め、現実的なシミュレーションに取り組んでみましょう。