| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- RNN
- 로제타폴드
- 바이오파이썬
- COVID
- SVM
- 서열정렬
- 캐글
- 알파폴드
- 인공지능
- bioinformatics
- ncbi
- Kaggle
- BLaST
- 인공신경망
- 자바
- CNN
- 이항분포
- 파이썬
- 단백질 구조 예측
- Java
- 딥러닝
- 결정트리
- 시그모이드
- 생물정보학
- AP
- 바이오인포매틱스
- AP Computer Science A
- 인공지능 수학
- 오류역전파
- 생명정보학
- Today
- Total
데이터 과학
PairwiseAligner를 이용한 서열 쌍 정렬 본문
PairwiseAligner를 이용한 서열 쌍 정렬
Bio.Align.PairwiseAligner는 Biopython에서 제공하는 최신 서열 쌍 정렬 도구입니다. 전역 정렬과 지역 정렬을 모두 지원하며, 일치 점수, 불일치 점수, 공백 페널티, 대체 행렬 등 다양한 조건을 세밀하게 설정할 수 있습니다.
이 클래스는 Needleman–Wunsch, Smith–Waterman, Gotoh, Waterman–Smith–Beyer 계열의 알고리즘을 지원합니다. 사용자가 지정한 정렬 방식과 점수 조건에 따라 적절한 알고리즘이 자동으로 선택됩니다.
기존의 pairwise2 모듈과 비교하면 PairwiseAligner는 객체지향적인 인터페이스를 제공하며, 긴 서열에서도 상대적으로 효율적으로 작동합니다. 따라서 새로운 분석 코드를 작성할 때는 PairwiseAligner를 우선적으로 사용하는 것이 좋습니다.
기본적인 사용법
서열 쌍 정렬을 수행하려면 먼저 PairwiseAligner 객체를 생성합니다.
from Bio import Align
aligner = Align.PairwiseAligner()
생성된 정렬 객체에는 정렬 방식과 점수 계산에 필요한 여러 매개변수가 저장됩니다. 이러한 값은 객체를 생성할 때 지정하거나, 생성한 뒤 속성으로 설정할 수 있습니다.
다음은 정렬 객체를 생성하면서 일치 점수를 설정하는 예제입니다.
from Bio import Align
aligner = Align.PairwiseAligner(
match_score=1.0
)
동일한 설정은 객체를 먼저 생성한 뒤 속성에 값을 대입하는 방식으로도 적용할 수 있습니다.
from Bio import Align
aligner = Align.PairwiseAligner()
aligner.match_score = 1.0
두 방식의 결과는 동일합니다.
정렬 방식 설정
PairwiseAligner는 전역 정렬과 지역 정렬을 지원합니다. 정렬 방식은 mode 속성으로 지정합니다.
전역 정렬을 수행하려면 다음과 같이 설정합니다.
aligner.mode = "global"
전역 정렬은 두 서열 전체를 대상으로 최적의 정렬을 찾습니다. 길이와 구조가 비슷한 서열을 비교하거나, 전체적인 유사성을 확인할 때 적합합니다.
지역 정렬을 수행하려면 다음과 같이 설정합니다.
aligner.mode = "local"
지역 정렬은 두 서열에서 가장 유사한 구간을 찾아 정렬합니다. 전체적으로는 차이가 크지만 특정 영역이나 기능성 도메인이 유사한 서열을 비교할 때 유용합니다.
기본 점수 확인하기
정렬 객체의 현재 설정은 print() 함수를 이용하여 확인할 수 있습니다.
print(aligner)
출력에는 다음과 같은 정보가 포함될 수 있습니다.
- 정렬 방식
- 일치 점수
- 불일치 점수
- 공백 열기 점수
- 공백 연장 점수
- 말단 공백 점수
- 대체 행렬 사용 여부
Biopython 버전에 따라 출력되는 속성의 이름과 구성은 다소 달라질 수 있습니다.
일치와 불일치 점수 설정하기
DNA 서열과 같이 문자 일치 여부를 직접 평가하려면 match_score와 mismatch_score를 설정할 수 있습니다.
from Bio import Align
aligner = Align.PairwiseAligner()
aligner.match_score = 2.0
aligner.mismatch_score = -1.0
이 설정에서는 동일한 문자가 정렬되면 2점을 얻고, 서로 다른 문자가 정렬되면 1점이 감점됩니다.
예를 들어 다음 두 DNA 서열을 정렬할 수 있습니다.
sequence1 = "GAACT"
sequence2 = "GAT"
최고 정렬 점수는 score() 메서드로 계산합니다.
score = aligner.score(
sequence1,
sequence2
)
print(score)
score()는 최적의 정렬 문자열을 생성하지 않고 최고 점수만 반환합니다. 따라서 많은 서열을 빠르게 비교해야 할 때 효율적입니다.
정렬 결과 생성하기
실제 정렬 결과를 확인하려면 align() 메서드를 사용합니다.
alignments = aligner.align(
sequence1,
sequence2
)
반환된 객체에는 최고 점수를 갖는 하나 이상의 정렬 결과가 포함됩니다.
정렬 결과의 개수는 다음과 같이 확인할 수 있습니다.
print(len(alignments))
첫 번째 정렬은 다음과 같이 출력합니다.
alignment = alignments[0]
print(alignment)
출력 형식은 Biopython 버전에 따라 다를 수 있지만, 일반적으로 두 서열의 대응 관계와 일치 여부를 확인할 수 있도록 표시됩니다.
정렬 점수 확인하기
각 정렬 결과에는 해당 정렬의 점수가 저장되어 있습니다.
print(alignment.score)
동일한 최고 점수를 갖는 여러 정렬이 존재할 수 있으며, 이 경우 alignments 객체에는 해당 결과들이 모두 포함됩니다.
정렬된 서열의 좌표 확인하기
PairwiseAligner의 정렬 결과는 단순한 문자열뿐 아니라 정렬 경로를 좌표 형태로 제공합니다.
print(alignment.coordinates)
좌표는 각 서열에서 정렬이 진행된 위치를 나타냅니다. 이를 이용하면 다음과 같은 정보를 정확하게 확인할 수 있습니다.
- 일치 구간
- 불일치 구간
- 삽입 구간
- 결실 구간
- 정렬 시작 위치
- 정렬 종료 위치
좌표 기반 표현은 긴 서열이나 복잡한 정렬을 프로그램으로 분석할 때 특히 유용합니다.
공백 페널티 설정하기
서열 정렬에서는 삽입과 결실을 표현하기 위해 공백을 사용합니다. 그러나 공백을 아무런 제한 없이 허용하면 생물학적으로 부자연스러운 정렬이 생성될 수 있습니다.
일반적으로 새로운 공백을 만드는 경우에는 큰 페널티를 부여하고, 기존 공백을 연장할 때는 상대적으로 작은 페널티를 적용합니다.
aligner.open_gap_score = -10.0
aligner.extend_gap_score = -0.5
open_gap_score는 새로운 공백을 생성할 때 적용되는 점수이며, extend_gap_score는 이미 존재하는 공백을 한 칸 더 연장할 때 적용되는 점수입니다.
페널티는 보통 음수로 지정합니다.
말단 공백 점수
서열의 시작이나 끝에 발생하는 공백은 내부에 발생하는 공백과 다른 의미를 가질 수 있습니다. PairwiseAligner에서는 말단 공백의 점수를 별도로 설정할 수 있습니다.
Biopython 버전에 따라 다음과 같은 속성을 사용할 수 있습니다.
aligner.target_end_gap_score = 0.0
aligner.query_end_gap_score = 0.0
말단 공백에 0점을 부여하면 두 서열의 전체 길이가 다르더라도 시작 또는 끝부분의 차이를 크게 불리하게 평가하지 않습니다.
이 방식은 한 서열이 다른 서열의 일부 영역만 포함하거나, 부분 서열을 전체 서열과 비교할 때 유용합니다.
대체 행렬 사용하기
단백질 서열 정렬에서는 단순히 같은 아미노산인지 여부만 평가하는 것보다, 아미노산 사이의 생화학적 유사성을 반영하는 것이 중요합니다.
이를 위해 BLOSUM이나 PAM과 같은 대체 행렬을 사용할 수 있습니다.
다음은 BLOSUM62 행렬을 불러와 정렬 객체에 적용하는 예제입니다.
from Bio import Align
from Bio.Align import substitution_matrices
aligner = Align.PairwiseAligner()
matrix = substitution_matrices.load(
"BLOSUM62"
)
aligner.substitution_matrix = matrix
aligner.open_gap_score = -10.0
aligner.extend_gap_score = -0.5
이제 두 단백질 서열을 정렬할 수 있습니다.
sequence1 = "MVLSPADKTNVKAAWGKVGAHAGEYGAEALERMF"
sequence2 = "MVHLTPEEKSAVTALWGKVNVDEVGGEALGRLLV"
alignments = aligner.align(
sequence1,
sequence2
)
print(alignments[0])
print(alignments[0].score)
대체 행렬을 사용하면 동일한 아미노산뿐 아니라 생화학적으로 유사한 아미노산의 치환도 점수에 반영됩니다.
대체 행렬과 단순 점수의 관계
substitution_matrix를 설정하면 match_score와 mismatch_score 대신 행렬에 정의된 점수가 사용됩니다.
따라서 대체 행렬을 사용하는 동안에는 개별 일치·불일치 점수를 별도로 설정하지 않는 것이 일반적입니다.
반대로 다음과 같이 일치 점수나 불일치 점수를 새로 지정하면, 기존에 설정된 대체 행렬이 해제될 수 있습니다.
aligner.match_score = 1.0
aligner.mismatch_score = -1.0
분석 목적에 따라 다음 두 방식 중 하나를 선택해야 합니다.
- DNA 서열처럼 단순한 문자 일치 여부를 평가할 때: match_score, mismatch_score
- 단백질 서열처럼 치환 가능성을 반영할 때: substitution_matrix
전역 정렬 예제
다음은 DNA 서열에 전역 정렬을 적용하는 예제입니다.
from Bio import Align
aligner = Align.PairwiseAligner()
aligner.mode = "global"
aligner.match_score = 2.0
aligner.mismatch_score = -1.0
aligner.open_gap_score = -2.0
aligner.extend_gap_score = -0.5
sequence1 = "GAACT"
sequence2 = "GAT"
alignments = aligner.align(
sequence1,
sequence2
)
print(alignments[0])
print("정렬 점수:", alignments[0].score)
전역 정렬에서는 두 서열의 시작부터 끝까지 전체 범위를 대상으로 최적의 대응 관계를 찾습니다.
지역 정렬 예제
다음은 두 서열에서 가장 유사한 부분만 정렬하는 예제입니다.
from Bio import Align
aligner = Align.PairwiseAligner()
aligner.mode = "local"
aligner.match_score = 2.0
aligner.mismatch_score = -1.0
aligner.open_gap_score = -2.0
aligner.extend_gap_score = -0.5
sequence1 = "LSPADKTNVKAA"
sequence2 = "PEEKSAV"
alignments = aligner.align(
sequence1,
sequence2
)
print(alignments[0])
print("정렬 점수:", alignments[0].score)
지역 정렬에서는 양의 누적 점수를 갖는 가장 유사한 구간이 선택됩니다. 따라서 정렬되지 않은 앞뒤 영역은 결과에서 제외될 수 있습니다.
정렬 객체 반복하기
정렬 결과 객체는 반복 가능한 형태로 제공됩니다. 동일한 최고 점수를 갖는 여러 정렬을 순서대로 확인할 수 있습니다.
for alignment in alignments:
print(alignment)
print("점수:", alignment.score)
정렬 결과가 매우 많을 수 있으므로 실제 분석에서는 필요한 수만 제한하여 확인하는 것이 좋습니다.
for index, alignment in enumerate(alignments):
if index >= 3:
break
print(alignment)
역상보 서열 정렬
DNA 서열 분석에서는 한 서열의 역상보 서열과 비교해야 하는 경우가 있습니다.
from Bio.Seq import Seq
sequence = Seq("ATGCCGTA")
reverse_complement = sequence.reverse_complement()
print(reverse_complement)
이후 원본 서열 또는 다른 기준 서열과 역상보 서열을 정렬할 수 있습니다.
alignments = aligner.align(
"TACGGCAT",
str(reverse_complement)
)
print(alignments[0])
염기서열의 방향이 명확하지 않은 경우에는 원본과 역상보 서열을 각각 정렬한 뒤 점수를 비교할 수 있습니다.
pairwise2와 PairwiseAligner 비교
pairwise2와 PairwiseAligner는 모두 서열 쌍 정렬을 수행하지만 사용 방식에는 차이가 있습니다.
구분pairwise2PairwiseAligner
| 구조 | 함수 중심 | 객체 중심 |
| 권장 여부 | 기존 코드 호환용 | 새로운 코드에 권장 |
| 전역 정렬 | 지원 | 지원 |
| 지역 정렬 | 지원 | 지원 |
| 대체 행렬 | 지원 | 지원 |
| 공백 점수 설정 | 지원 | 세부 설정 가능 |
| 좌표 정보 | 제한적 | 정렬 좌표 제공 |
| 긴 서열 처리 | 상대적으로 제한적 | 상대적으로 효율적 |
새로운 프로젝트에서는 PairwiseAligner를 사용하는 것이 바람직하지만, 기존 문헌이나 코드에서 pairwise2 예제를 접할 가능성이 높으므로 두 방식의 차이를 이해할 필요가 있습니다.
파일에서 배열 객체 읽기
Bio.Align.substitution_matrices 모듈은 파일에 저장된 1차원 및 2차원 배열을 읽는 기능을 제공합니다.
이 기능은 염색체 크기 목록, 문자별 가중치, 대체 행렬 등과 같이 행과 열로 구성된 생물정보학 데이터를 불러올 때 사용할 수 있습니다.
1차원 배열 읽기
1차원 배열은 일반적으로 두 개의 열로 구성됩니다.
첫 번째 열에는 항목의 이름 또는 키가 들어가고, 두 번째 열에는 해당 항목의 값이 저장됩니다.
예를 들어 인간 참조 유전체 hg38의 염색체별 길이를 저장한 hg38.chrom.sizes 파일은 다음과 같은 형식을 가집니다.
chr1 248956422
chr2 242193529
chr3 198295559
chr4 190214555
...
chrUn_KI270385v1 990
chrUn_KI270423v1 981
chrUn_KI270392v1 971
chrUn_KI270394v1 970
이 파일은 각 염색체 이름과 해당 염색체의 뉴클레오티드 길이를 저장합니다.
파일을 읽으려면 substitution_matrices.read() 함수를 사용합니다.
from Bio.Align import substitution_matrices
with open("hg38.chrom.sizes") as handle:
table = substitution_matrices.read(handle)
print(table)
기본적으로 숫자 값은 실수형으로 읽힐 수 있습니다.
chr1 248956422.0
chr2 242193529.0
chr3 198295559.0
chr4 190214555.0
...
값을 정수형으로 읽으려면 두 번째 인수에 int를 지정합니다.
from Bio.Align import substitution_matrices
with open("hg38.chrom.sizes") as handle:
table = substitution_matrices.read(
handle,
int
)
print(table)
이 경우 각 염색체 길이가 정수로 저장됩니다.
chr1 248956422
chr2 242193529
chr3 198295559
chr4 190214555
...
배열 값 접근하기
불러온 배열은 키를 이용하여 값을 확인할 수 있습니다.
print(table["chr1"])
출력 결과는 다음과 같습니다.
248956422
이러한 방식으로 염색체 길이, 문자별 점수, 빈도 정보 등을 배열 객체로 관리할 수 있습니다.
2차원 대체 행렬 읽기
2차원 배열은 행과 열을 모두 가지는 행렬 형태의 데이터입니다.
생물정보학에서는 아미노산 또는 뉴클레오티드 치환 점수를 저장하는 대체 행렬이 대표적인 예입니다.
NCBI의 단백질 BLAST에서 기본적으로 사용되는 BLOSUM62 행렬은 파일 형태로 저장할 수 있습니다.
파일의 앞부분에는 #으로 시작하는 설명이 포함되며, 이후 행과 열에 아미노산별 치환 점수가 기록됩니다.
# Matrix made by matblas from blosum62.iij
# * column uses minimum score
# BLOSUM Clustered Scoring Matrix in 1/2 Bit Units
# Blocks Database = /data/blocks_5.0/blocks.dat
# Cluster Percentage: >= 62
# Entropy = 0.6979, Expected = -0.5209
행렬의 열과 행에는 아미노산 문자가 배치됩니다.
A R N D C Q E G H I L K M F P S T W Y V
A 4 -1 -2 -2 0 -1 -1 0 -2 -1 -1 -1 -1 -2 -1 1 0 -3 -2 0
R -1 5 0 -2 -3 1 0 -2 0 -3 -2 2 -1 -3 -2 -1 -1 -3 -2 -3
...
이 파일을 읽으려면 다음과 같이 작성합니다.
from Bio.Align import substitution_matrices
with open("BLOSUM62") as handle:
matrix = substitution_matrices.read(handle)
행렬의 알파벳 확인하기
대체 행렬에 포함된 문자 목록은 alphabet 속성으로 확인할 수 있습니다.
print(matrix.alphabet)
출력 예시는 다음과 같습니다.
ARNDCQEGHILKMFPSTWYVBZX*
이 문자열은 행렬의 행과 열에 사용되는 문자의 순서를 나타냅니다.
일반적인 20개 아미노산 외에도 다음 문자가 포함될 수 있습니다.
- B: 아스파라진(N) 또는 아스파르트산(D)
- Z: 글루타민(Q) 또는 글루탐산(E)
- X: 종류가 결정되지 않은 아미노산
- *: 번역 종결 또는 정지 코돈
특정 치환 점수 확인하기
두 아미노산 사이의 치환 점수는 다음과 같이 확인합니다.
print(matrix["A", "D"])
출력 결과는 다음과 같습니다.
-2.0
이는 알라닌(A)이 아스파르트산(D)으로 치환되는 경우 BLOSUM62에서 -2점으로 평가된다는 의미입니다.
대체 행렬은 일반적으로 대칭이므로 다음 두 값은 같습니다.
print(matrix["A", "D"])
print(matrix["D", "A"])
헤더 정보 확인하기
파일에서 #으로 시작하는 설명 행은 행렬 객체의 header 속성에 저장됩니다.
print(matrix.header[0])
출력 예시는 다음과 같습니다.
Matrix made by matblas from blosum62.iij
전체 헤더를 확인하려면 반복문을 사용할 수 있습니다.
for line in matrix.header:
print(line)
헤더에는 행렬의 출처, 생성 방법, 단위, 클러스터 기준 등의 정보가 포함될 수 있습니다.
정렬 객체에 대체 행렬 적용하기
읽어 들인 행렬은 PairwiseAligner의 대체 행렬로 사용할 수 있습니다.
from Bio.Align import PairwiseAligner
aligner = PairwiseAligner()
aligner.substitution_matrix = matrix
공백 점수도 함께 지정할 수 있습니다.
aligner.open_gap_score = -10.0
aligner.extend_gap_score = -0.5
이후 단백질 서열을 정렬합니다.
sequence1 = "LSPADKTNVKAA"
sequence2 = "PEEKSAV"
alignments = aligner.align(
sequence1,
sequence2
)
print(alignments[0])
배열 객체를 문자열과 파일로 저장하기
대체 행렬 객체는 str() 함수를 사용하여 문자열로 변환할 수 있습니다.
text = str(matrix)
print(text)
문자열에는 헤더와 행렬 값이 함께 포함됩니다.
# Matrix made by matblas from blosum62.iij
# * column uses minimum score
# BLOSUM Clustered Scoring Matrix in 1/2 Bit Units
...
생성된 문자열은 일반 텍스트 파일로 저장할 수 있습니다.
with open(
"saved_BLOSUM62.txt",
"w"
) as handle:
handle.write(text)
저장한 파일은 이후 substitution_matrices.read() 함수를 이용하여 다시 불러올 수 있습니다.
from Bio.Align import substitution_matrices
with open("saved_BLOSUM62.txt") as handle:
saved_matrix = substitution_matrices.read(
handle
)
미리 정의된 대체 행렬 불러오기
Biopython에는 다양한 대체 행렬이 기본으로 포함되어 있습니다.
대표적으로 다음과 같은 행렬을 사용할 수 있습니다.
- BLOSUM 계열
- PAM 계열
- BENNER 계열
- 핵산용 대체 행렬
- 코돈 기반 대체 행렬
BLOSUM62 행렬은 다음과 같이 불러옵니다.
from Bio.Align import substitution_matrices
matrix = substitution_matrices.load(
"BLOSUM62"
)
행렬의 알파벳은 다음과 같이 확인합니다.
print(matrix.alphabet)
출력 결과는 다음과 같습니다.
ARNDCQEGHILKMFPSTWYVBZX*
사용할 수 있는 행렬 목록 확인하기
load() 함수에 인수를 전달하지 않으면 Biopython에 포함된 대체 행렬의 목록을 확인할 수 있습니다.
from Bio.Align import substitution_matrices
matrices = substitution_matrices.load()
print(matrices)
출력 예시는 다음과 같습니다.
['BENNER22', 'BENNER6', 'BENNER74',
'BLOSUM45', 'BLOSUM50', 'BLOSUM62',
'BLOSUM80', 'BLOSUM90', 'PAM30',
'PAM70', 'PAM250', ...]
설치된 Biopython 버전에 따라 사용할 수 있는 행렬의 종류는 달라질 수 있습니다.
BLOSUM 행렬의 선택
BLOSUM 계열 행렬은 이름 뒤의 숫자에 따라 서로 다른 유사도 수준을 반영합니다.
- BLOSUM80, BLOSUM90: 유사도가 높은 서열 비교
- BLOSUM62: 일반적인 단백질 서열 비교
- BLOSUM45, BLOSUM50: 진화적으로 거리가 먼 서열 비교
BLOSUM62는 광범위한 단백질 정렬에서 일반적으로 사용되는 대표적인 행렬입니다.
PAM 행렬의 선택
PAM 계열 행렬은 진화적 거리의 크기를 기준으로 선택합니다.
- PAM30: 매우 유사한 서열 비교
- PAM70: 비교적 유사한 서열 비교
- PAM250: 진화적으로 거리가 먼 서열 비교
분석 대상 서열의 예상 유사도와 진화적 거리를 고려하여 적절한 행렬을 선택해야 합니다.
코돈 기반 대체 행렬
Biopython에는 세 개의 뉴클레오티드로 구성된 코돈을 하나의 단위로 사용하는 대체 행렬도 포함되어 있습니다.
예를 들어 SCHNEIDER 행렬은 다음과 같이 불러올 수 있습니다.
from Bio.Align import substitution_matrices
matrix = substitution_matrices.load(
"SCHNEIDER"
)
알파벳을 확인하면 각 항목이 하나의 문자가 아니라 세 글자의 코돈으로 구성되어 있습니다.
print(matrix.alphabet)
출력 예시는 다음과 같습니다.
('AAA', 'AAC', 'AAG', 'AAT',
'ACA', 'ACC', 'ACG', 'ACT',
...,
'TTG', 'TTT')
코돈 기반 행렬은 단순한 염기 단위 정렬보다 번역과 유전 암호의 특성을 더 직접적으로 반영할 수 있습니다.
대체 행렬 활용 시 고려 사항
대체 행렬은 서열의 종류와 분석 목적에 맞게 선택해야 합니다.
DNA나 RNA 서열에서는 대개 일치·불일치 점수를 직접 지정하거나, 전이와 전환의 차이를 반영한 핵산용 행렬을 사용할 수 있습니다.
단백질 서열에서는 아미노산의 물리화학적 특성과 진화적 치환 빈도를 반영한 BLOSUM 또는 PAM 행렬이 일반적으로 사용됩니다.
정렬 결과는 대체 행렬뿐 아니라 공백 열기 점수와 공백 연장 점수에도 크게 영향을 받습니다. 따라서 행렬과 공백 점수를 함께 조정하면서 분석 목적에 적합한 조건을 선택해야 합니다.
동일한 두 서열이라도 사용한 행렬과 공백 점수에 따라 정렬 결과와 점수가 달라질 수 있으므로, 결과를 비교할 때는 사용한 매개변수를 함께 기록하는 것이 중요합니다.
사용 가능한 대체 행렬 목록 확인
Biopython에 포함된 대체 행렬의 전체 목록은 substitution_matrices.load() 함수를 인수 없이 호출하여 확인할 수 있습니다.
from Bio.Align import substitution_matrices
available_matrices = substitution_matrices.load()
print(available_matrices)
실행 결과에는 현재 설치된 Biopython에서 사용할 수 있는 대체 행렬의 이름이 목록 형태로 출력됩니다.
['BENNER22', 'BENNER6', 'BENNER74',
'BLOSUM45', 'BLOSUM50', ...,
'TRANS']
목록에는 BLOSUM과 PAM 계열뿐 아니라 다양한 연구 목적에 맞게 설계된 대체 행렬이 포함되어 있습니다. 사용할 수 있는 행렬의 종류는 Biopython 버전에 따라 달라질 수 있으므로, 실제 분석 환경에서 목록을 직접 확인하는 것이 좋습니다.
코돈 단위 대체 행렬
일반적인 단백질 대체 행렬은 각각의 아미노산을 한 문자 단위로 표현합니다. 그러나 일부 대체 행렬은 세 개의 뉴클레오티드로 이루어진 코돈을 하나의 단위로 사용합니다.
대표적인 예가 SCHNEIDER 행렬입니다.
from Bio.Align import substitution_matrices
matrix = substitution_matrices.load(
"SCHNEIDER"
)
행렬에 포함된 알파벳은 alphabet 속성으로 확인할 수 있습니다.
print(matrix.alphabet)
출력 결과는 다음과 같은 형태입니다.
('AAA', 'AAC', 'AAG', 'AAT',
'ACA', 'ACC', 'ACG', 'ACT',
...,
'TTG', 'TTT')
이 행렬에서는 각각의 항목이 하나의 염기가 아니라 세 염기로 구성된 코돈입니다. 따라서 일반적인 문자 단위 정렬보다 유전 암호의 특성을 직접 반영할 수 있습니다.
코돈 기반 대체 행렬은 다음과 같은 분석에 활용할 수 있습니다.
- 단백질을 암호화하는 염기서열 비교
- 동의적 치환과 비동의적 치환 분석
- 코돈 사용 편향 분석
- 유전자 수준의 진화적 변화 비교
- 번역 결과를 고려한 염기서열 정렬
다만 코돈 단위 정렬에서는 입력 서열의 길이가 3의 배수인지 확인해야 하며, 삽입이나 결실로 인해 읽는 틀이 달라지는 프레임시프트(Frame Shift) 가능성도 함께 고려해야 합니다.
대체 행렬 선택 기준
대체 행렬은 분석 대상과 서열 간 예상 유사도에 맞추어 선택해야 합니다. 모든 분석에 하나의 행렬을 일률적으로 적용하는 것은 적절하지 않습니다.
유사도가 높은 단백질 서열을 비교할 때는 BLOSUM80, BLOSUM90, PAM30과 같이 가까운 진화적 관계를 반영하는 행렬을 사용할 수 있습니다.
일반적인 단백질 서열 비교에는 BLOSUM62가 널리 사용됩니다. BLOSUM62는 지나치게 가까운 서열이나 매우 먼 서열에 치우치지 않아 다양한 분석에서 기본값으로 활용됩니다.
진화적으로 거리가 먼 단백질 서열을 비교할 때는 BLOSUM45, BLOSUM50 또는 PAM250과 같은 행렬이 적합할 수 있습니다.
코돈 수준의 변화를 분석하려면 SCHNEIDER와 같은 코돈 기반 행렬을 고려할 수 있습니다.
정렬 결과의 재현성
서열 정렬 결과를 다른 연구자와 공유하거나 동일한 분석을 다시 수행하려면 사용한 설정을 함께 기록해야 합니다.
최소한 다음 정보는 분석 결과와 함께 보존하는 것이 좋습니다.
- Biopython 버전
- 사용한 정렬 알고리즘
- 전역 정렬 또는 지역 정렬 여부
- 대체 행렬의 종류
- 일치 및 불일치 점수
- 공백 열기 점수
- 공백 연장 점수
- 말단 공백 처리 방식
- 입력 서열의 출처와 버전
예를 들어 다음과 같이 분석 조건을 명시할 수 있습니다.
정렬 도구: Bio.Align.PairwiseAligner
정렬 방식: Global Alignment
대체 행렬: BLOSUM62
공백 열기 점수: -10.0
공백 연장 점수: -0.5
Biopython 버전: 분석 환경에 설치된 버전
이러한 정보를 함께 기록하면 동일한 입력 서열에 대해 같은 조건으로 분석을 재현할 수 있습니다.
마무리
Biopython은 외부 정렬 프로그램과 연계하는 기능뿐 아니라 서열 쌍 정렬, 정렬 결과 처리, 대체 행렬 불러오기와 저장 등 서열 비교에 필요한 다양한 기능을 제공합니다.
ClustalW와 MUSCLE은 여러 서열을 동시에 비교하는 다중 서열 정렬에 적합하며, EMBOSS의 needle과 water는 전역 및 지역 서열 쌍 정렬에 활용할 수 있습니다.
Python 내부에서 직접 서열 쌍 정렬을 수행하려면 기존의 pairwise2 모듈이나 최신 PairwiseAligner 클래스를 사용할 수 있습니다. 새로운 분석에서는 처리 효율과 확장성을 고려하여 PairwiseAligner를 우선적으로 사용하는 것이 바람직합니다.
대체 행렬은 정렬 점수와 결과에 큰 영향을 미칩니다. 따라서 DNA, 단백질, 코돈 등 서열의 종류와 예상되는 진화적 거리를 고려하여 적절한 행렬과 공백 점수를 선택해야 합니다.
서열 정렬은 단순히 문자를 나란히 배치하는 과정이 아니라, 생물학적 변화의 가능성을 점수 체계로 표현하고 가장 타당한 대응 관계를 탐색하는 분석 과정입니다. 따라서 정렬 결과를 해석할 때는 사용한 알고리즘과 점수 조건을 함께 고려해야 합니다.
'생명정보학 & 화학정보학 > 바이오파이썬' 카테고리의 다른 글
| Python for Biologists(www.pythonforbiologists.org) (0) | 2026.08.06 |
|---|---|
| EMBOSS에서의 서열정렬 (0) | 2026.07.30 |
| ClustalW와 MUSCLE을 이용한 다중 서열 정렬 (0) | 2026.07.30 |
| 정렬 (Alignment) (0) | 2026.07.30 |
| UPGMA 계통수 (0) | 2023.05.28 |