화학 데이터 세트의 시각화와 탐색적 데이터 해석【Python, RDKit】

2020/2/17

기계 학습/QSAR 모델링의 전 단계로서, 예를 들어 화학 구조와 활성 목록으로 구성된 화합물 데이터에 대한 내용을 가시적으로 분석하는 것은 모델을 선택하고 이해하는 데 중요합니다.

이번에는 목적 변수와 관련된 특징을 찾기위한 데이터 과학 기술로서 화합물 데이터 세트의 탐색 적 데이터 분석을 수행한다.

탐색적 데이터 분석이란?

탐색적 데이터 분석(Exploratory data analysis)은 데이터의 시각화와 상관 분석 등을 통해 주요 특징을 요약하는 데이터 분석의 초기 단계에서 중요한 접근법입니다.데이터 중에서 원래 상정했던 패턴이 인정되는지를 검증하거나 어떤 패턴이 있는지를 찾기 위해서 행해집니다.

1970년대 통계학자인 Tukey의 책탐색 적 데이터 분석"이제 약 2건이 인용될수록 데이터 분석에서 중요한 프로세스로 정착하고 있다"(Tukey, John W. 탐색 적 데이터 분석Vol. 2. 1977. ).

데이터 준비

샘플 데이터에는 MoleculeNet의 BBBP를 이용. blood-brain barrier penetration(화합물의 혈액뇌 관문 투과성)에 대해서 「투과성 있음(penetration)」을 XNUMX, 「투과성 없음(non-penetration)」을 XNUMX으로 정리한 데이터입니다.

참고 문헌 :https://pubs.acs.org/doi/10.1021/ci300124c

데이터 아래 준비

import numpy as np
import pandas as pd
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, PandasTools, Descriptors
pd.set_option('display.max_columns',250)
print('rdkit version: ',rdBase.rdkitVersion) #rdkit version:  2019.03.4
 
bbbp = pd.read_csv('./BBBP.csv',index_col=0)
 
# smilesからmolオブジェクトを作成し、DataFrameに格納
PandasTools.AddMoleculeColumnToFrame(bbbp,'smiles')
 
# molオブジェクトを作れなかった行の削除
bbbp = bbbp.dropna() 
bbbp.info()
Int64Index: 2039 entries, 1 to 2053 Data columns (total 4 columns): name 2039 non-null object p_np 2039 non-null int64 smiles 2039 non-null object ROMol 2039 non-null ) memory usage: 64+ KB

데이터 세트의 부감

우선은 어떤 화학구조가 포함되어 있는지 일람으로 확인합니다.

# 化学構造を一覧で表示
PandasTools.FrameToGridImage(bbbp[:18], column='ROMol', legendsCol='name', molsPerRow=6, subImgSize=(150,150))

  

# ターゲットp-npの分布を確認
bbbp.p_np.value_counts()
1 1560 0 479 이름: p_np, dtype: int64

화합물 기술자로부터 목적 변수와의 상관 관계를 찾는다.

육안만으로는 개요를 파악할 수 없기 때문에, 기술자를 작성·집계해 데이터 세트 부감해 본다.
화합물 기술자에 대해서는 이하에 정리하고 있습니다.

# 記述子を生成する
for i,j in Descriptors.descList:
    bbbp[i] = bbbp.ROMol.map(j)

# 要約統計量の表示
bbbp.describe()

# データセット全体における構造記述子の分布
import matplotlib.pyplot as plt
import math

list = ["p_np", "RingCount", "NumAromaticRings", "NumAromaticCarbocycles", "NumAromaticHeterocycles", "NumSaturatedCarbocycles", "NumSaturatedHeterocycles", "NumSaturatedRings"]

fig = plt.figure(figsize=(15,7))
for i, c in enumerate(list):
   ax = fig.add_subplot(
       math.ceil(len(list) / 4), 4, i + 1)
   # plot the continent on these axes
   sns.countplot(x=c, data=bbbp,  ax=ax)
   ax.set_title(c)
fig.tight_layout()
plt.show()

 

# targetによる構造記述子の分布の違いを可視化
list = ["RingCount", "NumAromaticRings", "NumAromaticCarbocycles", "NumAromaticHeterocycles", "NumSaturatedCarbocycles", "NumSaturatedHeterocycles", "NumSaturatedRings"]
 
fig = plt.figure(figsize=(15,7))
for i, c in enumerate(list):
   ax = fig.add_subplot(
       math.ceil(len(list) / 4), 4, i + 1)
   # plot the continent on these axes
   sns.countplot(x=c, data=bbbp, ax=ax, hue="p_np")
   ax.set_title(c)
fig.tight_layout()
plt.show()

 

# logPと分子量でplotしてみる
import seaborn as sns
sns.scatterplot(x="MolWt", y="MolLogP", data=bbbp,
                hue="p_np",
                alpha=0.5)

혈액뇌 장벽 투과성이기 때문에 중요한 인자는 거의 알려져 있었지만, 소수성(logP)과 분자량(MolWt)이 막 투과성에 중요하다는 관계성을 엿볼 수 있습니다.

일반적인 탐색적 데이터 해석에 있어서의 수법으로서 이하등이 참고가 되었습니다( 탐색 데이터 분석에서 올바른 시각화 기법을 선택하는 방법과 그리는 방법 ).기술자의 집계에 적용하는 것도 좋을 것 같다.