CBIS-DDSM 데이터셋 Simple EDA (上)

CBIS-DDSM 데이터셋 Simple EDA (上)

CBIS-DDSM은 유방암 Classfication 또는 Detection 분야에서 종종 사용되는 데이터셋입니다. 이번 포스트에서는 개인 연구에 활용하기 위해 개인적으로 EDA를 수행한 노트북을 다룹니다.

CBIS-DDSM은 유방암 Classfication 또는 Detection 분야에서 종종 사용되는 데이터셋입니다. 이번 포스트에서는 개인 연구에 활용하기 위해 개인적으로 EDA를 수행한 노트북을 다룹니다. 보다 상세한 통계 정보를 다루는 하(下)편은 언제가 될 지는 모르겠으나 빠른 시일 내로 업데이트해 보겠습니다.

CBIS-DDSM_EDA

CBIS-DDSM 데이터셋에서 제공되는 부가 파일들을 활용해 EDA를 수행해 봅니다. CBIS-DDSM 데이터셋은 이미지 데이터(.dcm)와 메타 데이터(.csv)로 구성되며, 이미지 데이터는 아래와 같은 내역으로 구성되어 있습니다.

  • Dataset format
    • Modality : MG(Mammography
    • Number of Patients : 6671
    • Number of Studies : 6775
    • Number of Series : 6775
    • Number of Images : 10239
    • Entire image size : 163.6GB

전체 이미지는 6671장으로 구성되어 있으며 각 case별 상세 설명이 기재된 네 개의 .csv파일이 제공됩니다. Abnormality type은 ‘Calculation case’와 ‘Mass case’로 나뉘며, Calculation case는 흰색 반점(spots)이나 얼룩덜룩한 형태(flecks)로 관찰되는 Abnormality type을 의미하고, Mass case는 Breast Lumps가 구름처럼 mass하게 퍼져 있는 Abnormality type을 의미합니다.

  • calc_case_description_train_set.csv: 두 개의 abnormality typecalc(calcification, 석회화 조직)인 case들을 모아 구성된 train set list입니다.
  • calc_case_description_test_set.csv: 두 개의 abnormality typecalc인 case들을 모아 구성된 test set list입니다.
  • mass_case_description_train_set.csv: 두 개의 abnormality typemass(mass lumps, 덩어리 조직)인 case들을 모아 구성된 train set list입니다.
  • mass_case_description_test_set.csv: 두 개의 abnormality typemass인 case들을 모아 구성된 test set list입니다.

EDA에 앞서, 데이터셋을 한바퀴 둘러보겠습니다.

1. 데이터셋 둘러보기

1.1 Abnormality type별 feature 탐색

Abnormality type의 구분은 파일명에서 calcmass 접두사로 되어 있습니다. 각 사례(case)는 ①원본 이미지와, ②원본 이미지에 대응되는 segment annotation과, 해당 segment annotation을 포함하는 ③bounding box를 crop한 이미지를 포함하고 있습니다. 이 꼭지에서는 Abnormality type별 각 컬럼의 feature가 의미하는 바를 알아 보도록 하겠습니다.

case_details

import os
import pandas as pd

# Setting base path
ROOT_PATH = os.path.join(os.getcwd(), 'Dataset_csv')
CBISDDSM_csvPATH = os.path.join(ROOT_PATH, 'CBISDDSM')
MIAS_PATH = os.path.join(ROOT_PATH, 'MIAS')

# Load Dataframe from .csv
calc_case_description_train_set_df = pd.read_csv(os.path.join(CBISDDSM_csvPATH, "calc_case_description_train_set.csv"), index_col=0)
calc_case_description_test_set_df = pd.read_csv(os.path.join(CBISDDSM_csvPATH, "calc_case_description_test_set.csv"), index_col=0)
mass_case_description_train_set_df = pd.read_csv(os.path.join(CBISDDSM_csvPATH, "mass_case_description_train_set.csv"), index_col=0)
mass_case_description_test_set_df = pd.read_csv(os.path.join(CBISDDSM_csvPATH, "mass_case_description_test_set.csv"), index_col=0)
# 몇 가지 테스트 및 데이터 타입 조사를 위한 더미 코드입니다.
# print(calc_case_description_train_set_df['abnormality type'].unique())
# print(calc_case_description_test_set_df['abnormality type'].unique())
print(mass_case_description_train_set_df['subtlety'].unique())
print(mass_case_description_train_set_df['abnormality id']['P_00001'])
print(mass_case_description_test_set_df['subtlety'].unique())
[4 3 5 1 2 0]
P_00001    1
P_00001    1
Name: abnormality id, dtype: int64
[5 4 2 3 1]

.csv파일은 아래와 같은 내용들을 포함하고 있습니다. 각 column에 대한 설명은 다음과 같으며, 보다 자세한 설명은 https://www.nature.com/articles/sdata2017177에서 확인하실 수 있습니다. (중복 feature가 존재하는 경우는 dataframe['columnname'].unique()로 유니크한 값만 뽑아 확인)

  • calcification 타입의 데이터셋 각 컬럼별 설명 (calc_case_description_train_set_df, calc_case_description_test_set_df)
    • patient_id: 신원 정보가 제거된(de-identification) 환자 번호입니다. (e.g. P_00005, P_00013, …)
    • breast density: 유방 조직의 밀도를 구분한 정수형 feature입니다. train csv에는 1에서 4까지의 int형 feature를, test csv에는 0~4의 int형 feature를 포함하고 있습니다. (e.g. 3, 4, 1, 2, …)
    • left or right breast: 유방을 촬영한 각도입니다. LEFT, RIGHT로 구성된 srt형 바이너리 feature입니다. (e.g. LEFT, RIGHT, …)
    • image view: mammography 촬영 방법에 따른 구분입니다. CC, MLO로 구성된 str형 바이너리 feature입니다. (e.g. CC, MLO, …)
    • abnormality id: 해당 case 안에 anomaly 패치가 몇 개인지 구분하기 위한 id입니다. train csv는 1부터 7까지의 범위를 갖는 int형 feature를, test csv는 1~5의 범위를 갖는 int형 feature를 포함하고 있습니다. (e.g. 3, 2, 5, 1, …)
    • abnormality type: Abnormality type에 따른 구분입니다. traintest로 나뉜 네 개의 .csv파일에서 해당 테이블은 파일에 대해 모두 동일한 값을 가지며, calcificationmass 두 타입이 존재합니다. 아래 dataframe.head를 통해 해당 column 정보를 확인하실 수 있습니다.
    • calc type: calcification 타입의 lumps(덩어리)에서 나타나는 Cancer diagnostic 정보입니다. 46종으로 구분되어 있으며, str형 feature입니다. (e.g. AMORPHOUS, ROUND_AND_REGULAR-AMORPHOUS, …)
    • calc distribution: calc타입의 lumps 조직이 얼마나 뭉쳐 있는지, 퍼져 있는지에 대한 str형 feature입니다. CLUSTERED, LINEAR, REGIONAL, DIFFUSELY_SCATTERED, SEGMENTAL, CLUSTERED-LINEAR, CLUSTERED-SEGMENTAL, LINEAR-SEGMENTAL, REGIONAL-REGIONAL로 구성되어 있으며, nan값도 포함되어 있으므로 핸들링에 주의가 필요합니다. (e.g. CLUSTERED-LINEAR, SEGMENTAL, CLUSTERED, …)
    • assessment: 비정상 정도에 대한 레벨을 구분하는 정수형 feature입니다. BI-RADS에 따른 각 사례별 분류로, 0, 2, 3, 4, 5의 unique한 int형 features가 포함되어 있습니다.
    • pathology: 해당 lumps에 대한 병리학적 분류를 의미합니다. BENIGN_WITHOUT_CALLBACK, BENIGN, MALIGNANT 세 개의 unique한 str형 features로 구성되어 있으며, 각각 정상(추정), 양성, 음성을 의미합니다. (e.g. BENIGN, BENIGN, MALIGNANT, …)
    • subtlety: 확인되지 않은 컬럼입니다. 1~5의 범위를 갖는 int형 feature로 구성되어 있습니다. (e.g. 3, 4, 1, 5, 2, …)
    • image file path: 원본 이미지 파일(.dcm)의 경로입니다.
    • cropped image file path: 의심 ROI segment에 대해 crop 후 저장한 .dcm 이미지 경로입니다. segment 단위로 bounding box를 근사해 crop한 것으로 추정됩니다.
    • ROI mask file path: 원본 이미지 파일에 대응해 의심 ROI 영역을 segment로 annotation한 마스크 .dcm 이미지입니다.
  • mass 타입의 데이터셋 각 컬럼별 설명 (mass_case_description_train_set_df, mass_case_description_test_set_df)
    • patient_id: 상기와 동일
    • breast density: 유방 조직의 밀도를 구분한 정수형 feature입니다. train csv와 test csv 모두 1~4의 int형 feature를 포함하고 있습니다. (e.g. 3, 4, 1, 2, …)
    • left or right breast: 상기와 동일
    • image view: 상기와 동일
    • abnormality id: 비정상 정도에 대한 레벨을 구분하는 정수형 feature입니다. BI-RADS에 따른 각 사례별 분류로 추정되며, train csv는 1부터 6까지의 범위를 갖는 int형 feature를, test csv는 1~4의 범위를 갖는 int형 feature를 포함하고 있습니다. (e.g. 3, 2, 5, 1, …)
    • abnormality type: 상기와 동일
    • mass shape: mass 타입의 lumps 조직이 어떤 모양을 갖고 있는지에 대한 정보입니다. 약 19개의 str형 features로 구분되어 있습니다. nan값도 포함되어 있으므로 핸들링에 주의가 필요합니다. (e.g. IRREGULAR-ARCHITECTURAL_DISTORTION, LOBULATED, …)
    • mass margins: 확인되지 않은 컬럼입니다. SPICULATED, ILL_DEFINED, CIRCUMSCRIBED, ILL_DEFINED-SPICULATED, OBSCURED, OBSCURED-ILL_DEFINED, MICROLOBULATED, MICROLOBULATED-ILL_DEFINED-SPICULATED, MICROLOBULATED-SPICULATED, CIRCUMSCRIBED-ILL_DEFINED, MICROLOBULATED-ILL_DEFINED, CIRCUMSCRIBED-OBSCURED, OBSCURED-SPICULATED, OBSCURED-ILL_DEFINED-SPICULATED, CIRCUMSCRIBED-MICROLOBULATED의 unique한 str features를 갖고 있으며 nan값도 포함되어 있으므로 핸들링에 주의가 필요합니다. (e.g. CIRCUMSCRIBED, SPICULATED, …)
    • assessment: 확인되지 않은 컬럼입니다. 0~5의 unique한 int형 features가 포함되어 있습니다.
    • pathology: 상기와 동일
    • subtlety: 확인되지 않은 컬럼입니다. train csv는 1부터 5까지의 범위를 갖는 int형 feature로 구성되어 있으며, test csv는 1~5의 범위를 갖는 int형 features로 구성되어 있습니다. (e.g. 3, 4, 1, 5, 2, …)
    • image file path, cropped image file path, ROI mask file path: 상기와 동일
calc_case_description_train_set_df.head(3)
breast densityleft or right breastimage viewabnormality idabnormality typecalc typecalc distributionassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_000053RIGHTCC1calcificationAMORPHOUSCLUSTERED3MALIGNANT3Calc-Training_P_00005_RIGHT_CC/1.3.6.1.4.1.959...Calc-Training_P_00005_RIGHT_CC_1/1.3.6.1.4.1.9...Calc-Training_P_00005_RIGHT_CC_1/1.3.6.1.4.1.9...
P_000053RIGHTMLO1calcificationAMORPHOUSCLUSTERED3MALIGNANT3Calc-Training_P_00005_RIGHT_MLO/1.3.6.1.4.1.95...Calc-Training_P_00005_RIGHT_MLO_1/1.3.6.1.4.1....Calc-Training_P_00005_RIGHT_MLO_1/1.3.6.1.4.1....
P_000074LEFTCC1calcificationPLEOMORPHICLINEAR4BENIGN4Calc-Training_P_00007_LEFT_CC/1.3.6.1.4.1.9590...Calc-Training_P_00007_LEFT_CC_1/1.3.6.1.4.1.95...Calc-Training_P_00007_LEFT_CC_1/1.3.6.1.4.1.95...
calc_case_description_test_set_df.head(3)
breast densityleft or right breastimage viewabnormality idabnormality typecalc typecalc distributionassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_000382LEFTCC1calcificationPUNCTATE-PLEOMORPHICCLUSTERED4BENIGN2Calc-Test_P_00038_LEFT_CC/1.3.6.1.4.1.9590.100...Calc-Test_P_00038_LEFT_CC_1/1.3.6.1.4.1.9590.1...Calc-Test_P_00038_LEFT_CC_1/1.3.6.1.4.1.9590.1...
P_000382LEFTMLO1calcificationPUNCTATE-PLEOMORPHICCLUSTERED4BENIGN2Calc-Test_P_00038_LEFT_MLO/1.3.6.1.4.1.9590.10...Calc-Test_P_00038_LEFT_MLO_1/1.3.6.1.4.1.9590....Calc-Test_P_00038_LEFT_MLO_1/1.3.6.1.4.1.9590....
P_000382RIGHTCC1calcificationVASCULARNaN2BENIGN_WITHOUT_CALLBACK5Calc-Test_P_00038_RIGHT_CC/1.3.6.1.4.1.9590.10...Calc-Test_P_00038_RIGHT_CC_1/1.3.6.1.4.1.9590....Calc-Test_P_00038_RIGHT_CC_1/1.3.6.1.4.1.9590....
mass_case_description_train_set_df.head(3)
breast_densityleft or right breastimage viewabnormality idabnormality typemass shapemass marginsassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_000013LEFTCC1massIRREGULAR-ARCHITECTURAL_DISTORTIONSPICULATED4MALIGNANT4Mass-Training_P_00001_LEFT_CC/1.3.6.1.4.1.9590...Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.95...Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.95...
P_000013LEFTMLO1massIRREGULAR-ARCHITECTURAL_DISTORTIONSPICULATED4MALIGNANT4Mass-Training_P_00001_LEFT_MLO/1.3.6.1.4.1.959...Mass-Training_P_00001_LEFT_MLO_1/1.3.6.1.4.1.9...Mass-Training_P_00001_LEFT_MLO_1/1.3.6.1.4.1.9...
P_000043LEFTCC1massARCHITECTURAL_DISTORTIONILL_DEFINED4BENIGN3Mass-Training_P_00004_LEFT_CC/1.3.6.1.4.1.9590...Mass-Training_P_00004_LEFT_CC_1/1.3.6.1.4.1.95...Mass-Training_P_00004_LEFT_CC_1/1.3.6.1.4.1.95...
mass_case_description_test_set_df.head(3)
breast_densityleft or right breastimage viewabnormality idabnormality typemass shapemass marginsassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_000164LEFTCC1massIRREGULARSPICULATED5MALIGNANT5Mass-Test_P_00016_LEFT_CC/1.3.6.1.4.1.9590.100...Mass-Test_P_00016_LEFT_CC_1/1.3.6.1.4.1.9590.1...Mass-Test_P_00016_LEFT_CC_1/1.3.6.1.4.1.9590.1...
P_000164LEFTMLO1massIRREGULARSPICULATED5MALIGNANT5Mass-Test_P_00016_LEFT_MLO/1.3.6.1.4.1.9590.10...Mass-Test_P_00016_LEFT_MLO_1/1.3.6.1.4.1.9590....Mass-Test_P_00016_LEFT_MLO_1/1.3.6.1.4.1.9590....
P_000172LEFTCC1massROUNDCIRCUMSCRIBED4MALIGNANT4Mass-Test_P_00017_LEFT_CC/1.3.6.1.4.1.9590.100...Mass-Test_P_00017_LEFT_CC_1/1.3.6.1.4.1.9590.1...Mass-Test_P_00017_LEFT_CC_1/1.3.6.1.4.1.9590.1...
print('Length of calc_case_description_train_set_df: ', len(calc_case_description_train_set_df))
print('Length of calc_case_description_test_set_df', len(calc_case_description_test_set_df))
print('Length of mass_case_description_train_set_df: ', len(mass_case_description_train_set_df))
print('Length of mass_case_description_test_set_df:', len(mass_case_description_test_set_df))
Length of calc_case_description_train_set_df:  1546
Length of calc_case_description_test_set_df 326
Length of mass_case_description_train_set_df:  1318
Length of mass_case_description_test_set_df: 378

1.2 Abnormality type별 이미지 관찰

이제 calcmass 두 가지 타입 별로 이미지 몇 장을 뽑아 시각화해 보겠습니다. 각 column의 인덱스는 다음과 같이 patient_id로 접근할 수 있습니다. 우선 3개 정도의 이미지를 랜덤 샘플링해 출력해 보겠습니다.

sample_calc_case_description_train_set_df = calc_case_description_train_set_df.sample(n=3)
sample_mass_case_description_train_set_df = mass_case_description_train_set_df.sample(n=3)
sample_calc_case_description_train_set_df
breast densityleft or right breastimage viewabnormality idabnormality typecalc typecalc distributionassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_018303RIGHTMLO3calcificationPUNCTATEREGIONAL2BENIGN_WITHOUT_CALLBACK5Calc-Training_P_01830_RIGHT_MLO/1.3.6.1.4.1.95...Calc-Training_P_01830_RIGHT_MLO_3/1.3.6.1.4.1....Calc-Training_P_01830_RIGHT_MLO_3/1.3.6.1.4.1....
P_010023LEFTCC1calcificationFINE_LINEAR_BRANCHINGREGIONAL5MALIGNANT5Calc-Training_P_01002_LEFT_CC/1.3.6.1.4.1.9590...Calc-Training_P_01002_LEFT_CC_1/1.3.6.1.4.1.95...Calc-Training_P_01002_LEFT_CC_1/1.3.6.1.4.1.95...
P_011362RIGHTMLO1calcificationPLEOMORPHICCLUSTERED5MALIGNANT5Calc-Training_P_01136_RIGHT_MLO/1.3.6.1.4.1.95...Calc-Training_P_01136_RIGHT_MLO_1/1.3.6.1.4.1....Calc-Training_P_01136_RIGHT_MLO_1/1.3.6.1.4.1....
sample_mass_case_description_train_set_df
breast_densityleft or right breastimage viewabnormality idabnormality typemass shapemass marginsassessmentpathologysubtletyimage file pathcropped image file pathROI mask file path
patient_id
P_005283LEFTMLO2massOVALCIRCUMSCRIBED3BENIGN5Mass-Training_P_00528_LEFT_MLO/1.3.6.1.4.1.959...Mass-Training_P_00528_LEFT_MLO_2/1.3.6.1.4.1.9...Mass-Training_P_00528_LEFT_MLO_2/1.3.6.1.4.1.9...
P_011632LEFTCC1massOVALSPICULATED4MALIGNANT5Mass-Training_P_01163_LEFT_CC/1.3.6.1.4.1.9590...Mass-Training_P_01163_LEFT_CC_1/1.3.6.1.4.1.95...Mass-Training_P_01163_LEFT_CC_1/1.3.6.1.4.1.95...
P_008474LEFTMLO1massARCHITECTURAL_DISTORTIONNaN2BENIGN4Mass-Training_P_00847_LEFT_MLO/1.3.6.1.4.1.959...Mass-Training_P_00847_LEFT_MLO_1/1.3.6.1.4.1.9...Mass-Training_P_00847_LEFT_MLO_1/1.3.6.1.4.1.9...

1.2.1. calc 타입 이미지 확인

샘플 오리지널 이미지와 cropped ROI, ROI mask의 이미지 비율은 각각 다르지만 시각화의 편의를 위해 1000 x 1000 해상도로 출력했습니다.

import PIL
import numpy as np
import pydicom as dicom
from PIL import ImageDraw
import matplotlib.pyplot as plt
import cv2

font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 0.5

# Dataset directory
DDSM_dataPATH = 'E:/CBIM-DDSM'

# sample image file lists
calc_case_original_img = sample_calc_case_description_train_set_df['image file path'].to_list()
calc_case_croppedROI_img = sample_calc_case_description_train_set_df['cropped image file path'].to_list()
calc_case_ROImask_img = sample_calc_case_description_train_set_df['ROI mask file path'].to_list()

for i in range(3):
    plt.figure(figsize=(12,20))
    original_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, calc_case_original_img[i]).replace('\n', '').replace('\r', ''))
    original_image_ds_resized = cv2.resize(original_image_ds.pixel_array, dsize=(750, 1000), interpolation=cv2.INTER_CUBIC)

    croppedROI_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, calc_case_croppedROI_img[i]).replace('\n', '').replace('\r', ''))
    croppedROI_image_ds_resized = cv2.resize(croppedROI_image_ds.pixel_array, dsize=(1000, 1000), interpolation=cv2.INTER_CUBIC)

    ROIMask_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, calc_case_ROImask_img[i]).replace('\n', '').replace('\r', ''))
    ROIMask_image_ds_resized = cv2.resize(ROIMask_image_ds.pixel_array, dsize=(1000, 1000), interpolation=cv2.INTER_CUBIC)
    merged_image = np.concatenate((np.concatenate((original_image_ds_resized, croppedROI_image_ds_resized), axis=1), ROIMask_image_ds_resized), axis=1)
        
    plt.title('Preview of calc type images(original, mask, croppedROI order)', fontsize=15)
    plt.imshow(merged_image, cmap = 'gray')
    plt.show()

case_details

case_details

case_details

1.2.2. mass 타입 이미지 확인

font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 0.5

# sample image file lists
mass_case_original_img = sample_mass_case_description_train_set_df['image file path'].to_list()
mass_case_croppedROI_img = sample_mass_case_description_train_set_df['cropped image file path'].to_list()
mass_case_ROImask_img = sample_mass_case_description_train_set_df['ROI mask file path'].to_list()

for i in range(3):
    plt.figure(figsize=(12,20))
    original_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, mass_case_original_img[i].replace('\n', '').replace('\r', '')))
    original_image_ds_resized = cv2.resize(original_image_ds.pixel_array, dsize=(750, 1000), interpolation=cv2.INTER_CUBIC)

    croppedROI_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, mass_case_croppedROI_img[i].replace('\n', '').replace('\r', '')))
    croppedROI_image_ds_resized = cv2.resize(croppedROI_image_ds.pixel_array, dsize=(1000, 1000), interpolation=cv2.INTER_CUBIC)

    ROIMask_image_ds = dicom.dcmread(os.path.join(DDSM_dataPATH, mass_case_ROImask_img[i].replace('\n', '').replace('\r', '')))
    ROIMask_image_ds_resized = cv2.resize(ROIMask_image_ds.pixel_array, dsize=(1000, 1000), interpolation=cv2.INTER_CUBIC)
    merged_image = np.concatenate((np.concatenate((original_image_ds_resized, croppedROI_image_ds_resized), axis=1), ROIMask_image_ds_resized), axis=1)
        
    plt.title('Preview of mass type images', fontsize=15)
    plt.imshow(merged_image, cmap = 'gray')
    plt.show()

case_details

case_details

case_details

위 이미지들을 통해 확인할 수 있듯, cropped ROI에는 히스토그램 평활화로 추정되는 이미지 전처리 기법이 적용되어 있습니다. X-Ray 이미지를 전처리하는 데엔 다양한 방법들이 존재하며, 아래 노트북을 참고해 전처리 및 Augmentaion 작업을 진행하면 큰 도움이 될 것으로 예상됩니다.

https://github.com/yuyuyu123456/CBIS-DDSM/blob/master/EDA.ipynb

2. CSV data EDA

이제 각 csv 파일이 갖고 있는 column들에 대해 보다 자세히 EDA를 수행한 후 분포를 확인해 보도록 하겠습니다. 각 csv파일들이 갖고 있는 정수형 변수들에 대한 간단한 통계 정보는 아래와 같습니다.

calc_case_description_train_set_df.describe()
breast densityabnormality idassessmentsubtlety
count1546.0000001546.0000001546.0000001546.000000
mean2.6636481.4152653.2587323.411384
std0.9372190.9035711.2292311.179754
min1.0000001.0000000.0000001.000000
25%2.0000001.0000002.0000003.000000
50%3.0000001.0000004.0000003.000000
75%3.0000001.0000004.0000004.000000
max4.0000007.0000005.0000005.000000
calc_case_description_test_set_df.describe()
breast densityabnormality idassessmentsubtlety
count326.000000326.000000326.000000326.000000
mean2.6963191.2147243.4539883.319018
std0.9096670.5290611.1881591.188175
min0.0000001.0000000.0000001.000000
25%2.0000001.0000002.0000003.000000
50%3.0000001.0000004.0000003.000000
75%3.0000001.0000004.0000004.000000
max4.0000005.0000005.0000005.000000
mass_case_description_train_set_df.describe()
breast_densityabnormality idassessmentsubtlety
count1318.0000001318.0000001318.0000001318.000000
mean2.2033381.1160853.5045523.965857
std0.8737740.4670131.4146091.102032
min1.0000001.0000000.0000000.000000
25%2.0000001.0000003.0000003.000000
50%2.0000001.0000004.0000004.000000
75%3.0000001.0000004.0000005.000000
max4.0000006.0000005.0000005.000000
mass_case_description_test_set_df.describe()
breast_densityabnormality idassessmentsubtlety
count378.000000378.000000378.000000378.000000
mean2.3968251.0925933.5343923.785714
std0.8594550.3981361.3430761.171776
min1.0000001.0000000.0000001.000000
25%2.0000001.0000003.0000003.000000
50%2.0000001.0000004.0000004.000000
75%3.0000001.0000004.0000005.000000
max4.0000004.0000005.0000005.000000

2.1 assessment and abnormality id distribution

우선, assessmentabnormality id의 분포를 출력해 보겠습니다. assessment는 목적을 확인할 수 없는 컬럼이고, abnormality id는 BI-RADS 기준에 따라 분류된 비정상 정도를 의미합니다.

import matplotlib
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt

SMALL_SIZE = 17
MEDIUM_SIZE = 20
BIGGER_SIZE = 25
font = {'family' : 'DejaVu Sans',
        'weight' : 'normal',}
matplotlib.rc('font', **font)
params = {'legend.fontsize': SMALL_SIZE,
         'axes.labelsize': MEDIUM_SIZE,
         'axes.titlesize':BIGGER_SIZE,
         'xtick.labelsize':MEDIUM_SIZE,
         'ytick.labelsize':MEDIUM_SIZE}
pylab.rcParams.update(params)

fig, axes = plt.subplots(nrows=2, ncols=2)

calc_case_description_train_set_df['assessment'].value_counts().sort_index().plot(ax=axes[0, 0], kind='bar', rot=75, figsize=(20, 10)).set_title('assessment frequency of `calc_case_description_train`')
calc_case_description_test_set_df['assessment'].value_counts().sort_index().plot(ax=axes[0, 1], kind='bar', rot=75, figsize=(20, 10)).set_title('assessment frequency of `calc_case_description_test`')
mass_case_description_train_set_df['assessment'].value_counts().sort_index().plot(ax=axes[1, 0], kind='bar', rot=75, figsize=(30, 10)).set_title('assessment frequency of `mass_case_description_train`')
mass_case_description_test_set_df['assessment'].value_counts().sort_index().plot(ax=axes[1, 1], kind='bar', rot=75, figsize=(30, 10)).set_title('assessment frequency of `mass_case_description_test`')

plt.tight_layout()
plt.show()

case_details

import matplotlib
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt

SMALL_SIZE = 17
MEDIUM_SIZE = 20
BIGGER_SIZE = 25
font = {'family' : 'DejaVu Sans',
        'weight' : 'normal',}
matplotlib.rc('font', **font)
params = {'legend.fontsize': SMALL_SIZE,
         'axes.labelsize': MEDIUM_SIZE,
         'axes.titlesize':BIGGER_SIZE,
         'xtick.labelsize':MEDIUM_SIZE,
         'ytick.labelsize':MEDIUM_SIZE}
pylab.rcParams.update(params)

fig, axes = plt.subplots(nrows=2, ncols=2)

calc_case_description_train_set_df['abnormality id'].value_counts().sort_index().plot(ax=axes[0, 0], kind='bar', rot=75, figsize=(20, 10)).set_title('abnormality id frequency of `calc_case_description_train`')
calc_case_description_test_set_df['abnormality id'].value_counts().sort_index().plot(ax=axes[0, 1], kind='bar', rot=75, figsize=(20, 10)).set_title('abnormality id frequency of `calc_case_description_test`')
mass_case_description_train_set_df['abnormality id'].value_counts().sort_index().plot(ax=axes[1, 0], kind='bar', rot=75, figsize=(30, 10)).set_title('abnormality id frequency of `mass_case_description_train`')
mass_case_description_test_set_df['abnormality id'].value_counts().sort_index().plot(ax=axes[1, 1], kind='bar', rot=75, figsize=(30, 10)).set_title('abnormality id frequency of `mass_case_description_test`')

plt.tight_layout()
plt.show()

case_details

2.2 Pathology(normal, benign, malignant) distribution

그 다음으로, 학습에 가장 중요한 영향을 끼칠 Pathology column에 대해서도 분포를 출력해 보겠습니다.

import matplotlib
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt

SMALL_SIZE = 17
MEDIUM_SIZE = 20
BIGGER_SIZE = 25
font = {'family' : 'DejaVu Sans',
        'weight' : 'normal',}
matplotlib.rc('font', **font)
params = {'legend.fontsize': SMALL_SIZE,
         'axes.labelsize': MEDIUM_SIZE,
         'axes.titlesize':BIGGER_SIZE,
         'xtick.labelsize':MEDIUM_SIZE,
         'ytick.labelsize':MEDIUM_SIZE}
pylab.rcParams.update(params)

fig, axes = plt.subplots(nrows=2, ncols=2)

calc_case_description_train_set_df['pathology'].value_counts().sort_index().plot(ax=axes[0, 0], kind='bar', rot=0, figsize=(20, 10)).set_title('pathology distribution of `calc_case_description_train`')
calc_case_description_test_set_df['pathology'].value_counts().sort_index().plot(ax=axes[0, 1], kind='bar', rot=0, figsize=(20, 10)).set_title('pathology distribution of `calc_case_description_test`')
mass_case_description_train_set_df['pathology'].value_counts().sort_index().plot(ax=axes[1, 0], kind='bar', rot=0, figsize=(30, 10)).set_title('pathology distribution of `mass_case_description_train`')
mass_case_description_test_set_df['pathology'].value_counts().sort_index().plot(ax=axes[1, 1], kind='bar', rot=0, figsize=(30, 10)).set_title('pathology distribution of `mass_case_description_test`')

plt.tight_layout()
plt.show()

case_details

pathology column은 train과 test csv에서 각기 다른 양상을 보이는 것을 확인할 수 있습니다. 이어지는 내용은 下편에서 다루도록 하겠습니다.