Code Bench/Microbiome Tools 2 posts

  • Phyloseq로 마이크로바이옴 분석하기 — QIIME2 결과를 R에서 다양성·조성으로 시각화
    Code Bench/Microbiome Tools

    Phyloseq로 마이크로바이옴 분석하기 — QIIME2 결과를 R에서 다양성·조성으로 시각화

    그림 1. phyloseq 객체 = ASV 테이블·분류·메타데이터·계통수 네 구성요소를 하나로 통합 → 알파·베타·조성 분석. (직접 그린 도식)이 글에서 만들 것 — 앞선 QIIME2 글에서 만든 .qza 결과를 R의 phyloseq로 가져와, 마이크로바이옴 분석의 대표 그림 세 가지(알파 다양성 박스플롯 · 베타 다양성 PCoA · 분류군 조성 막대그래프)를 직접 그립니다. QIIME2가 데이터를 만드는 단계라면, phyloseq는 그걸 R에서 자유롭게 분석·시각화하는 단계입니다. 설치부터 그림까지 코드 한 줄마다 한글 설명을 붙였습니다.🔗 관련 글 · 데이터 만들기(앞 단계): QIIME2로 시작하는 16S rRNA 분석 · 기본 개념: 마이크로바이옴 입문1. phyloseq가 뭔가요?ph..

    2026.05.31 · 💬
  • QIIME2로 시작하는 16S rRNA 마이크로바이옴 분석 — Docker 설치부터 Diversity까지
    Code Bench/Microbiome Tools

    QIIME2로 시작하는 16S rRNA 마이크로바이옴 분석 — Docker 설치부터 Diversity까지

    그림 1. QIIME2 16S rRNA 분석 4단계 — Import (.qza) → DADA2 (ASV) → Diversity (alpha·beta) → Taxonomy (bar plot). (직접 그린 도식)이 글에서 만들 것 — 마이크로바이옴 분석의 사실상 표준 도구인 QIIME2 2026.1을 Docker로 5분 만에 띄우고, 공식 Moving Pictures 튜토리얼 데이터로 원시 FASTQ → ASV 테이블 → 알파·베타 다이버시티 → 분류군 바 플롯까지 한 번에 돌립니다. 한국어 자료가 거의 없는 영역인 만큼, 명령어 한 줄마다 한글 설명을 붙였고 자주 막히는 지점은 따로 정리했습니다. 앞서 마이크로바이옴 시리즈에서 다룬 개념·과학·산업을, 이번 글로 실제 데이터 분석까지 잇습니다.🔗 관련 ..

    2026.05.28 · 💬

Phyloseq로 마이크로바이옴 분석하기 — QIIME2 결과를 R에서 다양성·조성으로 시각화

그림 1. phyloseq 객체 = ASV 테이블·분류·메타데이터·계통수 네 구성요소를 하나로 통합 → 알파·베타·조성 분석. (직접 그린 도식)
이 글에서 만들 것앞선 QIIME2 글에서 만든 .qza 결과를 R의 phyloseq로 가져와, 마이크로바이옴 분석의 대표 그림 세 가지(알파 다양성 박스플롯 · 베타 다양성 PCoA · 분류군 조성 막대그래프)를 직접 그립니다. QIIME2가 데이터를 만드는 단계라면, phyloseq는 그걸 R에서 자유롭게 분석·시각화하는 단계입니다. 설치부터 그림까지 코드 한 줄마다 한글 설명을 붙였습니다.
🔗 관련 글  ·  데이터 만들기(앞 단계): QIIME2로 시작하는 16S rRNA 분석  ·  기본 개념: 마이크로바이옴 입문

1. phyloseq가 뭔가요?

phyloseq는 마이크로바이옴 데이터를 R에서 다루는 사실상 표준 패키지입니다(McMurdie & Holmes, 2013). 핵심은 흩어진 네 가지 정보를 하나의 객체로 묶는다는 점입니다.

구성요소함수내용
OTU/ASV 테이블otu_table()시료 × ASV 개수 행렬(누가 얼마나 있나)
분류표tax_table()ASV별 분류(Kingdom…Species)
시료 메타데이터sample_data()시료 정보(부위·시점·그룹 등)
계통수phy_tree()ASV 간 진화적 거리(UniFrac에 필요)

이 넷이 한 객체(ps) 안에 들어 있으니, 시료를 거르거나 분류 수준을 바꾸면 네 정보가 항상 같이 움직입니다. 행과 이름을 일일이 맞추던 수작업이 사라지는 게 phyloseq의 진짜 이점입니다.

QIIME2와의 분업도 분명합니다. QIIME2가 원시 FASTQ를 ASV 테이블·계통수·분류까지 만들어 주면, phyloseq는 그 결과를 받아 ggplot2 기반의 유연한 그림과 통계로 잇습니다. R 시각화라는 점에서, 앞서 다룬 Volcano plot 글과 같은 ggplot2 계열입니다.

2. 사전 준비 — 설치

phyloseq는 CRAN이 아니라 Bioconductor에 있습니다. R(또는 RStudio)에서 한 번만 설치하면 됩니다.

# 1) Bioconductor에서 phyloseq 설치 (최초 1회)
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("phyloseq")

# 2) qiime2R: QIIME2 .qza를 phyloseq로 변환 (GitHub 배포)
if (!requireNamespace("remotes", quietly = TRUE))
  install.packages("remotes")
remotes::install_github("jbisanz/qiime2R")

# 3) 함께 쓰면 좋은 패키지 (통계·그림)
install.packages(c("vegan", "ggplot2"))
왜 Bioconductor인가요? Bioconductor는 생물정보 R 패키지의 전용 저장소입니다. install.packages()(CRAN)로는 phyloseq가 안 깔리니, 반드시 BiocManager::install()을 쓰세요.

3. 단계별 실행

QIIME2 글의 산출물 네 개(table.qza, rooted-tree.qza, taxonomy.qza, sample-metadata.tsv)가 한 폴더에 있다고 가정합니다. 그 폴더에서 R을 띄우세요.

STEP 1 — QIIME2 결과를 phyloseq로 가져오기

qiime2R::qza_to_phyloseq() 한 번으로 네 파일이 하나의 phyloseq 객체가 됩니다.

library(phyloseq); library(qiime2R); library(ggplot2)

ps <- qza_to_phyloseq(
  features = "table.qza",          # ASV 테이블 (시료 × ASV)
  tree     = "rooted-tree.qza",    # 계통수
  taxonomy = "taxonomy.qza",       # 분류
  metadata = "sample-metadata.tsv" # 시료 메타데이터
)
ps

STEP 2 — 객체 들여다보기

phyloseq 객체는 "몇 개 ASV × 몇 개 시료"로 요약됩니다. 본격 분석 전에 구조부터 확인합니다.

ps                      # 요약: ASV 수 × 시료 수 + 보유 구성요소
ntaxa(ps)               # ASV 개수
nsamples(ps)            # 시료 개수
rank_names(ps)          # 분류 수준 (Kingdom … Species)
sample_variables(ps)    # 메타데이터 열 이름 (body-site 등)
otu_table(ps)[1:5, 1:5] # ASV 테이블 일부 미리보기

STEP 3 — 전처리·필터링

분류가 안 됐거나 극히 드문 ASV는 잡음입니다. 솎아내고, 조성 그림용 상대풍부도 사본도 만들어 둡니다.

# 0) 메타데이터 열 이름 정리 (하이픈 등 → R 친화적: body-site → body.site)
colnames(sample_data(ps)) <- make.names(colnames(sample_data(ps)))

# 1) Phylum이 비었거나 미분류인 ASV 제거
ps <- subset_taxa(ps, !is.na(Phylum) & Phylum != "")

# 2) 저빈도 ASV 제거: 전체 합이 5 미만이면 버림
ps <- prune_taxa(taxa_sums(ps) >= 5, ps)

# 3) 상대풍부도(비율)로 변환한 사본 (조성·오디네이션용)
ps_rel <- transform_sample_counts(ps, function(x) x / sum(x))
왜 상대풍부도인가요? 시료마다 총 read 수가 달라서, 개수를 그대로 비교하면 깊게 읽은 시료가 무조건 커 보입니다. 합을 1(=100%)로 맞추면 비로소 구성 비율을 비교할 수 있습니다.

STEP 4 — 알파 다양성 (한 시료 안의 다양성)

plot_richness() 한 줄이면 시료 부위별 다양성 박스플롯이 나옵니다.

plot_richness(ps, x = "body.site", color = "body.site",
              measures = c("Observed", "Shannon")) +
  geom_boxplot(alpha = 0.6) +
  theme_bw()

# 통계 검정: Shannon 다양성이 부위별로 다른가? (비모수)
rich <- estimate_richness(ps, measures = c("Observed", "Shannon"))
meta <- data.frame(sample_data(ps))
kruskal.test(rich$Shannon ~ meta$body.site)

Observed는 관측된 ASV 수(풍부도), Shannon은 종 수와 균등도를 함께 본 지표입니다. 부위별로 분포가 갈리면, 크러스컬-월리스 검정의 p값으로 그 차이가 우연인지 가늠합니다.

STEP 5 — 베타 다양성·오디네이션 (시료들 사이의 차이)

베타 다양성은 시료 간 군집 거리를 2차원으로 펼쳐 봅니다. 가장 흔한 조합이 Bray-Curtis 거리 + PCoA입니다.

# Bray-Curtis 거리 → PCoA 좌표
ord <- ordinate(ps_rel, method = "PCoA", distance = "bray")

plot_ordination(ps_rel, ord, color = "body.site") +
  geom_point(size = 3) +
  stat_ellipse() +          # 그룹별 신뢰타원
  theme_bw()

# 군집 차이 통계 검정: PERMANOVA
library(vegan)
bray <- phyloseq::distance(ps_rel, method = "bray")
adonis2(bray ~ body.site, data = data.frame(sample_data(ps_rel)))
그림 2. 베타 다양성 PCoA (Bray-Curtis) — 시료 부위별로 군집이 분리되며, PERMANOVA로 유의성을 검정. (예시 도식)

PCoA에서 같은 부위 점들이 모이고 다른 부위와 떨어지면, 군집이 부위에 따라 다르다는 뜻입니다. 그 분리가 통계적으로 유의한지는 PERMANOVA(adonis2)의 p값으로 확인합니다. 그림과 검정을 짝으로 보고하는 게 표준입니다.

STEP 6 — 분류군 조성 막대그래프

"무엇이 얼마나 있나"는 막대그래프로 봅니다. 잘게 쪼개지지 않도록 문(Phylum) 수준으로 합쳐 그립니다.

# 문(Phylum) 수준으로 합치기
ps_phylum <- tax_glom(ps_rel, taxrank = "Phylum")

plot_bar(ps_phylum, x = "body.site", fill = "Phylum") +
  geom_bar(stat = "identity", position = "stack") +
  labs(y = "상대 풍부도") +
  theme_bw()
그림 3. 분류군 조성 막대그래프 — 문(Phylum) 수준 상대 풍부도를 시료 부위별로 비교. (예시 도식)

tax_glom은 같은 문에 속한 ASV를 하나로 묶어, 막대가 수백 조각으로 부서지는 걸 막아 줍니다. 속(Genus) 수준이 보고 싶으면 taxrank = "Genus"로 바꾸고, 상위 몇 개만 남기면 더 읽기 쉽습니다.

4. 자주 발생하는 에러와 해결법

증상원인 / 해결
qza_to_phyloseq 오류.qza 경로·이름 확인. QIIME2 버전 차이로 막히면 remotes::install_github("jbisanz/qiime2R")로 최신화.
body.site 열을 못 찾음R이 하이픈을 .로 바꿉니다. STEP 3의 make.names()를 먼저 돌리고, sample_variables(ps)로 실제 이름을 확인하세요.
PCoA 점이 다 겹침상대풍부도(ps_rel)로 거리 계산했는지 확인. 시료 수가 너무 적으면 분리가 약합니다.
막대가 수백 조각으로 부서짐tax_glom으로 상위 수준(Phylum·Genus)에서 합치고, 상위 N개만 표시하세요.
UniFrac 거리 오류계통수가 없어서입니다. import에 rooted-tree.qza를 넣었는지 확인. 없으면 Bray-Curtis 같은 비계통 거리를 쓰세요.
그림 저장 시 한글 깨짐ggsave()에서 device = cairo_pdf를 쓰거나 한글 폰트를 지정하세요.

5. 확장 / 응용

① microViz — 더 쉬운 현대적 래퍼 — phyloseq를 감싼 microViz(2021~)는 ord_explore()로 오디네이션을 인터랙티브하게 탐색하고, comp_barplot()으로 조성 그림을 깔끔하게 뽑습니다. 입문자에게 특히 편합니다.

② 차등 풍부도 — 조성 데이터의 함정 — "어떤 균이 그룹 간에 유의하게 다른가"는 일반 검정으로 다루면 안 됩니다. 마이크로바이옴은 합이 1인 조성(compositional) 데이터라서요. phyloseq_to_deseq2()로 DESeq2에 넘기거나, QIIME2 글에서 본 ANCOM-BC를 씁니다.

③ rarefaction 논쟁 — 시료마다 깊이를 통일하는 rarefying은 McMurdie & Holmes(2014)가 "정보를 버린다"며 비판했지만, 알파·베타 다양성에서는 여전히 흔히 씁니다. 정답보다는 분석 목적에 맞춰 택하는 영역입니다.

④ 차세대 객체 — mia / TreeSummarizedExperiment — Bioconductor는 phyloseq의 뒤를 잇는 TreeSummarizedExperiment 생태계(mia 패키지)로 옮겨 가는 중입니다. makeTreeSummarizedExperimentFromPhyloseq()로 변환해 양쪽을 오갈 수 있습니다.

6. References

  1. McMurdie, P. J., & Holmes, S. (2013). phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data. PLoS ONE, 8(4), e61217.
  2. McMurdie, P. J., & Holmes, S. (2014). Waste not, want not: why rarefying microbiome data is inadmissible. PLoS Computational Biology, 10(4), e1003531.
  3. Bisanz, J. E. (2018). qiime2R: Importing QIIME2 artifacts and associated data into R sessions. GitHub: jbisanz/qiime2R.
  4. Oksanen, J., et al. vegan: Community Ecology Package (R). (PERMANOVA / adonis2)
  5. Barnett, D. J. M., Arts, I. C. W., & Penders, J. (2021). microViz: an R package for microbiome data visualization and statistics. Journal of Open Source Software, 6(63), 3201.
  6. Bolyen, E., et al. (2019). Reproducible, interactive, scalable and extensible microbiome data science using QIIME 2. Nature Biotechnology, 37, 852–857.

Pipette & Pipeline · A bio portfolio journal — bridging research, data, and industry.

이 글을 쓴 사람 Yumingming

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

About · 더 알아보기 →

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

QIIME2로 시작하는 16S rRNA 마이크로바이옴 분석 — Docker 설치부터 Diversity까지

그림 1. QIIME2 16S rRNA 분석 4단계 — Import (.qza) → DADA2 (ASV) → Diversity (alpha·beta) → Taxonomy (bar plot). (직접 그린 도식)
이 글에서 만들 것 — 마이크로바이옴 분석의 사실상 표준 도구인 QIIME2 2026.1Docker로 5분 만에 띄우고, 공식 Moving Pictures 튜토리얼 데이터로 원시 FASTQ → ASV 테이블 → 알파·베타 다이버시티 → 분류군 바 플롯까지 한 번에 돌립니다. 한국어 자료가 거의 없는 영역인 만큼, 명령어 한 줄마다 한글 설명을 붙였고 자주 막히는 지점은 따로 정리했습니다. 앞서 마이크로바이옴 시리즈에서 다룬 개념·과학·산업을, 이번 글로 실제 데이터 분석까지 잇습니다.
🔗 관련 글  ·  기본 개념: 마이크로바이옴 입문  ·  산업 측면: 마이크로바이옴 화장품, 과학이 마케팅을 따라가는 시장

1. QIIME2가 뭔가요?

QIIME2 (Quantitative Insights Into Microbial Ecology 2)는 마이크로바이옴(특히 16S rRNA 같은 마커유전자 amplicon) 분석의 국제 표준 파이프라인입니다. 입력은 시퀀서가 뱉어 낸 FASTQ(앞선 FASTQ 입문 참고)이고, 출력은 군집 구성·다이버시티·통계·시각화까지 한 줄로 이어집니다.

다른 도구와 비교하면 자리매김이 또렷합니다.

도구성격특징
QIIME2통합 파이프라인전 단계(import→denoise→tree→diversity→taxonomy) 한 우산. 결과는 .qza/.qzv 표준 객체
Mothur통합 파이프라인C++ 기반. 명령어 체계가 다르고 커뮤니티 색이 다름
DADA2 (R)디노이징 단일R 패키지. QIIME2 안에서도 디노이저로 호출됨
phyloseq (R)분석·시각화QIIME2 결과를 R로 받아 추가 분석

QIIME2의 진짜 강점은 재현성입니다. 모든 입력·출력이 메타데이터를 품은 단일 파일(.qza, .qzv)이라 누가 언제 어떤 버전으로 만들었는지가 파일 안에 기록됩니다. 학술적으로도 산업적으로도 신뢰가 가는 이유입니다.

2. 사전 준비 — Docker 한 줄 설치

QIIME2 설치는 conda로도 되지만, 의존성 충돌이 잦습니다. Docker가 제일 깔끔합니다. OS와 무관하게 같은 결과를 보장합니다.

Docker 데스크톱 설치

설치 후 확인:

docker --version
# 예: Docker version 27.x.x, build ...

QIIME2 이미지 받기

공식 Amplicon Distribution 이미지를 받습니다(약 3 GB, 한 번만).

docker pull quay.io/qiime2/amplicon:2026.1

작업 폴더에서 컨테이너 띄우기

작업할 디렉터리를 컨테이너의 /data에 마운트해 인터랙티브 셸로 들어갑니다.

mkdir qiime2-mp && cd qiime2-mp           # 작업 폴더 생성·이동
docker run -it --rm \
  -v "$PWD":/data -w /data \
  quay.io/qiime2/amplicon:2026.1 bash

옵션 의미: -it(대화형) · --rm(종료 시 컨테이너 삭제) · -v "$PWD":/data(현재 폴더를 컨테이너의 /data에 연결) · -w /data(작업 위치 지정).

이제 프롬프트가 컨테이너 내부로 바뀌면 준비 끝입니다. 아래 모든 qiime ... 명령은 이 셸에서 실행합니다.

Windows 사용자 메모 — PowerShell에서는 $PWD 대신 ${PWD}로, 또는 절대경로(C:/Users/.../qiime2-mp)로 마운트하세요.

3. 단계별 실행 — Moving Pictures 튜토리얼

공식 튜토리얼은 한 사람의 창자·혀·왼손·오른손 시료를 시간에 걸쳐 추적한 유명한 데이터셋입니다. 데이터가 작아 노트북에서도 10여 분에 끝납니다.

STEP 1 — 메타데이터와 원자료 받기

# 메타데이터
wget -O sample-metadata.tsv \
  "https://data.qiime2.org/2024.10/tutorials/moving-pictures/sample_metadata.tsv"

# 원시 시퀀스(EMP single-end 포맷: barcodes + sequences)
mkdir emp-single-end-sequences
wget -O emp-single-end-sequences/barcodes.fastq.gz \
  "https://data.qiime2.org/2024.10/tutorials/moving-pictures/emp-single-end-sequences/barcodes.fastq.gz"
wget -O emp-single-end-sequences/sequences.fastq.gz \
  "https://data.qiime2.org/2024.10/tutorials/moving-pictures/emp-single-end-sequences/sequences.fastq.gz"

QIIME2 객체(.qza)로 변환합니다.

qiime tools import \
  --type EMPSingleEndSequences \
  --input-path emp-single-end-sequences \
  --output-path emp-single-end-sequences.qza
.qza가 뭔가요? QIIME2의 단일 결과물 파일입니다. 사실은 zip이고 안에 데이터+메타데이터(provenance, 즉 누가/언제/어떤 명령으로 만들었나)가 함께 들어 있습니다. .qzv는 그 시각화 버전이며 view.qiime2.org에 끌어다 놓으면 브라우저에서 바로 열립니다.

STEP 2 — 디멀티플렉싱

여러 시료의 시퀀스가 한 파일에 섞여 있으므로 바코드로 시료별로 가릅니다.

qiime demux emp-single \
  --i-seqs emp-single-end-sequences.qza \
  --m-barcodes-file sample-metadata.tsv \
  --m-barcodes-column barcode-sequence \
  --o-per-sample-sequences demux.qza \
  --o-error-correction-details demux-details.qza

qiime demux summarize \
  --i-data demux.qza \
  --o-visualization demux.qzv      # view.qiime2.org에서 열어 시료별 read 분포·품질을 확인

이 시점에 demux.qzv를 열어 시료당 read 수위치별 품질 곡선을 봐야 합니다. 다음 단계의 --p-trunc-len 값을 정하는 근거가 됩니다.

STEP 3 — DADA2로 디노이징 → ASV

DADA2는 오차 모델로 시퀀싱 에러를 보정해 정확한 1-염기 분해능의 ASV (Amplicon Sequence Variant)를 뽑아냅니다. 과거의 97% 유사도 OTU보다 해상도가 높고 재현 가능합니다.

qiime dada2 denoise-single \
  --i-demultiplexed-seqs demux.qza \
  --p-trim-left 0 \
  --p-trunc-len 120 \
  --o-representative-sequences rep-seqs-dada2.qza \
  --o-table table-dada2.qza \
  --o-denoising-stats stats-dada2.qza

--p-trunc-len 120은 품질이 떨어지는 꼬리 부분을 잘라 120 bp만 쓴다는 뜻입니다. STEP 2의 품질 곡선을 보고 정합니다.

산출물을 표준 이름으로 정리합니다.

mv rep-seqs-dada2.qza rep-seqs.qza      # 대표 서열 (ASV)
mv table-dada2.qza   table.qza          # feature table (시료 × ASV 행렬)

qiime metadata tabulate \
  --m-input-file stats-dada2.qza \
  --o-visualization stats-dada2.qzv     # 시료별 input/filtered/denoised/chimera 통계

STEP 4 — Feature table 요약 + 계통수

qiime feature-table summarize \
  --i-table table.qza \
  --o-visualization table.qzv \
  --m-sample-metadata-file sample-metadata.tsv

qiime feature-table tabulate-seqs \
  --i-data rep-seqs.qza \
  --o-visualization rep-seqs.qzv

table.qzv에서 표본당 read 수 분포를 본 뒤, 너무 작아 의미가 떨어지는 시료를 가르는 기준값(rarefaction depth)을 다음 단계에서 정합니다.

계통적 다이버시티(예: Faith's PD, UniFrac)에 필요한 계통수를 만듭니다.

qiime phylogeny align-to-tree-mafft-fasttree \
  --i-sequences rep-seqs.qza \
  --o-alignment aligned-rep-seqs.qza \
  --o-masked-alignment masked-aligned-rep-seqs.qza \
  --o-tree unrooted-tree.qza \
  --o-rooted-tree rooted-tree.qza

STEP 5 — 핵심 다이버시티 (알파·베타)

core-metrics-phylogenetic 한 줄로 알파·베타 지표 한 묶음과 PCoA 좌표·Emperor 시각화가 한꺼번에 떨어집니다.

qiime diversity core-metrics-phylogenetic \
  --i-phylogeny rooted-tree.qza \
  --i-table table.qza \
  --p-sampling-depth 1103 \
  --m-metadata-file sample-metadata.tsv \
  --output-dir core-metrics-results

--p-sampling-depth 1103은 모든 시료를 1103개 read로 통일(rarefaction)합니다. 이 값은 STEP 4의 table.qzv에서 너무 작은 시료를 버리지 않으면서도 의미 있는 깊이를 고른 결과입니다(시료마다 다름).

알파 다이버시티 그룹 차이(예: 시료 부위별)를 검정합니다.

qiime diversity alpha-group-significance \
  --i-alpha-diversity core-metrics-results/faith_pd_vector.qza \
  --m-metadata-file sample-metadata.tsv \
  --o-visualization core-metrics-results/faith-pd-group-significance.qzv

그림 2. 알파 다이버시티 박스플롯 (Faith's PD, 부위별) — 시료 한 개 안에서 얼마나 다양한 균이 사는지를 비교한다(개념도).

베타 다이버시티는 군집 간 거리(예: UniFrac) 차이를 PERMANOVA로 검정합니다.

qiime diversity beta-group-significance \
  --i-distance-matrix core-metrics-results/unweighted_unifrac_distance_matrix.qza \
  --m-metadata-file sample-metadata.tsv \
  --m-metadata-column body-site \
  --o-visualization core-metrics-results/unweighted-unifrac-body-site-significance.qzv \
  --p-pairwise

그림 3. 베타 다이버시티 PCoA — 시료들 사이의 군집 거리를 2D에 펼친 결과. 같은 부위의 시료끼리 모이면 군집 차이가 또렷한 신호다(개념도).
알파 vs 베타? 알파 = 한 시료 안의 다양성(얼마나 많은 종이 얼마나 균등하게 사는가). 베타 = 시료들 사이의 차이(두 시료의 군집이 얼마나 닮았는가). 박스플롯과 PCoA 산점도가 각각의 표준 시각화입니다.

STEP 6 — 분류 (Taxonomy)

ASV의 정체(어떤 균인지)는 사전 학습된 분류기에 맡깁니다. 빠르고 안정적인 Greengenes 13_8 사전학습 분류기를 받습니다.

wget -O gg-13-8-99-515-806-nb-classifier.qza \
  "https://data.qiime2.org/classifiers/sklearn-1.4.2/greengenes/gg-13-8-99-515-806-nb-classifier.qza"

qiime feature-classifier classify-sklearn \
  --i-classifier gg-13-8-99-515-806-nb-classifier.qza \
  --i-reads rep-seqs.qza \
  --o-classification taxonomy.qza
Greengenes vs SILVA? Greengenes 13_8은 가볍고 빠르며 V4 영역(515F/806R)에 잘 맞는 클래식. SILVA 138은 더 최신·포괄적이고 V3-V4 등 다양한 영역을 지원합니다. 시료의 프라이머 영역과 맞는 분류기를 고르는 게 중요합니다.

분류 결과를 표·바 플롯으로 봅니다.

qiime metadata tabulate \
  --m-input-file taxonomy.qza \
  --o-visualization taxonomy.qzv

qiime taxa barplot \
  --i-table table.qza \
  --i-taxonomy taxonomy.qza \
  --m-metadata-file sample-metadata.tsv \
  --o-visualization taxa-bar-plots.qzv

taxa-bar-plots.qzv에서 수준(phylum·class·…·species)을 슬라이더로 바꿔 가며 시료별 구성을 비교할 수 있습니다. 발표용 그림은 보통 이 화면을 캡처해서 만듭니다.

4. 자주 발생하는 에러와 해결법

증상원인 / 해결
--p-trunc-len을 너무 크게 잡아 모든 read가 버려짐demux.qzv의 위치별 품질이 떨어지는 지점 전에서 자르세요(보통 Q≥25 구간 끝).
core-metrics-phylogenetic에서 시료가 대거 누락--p-sampling-depth보다 read 수가 적은 시료가 버려진 것. table.qzv의 분포를 보고 깊이를 낮추세요.
Plugin error from feature-classifier (메모리 부족)분류기 학습이 RAM을 많이 씁니다. Docker 데스크톱의 메모리 한도를 8 GB 이상으로 올리거나, 사전학습 분류기를 쓰세요.
Permission denied (Docker 마운트)-v "$PWD":/data 경로가 Docker 데스크톱의 파일 공유 허용 목록에 있는지 확인.
.qzv가 안 열림view.qiime2.org에 파일을 끌어다 놓거나, qiime tools view file.qzv(브라우저가 있는 환경) 사용.
Greengenes 분류기와 시료의 프라이머 영역이 안 맞음시료가 V3-V4면 SILVA 138 V3-V4 분류기 또는 feature-classifier extract-reads + fit-classifier-naive-bayes로 직접 학습.

5. 확장 / 응용

① DADA2 vs Deblur — 둘 다 ASV 디노이저입니다. DADA2가 더 정밀하고 표준이지만, Deblur는 빠르고 가벼워 대용량 케이스에 종종 쓰입니다. QIIME2에서는 qiime deblur denoise-16S로 호출합니다.

② 차등 풍부도(differential abundance) — ANCOM-BC — 군집 구성 차이를 통계적으로 검정합니다. 마이크로바이옴 데이터는 합이 1인 조성 데이터(compositional)라 보통 회귀로 다루면 안 됩니다. ANCOM-BC가 이 함정을 보정합니다.

qiime composition ancombc \
  --i-table gut-table.qza \
  --m-metadata-file sample-metadata.tsv \
  --p-formula 'subject' \
  --o-differentials ancombc-subject.qza

③ R로 가져오기 — phyloseq — QIIME2 결과를 R로 옮기면 phyloseq·microbiome 패키지로 더 자유로운 분석·시각화가 가능합니다. qiime2R 패키지의 qza_to_phyloseq()가 가장 손쉽습니다.

References

  1. Bolyen, E., et al. (2019). Reproducible, interactive, scalable and extensible microbiome data science using QIIME 2. Nature Biotechnology, 37, 852–857.
  2. Callahan, B. J., et al. (2016). DADA2: High-resolution sample inference from Illumina amplicon data. Nature Methods, 13(7), 581–583.
  3. Lin, H., & Peddada, S. D. (2020). Analysis of compositions of microbiomes with bias correction (ANCOM-BC). Nature Communications, 11, 3514.
  4. McMurdie, P. J., & Holmes, S. (2013). phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data. PLoS ONE, 8(4), e61217.
  5. QIIME 2 Amplicon Distribution — Official Documentation (2025.4 / 2026.1). amplicon-docs.qiime2.org
  6. Moving Pictures Tutorial — docs.qiime2.org/2024.10/tutorials/moving-pictures
  7. SILVA rRNA database — arb-silva.de

Pipette & Pipeline · A bio portfolio journal — bridging research, data, and industry.

이 글을 쓴 사람 Yumingming

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

About · 더 알아보기 →

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