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

[ScRAT] Exploratory Data (Summary)

by doraemin_dev 2025. 3. 22.

ScRAT를 활용하여, scRNA 데이터를 분석해 보았다. 

2025.03.20 - [AI 및 Data Analysis/Code] - [ScRAT] scRNA Analysis

 

[ScRAT] scRNA Analysis

Paper : Phenotype prediction from single-cell RNA-seq data using attention-based neural networks https://academic.oup.com/bioinformatics/article/40/2/btae067/7613064 본 논문에서 언급된 ScRAT 방법으로 scRNA 분석하기 https://github.com/yuzhen

doraemin.tistory.com


데이터에 대해 살펴보자.

COMBAT와 Haniffa 데이터는 → covid 인지 아닌지에 대한 데이터다.

SC4 데이터는 → 경증인지 중증인지에 대한 데이터다. 또한, 회복인지 진행인지를 나타내는 데이터다.

 For COMBAT and Haniffa datasets, we perform the task of disease diagnosis
    COVID versus Non-COVID

For SC4 which includes mostly COVID samples
    mild/moderate versus severe/critical (경증/중등증 vs. 중증/위중증)
    convalescence versus progression (회복 vs. 진행)

데이터의 파일 형태

파일 이름 역할 및 내용
COMBAT_X_pca.npy / Haniffa_X_pca.npy PCA 차원 축소된 세포별 유전자 발현 데이터 (numpy 배열)
labels.pkl 표현형(Phenotype) 라벨 (COVID/Non-COVID)
patient_id.pkl 샘플에 대한 환자 ID 정보
cell_type_large.pkl 세포 유형(cell type) 정보 (상세한 라벨 포함)
cell_type.pkl 간략한 세포 유형 정보

 


COMBAT 데이터셋

총 세포 수: 836,148개

총 환자 수: 124명

Unique Labels (8, object)

  • ['COVID_SEV', 'COVID_MILD', 'COVID_HCW_MILD', 'COVID_CRIT', 'COVID_LDN', 'Sepsis', 'HV', 'Flu']
    • COVID_SEV → 중증 COVID-19 환자
    • COVID_MILD → 경증 COVID-19 환자
    • COVID_HCW_MILD → 경증 COVID-19 환자(보건의료 종사자)
    • COVID_CRIT → 위중증 COVID-19 환자
    • COVID_LDN → 런던 COVID-19 환자군
    • Sepsis → 패혈증(Sepsis) 환자
    • HV → 건강한 대조군(Healthy Volunteers)
    • Flu → 인플루엔자(Flu) 환자

Unique Cell Types Large (41, object)

  • ['NK.CD16hi', 'CD8.TEMRA', 'nan', 'ncMono', 'cMono', ..., 'GDT.VD2', 'CD8.TREG', 'PLT', 'RET', 'Mast’]

Unique Cell Types (18, object)

  • ['NK', 'CD8', 'nan', 'ncMono', 'cMono', ..., 'HSC', 'DC', 'PLT', 'RET', 'Mast']

Haniffa 데이터셋

총 세포 수: 647,366개

총 환자 수: 130명

Unique Labels (10, object) : ['Moderate', 'Healthy', 'Death', 'Mild', 'Severe', 'LPS', 'Critical ', 'Non-covid', 'Asymptomatic', 'nan']

  • Moderate → 중등증 COVID-19 환자
  • Mild → 경증 COVID-19 환자
  • Severe → 중증 COVID-19 환자
  • Critical → 위중증 COVID-19 환자
  •  Asymptomatic → 무증상 COVID-19 환자
  • Non-covid → COVID-19 감염되지 않은 환자
  • Healthy → 건강한 대조군(Healthy Control)
  • LPS → LPS(lipopolysaccharide) 염증 반응 실험군
  • Death → 사망자 데이터
  • nan → 결측값(missing value) 포함

Unique Cell Types Large (51, object)

  • ['CD8.TE', 'CD4.IL22', 'CD8.Naive', 'CD4.Naive', 'CD8.EM', ..., 'HSC_CD38neg', 'HSC_myeloid', 'HSC_MK', 'CD4.Th17', 'B_malignant’]

Unique Cell Types (18, object)

  • ['CD8', 'CD4', 'CD14', 'B_cell', 'NK_16hi', ..., 'gdT', 'HSC', 'pDC', 'RBC', 'Mono_prolif']

 


ScRAT 모델 실험에서 사용된 COMBAT  Haniffa 데이터셋의 labels.pkl과 patient_id.pkl 파일을 분석해보자.

import pickle
import pandas as pd

# 파일 경로 목록
file_paths = {
    "COMBAT_labels": "data/COMBAT/labels.pkl",
    "COMBAT_patient_id": "data/COMBAT/patient_id.pkl",
    "Haniffa_labels": "data/Haniffa/labels.pkl",
    "Haniffa_patient_id": "data/Haniffa/patient_id.pkl",
}

# 데이터 로드 및 출력
for key, file in file_paths.items():
    with open(file, 'rb') as f:
        data = pickle.load(f)
        print(f"📂 {file} 데이터 타입: {type(data)}")

        # pandas.Series인 경우 개수 및 고유값 출력
        if isinstance(data, pd.Series):
            print(f"  📊 샘플 개수: {data.shape[0]}")
            print(f"  🔍 예제 데이터: {data.head(5).to_dict()}")

            # 고유한 값 확인
            unique_values = data.unique()
            num_unique_values = len(unique_values)
            print(f"  🏷️ Unique 값 개수: {num_unique_values}")

            # 고유한 label 또는 환자 ID 출력
            if "labels" in key:
                print(f"  🔹 Unique Labels: {unique_values}")
                print(f"  📈 Label별 세포 수: {data.value_counts()}")
            elif "patient_id" in key:
                print(f"  🔹 Unique Patient IDs 개수: {num_unique_values}")

        # list나 dict인 경우 개수 출력
        elif isinstance(data, list) or isinstance(data, dict):
            print(f"  📊 샘플 개수: {len(data)}")
            print(f"  🔍 예제 데이터: {data[:5] if isinstance(data, list) else list(data.items())[:5]}")

    print("-" * 50)

 

실행 >

kim89@ailab-System-Product-Name:~/ScRAT$ python data_pkl.py
📂 data/COMBAT/labels.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 836148
  🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'COVID_SEV', 'AAACCTGAGCGGATCA-1-gPlexA1': 'COVID_MILD', 'AAACCTGAGGACATTA-1-gPlexA1': 'COVID_HCW_MILD', 'AAACCTGAGGCGACAT-1-gPlexA1': 'COVID_CRIT', 'AAACCTGAGGGAACGG-1-gPlexA1': 'COVID_SEV'}
  🏷️ Unique 값 개수: 8
  🔹 Unique Labels: ['COVID_SEV', 'COVID_MILD', 'COVID_HCW_MILD', 'COVID_CRIT', 'COVID_LDN', 'Sepsis', 'HV', 'Flu']
Categories (8, object): ['HV', 'COVID_MILD', 'COVID_SEV', 'COVID_CRIT', 'COVID_HCW_MILD',
                         'COVID_LDN', 'Sepsis', 'Flu']
  📈 Label별 세포 수: Source
COVID_SEV         247799
Sepsis            164128
COVID_MILD        114418
COVID_CRIT         93982
HV                 92205
COVID_HCW_MILD     88898
Flu                19233
COVID_LDN          15485
Name: count, dtype: int64
--------------------------------------------------
📂 data/COMBAT/patient_id.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 836148
  🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'S00109', 'AAACCTGAGCGGATCA-1-gPlexA1': 'S00112', 'AAACCTGAGGACATTA-1-gPlexA1': 'G05153', 'AAACCTGAGGCGACAT-1-gPlexA1': 'S00005', 'AAACCTGAGGGAACGG-1-gPlexA1': 'S00061'}
  🏷️ Unique 값 개수: 124
  🔹 Unique Patient IDs 개수: 124
--------------------------------------------------
📂 data/Haniffa/labels.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 647366
  🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'Moderate', 'AAACCTGAGAGTAATC-MH9179824': 'Moderate', 'AAACCTGAGAGTGAGA-MH9179824': 'Moderate', 'AAACCTGAGGAATCGC-MH9179824': 'Moderate', 'AAACCTGAGTGTTGAA-MH9179824': 'Moderate'}
  🏷️ Unique 값 개수: 10
  🔹 Unique Labels: ['Moderate', 'Healthy', 'Death', 'Mild', 'Severe', 'LPS', 'Critical ', 'Non-covid', 'Asymptomatic', 'nan']
Categories (10, object): ['Asymptomatic', 'Critical ', 'Death', 'Healthy', ..., 'Moderate', 'Non-covid',
                          'Severe', 'nan']
  📈 Label별 세포 수: Worst_Clinical_Status
Moderate        179012
Healthy          97039
Mild             93835
nan              74913
Critical         63854
Death            41836
Severe           40235
Asymptomatic     33601
Non-covid        15157
LPS               7884
Name: count, dtype: int64
--------------------------------------------------
📂 data/Haniffa/patient_id.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 647366
  🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'MH9179824', 'AAACCTGAGAGTAATC-MH9179824': 'MH9179824', 'AAACCTGAGAGTGAGA-MH9179824': 'MH9179824', 'AAACCTGAGGAATCGC-MH9179824': 'MH9179824', 'AAACCTGAGTGTTGAA-MH9179824': 'MH9179824'}
  🏷️ Unique 값 개수: 130
  🔹 Unique Patient IDs 개수: 130
--------------------------------------------------

ScRAT 모델 실험에서 사용된 COMBAT  Haniffa 데이터셋의 cell_type_large.pkl과 cell_type.pkl 파일을 분석해보자.

import pickle
import pandas as pd

# 파일 경로 목록 (세포 타입 관련 파일)
cell_type_files = {
    "COMBAT_cell_type_large": "data/COMBAT/cell_type_large.pkl",
    "COMBAT_cell_type": "data/COMBAT/cell_type.pkl",
    "Haniffa_cell_type_large": "data/Haniffa/cell_type_large.pkl",
    "Haniffa_cell_type": "data/Haniffa/cell_type.pkl",
}

# 데이터 로드 및 출력
for key, file in cell_type_files.items():
    try:
        with open(file, 'rb') as f:
            data = pickle.load(f)
            print(f"📂 {file} 데이터 타입: {type(data)}")

            # pandas.Series인 경우 개수 및 고유값 출력
            if isinstance(data, pd.Series):
                print(f"  📊 샘플 개수: {data.shape[0]}")
                print(f"  🔍 예제 데이터: {data.head(5).to_dict()}")

                # 고유한 세포 타입 확인
                unique_values = data.unique()
                num_unique_values = len(unique_values)
                print(f"  🏷️ Unique 세포 타입 개수: {num_unique_values}")
                print(f"  🔹 Unique Cell Types: {unique_values}")

            # list나 dict인 경우 개수 출력
            elif isinstance(data, list) or isinstance(data, dict):
                print(f"  📊 샘플 개수: {len(data)}")
                print(f"  🔍 예제 데이터: {data[:5] if isinstance(data, list) else list(data.items())[:5]}")

    except FileNotFoundError:
        print(f"⚠️ 파일을 찾을 수 없음: {file}")

    print("-" * 50)

실행 >

(scrat) kim89@ailab-System-Product-Name:~/ScRAT$ python data_celltype_pkl.py
📂 data/COMBAT/cell_type_large.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 836148
  🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'NK.CD16hi', 'AAACCTGAGCGGATCA-1-gPlexA1': 'CD8.TEMRA', 'AAACCTGAGGACATTA-1-gPlexA1': 'nan', 'AAACCTGAGGCGACAT-1-gPlexA1': 'ncMono', 'AAACCTGAGGGAACGG-1-gPlexA1': 'cMono'}
  🏷️ Unique 세포 타입 개수: 41
  🔹 Unique Cell Types: ['NK.CD16hi', 'CD8.TEMRA', 'nan', 'ncMono', 'cMono', ..., 'GDT.VD2', 'CD8.TREG', 'PLT', 'RET', 'Mast']
Length: 41
Categories (41, object): ['B.INT', 'B.MEM', 'B.NAIVE', 'CD4.NAIVE', ..., 'iNKT', 'nan', 'ncMono',
                          'pDC']
--------------------------------------------------
📂 data/COMBAT/cell_type.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 836148
  🔍 예제 데이터: {'AAACCTGAGAAAGTGG-1-gPlexA1': 'NK', 'AAACCTGAGCGGATCA-1-gPlexA1': 'CD8', 'AAACCTGAGGACATTA-1-gPlexA1': 'nan', 'AAACCTGAGGCGACAT-1-gPlexA1': 'ncMono', 'AAACCTGAGGGAACGG-1-gPlexA1': 'cMono'}
  🏷️ Unique 세포 타입 개수: 18
  🔹 Unique Cell Types: ['NK', 'CD8', 'nan', 'ncMono', 'cMono', ..., 'HSC', 'DC', 'PLT', 'RET', 'Mast']
Length: 18
Categories (18, object): ['B', 'CD4', 'CD8', 'DC', ..., 'cMono', 'iNKT', 'nan', 'ncMono']
--------------------------------------------------
📂 data/Haniffa/cell_type_large.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 647366
  🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'CD8.TE', 'AAACCTGAGAGTAATC-MH9179824': 'CD4.IL22', 'AAACCTGAGAGTGAGA-MH9179824': 'CD8.Naive', 'AAACCTGAGGAATCGC-MH9179824': 'CD4.Naive', 'AAACCTGAGTGTTGAA-MH9179824': 'CD8.EM'}
  🏷️ Unique 세포 타입 개수: 51
  🔹 Unique Cell Types: ['CD8.TE', 'CD4.IL22', 'CD8.Naive', 'CD4.Naive', 'CD8.EM', ..., 'HSC_CD38neg', 'HSC_myeloid', 'HSC_MK', 'CD4.Th17', 'B_malignant']
Length: 51
Categories (51, object): ['ASDC', 'B_exhausted', 'B_immature', 'B_malignant', ..., 'RBC', 'Treg',
                          'gdT', 'pDC']
--------------------------------------------------
📂 data/Haniffa/cell_type.pkl 데이터 타입: <class 'pandas.core.series.Series'>
  📊 샘플 개수: 647366
  🔍 예제 데이터: {'AAACCTGAGAAACCTA-MH9179824': 'CD8', 'AAACCTGAGAGTAATC-MH9179824': 'CD4', 'AAACCTGAGAGTGAGA-MH9179824': 'CD4', 'AAACCTGAGGAATCGC-MH9179824': 'CD4', 'AAACCTGAGTGTTGAA-MH9179824': 'CD4'}
  🏷️ Unique 세포 타입 개수: 18
  🔹 Unique Cell Types: ['CD8', 'CD4', 'CD14', 'B_cell', 'NK_16hi', ..., 'gdT', 'HSC', 'pDC', 'RBC', 'Mono_prolif']
Length: 18
Categories (18, object): ['B_cell', 'CD4', 'CD8', 'CD14', ..., 'RBC', 'Treg', 'gdT', 'pDC']
--------------------------------------------------

ScRAT 모델 실험에서 사용된 COMBAT  Haniffa 데이터셋의 pca.npy 파일을 분석해보자.

import numpy as np

# 데이터 로드
combat_pca = np.load("data/COMBAT/COMBAT_X_pca.npy")
haniffa_pca = np.load("data/Haniffa/Haniffa_X_pca.npy")

# 데이터 형태 확인
print(f"COMBAT 데이터 크기: {combat_pca.shape}")  # (세포 개수, PCA 차원)
print(f"Haniffa 데이터 크기: {haniffa_pca.shape}")  # (세포 개수, PCA 차원)

실행 >

(scrat) kim89@ailab-System-Product-Name:~/ScRAT$ python data_npy.py
COMBAT 데이터 크기: (836148, 50)
Haniffa 데이터 크기: (647366, 50)

'AI 및 Data Analysis > Code' 카테고리의 다른 글

[Hierarchical MIL] scRNA Analysis  (0) 2025.03.24
[Hierarchical MIL] Exploratory Data (Summary)  (0) 2025.03.22
[ScRAT] STEP 2. Attention layer  (0) 2025.03.20
[ScRAT] utils.py _ mixup()  (0) 2025.03.20
[ScRAT] Code Demo  (0) 2025.03.20