데이터 크기 최적화 전에, 데이터 구조를 열어서 obs, var, obsm, layers, raw 등 각각의 내용을 요약해서 파악하는 코드
import scanpy as sc
# 데이터 로드
adata = sc.read_h5ad('/data/project/kim89/cardio_pca.h5ad')
# obs: 셀 메타데이터
print("✅ obs columns:")
print(adata.obs.columns.tolist())
print()
# var: 유전자 메타데이터
print("✅ var columns:")
print(adata.var.columns.tolist())
print()
# obsm: 저차원 임베딩 (PCA, UMAP 등)
print("✅ obsm keys:")
print(list(adata.obsm.keys()))
print()
# layers: 추가 데이터 레이어
print("✅ layers keys:")
print(list(adata.layers.keys()))
print()
# raw: raw 데이터 여부
print("✅ raw exists:")
print(adata.raw is not None)
if adata.raw is not None:
print("raw shape:", adata.raw.shape)
print()
# X matrix info
print("✅ X matrix type:", type(adata.X))
print("✅ X shape:", adata.X.shape)
결과
✅ obs columns:
['biosample_id', 'patient', 'cell_type', 'cell_type_annotation', 'sex', 'cell_type_leiden06', 'sub_cluster', 'n_umi', 'n_genes', 'cellranger_percent_mito', 'exon_prop', 'entropy', 'doublet_score', 'species', 'species__ontology_label', 'disease', 'disease__ontology_label', 'organ', 'organ__ontology_label', 'library_preparation_protocol', 'library_preparation_protocol__ontology_label', 'label']
✅ var columns:
['n_cells']
✅ obsm keys:
['X_pca']
✅ layers keys:
[]
✅ raw exists:
False
✅ X matrix type: <class 'scipy.sparse._csc.csc_matrix'>
✅ X shape: (592689, 32151)
삭제
✅ obs: 분석에 필요 없는 컬럼 제거
- 필요: patient, cell_type, disease__ontology_label (또는 사용하는 label 컬럼)
- 불필요: biosample_id, cell_type_leiden06, sub_cluster, n_umi, n_genes, cellranger_percent_mito, exon_prop, entropy, doublet_score, species, species__ontology_label, organ, organ__ontology_label, library_preparation_protocol, library_preparation_protocol__ontology_label, sex, label (필요 없으면)
✅ var: n_cells도 제거 가능 (별 의미 없으면)
✅ obsm: X_pca 유지
✅ X: 크기 축소 필요 시 PCA 값만 남기는 전략
더보기
AnnData의 var는 무엇인가?
👉 adata.var 는 columns = gene (feature) 정보
👉 row = 각 gene (X의 column)
즉,
- adata.X 의 열 (gene expression 값)에 대응하는 메타데이터
- adata.var 는 gene symbol, gene id, n_cells 등 gene-level annotation
왜 var를 없애도 되냐?
👉 만약 X (cell × gene matrix) 를 쓰지 않으면:
- adata.var 는 의미가 없습니다. (gene에 대한 expression 값이 없으니까)
👉 지금 전략은:
- X matrix 대신 PCA 값 (obsm['X_pca']) 만 남기자는 것
- PCA는 gene 기반 matrix가 아니라 cell × component matrix
- 따라서 PCA 기반 AnnData라면 gene metadata (var) 는 의미가 사라집니다.
언제 var를 유지해야 하나?
👉 분석 대상이 gene expression (X matrix) 이라면
👉 gene symbol, Entrez ID, 기타 gene-level 정보가 필요
👉 따라서 var는 반드시 유지
당신의 경우
👉 지금 X matrix 제거하고 PCA만 보존하려는 상황 → var 제거 OK
👉 X matrix 기반 분석 (예: DEG 분석) 을 하려면 var 필요 → 제거하면 안 됨
정리
데이터 var 필요 여부PCA만 사용하는 데이터 | ❌ var 의미 없음 (없애도 무방) |
X matrix 기반 분석 | ✅ var 필요 (gene info 포함) |
권장
👉 X matrix + PCA 같이 둘 경우
adata.var = adata.var[['gene_symbols', 'gene_ids']] 처럼 핵심 컬럼만 남기세요.
👉 PCA-only AnnData 만들 경우
var 제거 OK
adata_min = sc.AnnData(X=adata.obsm['X_pca'], obs=adata.obs)
import scanpy as sc
# 데이터 로드
adata = sc.read_h5ad('/data/project/kim89/cardio_pca.h5ad')
# obs 컬럼 유지할 것만 남기기
keep_obs = ['patient', 'cell_type', 'disease__ontology_label']
adata.obs = adata.obs[keep_obs]
# var 컬럼 제거
adata.var = adata.var[[]]
# X를 없애고 PCA만 보존 (만약 X가 너무 크다면)
import numpy as np
import pandas as pd
# PCA component 수 만큼 dummy var 만들기
adata_min = sc.AnnData(X=adata.obsm['X_pca'], obs=adata.obs.copy())
adata_min.obsm['X_pca'] = adata.obsm['X_pca'] # obsm에 다시 추가
adata_min.var = pd.DataFrame(index=[f'PC{i+1}' for i in range(adata.obsm['X_pca'].shape[1])])
# 저장
adata_min.write('/data/project/kim89/cardio_minimal.h5ad')
✅ adata_min은 PCA값 + obs 메타데이터만 갖는 가벼운 데이터셋
✅ 메모리 소모 훨씬 작아짐 (X matrix 완전히 제거)
✅ 필요한 경우 PCA component 수 조절 가능
'AI 및 Data Analysis > Code' 카테고리의 다른 글
[ScRAT] customized dataset (0) | 2025.07.01 |
---|---|
GSE62452 (microarray) Analysis Results (0) | 2025.05.07 |
GSE86982 Analysis Summary (0) | 2025.04.30 |
[ProtoCell 4P] scRNA Analysis (0) | 2025.04.10 |
[Hierarchical MIL] Preprocessing Create '.h5ad' (0) | 2025.03.28 |