さやノート

Kaggler grandmasterを目指して

統計検定にデータサイエンス系科目が追加される

こんにちは。さやのです。

お久しぶりです。 ブログ更新サボっている間も、このブログを訪れてくれた方がいらっしゃったようで、ありがとうございます。

TL;DR;

統計検定に次の科目が追加される予定。 すべてCBT(テストセンターでコンピュータで答える形式の試験)。

科目名→ データサイエンス基礎 データサイエンス発展 データサイエンスエキスパート
出題範囲公開 2020年5月 2021年5月
サンプル問題公開 2019年9月末~10月 2020年8月 2021年9月
試験配信開始 2021年5月 2021年7月 2022年2月

抹消線はすでに公開済み

目次

統計検定とは?

統計検定は、一般財団法人 統計質保証推進協会が提供する、統計の知識や統計技術の活用スキルに関する資格です。

データ活用の必要性が叫ばれる現在、注目を浴びている資格の一つで、受験者数も、第1回実施の2011年からおよそ7倍の7000人に増加しています。

f:id:sayanotsu:20210509112335p:plain
統計検定の公式サイトより

(2020年はコロナの影響で試験の実施がなかったようです)

試験範囲

統計検定の試験範囲としては、データの平均、分散などの統計値を使ったデータの特徴の把握であったり、統計学の醍醐味でもある「仮説検定」や「信頼区間」などの知識の運用が問われます。

データサイエンス系の科目の出題範囲

データサイエンス基礎

公式サイトの「データサイエンス基礎」のページを見てみると次のように書いてあります。

「データサイエンス基礎」試験で評価するキーコンピテンシーをデータアナリティクス基礎とし、 (1) データハンドリング技能 (2) データ解析技能 (3) 解析結果の適切な解釈 の3観点を新学習指導要領(平成29・30年改訂)に対応した大学入試までの内容構成で出題します。主に高等学校では、数学I「データの分析」、数学B「統計的な推測」、「数学と社会生活」、数学A「場合の数と確率」、数学C「数学的な表現の工夫」、情報I「情報通信ネットワークとデータの活用」、情報II「情報とデータサイエンス」、理数探究基礎、理数探究等が関係します。

つまり「高校で学習する範囲」ということでしょうか。

私が高校を卒業したときのシラバスとはだいぶ変わっていますね、、、、

データサイエンス発展

公式サイトの「データサイエンス発展」の出題範囲を見てみると、データサイエンス基礎からワンランク上がって次のようなものが追加されています。

そのほか情報倫理や、セキュリティなども入っていますね。

データサイエンスエキスパート

こちらに関しては公式サイトには直接の掲載がありませんが、「数理・データサイエンス教育強化拠点コンソーシアム」から見ることができるPDFファイルの14ページあたりからの範囲を参考に作られる感じではないかと思います。

「データサイエンス発展」の更に専門的な内容、という感じでしょうかね。

学習方法

まだ私も合格したわけではなく、試験の歴史も浅いため正確に「これをやれば受かる!」ということは言えないのですが、 とりあえず私はディープラーニングに関しては次の本で学習しています。

この本は深層学習モデルについて数式をもちいて詳細に書かれています。そのため数学が苦手な方には苦しいと思います。

そのような方には、下記のように数式を最低限に絞った参考書がおすすめできるかもしれません。

こちらの本も学習しましたが、TensorflowやKerasなどのフレームワークを使わずに、1からディープラーニングのモデルを実装していくので仕組みがよく理解できました。

まとめ

以上が、今月から来年にかけて実施開始予定のデータサイエンス科目の情報でした。

これらの資格を取得することで、履歴書に書いたりして、データサイエンスのアルゴリズムや実装方法だけでなく、AIに関する一般知識や情報倫理も身に着けていることが証明でき、就職や転職に有利になったりするので取っておいて損はないでしょう。興味のある方はぜひ、合格を目指して見るのもよいのではないでしょうか。

参考サイト

Systemdについてちゃんとまとめてみる

はじめに

いつも仕事でCentOSのサーバ立ち上げて、データベースとかアプライアンスとか入れて動かしたいとき、 たとえばそれがPostgreSQLだったら

systemctl enable postgresql
systemctl start postgresql

ってするし、Dockerデーモンなら

systemctl enable docker
systemctl start docker

ってする。 この「systemctl」ってコマンド、何も考えずにこれまで使ってきたが、 ちゃんと調べる機会が出てきたので、ここでちゃんとまとめておくことにする。

本題

デーモンとサービス

OSで走るプロセスには、大きくわけて

  • 自分で何らかのコマンドを打つことで起動するプロセスと、

  • OSが立ち上がっている間ずっと起動しているプロセス

がある。 前者は、たとえば、

python hello.py
./start.sh
make install

が該当する。ユーザーが起動するので、ユーザープロセスとか言われる。 psコマンドを実行すると、実行されているプロセスが確認できる。

後者は、OS起動時にシステムによって立ち上げられ、バックグランドで動くプロセスで、これをデーモンと呼ぶ。 よく知られているものだとpostgresqlmysqlなどのデータベース、httpdやnginxなどのリバースプロキシ、その他jenkinsやgithubとかのアプライアンスなどが該当する。

systemd

systemdは、OSが起動されたときに、これらデーモンたちを立ち上げ、プロセス管理をするプロセスである。 systemctlというコマンドは、このsystemdにアクセスして、デーモンの起動・停止、監視などを行っている。

systemctl enable postgresql.service # PostgreSQLサーバを有効化
systemctl restart docker # Dockerデーモンを再起動
systemctl stop nginx # Nginxを停止
systemctl status sshd # SSHデーモンの状態確認

ユニットファイル

 では、Systemdは、デーモンプロセスの立ち上げを要求されたとき、実際はどんなことをしているのだろう。 それは、/etc/systemd/system/以下にある「ユニットファイル」というファイルに記載されている。

たとえば、Postgresのユニットファイルの中身はこうだ。

引用元: https://www.postgresql.jp/document/11/html/server-start.html

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0

(後略)

ユニットファイルの中身はWindows Configファイル(.ini)ライクな書き方で、 実際に実行されるコマンドというのは[Service]セクションの中のExecStartの部分だ。

ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data

つまり、SystemdはOS起動時に/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/dataというコマンドを実行していることになる。 ちなみに、その上にUser=postgresとある通り、このコマンドはpostgresユーザとして実行されている。

他にも、このユニットの前に起動されている必要のあるデーモンを指定するAfterや、デーモン専用の環境変数を指定するEnvironmentなどがある。 このあたりの話は、下記に詳しい。

access.redhat.com

また、systemctl list-unit-filesで、ユニットファイルの一覧を表示できる。

まとめ

今回は、systemdというLinuxにおいて実は重要な役割を果たしていたものについてまとめてみた。 今となってはサービスを公開するにはDockerやKubernetesを使って、コンテナやPodの単位でスケールしたり監視するのが主流となっているが、購入したアプライアンスなどをインストールするとき、物によってはこうしたsystemdの使用を強制されることがある。 そこで何かトラブルがあった際に対応できないと困るので、ちゃんと調べておくのは大事だ。

Jupyter Notebook Extensionを自作してみる その1

最近JupyterNotebookExtensionをオリジナルで作る方法に興味があったが、 なかなか日本語での説明がみあたらないので、備忘録も兼ねてまとめていくことにする。

まずは、どこか適当な場所に、Extension開発用のディレクトリを作る。 ここでは、~/jnbextension/ってことにする。

次に、その中にmy_first_moduleディレクトリを作る。

とりあえず、チュートリアルどおりに適当にコードを書いてみる。 Lyntなんて知らん。

// ~/jnbextension/my_first_module/main.js

define(function(){
  function load_ipython_extension(){
    console.info('This is my first extension')
  }

  return {
    load_ipython_extension: load_ipython_extension
  }
})

できたら、それをインストール・有効化する。

jupyter nbextension ~/jnbextension/my_first_module --user# main.jsがあるディレクトリを指定する
jupyter nbextension my_first_module/main

そしたら、次はJupyterNotebookを起動して、Nbextensionのタブを見てみる。 f:id:sayanotsu:20200412161702p:plain

そうすると、さっき作ったモジュールの名前があるはずなので、それにチェックを入れる。

さて、動作チェックは、1つのNotebookを起動して、「開発者ツール」の「コンソール」で確かめてみる。

f:id:sayanotsu:20200412162332p:plain

すると途中で「This is my first extension」って出力されてるので、とりあえずロードされてるっぽい。 なんかエラってるっぽいが気にしたら負けだ。

【参考】

jupyter-notebook.readthedocs.io

強化学習入門してみる 1

はい。お久しぶりです。さやのです。

今回は強化学習を入門。というよりはもう一回勉強し直してみます。 というのは、ちょっと最近面白そうなデータコンペが紹介されていまして。

minerl.io

MineRL(マイン・アールエル)という、まあMinecraftをプレイするエージェントを強化学習で作りましょうと言うコンペですね。

で、一度強化学習について勉強はしたものの、業務でつかわずもうすっかり忘れてしまったため、復習の意味を込めてもう一度、勉強してみようと思ったわけです。

ちなみに参考書はこちらですね。

www.amazon.co.jp

ちなみに和訳版はこちら。

www.amazon.co.jp

強化学習とは???

強化学習(Reinforcement Learning)というのは、機械学習のジャンルの一つで、 「ある状況の中でどのように行動すれば良い結果が得られるか」を学習する手法です。 事例で言うと「AlphaGo」 (アルファ碁)が有名かもしれません。AlphaGoは、碁のAIで、盤面や棋譜からどのように石を置けば勝てるかを学習しています。

モデル化

シンプルな強化学習のモデルは、次の要素から構成されます。

  1. エージェント(Agent)
  2. 環境(Environment)
  3. 観測(Observation)
  4. 行動(Action)
  5. 報酬(Reward)

エージェントは、環境の中で観測を受け取り、可能な行動を選択します。その結果報酬(プラスかマイナス)を得ます。 そして、エージェントはこの報酬の合計が最大になるように行動の選択の仕方を学習していくことになります。

わかりやすく、シューティングゲームに例えてみます。 シューティングゲームでは、エージェントは戦闘機に、観測は、コックピットからみた映像になります。 その映像を見て、エージェントは上昇する、下降する、旋回する、弾を打つなど行動を選択をすることになります。 そして、敵の戦闘機を倒すと得点がもらえたり、逆にダメージを受けると得点が減ったりしますね。これが報酬です。報酬はマイナス値になることもあります。 また、行動を起こしたことによって、次の観測も変わります。その観測から次の行動を選択し、報酬を得る。この繰り返しになりますね。

さて、上記で述べたことをモデル化すると次のようになります。

f:id:sayanotsu:20190725001038p:plain

次回は、簡単な例(CartPole)を通してもう少し詳しくみてみたいと思います。

PyCharmのエディタがVimで起動した時の対処法

こんにちは。さやのつです。

 わたしは自宅ではiMacを使っているのですが、PyCharmを起動したらエディタの部分がVimの仕様になっていて、コマンドモードと挿入モード使い分けないといけない感じになってました。 RLoginとかTeraTermLinuxサーバのターミナルで何か編集するときはVimじゃなきゃダメマンなんですが、PyCharmとかの統合環境では普通のテキストエディタが使いたいマンなので、 今日はどうやって対処したか紹介します。

プラグインを無効にして再起動するだけ。

 PyCharmのエディタ部分は、JetBrainsプラグインによって管理されています。 このとき、「IdeaVim」というプラグインが有効になっていると、エディタがVimになってしまうようです。

そこで、このIdeaVimを無効化してしまいましょう。

① メニューバーの「PyCharm」から「Preferences...」をクリックして、設定画面を表示させます。

f:id:sayanotsu:20180411203203p:plain

② 左のメニューから「Plugins」を選択し、プラグインの一覧が表示されたら、 「IdeaVim」を探して、右のチェックボックスを外す。

f:id:sayanotsu:20180411205133p:plain

外したら、設定画面右下の「OK」を押します。

③ PyCharmを再起動すると、普通のテキストエディタになっているはずです。

不偏分散はなぜn-1で割る?

社会人になって僕が統計学を復習してるときに、ひっかかってたところです。

標本分散を計算するとき、

{ \displaystyle
\frac{1}{N} \sum_{i=1}^{N} (X_i - {\overline X})^{2}
}

という感じで、各標本データと、標本平均の差の2乗をとってそれらの和を取り、最後に標本サイズ Nで割っていたんですが、

不偏分散という名前になった瞬間に

{ \displaystyle
\frac{1}{N-1} \sum_{i=1}^{N} (X_i - {\overline X})^{2}
}

と突然N-1で割るようになるのです。これはなぜだろう? この問いの答えを自分なりに説明してみます。

そもそも不偏分散って何?

 不偏分散とは、母分散に対する標本分散の「偏り」を補正した分散です。

標本統計量には「偏り」が存在する

 母集団が、平均 \mu、分散 \sigma^{2}の分布に従うと仮定します。 たとえば、ゾウの平均体重(母平均)や体重の分散(母分散)を知りたいとき、正確に知るには、地球上に生存しているすべてのゾウの体重を測って、 その平均値や分散を計算しなければなりません。それは明らかに現実的ではないので、例えばゾウ30頭とか、現実的な数の標本をとることになります。

 しかし当然、標本から計算した平均(標本平均)や分散(標本分散)は、母集団の平均や分散の値とは若干ずれ(り)が生じます。

標本平均:{\displaystyle {\bar X} = \frac{1}{N} \sum_{i=1}^{N} X_i }

標本分散:{ \displaystyle
S^{2} = \frac{1}{N} \sum_{i=1}^{N} (X_i - {\overline X})^{2}
}

そもそもなぜ「偏り」が生じるかというと、標本平均や標本分散は、それぞれ母平均や母分散と一致するとは限らないからです。
先ほどゾウの体重の例を出しましたが、このとき選んだ30頭のゾウは、もしかしたら地球上のゾウ全体のうちたまたま軽いほうから抽出されたかもしれませんし、重いほうだったかもしれません。もちろん軽いゾウと重いゾウがバランスよく抽出された可能性も考えられます。そして、抽出されたゾウたちは軽いほうなのか重いほうなのか、はたまたバランスよく分布しているのか、標本を採った私たちにはわかりません。
 つまりは、「標本平均や標本分散の値自体が確率分布を持っている」事になります。したがって、標本分散をそのまま母分散の推定量としてしまうと、それは「偏った」推定になってしまうのです。 ちなみに後で説明しますが、標本平均はそのまま母平均の推定量としても偏った推定にはなりません。

偏りは補正する

 で、この「偏り」を補正した推定量が「不偏推定量」ということになります。
母分散の不偏推定量が「不偏分散」、母平均の不偏推定量が「不偏平均」となります。

ではなぜn-1で割るの?

本題に入りますが、不偏推定量の定義は次の通りです。

T\thetaの不偏推定量 \leftrightarrow E(T)=\theta

Tは標本データを使って計算できる何かしらの統計量で、 \thetaは、母集団の推定したい統計量、すなわち母平均や母分散のことです。

この式が意味するところは、標本をとって統計量Tを計算することを何度も行い、その平均(期待値)が \thetaになるとき、その統計量は不偏推定量だ、という判定ができるということです。

標本平均 \bar{X}の期待値は、

 {\displaystyle E(\bar{X}) = E\left( \frac{ X_1 + X_2 + ... + X_N }{ N } \right)}

 {\displaystyle = \frac{1}{N} E( X_1 + X_2 + ... + X_N )}

 {\displaystyle = \frac{1}{N} N\mu}

 {\displaystyle = \mu }

になるので、標本平均はそのまま母平均の不偏推定量にしてもよいのです。

では、標本分散の期待値をとるとどうなるかというと、これが

 {\displaystyle E( S^{2}) = \frac{N-1}{N} \sigma^{2} }

と、母分散より少し小さい値になってしまうんです。(細かい計算式は長くなるので割愛します。)
なので、小さくならないように  S^{2}という統計量を補正してやる必要があるのです。
 {\displaystyle E( S^{2}) = \frac{N-1}{N} \sigma^{2} }より、

 {\displaystyle E\left( \frac{N}{N-1}S^{2}\right) = \sigma^{2} } なので、

 {\displaystyle \frac{N}{N-1}S^{2} =  \frac{N}{N-1} \frac{1}{N} \sum_{i=1}^{N} (X_i - {\overline X})^{2} }

 {\displaystyle = \frac{1}{N-1} \sum_{i=1}^{N} (X_i - {\overline X})^{2 }}

と、めでたく不偏分散が求まるわけです。

まとめ

  1. 不偏推定量は、母集団のあるパラメータの推定量の期待値である。
  2. 標本分散の期待値は、母分散よりやや小さくなるため、不偏分散を計算するときは、2乗の和を n-1で割る。

以上、これからも忘れないように文面化してみました。
万が一誤り等ありましたらご指摘いただければ幸いです。

Hello, Hatena Blog!

はじめまして、さやのつです!

ブログを書くのは中学生の時遊びでみんなでやってた時以来で、11451410年ぶりくらいです。

あれから10年たち、今、エンジニアとして就職し、テックブログにあこがれて始めました。

軽く自己紹介します。

【自己紹介】

名前:さやのつ
性別:男
誕生日:1993・07・02

趣味:

  • 楽器  高校の時吹奏楽部でクラリネット担当してました。入部するまでは、吹部ってオーケストラみたいな荘厳なイメージがあったんですが、入ってみると楽器吹きながらめっちゃ踊るわ、扱う曲もアップテンポで、とても楽しかったです。入部を誘ってくれた友達に感謝。  ちなみにこのおかげで僕はあがり症を克服しました。まさか舞台の上で楽器を吹くことになろうとは、中学コンピュータ部だったときの僕には想像がつかなかったかもしれません。

  • 自転車  サイクリング、楽しいですよね。体動かしたいなーって時に、ロードバイク持ち出して、海や山まで走りに行ったりします。

  • ゲーム  趣味っていうか好きなので、土日はどっぷりゲーム漬けなんてこともあります。これまででお気に入りのゲームは、
    逆転裁判レイトン教授シリーズ、スプラトゥーン2デレステ
    こんなかんじです。いまはスプラですかね。

ブログで書きたいこと:主にプログラミングや統計、AI、クラウドなど技術系の記事を書いていきたいです。

ブログ初心者ですが、よろしゅうお願いします。