草薙の研究ログ

英語の先生をやってます。

非線形最小二乗法で学習コンテンツ消化曲線をモデル化

まあ結構いろんなことに汎用的に当てはまることだと思うのだけど,ソフトウェアの品質管理とかの分野では,ソフトウェア信頼度成長曲線という手法があるそうだ(古い友人に教えてもらった)。

これは,ソフトウェア開発において,バグの発見数や残ったバグの数の予測などに使われるものだそうで,基本的には横軸に時間や工数,縦軸にはバグの数とかをプロットする。すると,S字カーブのような曲線になるそうだ。で,これを非線形最小二乗法を使って何かの関数に当てはめてモデル化するというはなし。ふむふむ。とっても面白そう。品質管理というだけあって,実用的だし,外国語教育の業務改善にもすごく通じるものがありそうだ。

外国語教育では,オンライン教材におけるコンテンツ消化率とかがパッと思いつくような例だ。オンライン教材で単語テストを繰り返すとか,そういう場面では,横軸に時間を,縦軸に消化率をプロットすると,おそらく同じように成長曲線を描くことができる。こんな感じだということしよう。ある学生があるオンライン教材を15週にかけて勉強した様子で,横軸には週,縦軸にはそのコンテンツの消化率をプロットした,と。(こういうデータは外国語教育にはかなりお蔵入りしてる)

#例の作成
t<-seq(1,15,1)
d<-c(0.04,0.02,0.03,0.06,0.12,0.22,0.36,0.50,0.60,0.72,0.85,0.91,0.97,0.98,1.00)

#作図
plot(t,d,xlab="時間(単位:週)",ylab="コンテンツ消化率")

f:id:kusanagik:20170128150313p:plain

このデータになんらかの関数を当てはめたい,と(最近欲求不満なのかなんでも当てはめたくなる)。
えっと,いろんな関数が当てはまるだろうけど,ここでは,ゴンペルツと4母数ロジスティック関数にしよう。

Rでやるには,デフォルトで使えるstatsパッケージのnlsという関数を使えばいい。非線形最小二乗法でフィッティングをする関数だ。いろいろ便利。

#ゴンペルツに当てはめ
fit.gom<-nls(d~SSgompertz(t,Asym,b2,b3))

#結果
summary(fit.gom)

Nonlinear regression model
  model: d ~ SSgompertz(t, Asym, b2, b3)
   data: parent.frame()
   Asym      b2      b3 
 1.0985 12.1508  0.7114 
 residual sum-of-squares: 0.004886

Number of iterations to convergence: 0 
Achieved convergence tolerance: 5.022e-06

AIC(fit.gom)
BIC(fit.gom)

#当てはめた曲線を描き足し
plot(t,d,xlab="時間(単位:週)",ylab="コンテンツ消化率")
lines(t,predict(fit.gom),lty=2,col=2)

#4母数ロジスティック関数に当てはめ
fit.fpl<-nls(d~SSfpl(t,A,B,xmid,scal))

#結果
summary(fit.fpl)

Formula: d ~ SSfpl(t, A, B, xmid, scal)

Parameters:
      Estimate Std. Error t value Pr(>|t|)    
A    -0.009647   0.015871  -0.608    0.556    
B     1.023469   0.017314  59.114 4.01e-15 ***
xmid  8.223108   0.108640  75.692 2.66e-16 ***
scal  1.791406   0.112481  15.926 6.06e-09 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01943 on 11 degrees of freedom

Number of iterations to convergence: 0 
Achieved convergence tolerance: 3.818e-06

AIC(fit.fpl)
BIC(fit.fpl)

#当てはめた曲線をさらに描き足し
plot(t,d,xlab="時間(単位:週)",ylab="コンテンツ消化率")
lines(t,predict(fit.gom),lty=2,col=2)
lines(t,predict(fit.fpl),lty=2,col=4)

#2つのモデルをANOVA
anova(fit.gom,fit.fpl)

Analysis of Variance Table

Model 1: d ~ SSgompertz(t, Asym, b2, b3)
Model 2: d ~ SSfpl(t, A, B, xmid, scal)
  Res.Df Res.Sum Sq Df     Sum Sq F value Pr(>F)
1     12  0.0048859                             
2     11  0.0041547  1 0.00073119  1.9359 0.1916

#予測のために
#ゴンペルツ曲線の関数を定義
gomf<-function(x,Asym,b2,b3){
  y<-Asym*exp(-b2*b3^x)
  y
}

#4母数ロジスティック曲線の関数を定義
fplf<-function(x,A,B,xmid,scal){
  y<-A+(B-A)/(1+exp((xmid-x)/scal))
  y
}


この例だとピッタシだ。


f:id:kusanagik:20170128151403p:plain



外国語教育研究では,これと似たような技術の応用に,キーログを使った川口ほか(2016, Language Education & Technology)がある。

CiNii 論文 -  エッセイライティングにおける増加語数の時系列推移傾向とエッセイ評価の関係 : モデルフィッティングを用いた検討