FastQC·fastp로 시퀀싱 리드 품질검사·트리밍 (NGS Pipelines 1)

TL;DR — NGS 분석 파이프라인은 보통 FASTQ → 품질검사(QC) → 정렬(alignment) → 변이호출(variant calling) 순서로 흐릅니다. 이 글은 그 첫 단계인 QC를 다룹니다. condafastqc·fastp·multiqc를 깔고, 공개 FASTQ로 FastQC (QC 리포트 도구)를 돌려 리포트를 읽는 법을 익힌 뒤, fastp (트리밍 도구)로 어댑터와 저품질 구간을 잘라내고, MultiQC (통합 리포트 도구)로 여러 샘플을 한 장에 모읍니다.

핵심 개념은 품질점수(Phred score)입니다. Q30이면 그 염기를 잘못 읽었을 확률이 1,000분의 1이라는 뜻이고, 이 값이 리드 뒤쪽에서 떨어지거나 어댑터가 섞이면 다음 정렬 단계가 흔들립니다. 그래서 "쓰레기를 넣으면 쓰레기가 나온다(garbage in, garbage out)"는 말 그대로, QC는 파이프라인 전체의 신뢰도를 가르는 첫 단추입니다.

명령은 모두 bash 커맨드라인이고, 데이터는 fastp 저장소에 들어 있는 작은 페어드엔드(paired-end) 테스트 FASTQ를 써서 누구나 그대로 재현할 수 있습니다.

🔗 관련 글  ·  입력 파일 포맷이 낯설다면 FASTQ 파일이란?에서 4줄 구조와 품질점수를 먼저 보고 오세요  ·  시퀀싱 방식 자체가 궁금하면 NGS란? 1·2·3세대 시퀀싱

이 글에서 만들 것

raw FASTQ 한 쌍을 받아서, 품질을 눈으로 확인하고 → 문제 구간을 잘라내고 → 깨끗해진 리드를 다음 단계로 넘길 준비까지 마치는 게 목표입니다. 결과물은 세 가지입니다. FastQC가 만드는 샘플별 HTML 리포트, fastp가 트리밍하면서 함께 뽑아 주는 전후 비교 리포트, 그리고 MultiQC가 이 모두를 묶은 통합 리포트입니다.

왜 QC부터 하느냐면, 시퀀서에서 갓 나온 리드에는 늘 군더더기가 섞여 있기 때문입니다. 리드 끝으로 갈수록 품질점수(Phred score)가 떨어지고, 짧은 DNA 조각을 읽을 땐 삽입물 너머의 어댑터(adapter) 서열까지 읽혀 들어옵니다. 이런 구간을 그대로 두고 정렬하면 잘못 매핑되거나 가짜 변이를 만들어 냅니다. QC는 이 군더더기를 확인(FastQC)하고 제거(fastp)하는 과정입니다.

전체 흐름을 한눈에 정리하면 이렇습니다.

# NGS QC 단계 한눈에 (bash)
conda activate ngs-qc                       # ① 도구 환경 활성화
fastqc R1.fq.gz R2.fq.gz -o fastqc_raw/     # ② 원본 품질검사
fastp -i R1.fq.gz -I R2.fq.gz \             # ③ 어댑터·저품질 트리밍
      -o R1.trim.fq.gz -O R2.trim.fq.gz \
      --detect_adapter_for_pe
fastqc R1.trim.fq.gz R2.trim.fq.gz -o fastqc_trim/   # ④ 트리밍 후 재검사
multiqc . -o multiqc_report/                # ⑤ 모든 리포트 통합

1. 사전 준비 — conda 환경과 샘플 FASTQ

도구는 모두 bioconda 채널에 있습니다. 매번 채널을 지정하지 않아도 되게, 한 번만 채널 우선순위를 설정해 둡니다.

# (최초 1회) conda 채널 설정 — bioconda 도구 설치 준비
conda config --add channels bioconda
conda config --add channels conda-forge
conda config --set channel_priority strict

# QC 전용 환경을 따로 만들어 세 도구를 한 번에 설치
conda create -n ngs-qc -y fastqc fastp multiqc
conda activate ngs-qc

설치가 끝나면 버전을 확인해 둡니다. 글 작성 시점(2026년 중반) 기준으로 FastQC는 0.12.x, fastp는 1.x (논문 기준 fastp 1.0, iMeta 2025), MultiQC는 1.3x 계열입니다.

fastqc --version    # FastQC v0.12.1
fastp  --version    # fastp 1.x
multiqc --version   # multiqc, version 1.35
FastQC v0.12.1
fastp 1.0.1
multiqc, version 1.35
💡 conda가 너무 느리다면 — 의존성 해결이 오래 걸릴 때가 있습니다. 같은 명령을 mamba(C++로 다시 쓴 conda 호환 도구)로 바꾸면 훨씬 빠릅니다. conda install -n base -c conda-forge mamba로 깔고, 위의 conda createmamba create로만 바꿔 쓰면 됩니다.

샘플 데이터는 fastp 저장소에 들어 있는 작은 페어드엔드 테스트 파일을 받습니다. 별도 다운로드 절차나 계정이 필요 없어 재현하기 가장 편합니다.

mkdir -p ~/ngs-qc-demo && cd ~/ngs-qc-demo

# fastp 공식 저장소의 테스트 FASTQ (R1=정방향, R2=역방향)
BASE=https://raw.githubusercontent.com/OpenGene/fastp/master/testdata
wget $BASE/R1.fq -O R1.fq
wget $BASE/R2.fq -O R2.fq

# 도구들은 .gz 압축 입력을 그대로 읽으므로 압축해 둔다 (실전과 동일하게)
gzip -k R1.fq R2.fq      # R1.fq.gz, R2.fq.gz 생성 (-k: 원본 유지)
ls -lh *.fq.gz
📌 실제 공개 데이터(SRA)를 쓰고 싶다면 — NCBI SRA의 작은 run을 받는 표준 도구는 sra-tools입니다. conda install -y sra-toolsprefetch SRR_번호로 받고 fasterq-dump --split-files SRR_번호로 FASTQ로 풉니다. --split-files는 페어드엔드를 R1·R2 두 파일로 나눠 줍니다. 다만 SRA run은 수 GB도 흔하니, 연습 단계에서는 위 테스트 데이터로 흐름을 익힌 뒤 옮겨 가는 편을 권합니다.

페어드엔드 시퀀싱은 DNA 조각 하나를 양쪽 끝에서 한 번씩 읽어 R1(정방향)과 R2(역방향) 두 파일을 만듭니다. 두 파일의 n번째 리드는 같은 조각의 짝이므로, QC와 트리밍에서 항상 쌍으로 다뤄야 합니다. 한쪽만 잘라내 길이가 어긋나면 정렬 단계에서 짝이 깨집니다.

그림 1. NGS 분석 파이프라인 — FASTQ에서 변이호출까지의 표준 흐름. 이 글은 첫 단계인 품질검사(QC)를 다룬다.

2. FastQC 실행과 리포트 해석

FastQC는 FASTQ를 훑어 십여 개 항목으로 품질을 진단하고, 항목마다 통과(초록)·주의(노랑)·실패(빨강) 신호를 단 HTML 리포트를 만듭니다. 실행은 파일을 인자로 주기만 하면 됩니다.

mkdir -p fastqc_raw
# 페어드엔드 두 파일을 동시에 검사 (-t 2 = 스레드 2개로 병렬)
fastqc R1.fq.gz R2.fq.gz -o fastqc_raw/ -t 2
ls fastqc_raw/
R1.fq.gz_fastqc.html   R1.fq.gz_fastqc.zip
R2.fq.gz_fastqc.html   R2.fq.gz_fastqc.zip

.html을 브라우저로 열면 리포트가 보입니다. 입문자가 꼭 읽어야 할 핵심 모듈만 추리면 다음과 같습니다.

모듈 무엇을 보나 어떻게 읽나
Per base sequence quality리드 위치별 품질점수 분포박스플롯이 초록 영역(Q≥28)에 있으면 양호. 뒤쪽이 노랑·빨강으로 내려가면 트리밍 신호
Per sequence quality scores리드 한 개 단위 평균 품질 분포봉우리가 높은 Q값(보통 Q36 이상)에 몰리면 좋음
Per base sequence content위치별 A·T·G·C 비율네 선이 평행하면 정상. 앞쪽 몇 bp가 출렁이는 건 라이브러리 특성(흔함)
Per sequence GC content리드별 GC 함량 분포이론적 정규분포에서 크게 벗어나면 오염·다종 혼입 의심
Sequence duplication levels같은 서열이 몇 번 중복되나중복이 높으면 PCR 과증폭 가능성. RNA-seq은 원래 다소 높음
Overrepresented sequences비정상적으로 많은 서열어댑터·rRNA·오염이 여기 잡힘. 정체를 확인할 단서
Adapter content위치별 어댑터 서열 누적 비율리드 끝에서 선이 솟구치면 어댑터가 섞인 것 → fastp로 제거

가장 먼저 보는 건 Per base sequence quality입니다. 가로축은 리드 안의 염기 위치, 세로축은 품질점수(Phred score)이고, 각 위치의 점수 분포가 박스-수염(box-whisker) 그림으로 그려집니다. 배경이 Q28 이상은 초록, Q20~28은 노랑, Q20 미만은 빨강으로 칠해져 있어서, 박스가 어느 띠에 들어가는지로 한눈에 판단합니다. 일루미나(Illumina) 리드는 뒤쪽으로 갈수록 품질이 떨어지는 게 정상적인 경향이라, 리드 끝이 노랑·빨강으로 내려오면 그 구간을 잘라낼 후보로 봅니다.

여기서 품질점수의 정의를 짚고 가면, Phred 점수 Q는 그 염기를 잘못 읽었을 확률 PQ = −10 × log₁₀P의 관계입니다. 그래서 Q20은 오류확률 1/100(정확도 99%), Q30은 1/1,000(99.9%), Q40은 1/10,000(99.99%)을 뜻합니다. FASTQ 4번째 줄의 ASCII 문자 하나가 염기 하나의 Q값을 담고 있고(요즘 장비는 Phred+33 인코딩), FastQC는 이 값을 위치별로 모아 위 그림을 그립니다. 포맷 자체가 더 궁금하면 FASTQ 파일 구조 글을 참고하세요.

Adapter content도 트리밍 전에 반드시 확인합니다. 시퀀싱할 DNA 조각이 리드 길이보다 짧으면, 조각을 다 읽고 난 뒤 라이브러리 제작에 쓴 어댑터 서열까지 읽혀 들어옵니다. 이 그림에서 리드 끝부분의 어댑터 비율 선이 위로 솟으면 어댑터가 섞였다는 뜻이고, 정렬을 망치기 전에 제거해야 합니다. 바로 그 일을 fastp가 합니다.

그림 2. FastQC의 Per base sequence quality 읽는 법 — 위치별 품질 박스플롯과 Phred 점수(Q)별 오류확률.

3. fastp로 어댑터·저품질 트리밍

fastp는 어댑터 제거, 저품질 구간 잘라내기, 품질 필터링, 리포트 생성을 한 번에 처리하는 도구입니다. C++로 짜여 매우 빠르고, 기본값만으로도 합리적으로 동작하도록 설계돼 있어 입문용으로 좋습니다.

mkdir -p fastp_out
fastp \
  -i R1.fq.gz -I R2.fq.gz \                       # 입력: R1(-i), R2(-I)
  -o fastp_out/R1.trim.fq.gz \                     # 출력: 트리밍된 R1
  -O fastp_out/R2.trim.fq.gz \                     # 출력: 트리밍된 R2
  --detect_adapter_for_pe \                        # 페어드엔드 어댑터 자동 검출
  -q 20 -u 30 \                                    # 품질필터: Q20 미만 염기가 30% 넘으면 리드 제거
  -l 30 \                                          # 길이필터: 트리밍 후 30bp 미만이면 버림
  -j fastp_out/fastp.json -h fastp_out/fastp.html  # 리포트: JSON + HTML
Read1 before filtering:
total reads: 100
total bases: 15000
Q20 bases: 14637(97.58%)  Q30 bases: 14116(94.1067%)

Read1 after filtering:
total reads: 98
total bases: 14246
Q20 bases: 14010(98.3434%)  Q30 bases: 13567(95.2338%)

Filtering result:
reads passed filter: 196
reads with adapter trimmed: 24
...
fastp v1.0.1, time used: 1 seconds

옵션을 하나씩 보면, 핵심은 --detect_adapter_for_pe입니다. fastp는 페어드엔드 데이터에서 R1과 R2의 겹침(overlap)을 분석해 어댑터를 자동으로 찾아내므로, 어댑터 서열을 직접 적어 줄 필요가 없습니다(서열을 알면 --adapter_sequence로 지정도 가능). 품질 필터는 -q 20(품질점수 Q20을 합격 기준으로)과 -u 30(Q20 미만 염기가 30%를 넘는 리드는 통째로 제거)이 함께 작동하고, -l 30은 트리밍 후 너무 짧아진 리드를 버려 정렬 단계의 잡음을 줄입니다. 출력에서 reads with adapter trimmed 줄이 실제로 어댑터가 잘려 나간 리드 수입니다.

fastp가 만든 fastp.html을 열면 트리밍 전후를 나란히 보여 줍니다. 필터링 전후 리드 수, Per-base 품질 곡선, 어댑터가 잘려 나간 비율이 한 장에 정리돼 있어, "무엇을 얼마나 잘라냈는지"를 바로 확인할 수 있습니다. 트리밍이 잘됐다면 after 곡선이 before보다 끝부분에서 위로 올라와 있어야 합니다.

확인 차원에서 트리밍된 파일을 FastQC로 다시 돌려, 어댑터 신호가 사라지고 끝부분 품질이 올라갔는지 봅니다.

mkdir -p fastqc_trim
fastqc fastp_out/R1.trim.fq.gz fastp_out/R2.trim.fq.gz -o fastqc_trim/ -t 2
📌 트리밍을 과하게 하지 말 것 — 품질 기준을 너무 빡빡하게 잡으면(예: Q30 컷, 긴 강제 절단) 멀쩡한 염기까지 버려 커버리지가 줄고, 짧아진 리드가 오히려 잘못 매핑되기도 합니다. 대부분의 일반 분석에서는 fastp 기본값에 가깝게(Q15~20, 어댑터 자동 검출) 쓰는 편이 안전합니다. 변이호출처럼 품질에 민감한 분석만 기준을 따로 조정합니다.
그림 3. fastp 트리밍 전후 — 어댑터를 제거하고 저품질 끝구간을 잘라내면 품질 곡선이 평탄해진다.

4. MultiQC로 여러 샘플 통합

샘플이 둘만 돼도 FastQC 리포트를 하나씩 여는 건 번거롭습니다. MultiQC는 폴더를 훑어 FastQC·fastp 같은 도구들의 결과 파일을 자동으로 찾아 하나의 HTML 리포트로 묶어 줍니다. 명령은 "현재 폴더(.)를 스캔하라"가 전부입니다.

# 현재 폴더 아래의 모든 QC 결과(fastqc_raw, fastqc_trim, fastp_out)를 한 장으로
multiqc . -o multiqc_report/
  /// MultiQC 🔍 | v1.35

  search_files | Search path: ~/ngs-qc-demo
    fastqc | Found 4 reports
    fastp  | Found 1 report
  write_results | Report : multiqc_report/multiqc_report.html
  write_results | Data    : multiqc_report/multiqc_data/

multiqc_report.html을 열면 모든 샘플의 품질 지표가 표와 겹쳐 그린 곡선으로 정리됩니다. 샘플이 수십 개로 늘어나도 "어떤 샘플이 유독 품질이 나쁜가"를 한눈에 짚어낼 수 있어서, 실전 파이프라인에서 사실상 표준처럼 쓰입니다. 트리밍 전(fastqc_raw)과 후(fastqc_trim)를 같은 리포트에서 비교하면 트리밍 효과가 더 분명히 드러납니다.

5. 에러 FAQ

  • java: command not found 또는 FastQC 실행 불가 — FastQC는 자바(Java)로 동작합니다. conda로 설치하면 의존성으로 자바도 함께 깔리지만, 시스템에 직접 설치한 경우 자바가 없을 수 있습니다. conda install -y openjdk로 해결하거나, 애초에 위처럼 conda 환경에 FastQC를 설치하세요.
  • FastQC OutOfMemoryError(자바 힙 부족) — 리드가 아주 길거나 파일이 매우 클 때 납니다. fastqc --memory 2048 ...처럼 모듈당 메모리(MB)를 늘려 주거나, 입력을 나눠서 처리합니다.
  • 품질점수가 이상하게 보임(인코딩 문제) — 2011년 이전 아주 오래된 일루미나 데이터는 Phred+64 인코딩을 쓰기도 했습니다. 요즘 장비는 모두 Phred+33이라 보통 문제없지만, 옛 데이터의 품질이 비정상으로 보이면 인코딩을 의심하세요. fastp는 --phred64 옵션으로 옛 인코딩을 받아 자동 변환합니다.
  • 페어드엔드인데 한쪽만 트리밍 / 짝이 깨짐 — R1만 잘라내고 R2를 그대로 두면 두 파일의 리드 수가 어긋나 정렬이 실패합니다. fastp에 -i/-I, -o/-O두 파일을 함께 넘기면 짝을 유지한 채 처리하니, 페어드엔드는 항상 4개 인자를 모두 주세요.
  • MultiQC가 리포트를 못 찾음(No analysis results found) — 스캔 경로에 결과 파일이 없거나, FastQC .zip을 지워 버린 경우입니다. MultiQC는 FastQC의 .zip을 파싱하므로 지우지 말고, 결과 폴더들이 들어 있는 상위 폴더에서 multiqc .을 실행하세요.

6. 다음 단계 — 정렬(alignment)로

여기까지 하면 깨끗하게 트리밍된 R1.trim.fq.gz·R2.trim.fq.gz가 손에 들어옵니다. 이게 NGS 파이프라인 두 번째 단계인 정렬(alignment)의 입력입니다. 트리밍된 리드를 참조 유전체(reference genome)에 맞춰 붙이면, 각 리드가 유전체 어디에서 왔는지가 정해지고 결과는 SAM/BAM 파일로 저장됩니다.

DNA 리드는 BWABowtie2로, 인트론을 건너뛰며 붙여야 하는 RNA-seq 리드는 STARHISAT2 같은 splice-aware 정렬기로 매핑합니다. 정렬이 끝난 BAM을 다시 한번 QC하고(중복 제거·정렬 품질 점검), 그 위에서 변이호출(variant calling)이나 발현 정량(quantification)으로 나아가는 게 표준 흐름입니다. QC에서 군더더기를 제대로 걷어냈다면, 이후 단계의 결과가 한결 깨끗해집니다.

요약하면 이렇습니다.

  • QC는 파이프라인의 첫 단추 — FASTQ를 정렬에 넘기기 전에 품질을 확인(FastQC)하고 군더더기를 제거(fastp)한다. 여기서 흘린 잡음은 뒤 단계에서 가짜 신호가 된다.
  • 품질점수(Phred score)를 읽을 줄 알아야 한다Q30 = 오류확률 1/1,000. FastQC의 Per base quality와 Adapter content가 가장 먼저 볼 두 그림이다.
  • fastp는 자동·올인원--detect_adapter_for_pe 하나로 어댑터를 자동 검출하고, 품질·길이 필터와 전후 리포트를 한 번에 처리한다. 기본값에 가깝게 쓰는 게 안전하다.
  • MultiQC로 통합 — 샘플이 늘면 multiqc . 한 줄로 모든 리포트를 한 장에 모아 이상 샘플을 빠르게 잡는다.
  • 페어드엔드는 항상 쌍으로 — R1·R2를 함께 트리밍해야 짝이 깨지지 않는다.

References

  1. Andrews, S. FastQC: A Quality Control Tool for High Throughput Sequence Data. Babraham Bioinformatics (공식 도구 페이지·도움말).
  2. Chen, S. (2025). fastp 1.0: an ultra-fast all-round tool for FASTQ data quality control and preprocessing. iMeta, 4(5), e70078. (fastp 원논문)
  3. Chen, S., Zhou, Y., Chen, Y., & Gu, J. (2018). fastp: an ultra-fast all-in-one FASTQ preprocessor. Bioinformatics, 34(17), i884–i890. (fastp 최초 논문)
  4. Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics, 32(19), 3047–3048. (MultiQC 원논문)
  5. OpenGene/fastp GitHub repository. github.com/OpenGene/fastp (사용법·테스트 데이터).
  6. MultiQC documentation. docs.seqera.io/multiqc (설치·실행).

Pipette & Pipeline · A bio portfolio journal

이 글을 쓴 사람 Yumingming

생명융합공학과 박사과정.
Microbiome · Cosmetics · RNA Therapeutics · Bioinformatics를 공부하며,
실험(Wet Lab)과 데이터(Dry Lab)를 잇는 글을 논문(article) 기반으로 씁니다.

About · 더 알아보기 →

⚕️ 이 글은 학습·정보 제공 목적이며, 의학적 진단·치료·조언을 대체하지 않습니다. 건강·질병·치료에 관한 결정은 반드시 의사 등 전문가와 상의하세요. 자세한 내용은 면책조항을 참고해 주세요.