みずぎわブログ

技術系のことや日々に考えたことを書き連ねます

データベーススペシャリストの難易度をデータより分析する

はじめに

 IPA情報処理技術者試験の中でデータベーススペシャリストというものがある。 自分もデータベース系の業務に携わっているので勉強がてら受験した。 Web上で情報を調べたり、参考書をみると、やたら高難易度の難しい試験であるように書いてあって、そんなに勉強する時間も気力も無いよと思いつつ、半ば諦めの気持ちで勉強し、試験へ挑んだ。最後まで諦めずにわからないなりに全力で解答欄を埋めたことが良かったのか、幸運なことに合格した(午前1:免除, 午前2:88点, 午後1:61点, 午後2:63点)。
 そこで思ったのだが、この試験はWebや参考書で言われるように難しくはないのではないかということだ。そこで、2chデータベーススペシャリストスレを見てみると、受験結果報告データがあったので、データベーススペシャリストらしく、2ch住民程度のリテラシーを持つ人達がどの程度合格していて、何が合格の決め手となるのかを分析しようと思う。

自分の背景と試験対策

 データベースについてはRailsを通して使ったことあるくらい、SQLは業務で書いたりすることがある程度。他の資格は応用情報技術者を持っている。
 勉強時間は参考書購入した日付が1/20なのでおそらく勉強した期間は2月-4月で、土日の午前中勉強したりしなかったりだったので、2h/1week だとすると、  2h / 1week * 3month(12week) = 25h程度 の勉強時間だと思う。午後問題は一問解くのにかなり時間かかるので面倒で嫌になって数問しかやっていない。特に午後2は解答を眺めただけで模擬的には解いていないと思う。午前2がテンポよく進められて楽しかったのでこれを一番やっていたと思う。 使った参考書。

情報処理教科書 データベーススペシャリスト 2015年版

情報処理教科書 データベーススペシャリスト 2015年版

 あとは試験前日に新谷良子さんのライブに行った。とても楽しく元気いっぱい飛び跳ねていたので、そうかこれが合格の秘訣か。

github

データとかソースコードとか置いてます。

https://github.com/yusuke0h/dbs_analyze

データ収集・ETL

2chデータベーススペシャリストスレより集めた。テンプレがあるので、これをスクレイピングした。きれいに整形できなかったのでここは手作業でクレンジングした。

合否報告用テンプレ 【合否】 【午前Ⅰ得点】 【午前Ⅱ得点】 【午後Ⅰ得点/自己採点】 【午後Ⅱ得点/自己採点】 【午後選択問題】午後Ⅰ問123、午後Ⅱ12 【受験回数】 回 【学習期間】 【年齢】 歳 【保有資格】 【参考書】 【一言】

ライブラリとデータ読み込み

library("ggplot2")
old = theme_set(theme_gray(base_family="HiraKakuProN-W3"))
library("mvpart")

df <- read.csv("/Users/yusuke/Projects/Hobbies/2015-06-24_DBS/data_cleaned.csv")

基礎統計量

標本数は47個、午前午後の得点や分析に使えそうな受験回数・学習期間・年齢がある。

summary(df)
##      合否      午前Ⅰ得点    午前Ⅱ得点       午後Ⅰ得点      午後Ⅱ得点   
##  合格  :34    免除  :32   Min.   : 19.0   Min.   :31.0   Min.   :45.0  
##  不合格:13   71     : 3   1st Qu.: 77.0   1st Qu.:64.5   1st Qu.:62.0  
##              85     : 3   Median : 84.0   Median :70.0   Median :66.5  
##              88     : 3   Mean   : 80.8   Mean   :69.1   Mean   :69.0  
##              25     : 1   3rd Qu.: 88.0   3rd Qu.:76.5   3rd Qu.:76.8  
##              64     : 1   Max.   :100.0   Max.   :84.0   Max.   :94.0  
##              (Other): 4                                  NA's   :5     
##     受験回数       学習期間          年齢                     保有資格 
##  Min.   :1.00   Min.   :  2.0   Min.   :22.0    基本情報、応用情報: 3  
##  1st Qu.:1.00   1st Qu.: 30.0   1st Qu.:27.0    AP                : 2  
##  Median :1.00   Median : 45.0   Median :33.0    FE、AP            : 2  
##  Mean   :1.72   Mean   : 52.8   Mean   :33.2   AP                 : 2  
##  3rd Qu.:2.00   3rd Qu.: 60.0   3rd Qu.:38.0                      : 1  
##  Max.   :6.00   Max.   :180.0   Max.   :50.0                      : 1  
##                 NA's   :2       NA's   :1      (Other)            :36  
##                          参考書  
##                             : 6  
##   情報処理教科書            : 6  
##                             : 4  
##   過去問                    : 4  
##   情報処理教科書、公式過去問: 3  
##   翔泳社                    : 2  
##  (Other)                    :22  
##                                                                                                                                                                                                                                                             一言   
##   2010年から5年の時を経てリベンジ。   午後はルールを覚えたら過去問で特訓あるのみ。   独特の言い回しを習得するのと午後Ⅱの過去問でへこたれない   精神力を鍛えられるかが鍵。                                                                                  : 1  
##   あかんかったか…                                                                                                                                                                                                                                            : 1  
##   あきらめずにチャレンジだ~                                                                                                                                                                                                                                  : 1  
##   あぶねー!おいら、データベースのセンスねぇぇぇ!                                                                                                                                                                                                            : 1  
##   うおお、午後1が問1に時間かけすぎて問2が設問1以外間に合わず空白になり  絶対落ちたと思ってたのに受かってた。前回も同じ感じで午後1で時間配分  ミスって落ちたが、今回まさかの67。ってことは問1はほぼ50点近く取れて  たのかな?諦めず午後2もやっといてよかった。: 1  
##   ここまで点取れてたとは思ってなかった                                                                                                                                                                                                                        : 1  
##  (Other)                                                                                                                                                                                                                                                      :41

可視化

ggplot(df, aes(x=合否, color=合否, fill=合否)) + geom_bar()

f:id:yusuke0h:20150711192632p:plain 合格者のほうがデータが多い。さすが2chかと思ったが、そもそも不合格者はあまりデータ残したいと思わないだろうから、合格のほうが多いのだろう。

ggplot(df, aes(x=午前Ⅱ得点, fill=合否)) + geom_histogram(binwidth=5, alpha = 0.5, position = "identity") + xlim(0, 101) + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711192942p:plain 午前2の得点に関してはあまり述べるところないかな。合格者のほうが正規分布っぽい。 安定した80点台といったところか。合格者で点数が低いのはクレンジングミスかな。

ggplot(df, aes(x=午後Ⅰ得点, fill=合否)) + geom_histogram(binwidth=5, alpha = 0.5, position = "identity") + xlim(0, 101) + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711192958p:plain 午後1では合格者のほうが安定した点数をとっている人が多い。まあ当たり前か。

ggplot(df, aes(x=午後Ⅱ得点, fill=合否)) + geom_histogram(binwidth=5, alpha = 0.5, position = "identity") + xlim(0, 101) + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711193018p:plain 午後2は当たり前だが、不合格者は全員60点以下である。合格者も60点を頂点として分布している。やはりギリギリ合格な人が多いらしい。

ggplot(df, aes(x=受験回数, fill=合否)) + geom_histogram(binwidth=1, alpha = 0.5, position = "identity") + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711193033p:plain ここからは受験者の属性を見ていく。 まずは受験回数。不合格者はやはり初見が多い。過去問等やっていないと流石に難しいのだろう。 対して合格者は初見で受かる人もそこそこいるが、2回目以降で受かる人もそれなりにいるということだ。なんにせよ何度も受けたら受かるわけではなく、きちんと勉強して受けると受かるようだ。

ggplot(df, aes(x=学習期間, fill=合否)) + geom_histogram(binwidth=20, alpha = 0.5, position = "identity") + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711193120p:plain 次に学習期間。合格者の学習期間は少ないか多いかに寄っている。これ面白いな。がっつり勉強する人と元々実力あって少ない勉強期間で受かる人がいるってことなのかな。逆に不合格者はのっぺり勉強している。

ggplot(df, aes(x=年齢, fill=合否)) + geom_histogram(binwidth=3, alpha = 0.5, position = "identity") + facet_grid(合否 ~ .)

f:id:yusuke0h:20150711193137p:plain 続いて年齢。三十半ばを超えると合格者の数が減る。若い人のほうが受かりやすい。不合格者のっぺりしている。まあ不合格者はデータ少ないので仕方ないか。

決定木

ついでに決定木分析やってみよう。

df.rp<-rpart(合否~ 受験回数 + 学習期間 + 年齢,df)
par(family="HiraMaruProN-W4")
plot(df.rp,uniform=T,margin=0.2)
text(df.rp,uniform=T,use.n=T,all=F)

f:id:yusuke0h:20150711193325p:plain 受験回数・学習期間・年齢を使った決定木では、まず45歳より若いのが条件らしい。 次に受験回数は初見が良く、そしてやはり30よりも若い人がいいらしい。その後学習期間の条件がくる。

df.rp<-rpart(合否~ 学習期間,df)
par(family="HiraMaruProN-W4")
plot(df.rp,uniform=T,margin=0.2)
text(df.rp,uniform=T,use.n=T,all=F)

f:id:yusuke0h:20150711193453p:plain 興味がわいたので学習期間だけで決定木作ってみる。すると、予想通り短期間型と長期間型がごく確率高いようだ。だらだら中途半端にやるのは受からないらしい。

結論

若くて実力がある人が短期決戦型で勉強するか、若くてやる気のある人が腰を据えてじっくり勉強すると合格する。だらだら勉強するのはよくない。 ブログや参考書で言われているほどの超難関ではないように感じるので若い人は気軽にどんどん受けてみるといいと思う。少なくとも情報処理教科書に書いてあるようなWBSの勉強時間(300時間)も必要ないと思う。

所感

データ分析と銘打ったが、可視化して、決定木しかしてない。 他にどんな手法が使えるのだろうか。 単純に仮説検定とか?自分の属性を入れて合格率が出るような回帰分析とか?参考書別の合格率とか? あとは、持っている資格欄が正規化されてないので第一正規化して集計したり、 一言欄をテキストマイニングしてみたりしても面白いのかな。