統計検定準1級(CBT)に合格したので勉強法やら書籍やらを書いておきます。
ギリギリですが合格しました。#統計検定準1級 pic.twitter.com/RVCSsQhUpB
— Satoaki Noguchi (@axjack_) 2023年2月11日
感想
CBTってどんな感じなのかな?とあくまで試験の慣らし運転ぐらいの気持ちで受験に臨んだのですが、棚からぼたもち的な流れで合格していました。「合格」の文字が出た時は思わず「え?」と変な声が出ました(笑
受験に臨むにあたって(勉強以外編)
- 荷物をロッカーに入れます
- 荷物が多いと入らないかもしれないので注意です。
- 教室内は電卓だけ持ち込み可でした
- 時計もスマホも参考書も持ち込み不可だったので、受験会場に入るまでに予習は済ませておきましょう。
- Odyssey ID、パスワードを暗記しておく必要がある
- 荷物・スマホはロッカーにあるので、IDパスワードを覚えておく必要があります。変に焦らぬように事前にログインできるか確認しておきましょう。
- 時計がなくても試験の残り時間は画面の左下に表示されます
- 電卓は必須です。おそらく使います。
- 計算"用紙"ではなくてラミネート加工されたツルツル紙に水性ペン?的なもので計算します
成績
- 評価得点:65点
- 確率と確率分布:60%
- 統計的推測:33%
- 多変量解析法:76%
- 種々の応用:85%
配点ウェイトどうなってるんだ・・・?
勉強法
統計学実践ワークブックを精読、行間を埋めるが中心でした。過去問はほとんど解いていないです。A4レポート用紙に式変形をひたすら書いて、はてなブログに勉強したことのまとめを書いてスマホにまとめを書いて、の繰り返しです。
準1級の勉強を通じて、なぜかLaTeX力がついた気がします。
書籍
統計検定特化型の書籍
- 統計学実践ワークブック
- 準1級CBTは「統計学実践ワークブック検定」といっても過言ではないかもです。それぐらい内容が網羅されていると思います。
- なのでこれさえ理解すれば大丈夫です。ただ、私のようなただの凡人にはワークブックだけで内容が分かるようなつくりにはなっていないので、他の書籍/webサイトで知識を補う必要があります。
- 統計検定 準1級 公式問題集
- 購入しましたがほとんど解いていないです
- 日本統計学会公式認定 統計検定1級対応 「統計学」
- 1級用なので準1級向けではない気がしますが、ワークブックでよくわからない式変形が出てきたときに役に立ちました
統計学全般の書籍
数式変形のお供に。
- 統計学入門(東京大学出版会)
- 2級受けた人なら手元にあるはず?たまに参考にします
- 自然科学の統計学(東京大学出版会)
- ワークブックでよくわからない式変形が出てきたときに役に立ちました
- 久保川達也 現代数理統計学の基礎
- ワークブックでよくわからない式変形が出てきたときに役に立ちました
買ったけど役に立ったか微妙なライン
本格的に学ぶには早すぎたかも?という意味で役に立ったか微妙でした。ただ、買って損はしないです。
webサイト
- Hello! Statisticians! - あつまれ統計の森
- - 理数アラカルト - 物理学や工学で現れる数学的手法を紹介
- HOME | DataArts - 統計検定 1級・準1級対策講座,過去問の解答(解答例)・解説を掲載.
- 統計学の時間 | 統計WEB
- 『パターン認識と機械学習の学習 普及版』(PDF)
youtube
確率変数の変数変換:一様分布に従う2 つの確率変数の和
理論編
確率変数の同時確率密度関数(joint pdf)を
とする。この時、
を
と変数変換(change of variables)することを考える。ただし、には逆変換が存在しそれを、
と表す。ここでヤコビアンを
とすると、変数変換後の同時確率密度関数は、
で表される(ここでは絶対値を表す)。
また、確率変数が独立でそれぞれの確率密度関数が
で与えられていれば、
となる。
さらに、同時確率密度関数を
で積分消去(integrate out, marginal, collapse)することで確率変数
の周辺確率密度関数(marginal pdf)を求めることができる。すなわち、
となる。
例:一様分布に従う2 つの確率変数の和
確率変数はそれぞれ独立に一様分布
に従うとする。確率密度関数
は
を用いて、および
で与えられる。
確率変数のとりうる領域
与えられた情報からまとめると、
より
より
なる不等式を得る。従って、に関する領域を書くと下記となる。
この図をw軸の視点で見ると、
のとき
のとき
となる。
領域の書き方補足
- 周辺確率密度関数にて
で積分消去することを念頭に置いて、
を固定したときの
を変数とする領域、をイメージすると良い。
は
とし、
の直線を
で動かすことで得られる。
- w軸と平行な線分が、zに依存しつつ線分の長さを変えながら動いた結果が水色の領域、というイメージ。
列空間と左零空間は直交する
準備
- 行列Aを
- Aの列空間を
- Aの左零空間を
とする。この時、C(A)の任意のベクトルとN(A')の任意のベクトルは直交する。
確認
x ∈ C(A), y ∈ N(A')を任意に取る。ベクトルが直交することを示すには内積が0となることを確認すれば良い。なお、小文字のoを零ベクトルとする。
すると、
- x'y = (Aw)'y = w'A'y = w'(A'y) = w'o = 0
- y'x = y'(Aw) = (y'A)w = (A'y)'w = o'w = 0
となってy'x = x'y = 0が示せた。
したがって、C(A)の任意のベクトルとN(A')の任意のベクトルは直交する。
□
ecdf関数とstepfun関数
- ecdf関数は経験累積分布関数を返す関数
- stepfun関数はステップ関数・区分関数・単関数(?)を返す関数
d <- c(1:10)
Fn <- ecdf(d)
plot(Fn)knots(Fn)
Gn <- stepfun(d,c(1,3,2,5,4,7,3,3,4,2,1))
plot(Gn)
R勉強会 第5回 アウトプット用課題の問5,6を解く
QittaのR言語記事を散策していたら@roadricefieldさんの面白い記事があったので、自分でも解いてみることにしました。
問5
極値を求める関数を作成する問題。
関数
extremum_detector <- function(d, k){ # 補助関数 f <- function(a,k){ judge <- rep(c(1,-1),each=(k-1)/2) sdf <- sign(diff(a)) all(sdf == judge)||all(sdf == rev(judge)) } if(k < 3 || k %% 2 == 0) stop() # extremum pointを返す which(apply(embed(d,k),MARGIN=1,f,k)) + (k-1)/2 }
実行
5点近傍での極値
dev.off() data <- c(1, 2, 3, 2, 1, 0, 1, 0, -1, 2, 3, 2, 1) extremum.points <- extremum_detector(data, 5) plot(data, type="b") points(extremum.points, data[extremum.points],col = "red",pch=16)
3点近傍での極値
dev.off() data <- c(1, 2, 3, 2, 1, 0, 1, 0, -1, 2, 3, 2, 1) extremum.points <- extremum_detector(data, 3) plot(data, type="b") points(extremum.points, data[extremum.points],col = "red",pch=16)
コメント
embed関数なるものを使うと、系列を左から個ずつスライドして取り出すことができて便利(ただし順番が逆になる点のみ注意)
- 使用例
> letters[1:12] [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" > embed(letters[1:12],4) [,1] [,2] [,3] [,4] [1,] "d" "c" "b" "a" [2,] "e" "d" "c" "b" [3,] "f" "e" "d" "c" [4,] "g" "f" "e" "d" [5,] "h" "g" "f" "e" [6,] "i" "h" "g" "f" [7,] "j" "i" "h" "g" [8,] "k" "j" "i" "h" [9,] "l" "k" "j" "i"
問6
k-meansクラスタリングを実装する。
関数
my_kmeans <- function(x = x_sample, y = y_sample, k = 3){ # # 初期クラスタを選択 # cent_ind <- sample(seq_along(x), k, replace = FALSE) # # 初期セントロイドたち # cent <- cbind(x[cent_ind], y[cent_ind]) # cent <- cbind(c(91,57,41),c(26,61,14)) cent <- sample( (min(x,y)):(max(x,y)), k * 2, replace = FALSE) |> matrix(nrow = k) i <- 0 while(1){ # セントロイドからの距離が最小となるような所属を求める M <- rbind(cent, cbind(x,y)) |> dist() |> as.matrix() belong <- M[-(1:k),1:k] |> apply(MARGIN = 1, which.min) # 新しいセントロイド cent_new <- cbind(tapply(x, belong, mean), tapply(y, belong, mean)) i <- i+1 cost <- sum((cent_new - cent)^2) print(paste("iter = ",i,", cost = ", cost)) # costが1より小さかったらループ終了 if ( cost < 1 ) break # セントロイドの更新 cent <- cent_new } # 所属を返す return( belong |> as.numeric() ) }
実行
dev.off(); set.seed(2022) x_sample <- sample(1:100, 50, replace = FALSE) y_sample <- sample(1:100, 50, replace = FALSE) clst <- my_kmeans(x_sample, y_sample, k = 3) plot(x_sample, y_sample, col = clst )