ChEMBLのデータを可視化してみた

前回までのこちらの記事でChEMBLからダウンロードしたデータを可視化できるように加工しました。

ChEMBLのデータを整える - おじさんちのクソゲ

既に構造や骨格の情報となるMol fileをSMILES stringsから生成してるので、今回は続きとして同じDataFrameを使っていきたいと思います。
可視化によく使われるのはmatplotlibとかseabornですが、今回はplotlyを使ってます。 簡単にintractiveなグラフを書いたり、web pageに組み込んだりできる(らしい)ので試してみたかっただけです。

統計値の作成

Spotfireとかだと文献や骨格情報のUnique countとかを簡単に表示できるやつです。
他にいい方法があったら教えてください。

dfd = df.groupby(['Document Year'])['Document ChEMBL ID'].describe()
dfm = df.groupby(['Document Year'])['Murcko_generic_SMILES'].describe()
dfd


Document Yearをgroupbyでまとめた後、Document ChEMBL IDMurcko_generic_SMILESの統計値をとってあげたっていう感じです。
注意が必要なのは、前回の処理でDocument Yearが不明なものを2025として処理していることです。
0とかでもいいんですが、可視化した時の見やすやを重視しています。

Count of Documents and Scaffold by Year

plotlyを使うとこんな感じです。

import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Bar(x=dfd.index, y=dfd['unique'], name='Document count'))
fig.add_trace(go.Bar(x=dfg.index, y=dfg['unique'], name='Scaffold count'))
fig.add_trace(go.Bar(x=dfm.index, y=dfm['unique'], name='Scaffold count'))

fig.update_layout(
    title='Documents and Murcko scaffold v.s. Year',
    # showlegend=False, # Legendのon/off
    width=1000,
    # height=700
    barmode='group',
)
fig.show()

Murcko Scaffoldは環構造に基づく骨格分類です。genericにすると芳香環やヘテロ環の情報もフラットにしてくれます。cyclopropylやcyclobutylが置換基ではなく骨格扱いになるところは厄介ですが、状況に応じて使い分けるかなと思います。
例えばSARで置換基の一つとしてPhみたいなのが登場することを考えると、文献一報あたりの骨格数は2~5くらいじゃないかなと思います。
その観点で見ると、2011年や2015年は突出してるように見えますね。骨格変換による何かしらのブレイクスルーがあったか、FBDDやVirtual Screeningのように大規模な探索が行われたのかもしれません。

pChEMBL Value box by Year

import plotly.express as px
fig = px.box(
    df,
    x='Document Year',
    y='pChEMBL Value',
    points='all',
)
fig.update_layout(
    title='pChEMBL Value v.s. Year',
    showlegend=False, # Legendのon/off
    width=1000,
    # height=700
    ) 
fig.show()


pChEMBL ValueはpIC50みたいなものと思っていいと思います。
ただし、functional assayだったりbinding affinityだったりと、各文献で評価系が異なる点に注意が必要です。
細かいところはDataFrameのassay discriptionで確認できます。
比較的早い段階からpChEMBL Value = 9が報告されていますが、TYK2はkinaseなので非選択的な既知阻害剤だったりで試験してたりするんじゃないかなと思います。
points = 'all'とすることでデータ数がわかりますが、2010年くらいから選択的阻害剤の探索が開始され、2019年くらいから選択性のいい化合物のSARが報告され出してるのかなーと妄想します。

Filtering by Molecular Name

import plotly.express as px
fig = px.box(
    df[df['Molecule Name'].notna()],  #ここを変えただけ
    x='Document Year',
    y='pChEMBL Value',
    points='all',
)
fig.update_layout(
    title='pChEMBL Value v.s. Year',
    showlegend=False, # Legendのon/off
    width=1000,
    # height=700
    ) 
fig.show()


治験だったり承認されたりすると薬剤名が登録されます。Molecule Nameでfilteringするとこんな感じです。
考察が正しいかはさておき、2011年くらいにやたら評価数が増えています。kinase標的の上市品が増えたとか、イベントでもあったんでしょうか?

Molecule Max Phase scatter by Year

import plotly.express as px
fig = px.scatter(
    df[df['Molecule Name'].notna()],
    x='Document Year',
    y='pChEMBL Value',
    color='Molecule Max Phase',
    hover_name='Molecule Name',
    # hover_data=['Document ChEMBL ID', df[df['Molecule Name'].notna()].index],
    opacity=0.5
)
fig.update_layout(
    title='pChEMBL Value v.s. Year',
    # showlegend=False, # Legendのon/off
    width=1000,
    # height=700
    ) 
fig.show()

使われた薬剤の治験進行状況をプロットするとこんな感じでした。
承認されたDeucravacitinibの初登場は2019年でした。いいもん出来たから文献に報告したんでしょうね。
ちなみにplotlyはlegendをダブルクリックすると簡単にfilteringできます。plotをドラッグすることで拡大したりもできます。


やはり早い段階から上市薬(Molecule Max Phase = 4)で試験されてますね。

Summary Table of Deucravacitinib

name = input('Molecule Name?')
df[df['Molecule Name']==name].filter(items=[
    'Molecule Name', 
    'Molecule ChEMBL ID',
    'Molecule_Image',
    'Molecular Weight',
    'pChEMBL Value',
    'AlogP',
    'Ligand Efficiency LLE',
    '#RO5 Violations',
    'Assay Description',
    'Document ChEMBL ID'
]).head(1)

Deucravacitinibはこんな顔でした。(小さくてごめんなさい)
重水素が3つ入ってますね。
ピリダジン周りがヒンジバインダーだと思うんですが、あんまり見たことない顔かもなーって思いました。
SBDDの文献も見つかったので、そのうち紹介したいと思います。
続く。。。