본문 바로가기
AI 및 Data Analysis/Code

Data Size Optimization

by doraemin_dev 2025. 7. 7.

데이터 크기 최적화 전에, 데이터 구조를 열어서 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