DQウォークのレベルアップに必要な経験値の数式モデルを求める（１）

#概要（TL;DR）

ドラクエウォークのレベルアップに必要な経験値を題材にpythonの数値計算ライブラリを練習してみたときの記録です。（１）はデータを確認するで（２）で数式モデルを算出しようと思います。
（現在 勉強中なので間違い等をどんどん指摘してもらえたら嬉しいです。）

1.データを読込み可視化する
2.データを数式モデル化する（回帰分析）


# まずはデータを眺める

必要なライブラリを読み込む。今回は使わないのもあるが、次回使うので読み込んでおく。

```python
import pandas as pd
import numpy as np
import scipy as sp

import matplotlib.pyplot as plt
import seaborn as sns

sns.set()
%matplotlib inline
%precision 3
```

参考URLからレベル毎に必要な経験値をテキストファイルに転記する。

```shell:zsh
% head data.csv
0
9
23
50
105
192
346
599
962
1397
```

よし早速、read_csv()だ。

```python
df = pd.read_csv('data.csv')
df.head()
```

<img width="151" alt="Screen Shot 2020-01-31 at 0.09.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/5f5314ed-2a81-675f-16a2-9da98a270443.png">


***王様「おお、ヘッダー列が無いデータをそのまま読み込んでしまうとは何事だ。」***


read_csv()のオプションでheader=Noneにするか、names=[]でカラム名を設定する。

```python
df = pd.read_csv('data.csv',names=['EXP'])
df.head()
```
<img width="162" alt="Screen Shot 2020-01-31 at 0.09.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/e82b2733-9578-55b2-73bc-b16cb8385e80.png">

indexが0から始まっているので、このままだとレベル０からレベル１になるために必要な経験値が9になってしまう。そこで、indexに1を加える。

```python
df.index = df.index+1
df.head()
```


<img width="163" alt="Screen Shot 2020-01-31 at 13.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/b1d9f4d1-84d5-7a63-5050-0ed0cecb51b1.png">





これだけだと、レベルアップに必要な経験値はわかるが、そのレベルに到達するまでに必要な経験値がわからないので累積和（Cumulative Sum）も算出しておく。

```python
df['CUMSUM_EXP'] = df['EXP'].cumsum()
df.head()
```

<img width="254" alt="Screen Shot 2020-01-31 at 20.23.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/99d514c6-ba0a-85f5-d004-25715d8e27fd.png">



#### 次のレベルアップまでに必要な経験値をグラフに

```python
plt.plot(df.index,df['EXP'])
plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.grid(True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/0f2c48c9-4fd1-6d1f-9337-9c389ff183e6.png)


レベル50前後で、明らかにモデルが違うような気が・・・・。

#### 累計で必要な経験値を折れ線グラフに
```python
plt.plot(df['CUMSUM_EXP'],'x')
plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.grid(True)
```

<img width="397" alt="Screen Shot 2020-01-31 at 0.51.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/87089055-d37e-bc6b-b8a7-42cfe2f1ed1c.png">

こっちはきれいな指数関数のグラフになりそうな気がする。

#### 要約統計量を確認する
pandasのdescribe()を使って要約統計量（descriptive statistics value）を確認してみる。

```python
pd.options.display.float_format = '{:.2f}'.format
df.describe()
```

<img width="314" alt="Screen Shot 2020-01-31 at 13.50.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/5d87f434-c052-03f7-9ee4-f680dd929c9c.png">


早速、先程のグラフに分位数の水平線を入れてみる。
次のレベルに必要な経験値のグラフに、累積経験値の分位数を当てはめる。（ここに違和感があるが、結果として正しいと思う。）

```python
plt.plot(df['EXP'],label = 'EXP')
plt.axhline(df['CUMSUM_EXP'].quantile(0.25), ls = "-.", color = "magenta",label="25%")
plt.axhline(df['CUMSUM_EXP'].quantile(0.50), ls = "-.", color = "green",label="50%")
plt.axhline(df['CUMSUM_EXP'].quantile(0.75), ls = "-.", color = "Orange",label="75%")

plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.legend()
plt.grid(True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/b63eb102-3d34-1c7a-cf75-3a8e133ed4f0.png)

ん？75%の線があんな場所にあるので、レベル50から55までを抜き出してグラフ化してみる。

```python
plt.plot(df['EXP'][49:55],label = 'EXP')
plt.axhline(df['CUMSUM_EXP'].quantile(0.75), ls = "-.", color = "Orange",label="75%")


plt.xlabel('LEVEL')
plt.ylabel('EXP')
plt.legend()
plt.grid(True)
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/354ea888-3252-01c5-bd43-15cf3db8a937.png)


レベル55までに必要な経験値の25%はレベル54から55になるまでに経験値とほぼ等しい・・・・・・。先日リリースされた上級職は、レベル55にしないと永続スキルがつかないので、これは悲報ですね・・・・。

つづく

# 参考URL

ドラクエウォーク攻略wiki
https://gamerch.com/dq-walk/entry/102321