化学数据集的可视化和探索性数据分析[Python,RDKit]

2020年2月17日

作为机器学习/ QSAR模型创建的第一步,从鸟瞰的角度分析组成一系列化学结构和活性的化合物数据的内容非常重要,以便选择和理解模型。

这次,我们将对化合物数据集进行探索性数据分析,以此作为查找与目标变量相关的特征的数据科学方法。

什么是探索性数据分析?

探索性数据分析是数据分析早期的一种重要方法,它通过数据可视化和相关性分析总结了关键功能。这样做是为了验证是否在数据中识别出了最初预期的模式,或者查找了任何模式。

1970年代统计学家图基(Tukey)的书“探索性数据分析现在已被确立为数据分析的重要过程,被引用了约2次(Tukey,John W. 探索性数据分析(第2卷,1977年)。

资料准备

Molecule Net 的 BBBP 用于样本数据。 关于血脑屏障渗透,数据是“渗透”为XNUMX,“非渗透”为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个条目,1到2053个数据列(总共4列):名称2039非空对象p_np 2039非空int64微笑2039非空对象ROMol 2039非空对象dtypes:int64(1),object(3 ))内存使用量:79.6+ 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)对于膜通透性很重要。

以下内容可作为一般探索性数据分析的方法( 探索性数据分析中如何选择和绘制正确的可视化方法 )。将其应用于描述符的聚合看起来不错。