9강 / 20강
크기를 맞춘다 — 정규화 없이는 아무것도 비교할 수 없다
CP10K · log1p · 그리고 왜 로그를 씌우는가
세포 A 에서 Cd3e 가 10개 잡혔고, 세포 B 에서는 5개 잡혔습니다. A 가 B 보다 두 배 많이 켜져 있는 걸까요?
세포 A 의 총 UMI 가 20,000 이고 세포 B 가 2,000 이었다면 이야기가 완전히 달라집니다. 비율로 보면 A 는 0.05%, B 는 0.25% — B 가 다섯 배 높습니다.
세포마다 잡힌 총량이 다른 이유는 생물학이 아니라 기술입니다. 세포 크기, 방울에 들어간 구슬 상태, 역전사 효율, 시퀀싱 깊이… 이 기술적 차이를 지우고 같은 자로 재는 것이 정규화입니다.
원 개수
세포마다 총량이 다르다
→
÷ 총 UMI
비율로 바꾼다
→
× 10,000
읽기 좋은 눈금으로
→
log(1+x)
큰 값의 횡포를 누른다
원 개수만 보면 순위가 뒤집혀 있습니다. 정규화를 해야 비로소 같은 자가 됩니다.
Python
브라우저에서 실행
0은 정규화해도 0이라 희소성이 유지됩니다. 이것이
L.data 에만 로그를 씌우는 이유예요 — 96%의 0은 건드릴 필요가 없습니다.
Python
브라우저에서 실행
🤔 확인 문제
세포 A(총 UMI 20,000)에서 Cd3e 10개, 세포 B(총 UMI 2,000)에서 5개가 잡혔습니다. 옳은 해석은?
해설 세포마다 잡힌 총량이 다르기 때문에 원 개수를 그대로 비교하면 안 됩니다. 총량 차이는 대개 생물학이 아니라 기술적 잡음이에요. 그래서 정규화가 선택이 아니라 필수입니다.
🤔 확인 문제
log(x) 가 아니라 log(1+x) 를 쓰는 이유는?해설 1을 더해 두면 0 → log(1) = 0 이 되어 희소성이 그대로 유지됩니다. numpy 에는 이 계산을 정밀하게 해 주는
np.log1p 가 따로 있습니다.🤔 확인 문제
정규화 배율을 10,000 대신 100,000 으로 바꾸면 무엇이 달라질까요?
해설 0이 아닌 값에 대략 log(10) ≈ 2.30 이 더해지는 셈이라 순위와 상대 비교는 거의 그대로입니다. 하지만 '발현량 1 이상' 같은 절대 문턱을 쓰면 전혀 다른 결과가 나오죠. 그래서 배율은 반드시 기록해야 합니다.