7강 / 20강
순위로 바꾸기 — 눈금을 버리고 순서만 남긴다
copula transform, 아라크네의 조용한 전처리
5강과 6강의 코드에 계속 등장한 rank_transform 을 이제 설명할 차례입니다.
하는 일은 한 줄로 끝납니다.
발현량 → 그 유전자 안에서 몇 번째로 큰가 → 0~1 로 환산200명 중 가장 낮은 사람은 0.0025, 가장 높은 사람은 0.9975. 값이 6.31 이었든 12000 이었든 상관없이 순서만 남습니다. 통계학에서는 이것을 copula 변환이라고 부릅니다.
왜 굳이 이런 짓을 할까요? 얻는 것이 셋 있습니다.
① 칸이 공평해진다
순위는 0~1 에 완벽하게 고르게 퍼져 있습니다. 7칸으로 자르면 칸마다 정확히 약 28~29명이 들어가요. 원래 값으로 자르면 가운데 칸에 100명, 끝 칸에 2명이 되기 쉽습니다.
등빈도 칸 = 추정이 안정적
② 눈금이 상관없어진다
CPM 이든 TPM 이든, log 를 씌웠든 안 씌웠든 순서는 같습니다. 그러니 MI 도 같습니다. 전처리 방식이 결과를 흔들지 않아요.
2강의 그 이야기
③ 이상치가 힘을 잃는다
한 사람의 값이 실수로 1000배 크게 찍혀도, 순위로는 그냥 1등일 뿐입니다. 상관계수라면 그 한 점이 r 을 통째로 끌고 갑니다.
튼튼함(robustness)
argsort 를 두 번 쓰는 것과 같은 관용구입니다. 칸마다 28~29명씩 정확히 나뉩니다.
Python
브라우저에서 실행
순서를 바꾸지 않는 변환에는 MI 가 꿈쩍도 하지 않습니다. 반면 상관계수는 이상치 하나에 무너집니다.
Python
브라우저에서 실행
🎮 원래 값 ↔ 순위, 같은 자료를 두 눈으로
왼쪽은 원래 발현량, 오른쪽은 순위로 바꾼 것입니다. 격자를 켜 보면 순위 쪽은 칸마다 점 수가 같아지는 것이 보입니다.
동점(tie) 처리는 순위 기반 방법의 공통 약점입니다. 전처리에서 미리 막는 것이 정석입니다.
Python
브라우저에서 실행
🤔 확인 문제
순위 변환을 하면 MI 계산에서 무엇이 좋아질까요?
해설 순위는 0~1 에 균등하게 퍼지므로 등폭 칸이 곧 등빈도 칸이 됩니다. 칸마다 표본 수가 비슷해야 확률 추정이 안정됩니다. 값의 분포가 치우친 유전자에서 특히 큰 차이가 납니다.
🤔 확인 문제
한 샘플의 발현량이 실수로 1000배 크게 기록되었습니다. 순위 변환 뒤 MI 는?
해설 1000배가 되어도 여전히 1등일 뿐이라 순위가 안 바뀝니다. 반면 피어슨 상관계수는 그 한 점에 끌려가 값이 크게 달라집니다. 이상치에 강한 것이 순위 기반 방법의 큰 장점입니다.
🤔 확인 문제
순위 변환으로 잃는 정보는 무엇일까요?
해설 순위는 '몇 번째'만 남기고 '얼마나 큰 차이'는 버립니다. 차등발현 분석처럼 배수가 답인 문제에는 못 씁니다. 아라크네는 '같이 움직이나'만 물으므로 손해가 없습니다.