時系列解析ライブラリProphet　公式ドキュメント翻訳4（飽和状態の予測編）

Facebookが公開している時系列解析用のライブラリProphetの公式ドキュメントを翻訳していきます。

目次
[1.Prophet公式ドキュメント翻訳（概要＆特徴編)](https://qiita.com/japanesebonobo/items/96868e58d4da42d36807)
[2.Prophet公式ドキュメント翻訳（インストール編)](https://qiita.com/japanesebonobo/items/a7309bc07c59c11bee7b)
[3.Prophet公式ドキュメント翻訳（クイックスタート編）](https://qiita.com/japanesebonobo/items/6f3234adb592f73bafbf)
**4.Prophet公式ドキュメント翻訳（飽和状態の予測編）**
[5.Prophet公式ドキュメント翻訳（トレンドの変化点編）](https://qiita.com/japanesebonobo/items/26cccef8ee9d45006093)
[6.Prophet公式ドキュメント翻訳（周期性・イベント効果・説明変数の追加編）](https://qiita.com/japanesebonobo/items/e674359618a879a49c05)
[7.Prophet公式ドキュメント翻訳（増加し続ける周期性編）](https://qiita.com/japanesebonobo/items/ed02f49ea66eab432af8)
[8.Prophet公式ドキュメント翻訳（誤差の間隔編）](https://qiita.com/japanesebonobo/items/f1acdd4ec1a1d0948553)
[9.Prophet公式ドキュメント翻訳（外れ値編）](https://qiita.com/japanesebonobo/items/4eb36710c689bca80c71)
[10.Prophet公式ドキュメント翻訳（1日単位ではないデータ編）](https://qiita.com/japanesebonobo/items/7062dd300a14bda4f84b)
[11.Prophet公式ドキュメント翻訳（モデルの診断編）](https://qiita.com/japanesebonobo/items/2266729f849868581011)
[12.Prophet公式ドキュメント翻訳（ヘルプ編）](https://qiita.com/japanesebonobo/items/08f85d74371240568fff)

2018/10/20公開。原文リンクは以下。
・Prophet概要＆特徴：https://facebook.github.io/prophet/
・公式ドキュメント：https://facebook.github.io/prophet/docs/quick_start.html

今回の記事はProphetの飽和状態の予測編です。
![スクリーンショット (91).png](https://qiita-image-store.s3.amazonaws.com/0/296645/7ee8810d-892b-9538-fa51-6eb3951df773.png)

#成長を予測する
デフォルト設定の場合、Prophetは予測の際に線形モデルを使用します。一般に成長予測をするときは、到達可能な最大値が存在します。例えば、市場規模の全体や総人口といったものです。これらは環境収容力と呼ばれ、ここで予測が飽和に達するとわかります。

Prophetは特定の飽和状態の予測の際に[ロジスティック関数](https://en.wikipedia.org/wiki/Logistic_function)に基づくトレンドモデルを使えます。私たちはこのことを説明するために、[RのWebページ(Wikipedia)](https://en.wikipedia.org/wiki/R_%28programming_language%29)の訪問数の対数をとった値をデータとして使います。

```R
# R
df <- read.csv('../examples/example_wp_log_R.csv')
```

```py
# Python
df=pd.read_csv('../examples/example_wp_log_R.csv')
```
私たちはcapという列で環境収容力を特定しなければいけません。この8.5という値は私たちが推測した値ですが、環境収容力は推測値ではなくデータの実際の値や市場規模についての専門知識を用いて決定した値を設定して下さい。

```R
# R
df$cap <- 8.5
```

```py
# Python
df['cap'] = 8.5
```
特記すべき重要なことは、capはデータフレームにおけるすべての行に明記されなければなりません。また、capは常に不変である必要はありません。市場規模が拡大した場合は、capをその都度大きくすることができます。

次に、モデルのフィッティングをドキュメントの前の部分で述べた方法で行います。従来の方法と異なる点は追加の引数にgrowth='logistic'を指定することです。

```R
# R
m <- prophet(df, growth = 'logistic')
```

```py
# Python
m = Prophet(growth='logistic')
m.fit(df)
```

予測値を含むデータフレームを作成します。従来の方法と異なるのは、未来のcapを指定しなければいけないことです。今回はcapを学習データと同じ値に設定し、今後3年分の予測を行います。

```R
# R
future <- make_future_dataframe(m, periods = 1826)
future$cap <- 8.5
fcst <- predict(m, future)
plot(m, fcst)
```

```py
# Python
future = m.make_future_dataframe(periods=1826)
future['cap'] = 8.5
fcst = m.predict(future)
fig = m.plot(fcst)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/d6a30d61-55d7-d67b-30ae-44e4f75a5522.png)
ロジスティック関数は暗黙的に0を最小値としています。そのためデータの値がcapを超えて飽和した際と
同様に0でも飽和します。別のアプローチとして、0とは異なる飽和の最小値を指定することも可能です。
#飽和する最小値について
ロジスティック関数に基づく成長モデルは、飽和する最小値も扱うことができます。capカラムで最大値を指定したように、floorカラムで最小値を指定します。

```R
# R
df$y <- 10 - df$y
df$cap <- 6
df$floor <- 1.5
future$cap <- 6
future$floor <- 1.5
m <- prophet(df, growth = 'logistic')
fcst <- predict(m, future)
plot(m, fcst)
```

```py
# Python
df['y'] = 10 - df['y']
df['cap'] = 6
df['floor'] = 1.5
future['cap'] = 6
future['floor'] = 1.5
m = Prophet(growth='logistic')
m.fit(df)
fcst = m.predict(future)
fig = m.plot(fcst)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296645/989d1002-e3dd-e67d-799b-06e278368969.png)
飽和の最小値を指定したロジスティック関数のトレンドモデルを使う際には、飽和の最大値も指定しなければなりません。