BioPlayground

🧬
목록으로

GC 비율과 종 판별: 알파벳 네 글자의 통계학이 종을 구별합니다

왜 스트렙토마이세스는 GC 70%인데 대장균은 50%인가. GC 비율이 종 판별의 첫 지표가 되는 이유를 진화적 · 물리화학적으로 유도하고, Rosalind GC 문제를 실제로 풀어봅시다.

입문
|
15
|
검증 완료 (2026-07-19)
GC contentcodon biasspecies identificationmetagenomics
진행률0/34 (0%)

왜 이 편이 필요한가

M01에서 DNA는 네 글자짜리 유한 알파벳 문자열이라고 했습니다. M03에서 두 서열의 차이를 재는 해밍 거리를 다뤘습니다. 이번 편은 한 걸음 물러서서, 한 서열 안의 네 글자 분포 자체가 정보를 담고 있다는 사실을 봅시다.

가장 유용한 요약이 GC 비율(GC content) 입니다. 서열 안에 G와 C가 차지하는 비율입니다. 놀랍게도 이 하나의 숫자만으로도 종을 상당 부분 구별할 수 있습니다. 마이크로바이옴 · 메타게노믹스 · 미확인 서열의 종 판별 첫 단서로 지금도 쓰입니다.

정의 — 딱 한 줄

GC%=G+CA+C+G+T×100\text{GC\%} = \frac{|G| + |C|}{|A| + |C| + |G| + |T|} \times 100

파이썬으로 옮기면 이렇습니다.

python
def gc_content(dna: str) -> float:
dna = dna.upper()
gc = sum(1 for c in dna if c in "GC")
total = sum(1 for c in dna if c in "ACGT") # N 문자는 제외
return 100.0 * gc / total if total else 0.0
# 예시
print(gc_content("AGCTATAG")) # 37.5

이걸로 Rosalind GC 문제의 뼈대가 완성됩니다. 문제 자체는 여러 서열 중 GC 비율이 가장 높은 서열을 찾는 것입니다.

왜 종마다 GC 비율이 다른가

이 지점에서 잠깐 놀랄 만한 관찰이 있습니다. 생물 종의 GC 비율은 20%에서 75%까지 넓게 퍼져 있습니다. 몇 가지 예시입니다.

GC 비율서식 특징
Plasmodium falciparum (말라리아 원충)19%열대
Mycobacterium leprae (나병균)58%인간 세포 내
Escherichia coli (대장균)51%온화, 다양
인간 (전체 게놈 평균)41%온화
Streptomyces coelicolor (토양 미생물)72%다양한 스트레스
Deinococcus radiodurans (방사선 저항균)67%극한 (방사선)

이 분포에는 여러 이유가 얽혀 있습니다.

이유 1: 물리적 안정성

G-C 결합은 3개의 수소 결합입니다. A-T 결합은 2개입니다. 그래서 G-C가 많을수록 DNA 이중 나선이 열에 안정적입니다. 고온 환경에서 사는 극한 미생물(hyperthermophile)의 GC 비율이 높은 경향이 부분적으로 여기서 옵니다. 다만 이건 상관관계일 뿐 완벽한 규칙은 아닙니다(예외가 많습니다).

이유 2: 코돈 사용 편향 (Codon Usage Bias)

같은 아미노산을 코딩하는 여러 코돈 중 어느 걸 쓸지는 종마다 다릅니다. GC 비율이 높은 종은 세 번째 위치(wobble position)에 G/C가 많은 코돈을 선호합니다. 이건 tRNA 풀 · 리보솜 부하 · 번역 속도와 얽혀 있습니다. 인간과 대장균이 같은 유전자를 다른 코돈 편향으로 발현하는 이유이기도 합니다.

이유 3: DNA 수복 편향

DNA 손상 수복 시 A-T가 G-C로 또는 그 반대로 변환되는 확률이 대칭이 아닙니다. 종의 수복 시스템 특성이 장기적으로 GC 비율을 밀거나 당깁니다. 이건 최근 20년 사이에 정리된 이론입니다.

Rosalind GC를 풀어봅시다

Rosalind GC의 문제입니다.

여러 DNA 서열이 FASTA 형식으로 주어집니다. 이 중 GC 비율이 가장 높은 서열의 ID와 GC 비율을 출력하세요.

FASTA 형식이 처음 나옵니다. 이렇게 생겼습니다.

text
>Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG
>Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC

파일 파싱을 포함한 완전한 풀이입니다.

python
def parse_fasta(text: str) -> dict[str, str]:
"""FASTA 문자열을 {id: sequence} 딕셔너리로 변환."""
records = {}
current_id = None
for line in text.strip().splitlines():
if line.startswith(">"):
current_id = line[1:].strip()
records[current_id] = ""
elif current_id:
records[current_id] += line.strip()
return records
def solve_rosalind_gc(fasta_text: str) -> tuple[str, float]:
records = parse_fasta(fasta_text)
best_id, best_gc = max(
records.items(),
key=lambda kv: gc_content(kv[1])
)[0], max(gc_content(seq) for seq in records.values())
return best_id, best_gc
# 사용
with open("rosalind_gc.txt") as f:
id_, gc = solve_rosalind_gc(f.read())
print(f"{id_}\n{gc:.6f}")

FASTA 파서를 한 번 만들어두면 이후 편의 실습에서 반복해서 씁니다. Biopython의 SeqIO.parse가 더 정교한 파서를 제공합니다만, 원리를 이해하기 위해 이번 편에서 손으로 짜봅시다.

실제 응용 — 메타게노믹스에서의 GC 비율

메타게노믹스는 환경 시료(토양 · 물 · 장내 미생물 등)에서 뽑아낸 여러 종이 섞인 DNA를 다룹니다. 여기서 GC 비율이 종 구성을 파악하는 첫 지표입니다.

  • contig별 GC 비율 히스토그램을 그리면 대개 여러 개의 봉우리가 보입니다.
  • 각 봉우리가 특정 미생물 종(또는 계통)의 게놈에 해당합니다.
  • Kraken2 · MetaPhlAn (S24 편에서 자세히) 같은 도구가 이 원리와 k-mer 매핑을 결합해 종을 판별합니다.

한 편만 더 앞서 말하면, DNA 바코딩(DNA barcoding) 도 이 사고의 확장입니다. 종 특이적인 짧은 유전자(예: 16S rRNA)의 GC 비율과 서열 패턴으로 미생물 종을 식별합니다.

자주 만나는 실무 함정

  • 저복잡도 영역 무시: 반복 서열(예: GCGCGCGC…)이 있으면 GC 비율이 왜곡됩니다. 계산 전 저복잡도 마스킹(RepeatMasker · dustmasker)을 고려합시다.
  • N 문자 처리: 위 코드는 N을 제외했습니다. 다른 정책(N을 각각 0.25로 셈)도 가능합니다. 파이프라인 문서에 명시합시다.
  • 윈도우 크기: 게놈 전체 평균 GC와 100bp 슬라이딩 윈도우 GC는 완전히 다릅니다. 시퀀싱 커버리지 편향 · 유전자 예측 · CpG island 검출에서 윈도우 GC가 중요합니다.
  • Illumina의 GC 편향: 짧은 리드 시퀀서는 극단적 GC 영역(20% 이하 또는 80% 이상)에서 커버리지가 떨어집니다. GATK의 CollectGcBiasMetrics로 확인할 수 있습니다(S07 편의 소재).

CS 매핑

  • 문자 빈도 특징 벡터: GC 비율은 네 글자 알파벳의 특징 벡터 축소본입니다. 자연어 처리에서 TF(term frequency)를 이용한 문서 분류와 같은 아이디어입니다.
  • 나이브 베이즈 종 판별: 실제로 k-mer(길이 k짜리 연속 부분 서열) 빈도 벡터로 나이브 베이즈 분류기를 만들면 종 판별 정확도가 크게 오릅니다. 이후 편(M13 접미사 트리 · S24 Kraken2)의 뿌리입니다.
  • 엔트로피와 정보량: 서열의 GC 편향은 단순 GC 비율 하나로 요약되지 않습니다. Shannon 엔트로피 H(x)=pilogpiH(x) = -\sum p_i \log p_i로 정보량을 재면 더 정밀한 종 특이성이 나옵니다. 정보 이론이 바이오에 들어오는 첫 지점입니다.

다음 편으로 이어지는 갈래

  • 다음 편 (M05): 역상보 서열 — 왜 반대 가닥의 GC 비율이 같은가(대칭성).
  • 두 편 뒤 (M06): Needleman-Wunsch — 두 서열의 정렬. GC 비율이 정렬 점수 매개변수 튜닝에 영향을 줍니다.
  • 여덟 편 뒤 (M13): 접미사 트리 · 배열 — k-mer 인덱싱의 자료구조.
  • 스물세 편 뒤 (S24): Kraken2 · MetaPhlAn — GC 비율을 확장한 k-mer 기반 종 분류.

더 깊게 파고 싶다면

본문은 BPD가 자체 재구성한 서술입니다. 심화는 아래로.

  • Harvard STAT115 — Xiaole Shirley Liu 교수의 Week 2: Nucleotide Composition and Codon Bias (자막 완비, 자동 번역 우수). 코돈 편향과 GC 비율의 관계를 상세히 다룹니다.
  • 참고 무료 웹북: NCBI Bookshelf — GC Content and Genome Evolution. 개관 수준으로 편안하게 읽힙니다.
  • 원 논문: Bernardi, G. (2000), Isochores and the evolutionary genomics of vertebrates, Gene 241, 3–17. 척추동물 GC 이소코어 개념의 정통.
  • 참고 도구: Biopython (Bio.SeqUtils.GC) — 실무에서 GC 계산은 이 함수 한 줄이면 됩니다. 지금은 원리 이해를 위해 손으로 짜본 것.
  • EMBL-EBI TrainingMetagenomics: Understanding Microbial Community (자막 자동 번역 우수). S24 편의 다리.

Rosalind에서 GC · REVC · PROT를 이어서 풀어봅시다. 그리고 관심 있는 미생물 두 종의 게놈을 NCBI에서 다운받아 GC 비율을 계산해보고, 히스토그램(100bp 슬라이딩 윈도우)을 그려봅시다. 다음 편 M05의 역상보 서열이 왜 대칭적으로 같은 GC 비율을 갖는지 자연스레 이해됩니다.