Project Namiki

Twitter→@sol2_CTF

統計検定1級に4か月で合格した話【医薬生物学】

初めに

2023年度の統計検定1級に4か月、かつ独学で合格したのでその記録を残します。
統計検定1級に挑戦する誰かの参考になれば嬉しいです。

TL;DR

  • 計算力はあればあるほど良い。
  • 統計数理はやればやるほど良い。
  • 『ラスベガスをぶっつぶせ』はいいぞ。

統計検定1級とは

統計に関する国内最上級の試験であり、確率分布の性質から検定手法まで、幅広い出題範囲を扱っています。
統計検定1級はほかの級と異なり、すべて論述形式の試験です。
統計数理と統計応用の2つに分かれており、その両方に合格する必要があります。合格率は数理と応用でどちらも毎年20%くらいで推移しています。
統計検定1級の立ち位置を全体でみるとこんな感じです。

(統計数理研究所『データサイエンティスト育成事業』から引用)
棟梁レベルというと何か強そうな感じがしてかっこいいのでこの画像を引用しました。
ちなみに日本ではこの棟梁レベルが不足しており、統計数理研究所は人材育成に力を入れているらしいです。
余談ですが、試験当日会場に来てるのは見るからに理系という人と、見るからにベテランという人の2択で、明らかに雰囲気が違ったのを覚えています。
周りに圧倒されないように理系のベテランぶることでなんとか耐えました。

バックグラウンド

  • 実習期間中の医学部5年生
  • 強化学習の実装のなかで確率分布に触れることはあったが、雰囲気で理解していた。
  • 微積は受験数学(数学III)まで、線形代数は初めから。
  • 統計検定の受験自体初めてで、2級や準1級は未受験。

きっかけ

統計学自体への関心があることに加え、統計学はセキュリティ、強化学習、医学など私の関心のある/関与する分野でも多く使われており、今後の需要も高まりそうなので勉強しようと思いました。
また、挑戦する壁は高ければ高いほど良いので、最初から1級を受験することにしました。

試験対策

共通

統計数理と統計応用の両方において、数学の知識と過去問演習が必須です。   

数学

統計検定1級には理系大学の基礎課程で学ぶような微積分と線形代数の知識が前提とされています。
私の大学も理系ではありますが、学部の性質上狭く浅くしかやってないので初めから勉強しました。

使用した参考書は以下の2冊です。

www.chart.co.jp

www.chart.co.jp

上記の参考書の問題全てを解いたわけではありませんが、問題を解いたり証明の理解に必要な基本的な事はこれらの参考書の演習を通して勉強しました。

過去問

jitsumu.hondana.jp

数理と応用に共通して、過去問を繰り返し解きました。
値段は張りますが揃えた方が良いと思います。私は2014~2022年の問題を入手しましたが、傾向が変化しているので2015年以前の過去問は必要ないと思います。(ちなみに2015,2014年はかなり異常な難易度で、その意味でもやる必要はそこまで無いと思います。)

時間制限も考慮して、問題ごとに解いた日付とかかった時間、正答率を記録しました。

統計数理

ここで大事なのは、問題パターンに対する解答を網羅的に理解したり覚えることではなく、初見の問題に対しても方針を立てて解くことが出来る力をつけることです。
試験時間が短いため典型的な問題はその場で考えなくても解けるように演習量を積みましょう。

使用したのは以下の書籍です。

2級公式本

www.tokyo-tosho.co.jp

統計に関する基本的な知識もなかったので、2級公式本は一通り読んで理解しました。問題を解いていく中で抜け落ちている箇所はその都度確認しました。

現代数理統計学の基礎

www.kyoritsu-pub.co.jp

他の多くの統計検定1級合格者が使用している参考書です。私の場合、統計数理の対策はほぼこの一冊で完結しました。
内容は統計検定1級の範囲を超えているので、必須ではありませんが、章末問題が豊富にあり、公式の解説も丁寧に書かれているので進めやすいです。
初学者からしたら初めは公式の解説も意味わからんので、有志で解答を作成して下さっている記事を参考にすることをお勧めします。
(参考:『現代数理統計学の基礎』章末演習問題解答 (答案) #統計学 - Qiita)
ただ先述の通り、私は個人的に重要なのは「問題に対する捉え方」だと考えています。そして、公式の解答は難しい内容ではありますが、問題テーマに沿った考え方で解説がなされています。
従って、平易な形でも一度解答を理解したなら、なるべく早く公式の解答を理解できるようにした方が良いと思います。
公式の解答を参考にするにあたっては、問題ごとに「この問題でテーマとされていることは何か」ということを意識しながら問題を解いたり解答を読み込むといいです。
それから多くで言われている通り、この書籍だけでは線形回帰や統計的検定の対策が不十分です。それらの部分は、2級公式本や次の項で説明する1級公式本や過去問で勉強しましょう。

統計応用【医薬生物学】

統計応用の医薬生物学は理工学や人文社会学など他の分野と比較して対策しにくいというのが印象です。加えて、インターネット上に合格者によるリソースが少ないため、ここでは医薬生物学の対策について少し詳しく書こうと思います。
対策が難しいとは言ったものの、やはり「過去問を解く」という基本的な方針に変わりはありません。統計数理と同様、「解法の方針を立てることができる」ようになるのが重要です。
その上で次のような書籍で勉強しました。

1級公式本

www.tokyo-tosho.co.jp

日本統計学会が出版している公式の参考書です。統計数理と、統計応用の各分野について一通りのことが書かれています。
私は主に統計応用の対策として用いました。
ただし注意点としては2つあって、1つ目は古い書籍であるということです。初版は2013年で現在出版されてるのはそれの増訂版です。手法が古いためか一般的でなくなったのか、問題ではあまり見ない手法について書かれていることもあります。
ちなみに試験問題ではこの書籍に書いてないことでも全然出題されます。公式本とは…?
2つ目は、過程や導出が結構省略されているということです。問題で出ないようなことまで書いてある割に、書いてあることについては内容が不十分な感じです。導出が省略されていたり、結果だけ書かれていたりと、初学者がこの一冊だけで十分に理解するのは難しいと思います。 なのでざっと読んでおいて、過去問を解くにあたり参考になる(かもしれない) 資料の一つとして持っておくといいと思います。

統計学実践ワークブック

www.gakujutsu.co.jp

同じく日本統計学会が出版している公式の参考書です。内容としては準1級向けですが、実際に手を動かして理解出来るという点で役に立ちます。初版は2020年と新しく、上の1級公式本よりも親切な解説です。
ノンパラメトリックの章の説明が素晴らしいので、特に医薬生物学選択の受験者にとってはそれだけでも価値がある一冊だと思います。今すぐに買いましょう。

その他リンク

DataArts

www.data-arts.jp 2014-2017年の統計数理と統計応用(理工学)の問題と解答が記載されているサイトです。
解説が公式のものよりわかりやすかったりします。医薬生物学の解説はないですが、共通問題として被ることがあります。

脳内ライブラリアン

nounai-librarian.com 医薬生物学の問題を解説して下さっている個人ブログ。医薬生物学の過去問解説って本当にインターネットに存在しないのでそれだけでもありがたい。
神経内科医として活躍されており、医療統計の現場での扱いなど、試験とは直接関係はないものの読み物として興味深いです。

東京大学 院試

www.iii.u-tokyo.ac.jp
東京大学大学院 情報学環・学際情報学府の院試です。
生物統計情報学コースの問題を医薬生物学の対策に解きました。問題数は少ないですし解答解説が無いので優先順位は低いですが、余裕がある人は解いてみるといいと思います。

医薬生物学に関する雑リンク

統計応用では以上の基本的な対策に加え確実に得点出来る自分の得意な分野を作りました。 私の場合は生存時間解析、分割表、ノンパラメトリックの3つの単元を重点的に勉強しました。
(後述しますが、結局どの分野も出題されなかったです…)
基本的にインターネット上の資料を用いての学習になると思います。
私が使用したいくつかのサイトのリンクを以下に載せておきます。適当に参考にしてください。

qiita.com 医薬生物学の一大コンテンツ、生存時間解析の入門的な解説記事です。
生存時間解析は医療以外にも経済、理工学などにも用いられている分野で、この記事は理工学を例にした説明ですが、生存時間解析自体の理解に問題はありません。

en.wikipedia.org

医療統計の検定方法については英語のリソースが多く、英語版wikiは結構参考になります。例えば上記のwiki記事の下のほうに検定手法が表でまとまっており、概観の整理にも役立ちます。

学習記録

4か月間の学習記録

(7月)

実習のスケジュールも考慮して、統計検定1級の受験を決意します。この段階で情報を集め、合格に必要な知識ややるべきことを整理しました。

8月 [70時間]

  • 【数理】
    『現代数理統計学の基礎』を始めます。
    すべてが初見だったので1問に対して理解するのに時間がかかり、この月は全体の半分くらいの問題を解きました。(と言うよりかは解説を読み進めました。)

  • 【応用】
    この月はやっとりません。

9月 [80時間]

  • 【数理】
    引き続き『現代数理統計学の基礎』を、8月と合わせて2周くらい読み進めました。この時点でなんとなく分かってきたので、解けそうな数理の過去問少しずつ解いてみたりしました。
  • 【応用】
    この月はやっとりません。

10月 [280時間]

この月の実習はほとんど自由時間だったため多くの時間を確保することが出来ました。

  • 【数理】
    『現代数理統計学の基礎』が解けるようになってきたので、この月だけで3周くらいしました。
    これに加えて、過去問を繰り返し解くようにしました。過去問は間隔をある程度空けて、5周くらいしたと思います。
  • 【応用】
    この月の中旬頃から統計応用の対策を始めました。
    統計応用の対策が後手になりがちとのことで早くに着手したつもりですが、もっと早く始めていてもよかったと思います。

11月(18日まで) [75時間]

実習が通常程度の忙しさに戻り、休憩時間や通学時間も利用して勉強しました。
基本的にはこれまで学習したことを確実に得点できるように練習をしました。 それから、本番に合わせて論述形式の解答制作をしました。実際にやってみて痛感しましたが、日本語で説明する部分を最小限にしないと時間が足りないです。
問題集の解説のような詳細な解答を書く時間はあまりないので、どこを言葉で説明してどこを式で説明するのかを考えながら書く練習をしました。

本番

自己採点

統計数理

[問1] (1)〇 (2)〇 (3)〇 (4)〇 (5)〇 (6)×
[問2] (1)× (2)〇 (3)〇 (4)×
[問3] (1)〇 (2)〇 (3)〇 (4)△

問題選択は解けそうな問1,2,3を選択しました。
統計数理は問1に30分かけてしまいましたが、他は特に困ることもなく解答できました。
終了時点ではかなり自信があり、成績優秀賞も狙えるくらいかな…?と思いましたが、後日発表された略解を確認すると問2の(1),(4)でしょうもないミスをしており以上のような結果となりました。

統計応用

[問1] (1)〇 (2)× (3)× (4)× (5)× [問2] (1)〇 (2)〇 (3)〇 (4)〇 (5)〇
[問5] (1)〇 (2)〇 (3)× (4)×(or△?)

午後の統計応用は、入念に対策をした分割表、ノンパラメトリック、生存時間解析のうちどの分野も出題が無く、その時点でかなり焦りました。
出来る問題から冷静にやってみて、問2→問5→問1の順番で解答しました。
問5は有名なモンティホール問題を扱った問題でしたが、感覚的にしか理解しておらず、いざ記述するとなると手が止まり、かなりの時間をここで消費しました。
話は変わりますが私の好きな映画の1つに『ラスベガスをぶっ潰せ』という映画があります。
作中で主人公のベン・キャンベルが数学教授にまさに問5と同じ問題設定のモンティホール問題を出題され、ベンはこの問題に対して余事象と全確率1の性質を用いて見事正解し教授から才能を買われる、というシーンがあります。
(2)では、この場面でベンが言っていたことを思い出して(今思えばかなり泥臭いやり方ではありますが)、なんとか解答を絞り出すことが出来ました。サンキューベン。  

『ラスベガスをぶっつぶせ』2008年
息抜きにいかが?

そうこうして解き進めますが、最後に解いた問1に移る頃には残り20分程度しか残っておらず、問1の(1)だけ答えた段階で、(2)以降を解き続けるか、これまで解いた問題の確認をするか、それとも問2ではなく問3を選択し直すか迷ってるうちに時間切れになってしまい、結局のところ問2は(2)以降白紙で提出することになりました。正直落ちたと思って試験終了後の帰り道にラーメンと油そばを連続で食べてみたりしましたが、結果としては合格していました。
問2が完答できていたのがかなりデカく、他のミスをギリギリ補えた、といった感じでしょうか。

所感

試験を振り返ってまず思うことは、統計数理の基礎的な知識と計算力が前提になるということです。
簡単な問題を早く正確に解答し、残りの時間で難しい問題を考える、というのが数理と応用で共通して言える試験だと思います。より多く手を動かしましょう。特に私のように数学をやっていない人の場合、感覚を身に着けるには量が大事です。今回の対策ではかなりの演習量を積んだので計算力に自信がつきました。
医薬生物学について言えば、過去問と同じ問題はもちろん出ませんし、対策していても知らないような問題が当たり前のように出てきます。まあそういうもんと割り切って、それでも面食らわず諦めないで1点でも多く得点するように頑張りましょう。

感想・今後の方針

合格自体も嬉しいことですが、それ以上に、これまでなんとなくで理解して通りすぎていた、技術書や技術的な論文の統計数理を用いた説明部分をしっかり理解できるようになったことがガチで嬉しいです。
資格は持ってるだけではアピール以外の何の意味もないです。統計検定1級の名に恥じぬよう、今回を始点に自分の実装や成果物に役立てていきたいと考えています。

これから統計検定1級に挑戦される全ての方の健闘を祈ります。

おまけ

合格発表の時は訳あって横浜でおいしいピザを食べてました。  

𝑾𝒊𝒏𝒏𝒊𝒏𝒈・𝑷𝒊𝒛𝒛𝒂
この後埠頭で缶ビールを飲むとかいう最強ムーブをしました。
むしろ寒ければ寒いほどいい

10月中に行ったTDL

本番はシンデレラ城が離散分布の確率密度関数に見えてから。

ポケセンで買ったウパー。

ウパー。特記事項なし。

情報処理安全確保支援士試験に一発で合格した話

令和4年度春期試験(4/16)に情報処理安全確保支援士試験(旧セキスぺ)を初受験し合格したので感想などを書いていきます。

TL;DR

  • IPAははやく結果を発表しなさい。
  • 旧セキスぺの"KISS…"の部分

 

目次です

 

情報処理安全確保支援士試験とは

対象としているのは次のような人物です。

サイバーセキュリティに関する専門的な知識・技能を活用して企業や組織における安全な情報システムの企画・設計・開発・運用を支援し、また、サイバーセキュリティ対策の調査・分析・評価を行い、その結果に基づき必要な指導・助言を行う者

(情報処理安全確保支援士試験 | 試験情報 | IPA 独立行政法人 情報処理推進機構)

 

実は情報系の国家試験のなかでも唯一「士業」として認められています。かっこいいね。

IPAの試験区分

 

私について

 

動機

コンピュータセキュリティの分野に興味があって、国内の技術者試験で最難関である情報処理安全確保支援士試験の合格を一つの目標としていました。

そんな中、去年12月にIPAから次のような発表がありました。

SC受験者が従事するセキュリティ関連業務の多様性の高まり、境界の曖昧化の傾向等を踏まえ、今回、午後Ⅰ試験と午後Ⅱ試験を統合して問題選択の幅と時間配分の自由度を拡大しました。また、午後Ⅰ試験と午後Ⅱ試験の統合によって、試験時間が短くなりSCの受験しやすさが高まりました。試験時間を短縮することによって受験のしやすさを高め、サイバーセキュリティの確保を担う情報処理安全確保支援士の育成・確保を一層推進していきます。

(情報処理安全確保支援士試験及び情報処理技術者試験(高度試験の組込み分野)における出題構成等の変更について | 試験情報 | IPA 独立行政法人 情報処理推進機構)

 

支援士試験は午前試験と午後試験に分かれており、さらにそれぞれI試験,II試験と分類され計4つの試験を通して評価されます。今回の変更では、午後I試験と午後II試験を統合し、一つの試験として行うというものです。

推測ですが、要は試験難易度を落として広く募集する、という事だと思います。

政府によるサイバーセキュリティ人材育成総合強化方針では、2020年までに3万人超の有資格者を確保する予定だったらしいですが、2022年10月時点でおよそ2万人と、人材が不足している現状を反映してのことでしょうか。そして実際に、形式変更が行われた基本情報技術者試験や情報セキュリティマネジメント試験では、変更前と比べて大幅に合格率が上がっています。

ですが私個人的には、これは難関な試験として設定した目標です。試験が簡単になってしまった後合格するのでは意味がありません。そういうわけで、難易度が高いうちに合格したいと考え、現形式で行われる最後の試験である今回の受験を決定しました。

 

結果

 

やったこと

対策期間は試験前1か月半くらいです。学生ではありますが病院実習中であり、さらに運の悪いことにその期間は朝から夕方までしっかりある忙しい診療科スケジュールだったので、そんときは宿泊先のビジネスホテルに持ち込んで勉強したりしました。

 

午前試験

午前I試験は応用情報に合格済のため免除でした。

午前II試験もあまり力を入れてなくて、試験前2日間で過去問の午前II試験の全ての出題を2周しました。午前試験は特別な勉強をしなくても、午後試験の対策をすれば自然にわかるようになっているので、なるべく午後試験の対策に時間を割いた方が良いと思われます。

 

午後試験

上述した通り次回以降の試験は午後I試験と午後II試験が統合されるため、ここではこれらを特に区別しません。

過去問と同じ問題が出るということはまずありません。なので丸暗記では解けないし、記述問題に正しく解答するためにもそれぞれについてしっかりと理解する必要があります。私は過去問で問題を解くたびに、『どのような知識があれば満点を取れたのか』を自分の言葉で説明できるように意識しました。

午後試験の対策としては2009~2022年までの春期・秋期試験の午後I、午後II過去問を全て解き、加えて2018~2022年の問題を選択的に繰り返し解きました。

過去問は全網羅しましたが、正直なところ古い問題は今と比べて簡単な印象があり、また出題傾向も今とは異なるため必ずしもやる必要はないと思います。2018年以降からとかで良いかも。

加えて、以下の書籍を参考にしました。

安全なwebアプリケーションの作り方

webセキュリティ分野の名著です。もともとはCTFのwebに入門するときに購入した本です。webアプリケーションに発生しる脆弱性と、それに対する攻撃手法、さらにその対策方法が詳細に分かりやすく書かれています。本が分厚く内容も決して薄くないですが、午後の選択問題でwebセキュリティも視野に入れている方には一読することを強く推奨します。

 

図解即戦力 暗号と認証のしくみと理論がこれ一冊でしっかりわかる教科書

現場で使われている知識が簡潔に書かれています。内容は広く浅くといった感じですが、DNSまわりの説明が参考になりました。

 

マスタリングTCP/IP 入門編

言わずと知れたネットワークの教科書です。とはいえ基礎的な知識が多いので、重要な箇所を理解したら次へ進みましょう。

マスタリングTCP/IP 応用編

ネットワークについて深く理解したかったので参考にしましたが、支援士の合格には必須ではない気がします。

マスタリングTCP/IP 情報セキュリティ編

辞書的な使い方をしました。PKISSL/TLSIPsecあたりの説明が分かりやすかったです。これも急いでたら必要ないかも。

 

情報処理安全確保支援士「専門知識+午後問題」の重点対策

最後の2週間くらいは本書籍に掲載されている午後問題を繰り返し解きました。

最低限の知識がまとめて書かれているので、試験の休憩時間に読んだりしました。

 

本番

応用情報の試験の際遅刻してしまった反省を生かし、余裕を持って自宅を出発し、試験開始2分前に会場に到着しました。応用情報の時と異なり受験者の平均年齢は結構高い気がしました。普段の業務でセキュリティをやっている方々が多いんでしょうか。

午後I試験の選択は問1,3、午後II試験の選択は問1です。

午前II試験と午後II試験は試験中に通過した感覚はありました。

午後I試験が一番の鬼門であり、時間との勝負でした。解けないほど難しい問題はありませんでしたが、焦らず冷静に解答したつもりでも後から見返したら解答形式を無視していたり、聞かれたことに正確に答えられていなかったりして結構失点していました。知らんうちに緊張していたのかもしれません。

午後I試験について各予備校が発表した解答で自己採点したところ、記述問題の部分点と何書いたか忘れたとこを0点として計算したら配点によっては最悪60%を切るような結果でした。これを契機に私の頭の中のメモリの一部に「あの問題なんて解答したっけな」について考える専門の領域が発生し、結果発表までの2か月はこれと生活を共にしました。

時間に少しでも余裕があれば、自分の解答をメモしておくことを強くお勧めします。

 

感想/内省

ここから先はセキュリティでも試験対策についての話でもないので、飛ばして頂いてかまいません。

少し個人的な話をします。私はコンピュータサイエンスのいずれかの分野で宇宙最強を目指しているのでした。宇宙最強というのは普通にこの宇宙で最強という意味です。

さて、宇宙最強を目指す意識から、「落ちても次回頑張ればいい」や「結果がどうあれ勉強した過程に意味がある」など甘い姿勢や態度は徹底的に排除しました。私にとって一番重要なことは、自身が設定した目標を達成するかしないか、勝つか負けるかの2択です。そういう背景もあって、試験前は「今回の試験は勝たなければ意味がない」という強迫的なエネルギーで勉強していました。

実際これが功を奏して、忙しい病院実習中にも関わらず短期間でかなり多くのことを学習できたと思っています。

その反面、結果が出るまでの間は同じ勢いで精神に負荷がかかりました。もし落ちていたら何をすればいいかが分からなかったし、既に結果は変えられない状況への緊張感を他の事で忘れようとしました。

でもよく考えれば、そもそも本番で大きなミスをしても余裕で合格出来るくらいの実力をつけていれば良かっただけの話です。覚悟が足りなかったか、あるいはもっと努力するべきだったのかもしれません。今回のようにくだらない不安が発生しないために、これからはもう少し考えなければならない、と感じました。

とはいえ結果が全てです。合格していて本当に良かったですし、とても嬉しいです。

 

気分紛らわせシリーズ

結果発表までの間やっていたことをいくつか

自作キーボード

“Orcinus one”というロープロファイルの40%分割キーボードを自作しました。

 

クールなキーボード

これまで自分で設計してきたキーボードはアクリル積層構造だったので、自分にとって初の3Dモデルによる設計です。3Dプリンタで出力した筐体は思ったより軽量で、重量による安定感はあまりありません。しかしロープロファイルで分割されたキーボードである以上、初めから打鍵感に期待はしなくていいですし、それならば3Dプリンタのボディでも問題はありません。

ちなみに初の脱promicroキーボードでもあり、初のUSB type-C接続キーボードでもあります。44個のキー全てにアンダーグローのLEDを実装しました。(一般的にキーボードが光るとテンションが上がるため)

この記事はOrcinus oneで書いています。やはり分割型は肩への負担がかからないので楽です。簡単に持ち運べるという点でも作ってよかったです。

競争から離れ、全てが自由で独創的。これが自作キーボードの素晴らしいところなのだなあ。(詠嘆)(開発費用がすごい速さで消費される点は無視するものとして)

 

GeoGuessr

GeoGuessrとはGoogleストリートビューの画像から、その場所が世界中のどこであるかを予測するオンラインゲームです。プレイヤーはストリートビューの画像から、風景、道路標識、言語、動植物、さらには土の色、太陽の位置、交通ルールなどを読み取り、それらをヒントとして出来るだけ正確な位置を推測します。細部への観察力や少ない情報からの推論力を披露するいい機会です。ウオオオオやったるわい!!!!!

2日でやめました。

 

映画

とあるきっかけで思い出したため、『ソーシャルネットワーク』を観直しました。最後にBeatlesの"Baby you are rich"が流れるシーンは何度観ても良いですね。

あと『ザ・スーパーマリオブラザーズ・ムービー』も映画館で観ました。64のピーチ城が再現されてて感動しかけた。

ステッカーはクッパでした!皆は何だった?

これからの目標

全部頑張る

(追記予定)

 

これから情報処理安全確保支援士試験を受験する全ての人の健闘を祈っています。

おわり

 

 

LiNGAMの理論を追う

統計的因果探索の勉強を始めたので、その基本的な手法であるLiNGAMを理論に沿って整理します。 数学的な議論は厳密なものではありません。詳しく知りたい方は以下の参考文献を参照してください。
間違っている箇所や気づいたことがあればご指摘いただけると幸いです。 

参考文献

LiNGAMの仮定

LiNGAMモデルでは以下の構造方程式について考えます。

\displaystyle{
x_i = \sum_{j\not=i} b_{ij}x_j + e_{i} \quad (i = 1,\ldots , p)
}

xは観測変数、 pは観測変数 xの個数、b_{ij}は観測変数 x_j x_iに及ぼす直接的な影響の大きさを表す係数、 e_iは誤差変数を表しています。

これは行列表現で

 x  = Bx + e\tag{0}

と書けます。

LiNGAMは xの分布 p(x)を入力として Bの値を一意に推定できます。

また、LiNGAMは次のような仮定を置いています。

  1. 各変数は連続変数である。
  2.  eは互いに独立である(=未観測共通原因が存在しない)かつ非ガウス分布に従う。
  3. 観測変数が他の観測変数と誤差変数の線形和で表現される。
  4. 観測変数は非巡回である。

データ生成過程

説明に用いるデータ生成過程の例は以下のものとします。

 \displaystyle
x_2 = e_2
\\\
x_1 = 2.0x_{2} + e_1
\\\
x_0 = 5.0x_{1} + 4x_{2} + e_0
\\\
x_5 = 1.5x_{0} + e_5
\\\
x_4 = 3.0x_{0} + e_4
\\\
x_3 = 1.0x_{4} + 2.0x_{2} + e_3

DAGは以下のようになります。

独立成分分析の導入

 Bを求めるために、まずは行列式 xについて解きます。

 \displaystyle
 x = Bx + e
\\\
\rightarrow(I-B)x = e
\\\
\rightarrow x = (I-B)^{-1}e

 (I-B)^{-1} Aと置いて

 \displaystyle
x = Ae

さらに A逆行列 W (= I - B)として

 \displaystyle
e = Wx
\tag{1}

となり、 Wがわかれば Bをもとめることができそうです。

これを解くために独立成分分析(Independent component analysis, ICA)という手法を援用します。 ICAは主に信号源分離に用いられている計算手法です。
観測変数ベクトル xが、非ガウス分布に従う独立成分ベクトル sと係数 aによって生成されるというモデルを以下のように定義します。

\displaystyle{
x_i = \sum_{j=1}^q a_{ij}s_j  \quad (i = 1,\ldots , q)
}

係数行列 Aを用いて行列式に書き直すと次のようになります。

\displaystyle{
x = As
}\tag{2}

ICAはこの xから

\displaystyle{
x = A_{ica} s _ {ica} 
}

の形に復元することができます。 式 (2)中の sが非ガウス分布に従う独立ベクトルであることに注目して、LiNGAMの式 (1)に適応できます。 ここで注意しないといけないのは、ICAによって復元された A _ {ica}は、本来の混合行列 Aと列の順序と尺度が異なる可能性があるということです。 つまり、ICAで得られた A _ {ica}逆行列 W_ {ica}は、本来の B単位行列 Iから W=I-Bとして得られた真の Wと比べ、列の順序と尺度が異なる可能性があります。 したがって、 W W _ {ica}の関係は、置換行列 Pと対角行列 Dを用いて次のように表せます。

\displaystyle{
W_{ica} = PDW 
}\tag{3}

ここから P, Dを推定して Wの値を求めたいです。独立成分分析において P, Dは識別不可能です。しかしLiNGAMモデルにおいては Bの性質を考慮することによって P, Dを求めることができます。

因果的順序と非巡回性の行列表現

LiNGAMモデルでは 4.観測変数は非巡回 という仮定を置いたのでした。これについて考えてみましょう。
初めに観測変数の因果的順序について説明します。因果的順序とは観測関数のデータが生成される順番のことです。
今回のデータ生成過程においては、まずはじめに非ガウス分布に従って x2が生成されます。これはほかの観測変数に依存しない独立な変数で、このことは係数行列 B x2行の成分がすべて 0であることからも確認できます。次に、 x1は生成された x2に係数 2.0をかけたものと、非ガウス分布によって生成された誤差変数の線形和として生成されます。以降、同様にして、 x0, x5, x4, x3と生成されます。
したがって、このデータの因果的順序の一つは x2,x1, x0, x5, x4, x3となります。この因果的順序の順番にデータが生成される過程はDAGを見ても直感的に理解出来るかと思います。以降は観測変数 x_iの因果的順序を k(i)  (i=1,...p)とあらわすことにします。
非巡回とは、データの生成過程で因果的順序が下流の変数が上流の変数と自分自身の値に影響を及ぼさない状態のことです。
さて、データ生成の行列表現は式(0)です。

 x  = Bx + e\tag{0}

(0)で観測変数 x,誤差変数 eを因果的順序 x _ {ord}, e _ {ord}に並び替え、それに対応して係数ベクトル B B _ {ord}に変換します。

 x_{ord}  = B_{ord}x_{ord} + e_{ord}\tag{4}

 B _ {ord}とデータ生成過程を確認します。非巡回は自分自身の値に影響しませんから、それぞれの行において観測変数自身にかかる係数成分は0です。したがって B _ {ord} の対角成分は0となります。では行列式 (0)に生成したデータを代入します。

 \begin{pmatrix}
x0\\
x1\\
x2\\
x3\\
x4\\
x5\\
\end{pmatrix}
=
 \begin{pmatrix}
0.0&5.0&4.0&0.0&0.0&0.0\\
0.0&0.0&2.0&0.0&0.0&0.0\\
0.0&0.0&0.0&0.0&0.0&0.0\\
0.0&0.0&2.0&0.0&1.0&0.0\\
3.0&0.0&0.0&0.0&0.0&0.0\\
1.5&0.0&0.0&0.0&0.0&0.0\\
\end{pmatrix}
 \begin{pmatrix}
x0\\
x1\\
x2\\
x3\\
x4\\
x5\\
\end{pmatrix}
+
\begin{pmatrix}
e0\\
e1\\
e2\\
e3\\
e4\\
e5\\
\end{pmatrix}
\tag{5}

 (5)を因果的順序に並び変えてみます。

 \begin{pmatrix}
x2\\
x1\\
x0\\
x5\\
x4\\
x3\\
\end{pmatrix}
=
 \begin{pmatrix}
0.0&0.0&0.0&0.0&0.0&0.0\\
1.0&0.0&0.0&0.0&0.0&0.0\\
0.0&0.0&0.0&0.0&0.0&0.0\\
4.0&5.0&0.0&0.0&0.0&0.0\\
0.0&0.0&3.0&0.0&0.0&0.0\\
2.0&0.0&0.0&0.0&1.0&0.0\\
\end{pmatrix}
 \begin{pmatrix}
x2\\
x1\\
x0\\
x5\\
x4\\
x3\\
\end{pmatrix}
+
\begin{pmatrix}
e2\\
e1\\
e0\\
e5\\
e4\\
e3\\
\end{pmatrix}
\tag{6}

観測変数は因果的順序が自身よりの下流の変数の影響を受けない(=係数成分が0)であるためそれぞれの行で対角成分をなす成分より右の成分は0となることがわかります。したがって、係数行列 B_{ord}は厳密な下三角を成します。
続いて W (= I - B) を考えます。 B の対角成分は0ですから Wの対角成分はすべて1となります。具体例で確認します。

 W = I-B = \begin{pmatrix}
1.0&0.0&0.0&0.0&0.0&0.0\\
0.0&1.0&0.0&0.0&0.0&0.0\\
0.0&0.0&1.0&0.0&0.0&0.0\\
0.0&0.0&0.0&1.0&0.0&0.0\\
0.0&0.0&0.0&0.0&1.0&0.0\\
0.0&0.0&0.0&0.0&0.0&1.0\\
\end{pmatrix}
-
 \begin{pmatrix}
0.0&5.0&4.0&0.0&0.0&0.0\\
0.0&0.0&2.0&0.0&0.0&0.0\\
0.0&0.0&0.0&0.0&0.0&0.0\\
0.0&0.0&2.0&0.0&1.0&0.0\\
3.0&0.0&0.0&0.0&0.0&0.0\\
1.5&0.0&0.0&0.0&0.0&0.0\\
\end{pmatrix} 
=
 \begin{pmatrix}
1.0&-5.0&-4.0&0.0&0.0&0.0\\
0.0&1.0&-2.0&0.0&0.0&0.0\\
0.0&0.0&1.0&0.0&0.0&0.0\\
0.0&0.0&-2.0&1.0&-1.0&0.0\\
-3.0&0.0&0.0&0.0&-1.0&0.0\\
-1.5&0.0&0.0&0.0&0.0&-1.0\\
\end{pmatrix} 

この条件を用いて置換行列 Pと対角行列 Dを推定します。
置換行列は行の順序を変更するのでした。行の順序が正しくない場合、変換後の行列の対角成分のいずれかが0になることが知られています。なので、 Pによって変更された順序を、すべての対角成分が0ではないような順序へ戻すような置換行列\tilde{P}を考えます。
\tilde{P}を式(3)の右からかけます。  \tilde{P}P = Iであることを利用して

\tilde{P} W_{ica} = \tilde{P}PDW= DW\tag{7}

となり、行の順序が Wと同じになるように復元できます。(復元する順序は Wの順序であって因果的順序に並び替えた W_{ord}の順序ではありません。)
また、実際の対角成分の値が0であっても計算によって生じる推定誤差により0とならない場合があるため、置換行列\tilde{P}は対角成分ができるだけ0から離れた値になるような推定値\hat{\tilde{P}}を以下のように求めます。

\displaystyle
\hat{\tilde{P}}={\underset{\tilde{P}}{\textrm{argmin}}}
\sum_{i=1}^{p} 
\dfrac{1}{|( \tilde{P} \hat{W_{ica}})_{ii}|)
}

次に Dを復元します。これは復元行列 Wの対角成分は1なので、\tilde{P} W _ {ica}のそれぞれの行の対角成分は行の尺度の値とわかります。したがって式(7)]の左から対角行列 D逆行列 D^{-1} をかけて

 D^{-1} \tilde{P} W_{ica} =  D^{-1} DW = W\tag{7}

となります。 あとは W = I - Bから Bが推定できます。以降ではこの推定値を   \hat{B}と表記します。
以上より独立成分分析によって得られた式

\displaystyle{
W_{ica} = PDW 
}

のみでは識別不可能だった P, Dが、LiNGAMモデルにおける因果的順序の非巡回性の仮定を条件に識別可能となり、結果としてW _ {ica}から Wを求め、 Bの推定値 \hat{B}を推定することができました。
この時点で Bは推定値 \hat{B}として復元されていますが、 \hat{B}の成分は本当の値が0であったとしても推定誤差のために0ではないため、このままだと巡回な関係となります。 なので、前述した因果的順序を推定し、並び替えた B _ {ord}の上三角部分の成分を0とすることで厳密な下三角とし、本来の非巡回の関係を推定します。
具体的な手順は次の通りです。 B _ {ord}の上三角成分の値がすべて0ということは、 B p^{2}個の成分のうち、すくなくとも対角成分の個数 p個と、残りの成分の半分にあたる \dfrac{p^{2}-p}{2}個の合計 \dfrac{p(p+1)}{2}個の成分の値が0である必要があります。なので \hat{B}の成分のうち絶対値が小さい順に \dfrac{p(p+1)}{2}個の成分を0で置き換えます。そして \hat{B}が厳密な下三角になるような並び替えが可能かを調べます。もし可能なら並び替え後の行列を B _ {ord} とし、不可能であれば成分のうち次に絶対値が小さい値一つを0としてもう一度並び替えを調べます。これを厳密な下三角が出来るまで繰り返し、因果的順序および B_ {ord}を推定します。

適応型Lasso回帰による冗長性の排除

上の手順で推定した B_ {ord}の下三角にはまだ、本来の値は0であるが推定誤差によって0になってない値があるかもしれません。観測変数の線形回帰によって正しい値を求めたいところですが、最小二乗法といった単純な線形回帰分析を行っても残されてしまいます。
適応型Lasso回帰の式を成り立ちを最小二乗法による線形回帰から軽く見ていきます。なお、適応型Lasso回帰について詳しく知りたい方は参考文献の元論文を参考にしてください。
まずは最小二乗法の式からです。

\displaystyle
\hat{\beta}={\underset{b}{\textrm{argmin}}\|{x_ {i}-{\sum_{k(j) < k(i)}}{b_{ij}x_{j}}}\|^{2}
}

この式の時点で行っていることは係数の推定のみで、推定誤差による冗長な因果関係を排除できていません。 Lasso回帰では、右辺の目的関数にL1正則化項を足し合わせたものになります。

\displaystyle
\hat{\beta}={\underset{b}{\textrm{argmin}}\|{x_ {i}-{\sum_{k(j) < k(i)}}{b_{ij}x_{j}}}\|^{2} + \lambda {\sum_{k(j) < k(i)}}|b_{ij}|
}

L1正則化項が最小となるのはすべての係数が0となるときですから、最小化をしていくと係数が0に近づいていくことが直感的にわかります。実際いくつかの係数は0となるので、本来の値が0である係数を0とすることができます。イメージとしては本当に重要な係数だけが選択され0ではない値として生き残る感じです。 つまり、Lasso回帰は係数の推定と同時に、変数の選択(=因果関係の選択)を行っていることになります。
Lasso回帰では係数の選択に一貫性が無い場合があるためさらに発展させた適応型Lasso回帰を導入します。 適応型Lasso回帰では、L1正則化項に含まれていた係数ベクトル b _ {ij}それぞれに重み w_{ij}を掛け合わせます。

\displaystyle
\hat{\beta}={\underset{b}{\textrm{argmin}}\|{x_ {i}-{\sum_{k(j) < k(i)}}{b_{ij}x_{j}}}\|^{2} + \lambda {\sum_{k(j) < k(i)}}{\hat{w_{ij}}}|b_{ij}|
}

一般的に、この係数 \hat{w _ {ij}}は推定値 \hat{b _ {ij}} とパラメータ \gammaを用いて次のように定義します。

\displaystyle
\hat{w _ {ij}} = \dfrac{1}{|\hat{b _ {ij}}|^{\gamma}}

書き直して最終的な適応型Lasso回帰の式を得ます。

\displaystyle
\hat{\beta}={\underset{b}{\textrm{argmin}}\|{x_ {i}-{\sum_{k(j) < k(i)}}{b _ {ij}x_{j}}}\|^{2} + \lambda {\sum_{k(j) < k(i)}} \dfrac{|b_{ij}|}{|\hat{b_{ij}}|^{\gamma}}}

やってみる!

以上を踏まえて実際に推定をしてみましょう。サンプルサイズは10000としました。

import numpy as np
import pandas as pd
import graphviz
import lingam
from lingam.utils import print_causal_directions, print_dagc, make_dot

x2 = np.random.uniform(size=10000)
x1 = 2.0*x2 + np.random.uniform(10000)
x0 = 4.0*x2 + 5.0*x1 +np.random.uniform(size=10000)
x5 = 1.5*x0 + np.random.uniform(size=10000)
x4 = 3.0*x0  + np.random.uniform(size=10000)
x3 = 2.0*x2 + 1.0*x4 + np.random.uniform(size=10000)

X = pd.DataFrame(np.array([x0,x1,x2,x3,x4,x5]).T, columns=['x0','x1','x2','x3','x4','x5'])
X.head()

model = lingam.ICALiNGAM()
model.fit(X)
model.causal_order_

B_ord =  model.adjacency_matrix_
B_ord

make_dot(model.adjacency_matrix_)

結果のDAGを見ると、想定していたDAGが正しい因果的順序で高い精度で復元できていることがわかります。
異なっている箇所は x_2から x_5への有向辺ですが、推定係数は0.02と小さい値でおさまっていると思います。 それから x_0に対する x_2の有向辺の表記が異なりますが、想定しているDAGでは x_2の単位量の変化が x_0に及ぼす影響は x2からの直接の係数と x_1を経由して及ぼす間接的な係数の合計(=4.00+2.005.00=14.00)で、これは復元したDAGでの x_2から tex_1を経由して x_0にかかる係数(2.007.00=14.00)一致しています。

感想など

めちゃ面白い分野です。因果推論/探索の他のアプローチやLiNGAMから派生した手法も理解していこうと思います。

応用情報技術者試験に一発で合格した話

 

TL;DR

試験の準備はちゃんとやったほうがいい。

前提

結果

 

私について

理系の大学4年生で、学部は情報系とは一切関係がないです。コンピュータサイエンスの分野に関心があり、セキュリティ分野ではCTFのPwnとCryptoをやっています。情報試験の受験は今回が初ですが、情報セキュリティ/ネットワーク/プログラミングについてはもともと知っていることが多く、特に情報セキュリティについては対策しなくても午後の過去問で8~10割を安定して取れたため試験に向けての勉強はしませんでした。

勉強期間は2週間くらいです。 

試験対策

午前試験

午前対策は以下のサイトで十分だと思います。

www.ap-siken.com

過去問がそのまま通用することも多く、10年分位解いておけば6割は越えられると思います。

私は結局ここに掲載されている2720問は全て解いた上で、テクノロジ系は加えて何周かした気がします。午前で合格点をとれなかった場合は午後が採点されないということもあり、ビビッて短い期間の割に入念にやってしまいましたが、振り返るとオーバーワークだったと思います。全てを解く必要は全くないですし、ある程度できるようになったら午後の対策に時間を使うと良いです。

それから午後でデータベース/ネットワークを選択される方は、解説を含めて理解しておくと午後試験が少し楽になります。

午後試験

選択した科目は次の通りです。

・情報セキュリティ(必須科目)

・プログラミング

・データベース

・組込みシステム開発

・システム監査

 

やったことは基本的に午前対策と同じです。過去問を解いて、出題された分野について深く調べるということを繰り返しました。

受験の目的は知識の確認のためだったのでした。なので午後の選択は文系科目を選ばず技術系のみと決めていましたし、対策もその決めた5分野しかやりませんでした。本来はシステム監査ではなくネットワークを選択するつもりでしたが、本番でネットワークのパッと見の難易度が高いことと残り時間が少ないことで焦ってしまい、急遽なんか知識が無くても解けそうなシステム監査を選択しました。(なめすぎ)

 

それぞれの分野についても少し書いておきます。()は自己採点の点数です。自己採点の合計点と実際の点数の差は記述の部分点の違いだと思います。

情報セキュリティ(16/20点)

特筆することはありません。実務経験がないと解答を確定しづらいような問題がたまに出る印象がありますが、確実に取れるところを取るしかないですね。

プログラミング(16/20点)

最近では機械学習の分野で用いられるアルゴリズムが多く出題されていましたが、今回は普通にパズル問題でした。私は基本的なアルゴリズムの概要を少し知っているだけで競プロなどの経験はありませんでしたが、記述の形式に慣れたら得点は安定するようになりました。

全くの初心者の方が一からやるには少しコスパが悪い分野ではある気がしますが、一方で少しでも経験者の方であればどの問題でも誘導に従って考えれば解けるようになっていると思います。

データベース(6/20点)

得点が終わっとります。

データベースはSQL文を中心としたデータベースの設計・データ操作が問われることがほとんどで、理解は難しい方だと思いますが対策しやすい分野だと思います。

過去問を30回分近く解いて8割くらいで安定していましたが、本番はかなり難しく感じました。講評曰く全体の得点は平均的だったらしいです。マジ?

組込みシステム監査(18/20点)

あまり対策しなくても得点しやすい分野だと思います。たまに16進数に慣れていないと解きにくい問題がたまに出題されるらしいですが、PwnとCryptoはだいたい16進数表記なので慣れたもんでした。

システム監査(6/20点)

得点が終わっとります2。

一部では「読解問題」とも言われているらしいです。咄嗟に選んだ問題ですが、午前の知識だけではどうにもならんかったですね。

ネットワーク(非選択)

実は今回の試験にあたって一番勉強した分野でした。本番ではプログラミングとデータべ―スに時間をかけすぎたせいであまり時間が残されておらず、普通に難しそうだったのでやむを得ずシステムを監査したのでした。

悔しいことに選択こそしませんでしたが、ネットワークの勉強の過程ではとても多くのことを知りましたし、自分がこの分野の基本的な内容で理解していること、理解していないことがはっきり分かってきた気がします。

 

やった方がよかったこと

今回の受験の反省点をいくつか挙げていきます。

午後の選択科目を7つくらい持っておく(あたりまえ)

今回、技術系しか解かない予定で5科目しか対策しなかったわけですが、合格を目指すという観点からするとこれは非常に危ない方針だと思います。それぞれの分野には例年と比べての難易度の差があり、難しい回を引いた時の逃げ道として予備の分野が二つくらいあると安心です。

 

午後を一回時間を測って通して解く

これは試験中に重要だと痛感しました。私は午後を分野ごとにしか解いておらず、本番の時間配分が上手く出来ずに試験時間いっぱいまで問題を解いていました。

何から解いてどうすすめるかの戦略は実際にやってみないとわからないことが多いです。本番で焦ったりしないためにもやっておいた方がよかったなと感じました。

講評を読む

各試験終了後にはIPAから公式の解答と講評が公開されます。講評には採点者による問題の評価やおおまかな正答率が書かれており、採点者がどこを見ていて、他の受験生の方がどう回答したのかなどの情報が得られるので対策に役立てられることが多いです。

私は本番3日前くらいに講評の存在を知りましたが、対策を始める前に知っておきたかったです。


0次試験?

情報試験ではその難関さから、申し込み~当日の朝の起床~そして受験会場に到着するまでの一連の手続きが0次試験と呼ばれることがあります。

私は試験会場を当日に初めて確認し、そこが駅から結構歩くところで午前試験に約5分間遅刻しました。受験票に記された会場の図では移動にかかる時間もよくわからないので、よく確認しておいた方がいいです。

特に最近では会場についてから体温を記録して試験官の方に提出する必要があり、その時間も含めて余裕を持っておいたほうがいいかと思います。

ちなみに私は会場の試験官の方が優しくて、遅刻して到着したときに「午前終わったらでいいよ」とお気遣い頂きました。サンキュー試験官。

 

感想とこれからの話

今回の合格で高度試験の午前Iが2年間免除となるので、これを利用して令和5年度春季のセキスペかネスペを受けるつもりです。

合格証もらいました。こういうのはテンションあがりますね。

激アツ合格証

 

これから応用情報技術者試験を受験される全ての方の健闘を祈っています。