成長曲線、ゴンペルツ曲線、ロジスティック曲線
生物の個体数、新製品の販売数、プログラムのバグ発見数など、当初は少なく、中途で大きくなり、その後また少なくなるような現象は多くあります。それを時間の推移と累積量をグラフにすると、下図のようになります。これを成長曲線といいます。
代表的な成長曲線に、ゴンペルツ曲線とロジスティック曲線があります。
両者とも、似たようなS字型の曲線で、時間xが経つにつれ、増加が止まり一定値Kに近づきます。ロジスティック曲線は変曲点を中心に左右対称になりますが、ゴンペルツ曲線は対称性がないのが大きな特徴です。

実際には、時間が負になるのは不適切ですが、t=x+t0のような変換により、t≧0としてこれらの曲線を利用します。
ゴンペルツ曲線は、
・・・ゴンペルツ曲線の式
をグラフにしたものです。
この式は、
dy/dx = Ay×e-Bx ・・・微分方程式
から得られたものです。
dy/dx は、yの増加率を示しています。すなわち、yの増加率は、
直前のyに比例して増加する要因
時間xに伴い指数的に減少する要因
に関係することを表しています。
ゴンペルツ曲線は、このような性質をもった曲線です。
右図は、K=1として、bとcを変化させたものです。
x→∞ のとき:e-cx→0、b0=1、y→K
x=0 のとき:e-cx=1、y=Kb
x→-∞のとき:e-cx→∞、y→b∞→0
(0<b<1 であることが必要です)になります。
b=0.3、c=0.5のとき(赤線)のグラフでいえば、x0(x=0)のとき、y0=Kb=1×0.3=0.3になっています。bはy0の値を決める要素であり、cは傾きの程度を示していることがわかります。
なお、yがαKになるxは、
= αK
より、次の式が得られます。
1 logb
x=──log(───)
c logα
ここで、b=0.3、c=0.5のときに、いくつかのαを与えると、次のようになります。
1 -1.204 α=0.5 0.9 0.95 0.99
x=───log(──────) x=1.104 4.872 6.312 9.572
0.5 logα
この曲線が、プログラムバグ発見数の累積だとすれば、95%のバグが発見されるのはx=6.3の時点であると予想されます。
ロジスティック曲線は、
・・・ロジスティック曲線の式
をグラフにしたものです。
生物は親から生まれるので、生物の個体数の増加率 dy/dt は直前の個体数yに比例すると考えられます。それで、
dy/dt = ry
と表現できます。
しかし、現実には無限に増大することはありません。その限界値Kに近づくと増加率は低下するはずです。それを加味すると、
dy/dt=ry(K-y) ・・・微分方程式
となります。ロジスティック曲線の式は、このような関係から導き出されたのです。
生物成長の観点では、t≧0であり、t0(t=0)のときy=0となりますが、ロジスティック曲線の式では、一般化するために、その条件を無視しています。それで、x=t+t0とし、t0=-∞としています。すなわち、生物ははるか昔に発生したというかたちになっています。
ロジスティック曲線の式を検討します。
x→∞ のとき:e-cx→0、分母→1、y→K
x=0 のとき:e-cx=1、分母=1+b、y=K/(1+b)
x→-∞のとき:e-cx→∞、y→0
になります。
また、微分方程式から、dy/dtが最大になる(増加率が最大になる)のは、y*=K/2のときです。ロジスティック曲線の式から、そのときのxを求めると、
x*= (logb-log2)/c
となります。なお、yがαKになるxは、
= αK
より、次の式が得られます。
logb-log((1/α)-1)
x=────────────
c
ここで、
α log((1/α)-1)
0.5 0
0.9 -2.197
0.95 -2.944
0.99 -4.595
右図は、K=1とし、bとcを変化させてグラフにしたものです。b=3、c=1のグラフ(赤)についていえば、x=0のとき、y0=1/(1+3)=2.5になっています。また、増加率が最大になるのは、x*= (log3-log2)/1=1.098-0.693=0.405、y*=1/2=0.5になっています。
また、bによりy0が決まること、cにより傾きが変わることがわかります。
測定したデータから、ゴンペルツ曲線やロジスティック曲線の式を求める、すなわち、K、b、cを決定することを考えます。
どちらの式も非線形ですので、かなり高度な数学が必要となります。また、繰り返し言及しているように、現実のデータの期間はt≧0であるのにたいして、これらの式は、-∞<x<∞の範囲です。それで、例えばt=1ののデータをx=-5、x=-10のデータであるというようにずらす必要がありますが、それまでも自動的に(統計学的に)行おうとすると、さらに複雑な数学が必要になります。
それでここでは、かなり単純化した方法にします。そのため、「よく近似する」式にはならないことをお断りしておきます。よく近似する式が必要なときは、専門の統計パッケージを利用してください。
●データの時期の調整
ここでは、t→xに関しては、過去データの散布図などにより、調整されているものとします。すなわち、実際には、t=0、1、・・・、nという時点で測定されたのですが、それを、x=-j、-j+1、・・・、0,1、・・・、k-1、kであるというように調整できたとします。
後述するように、そのずらしの範囲を与えて、いくつかのケースで計算するようにします。
●ゴンペルツでのcの取扱い
ゴンペルツ曲線の式を適宜変形すると、
logy=logK+e-cxlogb
となります。
ここで、Y=logy、P=logK、Q=logb、X=e-cxとすれば、
Y=P+QX
となるので、最小二乗法によりPとQを決定することができます。
そして、K=eP、b=eQの逆変換をすることから、Kとbが求められます。
ところが、それには未知数であるcを事前に与える必要があります。cに初期値を与えて逐次的に改善する方法があるのですが、かなり複雑になります。それで、現実離れしていますが、ここでは、
cの最小値と最大値を与えて、いくつかのcの値を仮定して計算する。
ことにします。
●ロジスティックでのKの取扱い
ロジスティック曲線を適宜変形すると、
log(K/y-1)=logb-cx
となります。
ここで、Y=log(K/y-1)、P=logb、(Q=-c)
とすれば、
Y=P+Qx
となるので、最小二乗法によりPとQを決定できます。
そして、b=eP、c=-Qの逆変換により、bとcが求められます。
ところが、このYには未知数であるKが含まれています。既にxが大で、Kに近いデータが存在するのであれば、Kを推定することができますが、実務的には、かなりxが小さい時点でKを知りたいことが目的の場合があります。ここでは、
Kの最小値と最大値を推測して与えることにより、それぞれのKにおけるBとcを求める
ことにします。
●計算プログラム
すなわち、ここの計算プログラムは、
・t→xの変換は利用者が既に行っている。
・一部のパラメータ(ゴンペルツではc、ロジスティックではK)の値を利用者が仮定する。
ことを前提にして、
・変換処理を行い、Y=P+Qxの形にして、
・最小二乗法によりPとQを計算し、
・逆変換処理により(先に仮定したものを加えて)、パラメータK、b、cを求める
こととします。
しかし、t→x、c、Kを1点で与えたのでは、近似式を得るまでの操作が大変なので、
・最小値と最大値の幅ときざみを与える
ことにより、いくつかのケースを連続的に行い、その結果により、利用者がより適切なパラメータの値を設定しやすいようにしました。
また、おまけ的ですが、
・入力値と計算値の誤差を出力する。
・α=50%、90%などのxを求める。
を行ないます。