tky_cowのブログ

python + chemistry, webの技術メモ等

統計検定2級を受けた話

f:id:tky_cow:20210328180428p:plain
統計検定2級の試験を受けたので、その受験記です。勉強に使った参考書、勉強法、かかった時間などをまとめておきます。

受けようと思った動機

 動機の詳しいところについては以下の記事にまとめてありますが、ざっくり言うと、自分の市場価値やできることを示す手段として、仕事に関連する資格を取ろうと考えました。その第2弾として着目したのが統計検定でした。
G検定を受けた話 - tky_cowのブログ

統計検定とは

 その名の通り統計に関する知識と活用力を評価する試験です。2011年に開始されており、様々な公的機関の支援、認定を受けている結構ちゃんとした資格のようです。英検のように1級、準1級、2級、3級、4級からなっており、自分が受けた2級は「大学基礎統計学の知識と問題解決力」というレベルに対応しています。一番受験者数の多い2級について概要をまとめると、以下のようになります。

統計検定2級

  • 試験時間:90分(多肢選択式・35問程度)
  • 受験料:一般:5,000円(税込)
  • 試験形式:試験会場での紙試験(6月、11月)、またはCBT形式(パソコン教室などのPC利用)
  • 合格率:40-45%前後
  • 電卓利用可能

 CBT試験は全国さまざまな会場で受けることができ、年中受けれるようなので便利です。問題形式は紙の試験と大分違うという噂です。2020年はコロナの影響で紙の試験は2回とも中止になってしまったようです。世知辛いですね・・

勉強方法

 G検定を受け終わった2020年8月頃からゆるゆる勉強を始めました。目標は年度内に合格することです。ブログなどで色々調べて、以下の順に勉強をしていきました。実は公式のテキストが存在しているのですが、概ね酷評されていたのでスルーしました。

前提知識

 勉強前の自分の状態としては、統計の知識はほぼない状態でした。化学系の人は生物系の人とは異なり、有意差が出るほど同じ実験を繰り返すことがほとんど無いため、そのような人も多いのではないでしょうか。微分積分線形代数は高校や大学の教養課程でやったなあという程度です。ちなみに数学、物理は苦手でした。

導入書1~2時間

 マンガで学ぶ系の本がKindleで投売りされていたので、とりあえず買って読んでみました。苦手意識がある人は導入のために一冊読んでおいてもいいかなと思いました。

統計WEBの統計学の時間を通読~30時間

 ほとんどの人が勧めていた統計WEBの統計学の時間の各項目を通読しました。問題も解いてみることを推奨されていたので解きながら進めていったのですが、結構時間がかかってしまいました。実際に出題される問題形式とも大分違うので、個人的には練習問題は解かなくて良かったのではと思います。その分2周読むか早く過去問に進む方が効果的なように思います。
bellcurve.jp

過去問を解いて復習40~50時間

 ひとまずインプットを終えて、過去問での演習に進みました。公式が出版している解説付き過去問集を買ってやりました。3年分6回分収載されています。1回分ずつひとまず解いてみて復習→次の週に解けなかった問題2回目復習→しばらく置いてできなかった問題3回目復習、という具合に進めていき、1回分7-8時間かけました。問題集の解説はたまに分かりにくい場合がありますが、統計WEBのブログでも解説してくれているので、適時参照しましょう。
 特に最初の3回分くらいは6割弱しか解けず、復習にも時間がかかってなかなか辛かったです。ただ、出題されている問題は理解を深めさせるような良問が多いなと思いました。自分の場合はここで一番知識が定着したように感じました。

追加した演習

 過去問6回分では演習が不足してるなと感じたので、以下のものに追加で取り組みました。結構時間的にタイトな試験なので、時間配分の練習をやっておけばよかったなと反省しました。

統計検定2級模擬問題集シリーズ

 統計ウェブを運営されているBellCurveさんが出している問題集です。1冊500円で3まで出ており、1冊で試験1回分程度の分量です。同じ形式で作られているわけではないので、時間配分練習には不向きかと思います。
Amazon.co.jp: 統計検定2級 模擬問題集1 eBook: BellCurve: Kindleストア

統計学演習

 同名の書籍が出版されているのですが、本文と例題は以下サイトで無料公開されています。章末問題の解答を見るためには購入が必要なようです。実は私は試験を受けた後に復習的に使ったのですが、CBT試験でほとんどそのまま出題されていたような問題が散見されたので、見ておけばよかったなと思いました。
www.math.s.chiba-u.ac.jp

実際の試験

 CBT試験がどのような感じなのかあまり情報が見つからなかったので、自分が受けたときの形式を紹介します。

試験会場の環境

 私が申し込んだ会場はPC教室だったのですが、特別な部屋が設けられるということはなく、自習室のようなところで受験する形式でした。同じ室内で普通に授業受けている人もいる(10名も入らない狭い教室)環境だったためか、ヘッドホンを渡されました。メモ用紙とペンも会場側で用意したものを使用するように指示されました(ラミネート加工されたA4用紙2枚とサインペン)。自分のタイミングでスタートして、90分したら勝手に終了する形式でした。

CBT試験問題の形式と難易度

 問題数は全32問で紙の過去問より少なかったです。大きな違いとしては、8割方一問一答形式で、紙の試験では多数派の(1),(2)のように分かれている問題は最後の方にまとまっていました。出題される分野の順番は紙のテストとほぼ同じだったと思います。難易度は紙のテストに比べて1-2割増しというところかなと感じました(過去問実績から1-2割り減った点数となりました)。流れのある問題が減った分、ヒントが減ることになって難しくなったのかと思います。

試験結果

 CBT試験の場合、終わるとすぐに画面上で点数と合否、セクション毎の正解率を確認することができます。60点以上で合格になります。結果は・・・68点で合格していました。過去問では7-8割行けそうかなと思っていたので、なんとももやもやする点数ですが、合格は合格です。セクション毎の正解率は以下の通りでした。

  • 1変数・2変数記述統計の分野:88%
  • データ収集・確率・分布の分野:75%
  • 推定・検定・線形モデルの分野:50%

推定・検定が悪すぎますね。。線形モデルは時間が足りなくなり、最後の3問くらいはとばすことになってしまったのが響きました。計算が合わず時間を取られた問題がいくつかあったのが悔やまれます。
 正直受けた直後は悔しさが大きく、再受験も考えて統計学演習の問題をやったりしていました。しかし、少し時間が経って落ち着いてきたのと、実務上それほど早く解く必要性は低く、別の分野や資格の勉強に充てたほうが有意義なのではないかと思えてきました。

まとめ

 統計検定の情報や受験記を調べているとスーパーマンのような受験記をいくつも見つけました。おそらく、数学的なセンスがある人や統計的な素養がある人には基本的な内容で簡単なのだと思いますが、そのような体験記は自分にはあまり参考になりませんでした。自分とレベルであったり、前提条件が近い人のものを探して参考にするのが良いと思います。本記事がそのような選択肢の一つになれればいいなと思います。

G検定を受けた話

f:id:tky_cow:20210111162438j:plain
 もう半年ほど経過してしまったのですが、タイトル通りG検定なるもの受けました。記録のために受験記を残しておくのも良いかなと思い立ち、筆を取った(パソコンだけど)次第です。なぜ受けようと思ったかの動機から、勉強に使った参考書、勉強法などをまとめておきます。

受けようと思った動機

 私は某製薬企業で計算化学系の仕事をしていますが、ここ数年は特に自分の市場価値というものを意識するようになりました。情報収集に使っているTwitterでも、身の回りでもここ5年ほどで大分転職が一般的になってきたように思います。自分のしたい仕事をし続けたいのであれば、常に転職できる状態を維持する必要があり、そのためには市場価値を客観的に示せる必要があるのではないかと考えました。研究職の場合、自分の能力を客観的に示せるものとしては以下のものがあると思います。

  1. PhD含む資格
  2. 論文や特許
  3. 学会などでの対外発表

計算やITに限って言えばKaggle, AtCoderなどのコンペ実績やGithubでのコミットなども有効な指標になっていくかも知れません。これらの中で、製薬企業では2の難易度はかなり高いです。創薬プロジェクトに関する内容、特に構造式を出せるのはプロジェクトが終了するか、特許を出してからになるためです。プロジェクトは3-5年ほど続く場合が多いので、忘れた頃に出す機会がやってくるような感じです。特許も他の業界と比べると特殊で、物質特許が基本になり、成功したものしか出せなかったりするのでさらに難易度は上がります。また、私の仕事は物を作り出す訳ではないので、特許に名前は載せてもらえるかもしれませんが、メインの業績にはなり辛いという問題もあります。対外発表については、自分の会社は比較的寛容であり、毎年できるようにネタを考えています。しかし、2020年はコロナの影響で様々な学会が中止やオンライン開催になり、モチベーションが上がらず一度も発表できませんでした。自分は現地に行く旅程も含めて参加するのが好きだったのだなと自覚しつつ、今年も同じような状況は続きそうなので反省していきたいところです。長くなりましたが、昨年は2,3共に難しい状況になったので、何か資格で取れないかと探し始めたのがきっかけです。

G検定、E資格とは

 普段の仕事内容に関係しそうな資格がないか調べたところ、目をつけたのがG検定、E資格、統計検定でした。実は統計検定2級も取得しようと勉強しているのですが、こちらは別エントリでまとめるとして、今回はG検定とE資格についてまとめます。G検定とE資格は共に一般社団法人日本ディープラーニング協会(JDLA)が主催、認定している資格試験です。格としてはG<Eで、G検定はジェネラリスト向け、E資格はエンジニア向けとなっています。諸々まとめると以下のようになりますが、まだ新しい資格ということもあり変更も多いようですので、最新の情報は公式サイトでご確認することをお勧めします。一般社団法人日本ディープラーニング協会【公式】

G検定

  • ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。
  • 試験時間:120分(多肢選択式・220問程度)
  • 受験料:一般:12,000円(税抜)、学生:5,000円(税抜)
  • 試験形式:オンライン受験
  • 合格率:60%前後
  • 年三回実施(3月、7月、11月)

E資格

  • ディープラーニングの理論を理解し、適切な手法を選択して実装する能力や知識を有しているかを認定する。
  • 試験時間:120分(多肢選択式・100問程度)
  • 受験料:一般:33,000円(税込)、学生:22,000円(税込)、会員:27,500円(税込)
  • 試験形式:指定の会場から希望した会場で受験
  • 合格率:65%前後
  • 年二回実施(8月、2月)
  • JDLA協会が認定した講座を修了する必要がある

受験料はどちらも結構お高いのですよね・・3万円以上出して落ちたら辛いですね。。新しい資格ということもあり、会社の自己研鑽支援などの対象にもなっていないのが痛い所です。特にE資格は指定された講座の受講料も含めると二桁万円かかるレベルなので、なかなか覚悟がいる資格だなと思います。

2020年第2回G検定の受験料が半額になっていた

本当はE資格を狙いたいなと思っていましたが、費用も期間もかなりかかって2020年中に受けるのは厳しいなと思っていたところ、G検定の受験料半額のニュースが出てきました。
次回7月4日G検定、受験料半額での実施を決定 - 一般社団法人日本ディープラーニング協会【公式】
これはありがたいということで、試験2ヶ月前くらいの時期でしたが受けてみることにしました。

勉強方法

 G検定は新しい試験ということもあり過去問が出回っておらず、どのような問題形式なのかイマイチつかめませんでした。受験した経験から言うと、計算問題や難しい問題はほとんどなく、知識問題がほとんどでした。120分で220問という設定からも伺いしれるように思いますね。歴史的背景や法規制についても出題されるので、普段機械学習ディープラーニングになじみがある人でも、以下参考書の内ひとつは読んでおいた方がいいと思います。
詳しい傾向と対策を知りたい方はhitoshiさんのサイトが参考になります。詳しい勉強法や当日のテクニックについても解説されています。
otokuget.net

前提知識

 自分の勉強開始前の状況としては、機械学習Python、深層学習は仕事でもちょくちょく使うので基本的なことは知っている状態でした。微分積分線形代数は高校や大学の教養課程でやったなあという程度です。ちなみに数学、物理は苦手でした。

使った参考書

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト

 まずは定番の公式テキストを購入して読み通しました。内容的にはこれだけで受かるのには必要十分だと思います。1周読み通した後、ざっくり2週目も通読しました。


人工知能は人間を超えるか

公式サイトで推薦されている松尾先生の著書も読んでみました。上の後に読んだので公式テキストの復習を兼ねるような使い方になりましたが、読み物色が強くてサクサク読めるので、導入として読むのもありかと思います。電子書籍は安くてよいですね。


その他役立った参考書

 試験対策のために読んでいたわけではないですが、過去に読んでいた知識が役立ったと感じる書籍です。

ゼロから作るDeep Learning

ディープラーニング入門書の定番ともいえる良書です。実装だけでなく基本的な仕組みも解説してくれているので役立ちました。


詳解ディープラーニング 第2版

RNNや自然言語処理についての解説が非常に良かったです。PytorchやTensorflowの新バージョンでの実装法も学べるのでお勧めです。


試験当日と結果

 2020年7月4日の回で受験しました。問題数は多いですが、数分残しで時間内に解き終わることができました。手ごたえ的には80-85%程度の正答率だったと思います。2020年7月16日にメールで結果が届き、無事合格していました。合格者には他にも以下のものが送られてきました。

  • 合格者コミュニティCDLEの案内
  • 名刺などに付けるロゴ
  • 合格証のzipファイル

まとめ

 無事合格したのですが、資格がどのような効果があるのかは正直よく分かりません。実務担当者というよりはマネージャーや上層部、ビジネス関係の人が受けると有効な試験だと思います。部下が提案してきたことへの理解や、どのような事ができそうでどのような事が難しそうか判断可能になりよいのではと思いました。今年はE資格の受験も含めて検討していきたいと思っています。

在宅勤務でのリモート開発環境構築

 新型コロナウイルスの影響で在宅勤務になっている方も多いのではないでしょうか。かくいう私も在宅勤務が基本となって9ヶ月が経過しました。普段の仕事では職場のマシンやサーバーでプログラミングしたり、GPUに計算投げたり、シミュレーションしたりしてますが、さすがに家に持ち帰るモバイル機でそれらをこなすのは限界があります。よって、家からでも快適にプログラミングができる環境の構築が急務となりました。今回はリモート環境構築で便利だと思ったツールと設定方法を、使用感と合わせて紹介します。

JupyterlabでリモートIDE環境構築

 JupyterlabはJupyter notebookの後継アプリケーションで、コードの動作を試したりするときに非常にお世話になっています。Notebookはまさにノートブックという感じでしたが、Labは見た目もIDEぽくなり、様々な拡張機能やアプリも開発されています。流れとしては、会社にあるサーバー(以下サーバーと記載)上でJupyterlabを立ち上げ、自宅モバイル機でChromeなどのブラウザからネットワーク経由でアクセスします。今回紹介する方法は以下記事を参考にしました。機能やおすすめのエクステンション、導入方法も参考になります。
qiita.com

やり方

自宅のモバイル機からSSHでサーバーに接続し、サーバー上でJupyterlabを導入した環境(jupyenvとします)を起動します。

conda activate jupyenv

続いて、サーバー上で以下のオプションを与えながらJupyterlabを起動します。IPの部分にはサーバーのIPアドレスを入れます。

jupyter lab --ip=11.22.33.44 --no-browser

無事立ち上がるとhttp://11.22.33.44:8888/?token=a1b2c3... のようなアクセス用のパスワードトークン付きのURLが表示されるので、これをコピーしてモバイル機のブラウザ(Chrome, Firefoxなど)に貼り付ければ終了です。

使用感

 この方法で起動すると、コードはモバイル機のブラウザ上でいつも通り行えますが、処理はサーバー上で行われるため、重い計算も難なく行えます。また、サーバー上にある容量の大きいデータも移動することなく解析でき便利です。さらに、書いたコードの分だけのデータ通信で済むためか、VPNが込み合って非常に重いときでも作業が可能でした。
 細かい点ですが、私はモバイル機とサーバーで同時にJupyterlabを使うので、サーバーの方はDark Themeの設定にして間違わないようにしています。設定方法は上で紹介した記事に書かれていますので、参考にしてください。

VSCode remote developmentでリモートのVSCodeで編集

 続いて、コードを書くときのもうひとつの頼りになる相棒VSCodeについてです。VSCodeマイクロソフト社が開発しているコードエディタで、使っている人も多いのではないでしょうか。サーバー上のVSCodeを自宅のモバイル機から使いたい場合は、VSCode remote developmentという拡張機能を使います。

やり方

 丸投げになってしまいますが、具体的な設定方法については以下の記事を参照して行いました。
qiita.com
自宅のWindows PCから会社にあるLinuxサーバーに接続したい場合やることとしては以下になります。

  1. モバイル機のVSCodeにRemote Development Extensionsを導入する
  2. WindowsPCの場合SSHを有効にする
  3. configにサーバー機に接続するための情報を記載する
  4. モバイル機VSCodeの左側CONNECTIONSにサーバーが表示されるので選択して開く

全て自宅モバイル機側での設定になりますね。

使用感

 こちらの方法を使うと、サーバー上にあるコードをモバイル機のVSCodeから直接編集できるようになり便利です。既に動かしているコードを編集したり、社内データベースにアクセスするようなコードを書く場合などに活用しています。ただ、Jupyterlabの方法に比べると特に起動時の通信量が多いようで、VPNが激込みのときは使えませんでした。

終わりに

 早いもので、在宅勤務主体になってから半年以上が経過しました。JupyterlabとVSCode remote developmentによるリモート開発環境を整えたことによって、在宅でも普段とほとんど変わらず業務がこなせるようになりました。しかし、コミュニケーション(と運動)不足は否めず、最近は週2くらいは出社するようにしています。第三波でどうなるか不透明ではありますが、どなたかの参考になれば幸いです。

RDKitの計算を並列化する

 はじめましてtky_cowと申します。某内資系製薬企業で研究職をしています。技術メモ的な内容を書き記していけたらなと思いブログを開設してみました。初の記事はタイトルの通りなのですが、非常にニッチな内容ですね笑。まあ気にせず行きましょう。

RDKitの記述子計算

 Chemistry分野では、化合物の特性を表す記述子と呼ばれる各種指標を計算することが良くあります。分子量(MW)、logP、tPSAなどが代表的ですね。RDKitでこれらを計算することができるわけですが、千単位の化合物数を計算すると時間がかかってちょっとストレスを感じることがあります。
 RDKitの記述子計算はデフォルトだと1コアで計算を実行するようです。そこで、マルチコアで実行するオプションでもあるのかなと調べましたが、特になさそうでした。公式ドキュメントでもmultiprocessingなどの他の機能で補って的なことが書かれていたので実装してみます。

multiprocessingで並列化

 multiprocessingはPythonの標準ライブラリーの一種です。使い方に関しては以下の記事を参考にさせていただきました。記事によると、今回のケースではPoolよりProcessの方が正しい気がしますが、そこまで厳密な制御を必要としていないので、実装がシンプルなPoolを使います。
Pythonの並列処理・並行処理をしっかり調べてみた - Qiita
Python並列処理(multiprocessingとJoblib) - Qiita

実際のコード

 ここでは実装の全体を示した後、細かいところを少し解説します。最後にTHE DRUG REPURPOSING HUBからダウンロードした10421化合物のデータセットで比較した結果もお示しします。

インポートと設定
import sys
from datetime import datetime
from multiprocessing import Pool
import multiprocessing as multi
from rdkit import Chem, rdBase
from rdkit.Chem import AllChem, Descriptors
from rdkit.ML.Descriptors import MoleculeDescriptors
rdBase.DisableLog('rdApp.warning')

 最後のrdBase.DisableLog('rdApp.warning')は立体フラグが不明瞭などの理由で結構warningが出たりするので、それをオフにしています。市販化合物などのデータではよく出るwarningです。

記述子計算部分
def calc_desclist( smi ):
	# MW, tPSA, AROM, HBA, HBD, ROTB, LogP, RING
	desclist = ['MolWt', 'TPSA', 'NumAromaticRings', 'NumHAcceptors',\
				 'NumHDonors', 'NumRotatableBonds', 'MolLogP', 'RingCount']
	calculator = MoleculeDescriptors.MolecularDescriptorCalculator( desclist )

	#Calculation
	res = []
	try:
		mol = Chem.MolFromSmiles(smi)
		descs = calculator.CalcDescriptors(mol)
		for num in range(0, len(desclist)):
			if descs[num]:
				res.append(str(descs[num]))
			else:
				res.append("")
		resrow = "\t".join(res)
	except Exception:
		ex, ms, tb = sys.exc_info()
		sys.stderr.write("ERROR : " + str(ms) + "\n")

	return resrow

 よく使う8種類の記述子を計算するように設定したcalculatorを作り、CalcDescriptorsメソッドで計算します。for文以降はファイルに書き出すために文字列に置き換え、1行分をまとめているだけです。

並列処理
def run_calc_multi(inpfile, num_cpus=multi.cpu_count()):
	with open(inpfile, 'r') as inF:
		print("Calculation started")
		counter = 0
		smilist = []
		for l in inF:
			if counter != 0:
				smi = l.rstrip()
				smilist.append(smi)
			counter += 1

		print("Compounds processing :", len(smilist))

		# Multiprocessing
		p = Pool(num_cpus)
		result = p.map(calc_desclist, smilist)
		p.close()

		# Output preparation
		pref = inpfile.split(".")[0]
		with open(pref + '_calc.tsv', 'w') as out:
			out.write("SMILES	MW	TPSA	AROM	HBA	" +\
				"HBD	ROTB	LOGP	RING\n")
			
			for smi, line in zip(smilist, result):
				out.write(smi + "\t" + line + "\n")

 本題の並列化部分です。後々のことを考えてnum_cpus引数で使うCPU数を指定できるようにしておきます。デフォルトでは利用可能なCPUをすべて使います。まず、計算する構造のリストを作成し、実行する関数と共に渡します。並列化する部分はこれだけで、非常に簡単ですね!

並列化の効果

 さて、並列化の効果はどの程度あるのでしょうか。CPU数を4→2→1と振って計算時間を比較してみます。結果は以下のようになりました。

CPU数 4 2 1
計算時間(秒) 6.77 8.14 14.0

1コアでも早いやないかい!例が悪かったですね。。記述子計算はそもそも計算速いようです。アラート構造を判定する部分構造検索などが含まれていると遅くなるのですが、その場合でも同じ並列化は有効ですので効果的に使えると思います。今回のコードやサンプルファイルはこちらにまとめてあります。