56 분 소요

1. 28챕터는 무엇을 하려는 장인가요?

28챕터는 공간 전사체학 데이터를 Python으로 분석하는 실습입니다. 공간 전사체학은 유전자 발현량을 단순히 숫자 표로만 보는 것이 아니라, 그 발현이 조직 안의 어느 위치에서 일어났는지도 함께 보는 분야입니다.

단일세포 전사체 분석에서는 세포 하나하나의 유전자 발현량을 봅니다. 그런데 보통의 단일세포 분석에서는 세포를 조직에서 떼어내어 분석하기 때문에, 그 세포가 원래 조직 안에서 어디에 있었는지는 잃어버리기 쉽습니다. 쉽게 말하면 학생 한 명 한 명의 성적표는 얻었지만, 그 학생들이 원래 교실 어디에 앉아 있었는지는 모르는 상황과 비슷합니다.

공간 전사체학은 여기에 자리 배치도를 다시 붙입니다. “이 세포는 이만큼의 유전자를 발현했고, 조직 안의 이 좌표에 있었습니다”라고 보는 것입니다. 그러면 단순히 “어떤 세포 유형이 있는가?”를 넘어 “그 세포 유형들이 어디에 모여 있는가?”, “서로 가까이 있는 세포 유형은 무엇인가?”, “특정 유전자가 조직의 어느 부위에서 강하게 켜지는가?” 같은 질문을 던질 수 있습니다.

28장에서 사용하는 핵심 도구는 Squidpy입니다. Squidpy는 공간 오믹스 데이터를 분석하기 위한 Python 라이브러리입니다. 단일세포 분석에서 자주 쓰이는 Scanpy, AnnData 생태계와 연결되어 있으며, 공간 그래프 구축, 공간 통계, 이웃 농축 분석, 동시 발생 분석, 이미지 분석 등을 지원합니다.

이 장을 한 문장으로 줄이면 다음과 같습니다.

세포별 유전자 발현량 표에 위치 정보를 붙여, 조직 안에서 세포와 유전자가 어떤 공간 패턴을 만드는지 분석하는 장입니다.


2. 공간 전사체 데이터는 “숫자 표 + 좌표 + 이미지”입니다

공간 전사체학 데이터를 처음 볼 때 가장 중요한 감각은 “데이터가 여러 겹으로 되어 있다”는 점입니다.

단일세포 RNA-seq에서는 보통 세포 × 유전자 행렬이 중심입니다. 행은 세포, 열은 유전자, 각 칸은 해당 세포에서 해당 유전자가 얼마나 발현되었는지를 나타냅니다. 이 개념은 25장 선수지식에서 자세히 다루었습니다.

공간 전사체학에서는 여기에 위치 정보가 더해집니다. 각 세포나 spot마다 x좌표와 y좌표가 있습니다. x좌표는 가로 위치, y좌표는 세로 위치라고 생각하시면 됩니다. 지도에서 “이 가게는 위도와 경도 몇 번에 있다”고 표시하는 것과 비슷합니다.

또한 조직 이미지가 함께 있을 수 있습니다. H&E 염색 이미지, 형광 이미지, 세포 경계 이미지 등이 여기에 해당합니다. 이런 이미지는 세포가 실제 조직 구조 안에서 어디에 있는지, 어떤 형태를 보이는지 확인하는 데 도움을 줍니다.

공간 전사체 데이터의 여러 층

초보자는 공간 전사체 데이터를 다음 세 층으로 나누어 이해하면 좋습니다.

데이터 층 쉬운 설명 분석에서 하는 일
유전자 발현 행렬 세포마다 어떤 유전자가 얼마나 켜졌는지 적은 표 세포 유형 추정, 클러스터링, 유전자 발현 분석
공간 좌표 세포나 spot이 조직 안에서 어디에 있었는지 나타내는 위치값 이웃 관계, 공간 패턴, 거리 기반 분석
조직 이미지 실제 조직 모양을 보여주는 그림 결과를 조직 구조와 함께 해석

여기서 중요한 것은 “공간”이 단순한 장식이 아니라는 점입니다. 위치 정보가 들어오면 분석 질문 자체가 바뀝니다. 단일세포 분석에서는 “비슷한 세포끼리 묶이는가?”가 중요했다면, 공간 전사체학에서는 “비슷한 세포들이 조직 안에서도 실제로 가까운가?”가 중요해집니다.


3. Squidpy, Scanpy, AnnData, SpatialData는 각각 무엇인가요?

28장에는 비슷해 보이는 도구 이름이 많이 나옵니다. Squidpy, Scanpy, AnnData, SpatialData, spatialdata-io, napari 같은 이름이 한꺼번에 등장합니다. 처음부터 전부 외우려고 하면 부담스럽습니다. 역할을 나누어 보면 훨씬 쉽습니다.

AnnData는 데이터를 담는 그릇입니다. 세포 × 유전자 행렬, 세포별 메타데이터, 유전자별 메타데이터, UMAP 좌표, 공간 좌표, 분석 결과 등을 한 객체 안에 담을 수 있습니다. 원문 코드에서 adata라는 이름이 자주 나오는데, 보통 이것이 AnnData 객체입니다.

Scanpy는 단일세포 분석 도구입니다. QC 지표 계산, 세포 필터링, 유전자 필터링, 정규화, 로그 변환, PCA, 이웃 그래프, UMAP, Leiden 클러스터링 같은 일을 합니다. 25장에서 등장한 분석 흐름이 Scanpy의 기본 영역입니다.

Squidpy는 공간 분석 도구입니다. Scanpy가 만든 단일세포 분석 결과에 공간 좌표를 붙여서, 공간 이웃 그래프를 만들고, 이웃 농축 분석, 동시 발생 분석, Moran’s I, Ripley’s L 같은 공간 통계를 계산합니다.

SpatialData는 더 큰 공간 데이터 저장 형식입니다. AnnData가 주로 발현 행렬과 메타데이터를 담는다면, SpatialData는 이미지, 점 좌표, 세포 경계, 마스크, 발현 테이블을 함께 담을 수 있습니다.

napari는 대화형 이미지 뷰어입니다. 사람이 눈으로 이미지를 확대하고, 여러 데이터 층을 켜고 끄면서 공간 데이터를 탐색할 수 있게 해줍니다.

Scverse 생태계에서 각 도구의 역할

정리하면 다음과 같습니다.

이름 역할 초보자용 비유
AnnData 분석 데이터를 담는 기본 객체 엑셀 파일 + 메모장 + 결과 폴더를 합친 상자
Scanpy 단일세포 전처리와 클러스터링 도구 세포를 정리하고 비슷한 세포끼리 묶는 도구
Squidpy 공간 전사체 분석 도구 세포 위치를 이용해 이웃과 공간 패턴을 계산하는 도구
SpatialData 이미지와 좌표까지 담는 공간 데이터 형식 지도, 사진, 표를 한꺼번에 담는 파일함
napari 대화형 시각화 도구 현미경 이미지와 좌표를 직접 들여다보는 뷰어

이 장에서 초보자가 가장 먼저 잡아야 할 구분은 이것입니다.

Scanpy는 “세포 발현 데이터 분석”, Squidpy는 “공간 위치를 활용한 분석”, SpatialData는 “공간 데이터를 담는 형식”입니다.


4. 실습 환경 구성은 왜 필요한가요?

원문에서는 ~/spatial 디렉토리를 만들고, uv venv --python 3.11로 가상환경을 만든 뒤, Squidpy, Scanpy, SpatialData, spatialdata-io, ipykernel을 설치합니다. 이 부분은 단순한 준비 작업처럼 보이지만, 실습에서는 꽤 중요합니다.

Python 분석에서는 여러 라이브러리가 서로 맞는 버전으로 설치되어야 합니다. Squidpy는 Scanpy, AnnData, numpy, scipy, pandas, matplotlib, spatialdata 같은 여러 라이브러리와 함께 작동합니다. 그런데 라이브러리 버전이 서로 맞지 않으면 코드가 실행되지 않거나 이상한 오류가 날 수 있습니다.

가상환경은 프로젝트 전용 작은 작업실이라고 생각하시면 됩니다. 컴퓨터 전체에 라이브러리를 마구 설치하는 대신, 이번 실습에 필요한 라이브러리만 따로 모아두는 공간입니다. 이렇게 하면 다른 프로젝트와 충돌할 가능성이 줄어듭니다.

ipykernel은 Jupyter Notebook에서 해당 가상환경을 선택할 수 있게 해주는 연결 장치입니다. 가상환경을 만들었더라도 Jupyter가 그 환경을 모르면 노트북에서 사용할 수 없습니다. 그래서 커널 등록이 필요합니다.

초보자 입장에서는 다음 순서만 이해하면 충분합니다.

작업 폴더 만들기 → 가상환경 만들기 → 라이브러리 설치하기 → Jupyter에서 쓸 수 있게 등록하기

명령어를 처음 볼 때는 “이게 생명정보학인가, 리눅스인가, 파이썬인가” 헷갈릴 수 있습니다. 하지만 실습 환경 구성은 생명정보학 분석 자체라기보다는, 분석을 실행하기 위한 컴퓨터 책상 정리라고 보시면 됩니다.


5. Xenium과 MERSCOPE는 무엇이 다른가요?

28장에서는 10x Genomics Xenium 데이터와 Vizgen MERSCOPE 데이터를 다룹니다. 둘 다 공간 전사체학 플랫폼입니다. 즉, 조직 안에서 RNA 정보를 읽으면서 위치 정보도 함께 보존하는 기술입니다.

Xenium은 10x Genomics의 제자리 시퀀싱 기반 플랫폼입니다. “제자리”라는 말은 세포를 조직에서 완전히 떼어내지 않고, 조직 안의 위치를 유지한 상태에서 분자 정보를 읽는다는 의미로 이해하면 됩니다. 원문 실습에서는 인간 폐암 데이터셋을 예로 듭니다.

MERSCOPE는 Vizgen의 MERFISH 기반 플랫폼입니다. 원문 실습에서는 마우스 뇌 수용체 데이터셋을 예로 듭니다. MERSCOPE 데이터에는 세포별 유전자 count뿐 아니라 세포 부피 같은 메타데이터가 포함될 수 있습니다.

Xenium과 MERSCOPE의 큰 감각

초보자에게 중요한 것은 플랫폼의 물리·화학적 원리를 깊게 외우는 것이 아닙니다. 28장 실습에 들어가기 전에는 다음 정도면 충분합니다.

첫째, 둘 다 공간 전사체 데이터를 만들어내는 플랫폼입니다.

둘째, 플랫폼마다 데이터를 읽는 함수와 파일 구조가 다릅니다. Xenium은 spatialdata_io.xenium()으로 SpatialData 형식으로 읽는 예시가 나오고, MERSCOPE는 sq.read.vizgen()으로 읽는 예시가 나옵니다.

셋째, 플랫폼마다 제공되는 메타데이터가 다를 수 있습니다. Xenium에서는 세포 면적(cell_area)을 볼 수 있고, MERSCOPE에서는 세포 부피(volume)를 볼 수 있습니다. 항상 모든 데이터에 같은 컬럼이 있는 것은 아닙니다.

넷째, 데이터를 읽은 뒤의 큰 분석 흐름은 비슷합니다. QC를 확인하고, 필터링하고, 정규화하고, PCA/UMAP/Leiden 클러스터링을 하고, 공간 그래프를 만들고, 공간 통계를 계산합니다.


6. QC 지표는 데이터의 건강검진입니다

QC는 Quality Control의 약자입니다. 한국어로는 품질 관리라고 부릅니다. 공간 전사체 분석에서도 단일세포 분석과 마찬가지로 QC가 중요합니다.

왜 QC가 필요할까요? 실험 데이터에는 늘 잡음이 섞입니다. 어떤 세포는 너무 적은 RNA 신호만 잡혔을 수 있습니다. 어떤 세포는 세포 하나가 아니라 여러 세포가 섞여 잡혔을 수 있습니다. 어떤 유전자는 거의 모든 세포에서 관측되지 않을 수 있습니다. 이런 데이터를 그대로 분석하면 결과가 왜곡될 수 있습니다.

원문에서는 sc.pp.calculate_qc_metrics()를 사용하여 QC 지표를 계산합니다. 이 함수는 세포별 총 count, 관측된 유전자 수 등 기본적인 품질 지표를 계산해 줍니다.

QC 지표는 데이터의 건강검진입니다

가장 기본적인 QC 지표는 다음과 같습니다.

지표 의미 너무 낮거나 높으면 생길 수 있는 문제
total_counts 한 세포에서 관측된 전체 RNA 신호량 너무 낮으면 품질이 낮은 세포일 수 있습니다
n_genes_by_counts 한 세포에서 감지된 유전자 종류 수 너무 낮으면 정보가 부족하고, 너무 높으면 여러 세포가 섞였을 수 있습니다
cell_area 세포 면적 비정상적으로 크거나 작으면 세포 분할 문제일 수 있습니다
volume 세포 부피 비정상적인 세포 또는 측정 문제를 의심할 수 있습니다

원문에서는 히스토그램을 그려 QC 지표의 분포를 봅니다. 히스토그램은 값들이 어느 구간에 많이 몰려 있는지 보여주는 그림입니다. 예를 들어 대부분 세포의 total_counts가 100~1000 사이에 있는데, 어떤 세포만 0에 가깝거나 지나치게 크다면 확인이 필요합니다.

초보자는 QC를 다음처럼 이해하면 됩니다.

분석 전에 “너무 이상한 세포나 유전자”가 섞여 있지 않은지 먼저 확인하는 단계입니다.


7. 공간 전사체 데이터도 단일세포 전처리 흐름을 따라갑니다

28장에서는 Xenium과 MERSCOPE 데이터를 읽은 뒤, Scanpy를 사용해 필터링, 정규화, 로그 변환, 고변이 유전자 선택, PCA, UMAP, Leiden 클러스터링을 수행합니다. 이 흐름은 25장 단일세포 전사체 분석과 거의 같습니다.

앞선 25장 선수지식에서 이 과정을 자세히 설명했습니다. 여기서는 간단히만 다시 연결하겠습니다.

세포 필터링은 정보가 너무 적은 세포를 제거하는 과정입니다. 예를 들어 min_counts=10은 count가 너무 적은 세포를 제거하겠다는 뜻입니다.

유전자 필터링은 너무 적은 세포에서만 관측되는 유전자를 제거하는 과정입니다. 예를 들어 min_cells=5는 최소 5개 세포 이상에서 관측된 유전자만 남기겠다는 뜻입니다.

정규화는 세포마다 전체 count 규모가 다른 문제를 줄이는 과정입니다. 어떤 세포가 단순히 더 많이 읽혔다는 이유만으로 모든 유전자가 더 높아 보이면 곤란합니다.

로그 변환은 큰 숫자 차이를 완화하는 과정입니다. 유전자 발현량은 일부 값이 매우 크고 대부분은 작을 수 있기 때문에, 로그 변환을 하면 데이터가 분석하기 쉬운 형태가 됩니다.

고변이 유전자 선택은 세포 유형을 구분하는 데 도움이 되는 유전자를 고르는 과정입니다. 모든 유전자를 다 쓰면 계산량이 늘고 잡음도 많아집니다.

PCA는 수많은 유전자 차원을 더 적은 축으로 요약하는 과정입니다. UMAP은 세포들을 2차원 그림으로 보여주는 방법입니다. Leiden 클러스터링은 비슷한 세포끼리 그룹으로 나누는 방법입니다.

정리하면 다음과 같습니다.

필터링 → 정규화 → 로그 변환 → 고변이 유전자 선택 → PCA → 이웃 그래프 → UMAP → Leiden 클러스터링

여기까지는 공간 분석이라기보다 “공간 정보를 붙이기 전의 기본 단일세포 분석”에 가깝습니다. 이후부터 Squidpy가 본격적으로 등장합니다.


8. UMAP 그림과 공간 좌표 그림은 서로 다른 질문에 답합니다

원문에서는 UMAP 시각화와 공간 좌표 시각화를 모두 합니다. 두 그림은 비슷해 보일 수 있지만, 의미가 완전히 다릅니다.

UMAP은 발현 패턴이 비슷한 세포를 가까이 배치한 그림입니다. UMAP에서 가까이 있다고 해서 실제 조직 안에서도 가까운 것은 아닙니다. 두 세포가 UMAP에서 가까운 이유는 유전자 발현 패턴이 비슷하기 때문입니다.

반면 공간 좌표 그림은 실제 조직 안에서 세포가 어디에 있었는지를 보여줍니다. 공간 그림에서 가까운 세포는 실제 조직 안에서 물리적으로 가까운 세포입니다.

UMAP 그림과 공간 그림의 차이

예를 들어 두 세포가 같은 면역세포 유형이라면 UMAP에서는 가까이 모일 수 있습니다. 하지만 실제 조직에서는 서로 멀리 떨어져 있을 수도 있습니다. 반대로 실제 조직에서 가까운 두 세포라도, 하나는 암세포이고 하나는 면역세포라면 UMAP에서는 멀리 떨어질 수 있습니다.

초보자가 꼭 기억해야 할 차이는 다음과 같습니다.

그림 가까움의 의미 답하는 질문
UMAP 유전자 발현 패턴이 비슷함 어떤 세포들이 비슷한가요?
공간 좌표 그림 조직 안에서 실제로 가까움 세포들이 어디에 있나요?

28장은 이 둘을 함께 봅니다. 먼저 UMAP으로 세포 유형이나 클러스터를 파악하고, 그 클러스터가 조직 안에서 어디에 있는지 공간 좌표 위에 다시 표시합니다.


9. 공간 이웃 그래프는 “누가 누구와 가까운가”를 정하는 단계입니다

공간 분석을 하려면 먼저 “어떤 세포들이 이웃인가?”를 정해야 합니다. 사람에게는 가까운지 먼지가 눈으로 어느 정도 보이지만, 컴퓨터는 명확한 기준이 필요합니다. 그래서 공간 이웃 그래프를 만듭니다.

그래프는 점과 선으로 이루어진 구조입니다. 점은 세포이고, 선은 두 세포가 이웃이라는 관계를 뜻합니다. 공간 이웃 그래프에서는 조직 좌표상 가까운 세포끼리 선으로 연결합니다.

공간 이웃 그래프

원문에서는 두 가지 방식이 나옵니다.

하나는 Delaunay 삼각분할 기반 방식입니다. 세포들의 좌표를 바탕으로 자연스러운 삼각형 연결망을 만들고, 그 연결을 이웃 관계로 사용합니다. 초보자는 “가까운 점들을 적당히 선으로 이어서 망을 만드는 방식”이라고 이해하면 됩니다.

다른 하나는 고정 반경 기반 방식입니다. 어떤 세포를 중심으로 반지름 100 같은 기준을 정하고, 그 안에 들어오는 세포를 이웃으로 봅니다. 예를 들어 반경 100 안에 있는 세포는 이웃, 그보다 멀리 있는 세포는 이웃이 아니라고 정하는 방식입니다.

두 방식은 장단점이 있습니다. Delaunay 방식은 데이터의 점 배치에 따라 자연스럽게 연결되지만, 조직 구조나 세포 밀도에 따라 해석이 달라질 수 있습니다. 반경 기반 방식은 기준이 직관적이지만, 반경을 얼마로 잡느냐에 따라 결과가 달라집니다.

공간 이웃 그래프가 중요한 이유는 이후 분석들이 이 그래프를 바탕으로 하기 때문입니다. 이웃 농축 분석, 중심성 점수, 공간 자기상관 분석은 모두 “누가 누구의 이웃인가?”라는 정보가 있어야 가능합니다.

공간 이웃 그래프는 공간 분석의 뼈대입니다.


10. 이웃 농축 분석은 “특정 세포 유형끼리 유난히 붙어 있는가”를 봅니다

이웃 농축 분석은 Neighborhood Enrichment라고 부릅니다. 이 분석은 특정 세포 유형이 다른 세포 유형 근처에 예상보다 많이 나타나는지, 또는 예상보다 적게 나타나는지를 봅니다.

예를 들어 암 조직에서 암세포 클러스터와 면역세포 클러스터가 있다고 해보겠습니다. 면역세포가 암세포 주변에 유난히 많이 몰려 있다면, 둘 사이에는 공간적 관련성이 있을 수 있습니다. 반대로 면역세포와 암세포가 서로 떨어져 있다면, 면역세포가 암세포 영역에 잘 들어가지 못하고 있을 가능성을 생각해볼 수 있습니다.

이웃 농축 분석

원문에서는 sq.gr.nhood_enrichment(adata, cluster_key="leiden")를 사용합니다. 여기서 cluster_key="leiden"은 Leiden 클러스터 결과를 세포 유형 그룹처럼 사용하겠다는 뜻입니다. 즉, “Leiden 클러스터끼리 서로 얼마나 이웃으로 자주 만나는가?”를 계산합니다.

결과는 보통 히트맵으로 봅니다. 히트맵은 표의 숫자를 색으로 표현한 그림입니다. 원문에서는 양수 값이 두 클러스터가 공간적으로 함께 분포하는 경향을, 음수 값이 서로 떨어져 분포하는 경향을 나타낸다고 설명합니다.

z-score 해석은 다음처럼 이해하면 됩니다.

z-score 쉬운 해석
z > 2 두 세포 유형이 예상보다 자주 이웃입니다
-2 < z < 2 무작위와 크게 다르지 않습니다
z < -2 두 세포 유형이 예상보다 덜 이웃입니다

초보자는 숫자를 너무 복잡하게 생각하지 않아도 됩니다. 핵심은 이것입니다.

이웃 농축 분석은 “서로 붙어 다니는 세포 유형”과 “서로 떨어져 있는 세포 유형”을 찾는 분석입니다.


11. 동시 발생 분석은 거리에 따라 세포 관계를 봅니다

동시 발생 분석은 Co-occurrence Analysis라고 부릅니다. 이웃 농축 분석이 “바로 가까운 이웃 관계”를 주로 본다면, 동시 발생 분석은 거리 구간을 나누어 세포 유형 간 관계를 봅니다.

예를 들어 A 세포 유형 주변 0~100 거리 안에는 B 세포 유형이 많이 있고, 100~200 거리에서는 적고, 200~300 거리에서는 다시 많을 수도 있습니다. 이런 식으로 거리가 달라질 때 관계가 어떻게 달라지는지 보는 분석입니다.

동시 발생 분석

원문에서는 interval=[0, 100, 200, 300, 400, 500] 같은 값을 사용합니다. 이것은 거리 구간을 나누는 기준입니다. 0~100, 100~200, 200~300 같은 식으로 구간을 나누어 세포 유형 간 동시 발생 확률을 봅니다.

초보자에게는 다음 비유가 좋습니다. 어떤 카페 주변에 음식점이 얼마나 있는지 볼 때, 반경 100m 안, 300m 안, 500m 안을 따로 세어보는 것과 비슷합니다. 가까운 거리에서는 패턴이 강하지만 먼 거리에서는 사라질 수도 있고, 반대로 특정 거리 이상에서만 패턴이 나타날 수도 있습니다.

이 분석은 특히 조직 구조가 층을 이루거나, 특정 세포 유형이 다른 세포 유형 주변에 일정한 거리 간격으로 분포할 때 유용합니다.


12. 중심성 점수는 공간 그래프에서 중요한 클러스터를 보는 방법입니다

중심성은 그래프에서 어떤 점이나 그룹이 얼마나 중심적인 위치에 있는지를 나타내는 개념입니다. 26장 선수지식에서 유전자 조절 네트워크와 허브 유전자를 다룰 때 그래프 개념을 이미 보았습니다. 28장에서는 그 그래프 개념이 세포의 공간 위치에 적용됩니다.

공간 그래프에서 어떤 클러스터가 많은 다른 클러스터와 자주 이웃하거나, 여러 영역을 연결하는 위치에 있다면 중심성이 높을 수 있습니다. 반대로 특정 구석에 고립되어 있거나 다른 클러스터와 연결이 적으면 중심성이 낮을 수 있습니다.

원문에서는 sq.gr.centrality_scores(adata, cluster_key="leiden")를 사용합니다. 이것은 Leiden 클러스터별로 공간 그래프에서의 중심성 지표를 계산하는 코드입니다.

중심성을 쉽게 이해하려면 도시 지도를 떠올리면 됩니다. 어떤 역은 여러 노선이 만나는 환승역입니다. 이 역은 도시 교통망에서 중심성이 높습니다. 반면 외곽의 작은 역은 연결이 적어서 중심성이 낮습니다. 공간 전사체학에서도 어떤 세포 유형이 조직 안에서 여러 세포 유형과 많이 접촉하면 “공간 네트워크에서 중심적”이라고 볼 수 있습니다.

초보자가 기억할 핵심은 다음입니다.

중심성 점수는 “조직 안의 세포 관계망에서 어떤 세포 유형이 연결의 중심에 있는가”를 보는 지표입니다.


13. Moran’s I는 특정 유전자가 공간적으로 뭉쳐 켜지는지 봅니다

Moran’s I는 공간 자기상관을 측정하는 통계량입니다. 말이 어렵지만 핵심은 간단합니다.

가까운 위치에 있는 세포들이 비슷한 유전자 발현값을 가지는가?

예를 들어 어떤 유전자가 조직의 한쪽 구역에서만 강하게 발현되고, 다른 구역에서는 낮게 발현된다고 해보겠습니다. 그러면 높은 발현값끼리 가까이 모여 있고, 낮은 발현값끼리도 가까이 모여 있습니다. 이런 경우 Moran’s I는 양수 쪽으로 나올 수 있습니다.

반대로 높은 값과 낮은 값이 번갈아 섞여 있다면 음의 공간 자기상관으로 볼 수 있습니다. 아무 패턴 없이 흩어져 있다면 0에 가까울 수 있습니다.

Moran's I 해석

원문에서는 sq.gr.spatial_autocorr(adata, mode="moran")으로 Moran’s I를 계산합니다. 계산 결과는 adata.uns["moranI"] 같은 곳에 저장됩니다.

Moran’s I 해석은 다음처럼 볼 수 있습니다.

Moran’s I 값 의미
I > 0 비슷한 발현값이 공간적으로 모여 있습니다
I ≈ 0 뚜렷한 공간 패턴이 없습니다
I < 0 높은 값과 낮은 값이 서로 흩어져 나타납니다

또한 p-value도 함께 봅니다. p-value가 일반적인 유의수준인 0.05보다 작으면, 관측된 공간 패턴이 우연이라고 보기 어렵다고 해석할 수 있습니다.

초보자에게 가장 중요한 감각은 이것입니다.

Moran’s I는 “이 유전자의 발현이 조직 안에서 특정 구역에 몰려 있나요?”라고 묻는 분석입니다.


14. Ripley’s L은 세포나 클러스터 점들이 뭉쳐 있는지 봅니다

Ripley’s L 함수는 점 패턴을 분석하는 방법입니다. 여기서 점은 세포 위치나 특정 클러스터에 속한 세포 위치라고 생각하면 됩니다.

이 분석은 특정 세포들이 무작위로 흩어져 있는지, 한곳에 뭉쳐 있는지, 오히려 서로 거리를 두고 퍼져 있는지를 봅니다. Moran’s I가 “유전자 발현값”의 공간 패턴을 보는 느낌이라면, Ripley’s L은 “점들의 위치 자체”가 어떤 패턴을 보이는지 보는 느낌에 가깝습니다.

Ripley's L 해석

원문에서는 sq.gr.ripley(adata, cluster_key="leiden", mode="L")를 사용합니다. 여기서 cluster_key="leiden"은 Leiden 클러스터별로 점 패턴을 보겠다는 뜻입니다.

Ripley’s L을 해석할 때는 관측값과 무작위 기대값을 비교합니다. 관측값이 기대값보다 높으면 해당 세포들이 무작위보다 더 뭉쳐 있다고 볼 수 있습니다. 관측값이 기대값보다 낮으면 서로 떨어져 분산되어 있다고 볼 수 있습니다.

예를 들어 면역세포가 암 조직의 특정 주변부에 몰려 있다면 클러스터링 패턴이 보일 수 있습니다. 반대로 특정 세포들이 조직 전체에 고르게 퍼져 있다면 분산 패턴에 가까울 수 있습니다.

초보자는 다음처럼 구분하면 됩니다.

분석 주로 보는 것 쉬운 질문
Moran’s I 유전자 발현값의 공간 패턴 이 유전자는 어디에 몰려 켜져 있나요?
Ripley’s L 특정 점들의 위치 패턴 이 세포 유형은 뭉쳐 있나요, 흩어져 있나요?

15. 특정 유전자의 공간 발현 시각화는 왜 중요한가요?

원문에서는 MERSCOPE 데이터에서 Gad1, Slc17a7, Aqp4 같은 마커 유전자의 공간 분포를 시각화합니다. 마커 유전자는 특정 세포 유형이나 상태를 알려주는 단서 역할을 하는 유전자입니다.

예를 들어 어떤 유전자가 특정 신경세포 유형에서 주로 발현된다면, 그 유전자가 강하게 나타나는 위치를 보면 해당 세포 유형이 조직 안의 어느 구역에 많은지 추정할 수 있습니다.

공간 발현 시각화는 단순한 예쁜 그림이 아닙니다. UMAP이나 표만으로는 보이지 않는 조직 구조와 발현 패턴을 직접 연결해 줍니다.

예를 들어 다음 두 질문은 서로 다릅니다.

이 유전자가 어떤 세포에서 많이 발현되나요?
이 유전자가 조직의 어느 위치에서 많이 발현되나요?

첫 번째 질문은 단일세포 분석만으로도 어느 정도 답할 수 있습니다. 두 번째 질문은 공간 좌표가 있어야 답할 수 있습니다.

28장에서 공간 발현 시각화를 하는 이유는 분석 결과를 생물학적 구조와 연결하기 위해서입니다. 숫자 표에서 유의미해 보이는 유전자라도, 실제 조직 위에 올려 보았을 때 해석이 달라질 수 있습니다.


16. SpatialData는 공간 오믹스 데이터를 담는 표준화된 형식입니다

SpatialData는 공간 오믹스 데이터를 위한 표준화된 데이터 형식입니다. 공간 전사체 데이터는 발현 행렬만 있는 것이 아니라, 이미지, 좌표, 세포 경계, segmentation mask 등 여러 층으로 구성됩니다. 이런 데이터를 제각각 따로 보관하면 관리하기 어렵습니다.

SpatialData는 이런 여러 층의 데이터를 한 구조 안에 담기 위한 형식입니다.

SpatialData와 napari

원문에서 소개하는 SpatialData 구성요소는 다음과 같습니다.

구성요소 설명 쉬운 비유
Tables AnnData 형식의 유전자 발현 데이터 세포별 성적표
Points 개별 전사체의 공간 좌표 지도 위의 작은 점들
Shapes 세포 경계 같은 다각형 지도 위의 구역 경계선
Labels 세포 분할 마스크 이미지에서 각 세포를 구분한 색칠 영역
Images 조직 이미지 실제 지도나 사진

spatialdata_io.xenium("path/to/data") 같은 코드는 Xenium 데이터를 SpatialData 형식으로 읽어오는 예시입니다. 그 뒤 sdata.tables["table"]로 발현 테이블을 꺼내고, sdata.images로 이미지에 접근하고, sdata.points로 전사체 위치에 접근할 수 있습니다.

초보자는 SpatialData를 “공간 전사체학용 압축 파일함”처럼 이해해도 됩니다. 표, 이미지, 좌표, 경계 정보를 한꺼번에 담고, 필요한 것만 꺼내 쓰는 구조입니다.


17. napari는 공간 데이터를 눈으로 탐색하는 도구입니다

napari는 다차원 이미지 데이터를 대화형으로 볼 수 있는 Python 기반 뷰어입니다. 공간 전사체학에서는 조직 이미지, 세포 경계, 전사체 점, 클러스터 결과 같은 여러 데이터 층을 겹쳐 보아야 할 때가 많습니다. 이럴 때 napari가 유용합니다.

Jupyter Notebook의 정적인 그림은 한 번 그리면 끝입니다. 반면 napari는 확대하고, 이동하고, 레이어를 켜고 끄고, 이미지와 좌표를 직접 탐색할 수 있습니다.

예를 들어 다음과 같은 확인이 가능합니다.

세포 경계가 조직 이미지와 잘 맞나요?
특정 유전자 신호가 특정 조직 구역에 몰려 있나요?
클러스터 결과가 실제 조직 구조와 자연스럽게 맞나요?
특정 영역을 확대했을 때 이상한 segmentation 결과가 보이나요?

원문에서는 napari_spatialdata를 사용하여 SpatialData와 napari를 연결하는 예시를 보여줍니다. 이것은 단순히 그림을 예쁘게 보기 위한 것이 아니라, 분석 품질을 눈으로 검증하는 과정입니다.

초보자는 napari를 다음처럼 이해하면 됩니다.

napari는 공간 전사체 데이터를 현미경 이미지처럼 직접 들여다보게 해주는 대화형 탐색 도구입니다.


18. 28장에서 자주 보게 될 코드 이름을 미리 읽어보기

원문 코드를 처음 보면 함수 이름이 길고 낯설 수 있습니다. 하지만 함수 이름은 대부분 역할을 그대로 담고 있습니다.

코드 하는 일 쉬운 설명
sc.pp.calculate_qc_metrics() QC 지표 계산 세포별 품질 지표를 만듭니다
sc.pp.filter_cells() 세포 필터링 너무 정보가 적은 세포를 제거합니다
sc.pp.filter_genes() 유전자 필터링 너무 적게 관측된 유전자를 제거합니다
sc.pp.normalize_total() 정규화 세포별 전체 count 차이를 보정합니다
sc.pp.log1p() 로그 변환 큰 숫자의 영향을 줄입니다
sc.pp.highly_variable_genes() 고변이 유전자 선택 세포 차이를 잘 보여주는 유전자를 고릅니다
sc.pp.pca() PCA 많은 유전자 정보를 적은 축으로 요약합니다
sc.pp.neighbors() 이웃 그래프 발현 패턴 기준 이웃을 만듭니다
sc.tl.umap() UMAP 세포를 2차원에 배치합니다
sc.tl.leiden() Leiden 클러스터링 비슷한 세포끼리 그룹을 만듭니다
sq.pl.spatial_scatter() 공간 시각화 세포를 실제 공간 좌표에 그립니다
sq.gr.spatial_neighbors() 공간 이웃 그래프 물리적으로 가까운 세포를 연결합니다
sq.gr.nhood_enrichment() 이웃 농축 세포 유형끼리 가까운지 계산합니다
sq.gr.co_occurrence() 동시 발생 거리별 세포 유형 관계를 봅니다
sq.gr.centrality_scores() 중심성 점수 공간 그래프에서 중심적인 클러스터를 봅니다
sq.gr.spatial_autocorr() 공간 자기상관 유전자 발현이 공간적으로 몰리는지 봅니다
sq.gr.ripley() Ripley’s L 세포 점 패턴이 뭉쳤는지 봅니다

함수 이름 앞의 scsq도 구분해두면 좋습니다. sc는 보통 Scanpy를 뜻하고, sq는 Squidpy를 뜻합니다. 그래서 sc.pp.normalize_total()은 Scanpy의 전처리 함수이고, sq.gr.spatial_neighbors()는 Squidpy의 공간 그래프 함수입니다.


19. 28장을 읽기 전에 꼭 잡아야 할 직관

28장은 이 책의 마지막 장이라서 앞선 개념들이 많이 합쳐집니다. 하지만 모든 세부 공식을 외워야 읽을 수 있는 장은 아닙니다. 먼저 다음 직관을 잡는 것이 더 중요합니다.

첫째, 공간 전사체학은 “유전자 발현량 표에 위치를 붙인 분석”입니다.

둘째, UMAP과 공간 좌표 그림은 다릅니다. UMAP은 발현 유사성의 지도이고, 공간 좌표 그림은 실제 조직 위치의 지도입니다.

셋째, 공간 분석을 하려면 먼저 이웃을 정의해야 합니다. 그래서 공간 이웃 그래프를 만듭니다.

넷째, 이웃 농축 분석은 세포 유형끼리 예상보다 가까운지 봅니다.

다섯째, 동시 발생 분석은 거리 구간별로 세포 유형 간 관계를 봅니다.

여섯째, Moran’s I는 유전자 발현값이 공간적으로 몰려 있는지 봅니다.

일곱째, Ripley’s L은 특정 세포나 클러스터의 점들이 뭉쳐 있는지 흩어져 있는지 봅니다.

여덟째, SpatialData와 napari는 복잡한 공간 데이터를 저장하고 눈으로 탐색하기 위한 도구입니다.


20. 공간 통계 결과를 작은 숫자로 해석하는 연습

28챕터에서는 공간 분석 결과를 숫자로 읽는 장면이 많습니다. 공식 전체를 외울 필요는 없지만, 값의 방향은 해석할 수 있어야 합니다.

첫째, neighborhood enrichment의 z-score가 크고 양수이면 두 세포 유형이 우연보다 자주 이웃한다는 뜻입니다.

T cell - Tumor cell z-score = 3.1

이런 결과는 T cell과 Tumor cell이 예상보다 자주 붙어 있다는 신호로 읽을 수 있습니다. 반대로 큰 음수라면 예상보다 덜 붙어 있다는 뜻입니다.

둘째, Moran’s I는 유전자 발현값의 공간 자기상관을 봅니다.

Moran's I = 0.45  → 비슷한 발현값이 공간적으로 가까이 모이는 경향
Moran's I ≈ 0     → 뚜렷한 공간 패턴이 약함

셋째, Ripley’s L은 세포나 클러스터의 위치 점들이 무작위보다 더 뭉쳐 있는지 봅니다. 관측 L 값이 무작위 기대값보다 계속 높으면, 해당 점들이 무작위 배치보다 더 군집화되어 있다고 해석할 수 있습니다.

넷째, UMAP 거리와 실제 공간 거리는 다릅니다. UMAP에서 가까운 세포는 발현 패턴이 비슷하다는 뜻이고, spatial plot에서 가까운 세포는 조직 안에서 실제 위치가 가깝다는 뜻입니다. 두 그림이 서로 다른 질문에 답한다는 점을 계속 기억해야 합니다.

21. QC와 SpatialData 구성요소를 결과표로 읽는 연습

공간 전사체 데이터의 QC에서는 숫자가 너무 낮거나 너무 높은 경우를 모두 의심해야 합니다. 예를 들어 total_counts가 거의 0인 세포는 신호가 너무 약할 수 있고, cell_area가 비정상적으로 큰 세포는 segmentation에서 여러 세포가 하나로 합쳐졌을 가능성이 있습니다.

SpatialData 구성요소도 이름과 내용을 연결해서 읽어야 합니다.

구성요소 담는 정보
tables AnnData 형태의 발현량 표와 세포 metadata
images 조직 이미지
shapes 세포 경계나 영역 정보
points 전사체 위치 같은 점 좌표
labels 픽셀 단위 마스크나 라벨 이미지

공간 이웃을 만들 때는 방식도 중요합니다. Delaunay 방식은 좌표를 바탕으로 자연스럽게 가까운 점들을 연결하고, radius 방식은 정해진 거리 안에 있는 점들을 이웃으로 연결합니다. 어떤 방식을 쓰느냐에 따라 “이웃”의 정의가 달라질 수 있습니다.

22. 28챕터 진입 전 최종 요약표

구분 꼭 알아야 할 내용 자세한 내용이 궁금하면
공간 전사체학 발현량과 위치 정보를 함께 보는 분석입니다 12장 선수지식 참고
단일세포 전처리 필터링, 정규화, 로그 변환, PCA, UMAP, Leiden 흐름입니다 25장 선수지식 참고
Squidpy 공간 그래프와 공간 통계를 계산하는 Python 도구입니다 이번 28장 선수지식
공간 이웃 그래프 가까운 세포끼리 선으로 연결한 구조입니다 이번 28장 선수지식
이웃 농축 특정 세포 유형끼리 예상보다 가까운지 봅니다 이번 28장 선수지식
동시 발생 거리 구간별로 세포 유형 관계를 봅니다 이번 28장 선수지식
Moran’s I 유전자 발현값이 공간적으로 뭉치는지 봅니다 이번 28장 선수지식
Ripley’s L 특정 세포 점들이 뭉쳐 있는지 흩어져 있는지 봅니다 이번 28장 선수지식
SpatialData 표, 좌표, 이미지, 세포 경계 등을 함께 담는 형식입니다 이번 28장 선수지식
napari 공간 데이터를 대화형으로 탐색하는 이미지 뷰어입니다 이번 28장 선수지식

23. 28장을 공부할 때의 추천 순서

28장을 처음 공부할 때는 코드를 처음부터 끝까지 한 번에 이해하려고 하지 않는 편이 좋습니다. 대신 분석 흐름을 층별로 나누어 보시면 됩니다.

먼저 데이터 로드 코드를 봅니다. Xenium 데이터는 어떻게 읽고, MERSCOPE 데이터는 어떻게 읽는지 확인합니다. 여기서 중요한 것은 “파일 구조가 플랫폼마다 다르다”는 점입니다.

그다음 QC 코드를 봅니다. total_counts, n_genes_by_counts, cell_area, volume 같은 지표가 어떤 의미인지 확인합니다.

그다음 단일세포 전처리 코드를 봅니다. 필터링, 정규화, 로그 변환, PCA, UMAP, Leiden 클러스터링은 25장에서 이미 본 흐름입니다. 낯설면 25장 선수지식을 다시 보면 됩니다.

그다음 공간 시각화 코드를 봅니다. UMAP 그림과 공간 좌표 그림이 어떻게 다른지 비교합니다.

그다음 공간 이웃 그래프를 봅니다. “어떤 기준으로 이웃을 정의했는가?”를 확인합니다. Delaunay인지, radius인지가 중요합니다.

마지막으로 공간 통계 결과를 봅니다. 이웃 농축, 동시 발생, 중심성, Moran’s I, Ripley’s L이 각각 어떤 질문에 답하는지 구분합니다.

이 순서대로 보면 28장은 다음 흐름으로 정리됩니다.

데이터 읽기 → 품질 확인 → 단일세포 기본 분석 → 공간 좌표에 표시 → 공간 이웃 정의 → 공간 패턴 해석

이 장의 핵심은 복잡한 함수 이름을 외우는 것이 아닙니다. “좌표가 추가되면 어떤 질문을 새로 던질 수 있는가?”를 이해하는 것입니다.


24. 마지막으로 기억할 한 문장

28장은 이 책 전체의 여러 흐름이 합쳐지는 장입니다. DNA, RNA, 세포, 조직, 이미지, 통계, Python 도구가 모두 한꺼번에 등장합니다. 하지만 중심 생각은 아주 단순합니다.

공간 전사체학 분석은 세포별 유전자 발현량을 조직 지도 위에 올려놓고, 세포와 유전자가 어디서 어떤 패턴을 만드는지 해석하는 과정입니다.

이 한 문장만 잡고 들어가도, 28장의 Squidpy 코드와 공간 통계 개념이 훨씬 덜 낯설게 느껴질 것입니다.

문제 풀이

공간 전사체학 분석

0 / 32
Gemini AI 채점

주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.

API KEY 미등록
  1. 1. [쉬움] 객관식

    28챕터의 공간 전사체학 분석이 다루는 핵심 데이터 구성으로 가장 적절한 것을 고르라.

    선택지
  2. 2. [쉬움] 객관식

    Squidpy의 역할로 가장 적절한 것을 고르라.

    선택지
  3. 3. [쉬움] 객관식

    Xenium과 MERSCOPE에 대한 설명으로 가장 적절한 것을 고르라.

    선택지
  4. 4. [쉬움] 객관식

    공간 전사체 데이터의 QC 지표로 보기 가장 적절한 것을 고르라.

    선택지
  5. 5. [쉬움] 객관식

    UMAP 그림과 공간 좌표 그림의 차이로 가장 적절한 것을 고르라.

    선택지
  6. 6. [쉬움] 객관식

    공간 이웃 그래프의 기본 의미로 가장 적절한 것을 고르라.

    선택지
  7. 7. [보통] 객관식

    이웃 농축(neighborhood enrichment) 분석의 질문으로 가장 적절한 것을 고르라.

    선택지
  8. 8. [보통] 객관식

    Moran’s I가 공간 전사체 분석에서 보는 것으로 가장 적절한 것을 고르라.

    선택지
  9. 9. [보통] 객관식

    다음 코드의 일반적 의미로 가장 적절한 것을 고르라.

    import scanpy as sc
    import squidpy as sq
    adata = sc.read_h5ad("spatial.h5ad")
    
    선택지
  10. 10. [보통] 객관식

    다음 코드가 수행하려는 분석으로 가장 적절한 것을 고르라.

    sq.gr.spatial_neighbors(adata)
    
    선택지
  11. 11. [보통] 객관식

    다음 코드의 목적에 가장 가까운 것을 고르라.

    sq.gr.nhood_enrichment(adata, cluster_key="cell_type")
    
    선택지
  12. 12. [보통] 객관식

    다음 코드의 분석 대상으로 가장 적절한 것을 고르라.

    sq.gr.spatial_autocorr(adata, mode="moran", genes=["GeneA"])
    
    선택지
  13. 13. [어려움] 객관식

    다음 두 그림을 함께 해석할 때 가장 적절한 관점은 무엇인가?

    UMAP: 세포 유형 A와 B가 발현상 서로 가깝다.
    Spatial plot: A와 B가 조직 안에서는 서로 멀리 분포한다.
    
    선택지
  14. 14. [어려움] 객관식

    다음 이웃 농축 결과 해석으로 가장 적절한 것을 고르라.

    T cell - Tumor cell pair가 permutation 기대보다 자주 이웃으로 관찰된다.
    
    선택지
  15. 15. [어려움] 객관식

    Moran’s I가 높게 나온 유전자에 대한 가장 적절한 해석을 고르라.

    선택지
  16. 16. [어려움] 객관식

    Ripley’s L 분석의 질문으로 가장 적절한 것을 고르라.

    선택지
  17. 17. [어려움] 객관식

    SpatialData를 사용하는 이유로 가장 적절한 것을 고르라.

    선택지
  18. 18. [어려움] 객관식

    napari가 공간 전사체 분석에서 유용한 이유로 가장 적절한 것을 고르라.

    선택지
  19. 19. [어려움] 객관식

    공간 전사체 분석에서 세포 분할(segmentation) 오류가 중요한 이유로 가장 적절한 것을 고르라.

    선택지
  20. 20. [어려움] 객관식

    공간 co-occurrence 분석의 직관으로 가장 적절한 것을 고르라.

    선택지
  21. 21. [보통] 객관식

    neighborhood enrichment 결과가 다음과 같을 때 가장 적절한 해석을 고르라.

    T cell - Tumor cell z-score = 3.1
    
    선택지
  22. 22. [보통] 객관식

    Moran's I = 0.45에 대한 설명으로 가장 적절한 것을 고르라.

    선택지
  23. 23. [보통] 객관식

    Ripley’s L 분석에서 관측 L 값이 무작위 기대값보다 계속 높게 나타났다. 가장 적절한 해석을 고르라.

    선택지
  24. 24. [쉬움] 객관식

    UMAP에서 가까운 것과 spatial plot에서 가까운 것의 차이로 가장 적절한 것을 고르라.

    선택지
  25. 25. [보통] 객관식

    공간 전사체 QC에서 total_counts가 거의 0인 세포가 많을 때 가장 먼저 의심할 수 있는 것을 고르라.

    선택지
  26. 26. [보통] 객관식

    SpatialData 구성요소와 내용의 연결로 가장 적절한 것을 고르라.

    선택지
  27. 27. [보통] 객관식

    공간 이웃 그래프에서 radius 방식에 가장 가까운 설명을 고르라.

    선택지
  28. 28. [어려움] 객관식

    co-occurrence 분석이 특히 답하려는 질문으로 가장 적절한 것을 고르라.

    선택지
  29. 주관식 1. [쉬움] 주관식 · Gemini 채점

    공간 전사체 데이터가 일반 단일세포 데이터와 달리 추가로 갖는 정보가 무엇인지 설명하라.

  30. 주관식 2. [보통] 주관식 · Gemini 채점

    UMAP 그림과 spatial plot을 구분해서 해석해야 하는 이유를 설명하라.

  31. 주관식 3. [보통] 주관식 · Gemini 채점

    spatial neighbors, neighborhood enrichment, co-occurrence의 차이를 설명하라.

  32. 주관식 4. [어려움] 주관식 · Gemini 채점

    Moran’s I와 Ripley’s L이 각각 어떤 공간적 질문에 답하는지 설명하라.