前回までのこちらの記事でChEMBLからダウンロードしたデータを可視化できるように加工しました。
既に構造や骨格の情報となるMol fileをSMILES stringsから生成してるので、今回は続きとして同じDataFrameを使っていきたいと思います。
可視化によく使われるのはmatplotlib
とかseaborn
ですが、今回はplotly
を使ってます。
簡単にintractiveなグラフを書いたり、web pageに組み込んだりできる(らしい)ので試してみたかっただけです。
- 統計値の作成
- Count of Documents and Scaffold by Year
- pChEMBL Value box by Year
- Filtering by Molecular Name
- Molecule Max Phase scatter by Year
- Summary Table of Deucravacitinib
統計値の作成
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 ID
とMurcko_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の文献も見つかったので、そのうち紹介したいと思います。
続く。。。