# 11. 여러 샘플의 차등발현 검정

> 여러 bulk RNA-seq 샘플에서 실험군과 대조군의 발현 차이를 DESeq2로 검정하는 이유와 raw count·반복 샘플·통계 모델의 역할.

샘플 하나에서 발현량이 높아 보여도 **개인차인지, 실험 잡음인지, 조건의 효과인지** 구분할 수 없습니다. 여러 반복 샘플을 모아 그룹 안의 변동을 측정해야 “통계적으로 다르다”고 말할 수 있습니다.

> **이 수업의 질문**: 여러 샘플의 변동을 고려해 두 그룹의 발현 차이를 어떻게 검정하는가?

배포 전후의 latency를 한 번씩만 측정해서 회귀를 판정할 수 없는 것과 같습니다. 요청마다 값이 달라지는 범위를 먼저 알아야 배포 효과가 평소 변동보다 큰지 판단할 수 있습니다. 차등발현 분석에서는 요청 반복 대신 **생물학적 반복 샘플**, latency 대신 **유전자별 raw count**를 사용합니다.

| 입력 테이블 | 메타데이터 | 모델이 분리할 것 | 출력 |
| --- | --- | --- | --- |
| 유전자 × 샘플 raw count | 샘플별 실험군·대조군, 배치 | 그룹 차이와 그룹 안 변동 | 유전자별 log2FC, p-value, padj |

## 1. 여러 샘플로: bulk-RNA 차등발현 분석

샘플이 하나뿐인 **N=1** 분석의 근본 한계는 변동 범위를 추정할 수 없다는 점입니다. 개인차와 실험 환경 차이로 발현량이 달라질 수 있어서, 한 샘플에서 "튀는" 값이 조건의 효과인지 평소 변동인지 통계적으로 분리할 수 없습니다.

그래서 정통(conventional) bulk-RNA 분석은 **여러 샘플**을 씁니다.

- 특이적 변화가 **replicate에서 재현**되는지 확인하고,
- **정상 대조군과 비교**해 유전자별 변화에 **통계적 유의성**을 부여합니다.
- 보통 실험군·대조군 각각 **최소 n=3**(분산을 추정할 수 있는 최소 수)으로 두고, 많을수록 좋습니다. 실험군을 직접 확보하고 대조군은 공개 데이터로 채우기도 합니다(이때 **배치 효과** 제거 필요).

### 워크플로

정렬·정량까지는 앞선 RNA-seq 파이프라인과 같고, 그 뒤에 **차등발현(DEG) 분석**이 붙습니다.

```text
FastQC → Trim Galore! → FastQC → STAR → featureCounts
      → DEG 분석 (DESeq2 / limma-voom / edgeR)
      → 시각화·기능분석 (Volcano plot, g:Profiler, GSEA)
```

- **DEG**(Differentially Expressed Gene) 분석은 두 그룹(예: Tumor vs Normal)의 발현량을 유전자별로 비교합니다. 입력은 대개 **raw count**(정규화 전 원시 카운트)입니다.
- 결과로 유전자마다 **Log2FC**(그룹 간 발현 배수 변화)와 다중검정을 보정한 **padj**를 돌려줍니다. `baseMean`부터 `padj`까지 각 열의 계산 관계는 [DESeq2·PyDESeq2 결과표 읽기](/reference/deseq2-results/)에서, p-value와 padj의 일반적인 차이는 [통계적 검정과 다중검정](/reference/statistical-testing/)에서 설명합니다.
- 이걸 **Volcano plot**(x=Log2FC, y=유의성)으로 그리고, 튀는 유전자 집합의 기능을 **GSEA·g:Profiler**로 해석합니다.

![기능분석 결과 예시: dot plot·bar plot·enrichment map](/images/lessons/sam-and-bulk-rna/enrichment-plots.jpeg)

*DEG로 고른 유전자들을 기능(pathway)으로 묶어 본 enrichment 시각화 예시(dot plot·bar plot·enrichment map). "어떤 생물학적 프로그램이 두 그룹 사이에서 달라졌나"를 요약한다.*

### DESeq2가 하는 일

가장 널리 쓰는 DEG 도구 **DESeq2**는 다음 순서로 분석합니다.

```python
counts.shape       # genes × samples
sample_info.shape  # samples × conditions
results.shape      # genes × statistics
```

`counts`와 `sample_info`는 샘플 ID로 정확히 조인돼야 합니다. 열 순서가 어긋나 실험군 라벨을 다른 샘플에 붙이면 모델은 정상적으로 실행돼도 잘못된 비교를 하므로, 분석 전에 ID와 순서를 검증합니다.

1. raw count 행렬과 샘플별 조건 정보를 연결한다.
2. 너무 낮게 발현되는 유전자를 제거해 노이즈를 줄인다.
3. 샘플별 시퀀싱 깊이를 보정하고 유전자별 변동을 추정한다.
4. count 데이터에 맞는 모델로 그룹 차이를 검정해 log2FC와 padj를 구한다.
5. PCA·heatmap에 쓸 수 있도록 분산을 안정화한 값도 만든다.

> 🧩 **왜 raw count인가**: [TPM](/lessons/rna-seq-quantification/)은 샘플 내 비율로 바꾼 값입니다. DESeq2는 정수 count의 변동을 직접 모델링하고 자체 방식으로 깊이를 보정해야 하므로 raw count를 입력받습니다. 음이항분포와 반복 샘플의 역할은 [DEG에서 무엇을 검정하나](/reference/statistical-testing/#deg에서-무엇을-검정하나)에서 자세히 설명합니다.

> 이렇게 **N=1의 아웃라이어 탐색**에서 **여러 샘플의 통계적 차등발현**으로 넘어가면, "이 유전자가 튄다"를 넘어 **"통계적으로 유의하게 달라졌다"** 고 말할 수 있게 됩니다.

한 코호트의 paired Tumor·Normal 비교는 [GSE251845 DEG 실습](/practice/colorectal-deg-gse251845/#raw-count에서-deg까지)에서, 두 코호트의 변화량을 따로 계산해 비교하는 과정은 [EOCRC·LOCRC 비교 실습](/practice/eocrc-vs-locrc/#3-2-코호트별-paired-deseq2와-pca)에서 이어집니다.

## 정리

차등발현 분석은 한 샘플의 큰 값을 찾는 작업이 아닙니다. 그룹 안의 변동과 시퀀싱 깊이를 고려해, 조건이 달라졌을 때 일관되게 변한 유전자를 찾는 작업입니다.

> **반복 샘플 → raw count → 깊이·분산 추정 → 그룹 비교 → log2FC와 유의성 → 기능 분석**