なろう小説APIを試してみた2

[なろう小説API](https://dev.syosetu.com/man/api/)を読んでいたら面白いコマンドを見つけたので紹介と分析をしてみる

#会話率
>|パラメータ|	値|	説明|
|:--|:--|:--|
|kaiwaritu	|int string	|抽出する小説の会話率を%単位で指定できます。範囲指定する場合は、最低数と最大数をハイフン(-)記号で区切ってください。

なるほど。会話率……
会話ばっかりとか地の分とかそういうのかな

ではでは早速

ロードの準備とライブラリの読み込みをし

```before_load.py
import pandas as pd
import requests
import numpy as np
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline

url = "http://api.syosetu.com/novelapi/api/"
```

```narou_load.py
st = 1
lim = 500

data = []
while st < 2000:
    payload = {'of': 't-gp-gf-n-ka', 'order': 'hyoka',
          'out':'json','lim':lim,'st':st}
    r = requests.get(url,params=payload)
    x = r.json()
    data.extend(x[1:])
    st = st + lim
df = pd.DataFrame(data)

df.head()

```
`payload = {'of': 't-gp-gf-n`
この部分に`ka`という部分を追加すればロードができる。(上では追加済み)
そして出てくるデータが

|title	|kaiwaritu(%)|
|:--|--:|
|転生したらスライムだった件	|14|
|ありふれた職業で世界最強	|40|
|とんでもスキルで異世界放浪メシ	|36|
|無職転生　- 異世界行ったら本気だす -	|22|
|デスマーチからはじまる異世界狂想曲（ web版 ）	|38|

なるほど。ありふれ結構高いな（ファン）
ただ、そもそもこれがどれくらい高いのか分からないので`describe()`してみる


||kaiwaritu|
|:--:|--:|
|count|	2000.00000|
|mean	|38.00800|
|std	|10.66831|
|min	|0.00000|
|25%	|31.00000|
|50%	|38.00000|
|75%	|45.00000|
|max	|96.00000|

なるほど。平均が38％となると平均くらいなのか。
というか、ありふれくらい文字数が多くてこの割合って結構多いのか？

文字数を少し絞ってみようか。

#読了時間

あえて文字数を指定せずに読了時間というものを使ってみる
といっても読了時間とは

>|パラメータ	|値	|説明|
|:--|:--|:--|
|time|int string|抽出する小説の読了時間を指定できます。読了時間は小説文字数÷500を切り上げした数字です。範囲指定する場合は、最小文字数と最大文字数をハイフン(-)記号で区切ってください。|

と、ある通り文字数に比例した数字なので数字が小さくなる以外はそこまで問題はないはず。

`payload` の`of` に`ti`を追加して早速ロード

せっかくなので`time`を`describe()`してみて

||	time|
|:--:|--:|
|count	|2000.000000|
|mean	|1395.985500|
|std	|1823.680635|
|min	|11.000000|
|25%	|434.750000|
|50%	|889.500000|
|75%	|1608.250000|
|max	|26130.000000|

一応最低でも5001文字以上はあるようだ。
(...というかmaxってサモナーさんじゃないだろうな)
`df[['title','time']].sort_values('time').tail()`

|title|	time|
|:--|--:|
|マギクラフト・マイスター|	14868|
|境界迷宮と異界の魔術師|	16410|
|異世界料理道	|17653|
|サモナーさんが行く|	25536|
|レジェンド	|26130|

**違いました**

##読了時間(文字数)と会話率の関連性

```doku_kai.py
#時間で四分位する
df['part']=pd.qcut(df.time,4,labels=['D','C','B','A'])
#パート毎に平均する
df.groupby('part').agg({'kaiwaritu':['mean']})
```
※文字数はD<C<B<A

|part	|kaiwaritu(平均:％)|
|:--:|--:|
|D	|36.990|
|C	|38.180|
|B	|38.322|
|A	|38.540|

これは驚いた。特に長編だろうが短編だろうが会話率は変わらないようだ。

#文体
悔しかったので、もう一つ文体という機能を使ってみた
これはまだ試作段階のようで、はっきりとデータが出ない場合がある(そもそもあいまい)のと、`of`に設定ができないのでデータフレーム読み込みを2種類作ることにする

>|パラメータ	|値	|説明|
|:--|:--|:--|
|buntai	|int string|	文体を指定できます。ハイフン(-)記号で区切ればOR検索できます。 1：字下げされておらず、連続改行が多い作品 2：字下げされていないが、改行数は平均な作品 4：字下げが適切だが、連続改行が多い作品 6：字下げが適切でかつ改行数も平均な作品|

まず、それぞれ`df1`、`df2`、`df4`、`df6`にわける

- df1

>失格紋の最強賢者　～世界最強の賢者が更に強くなるために転生しました～
公爵令嬢の嗜み
転生賢者の異世界ライフ　～第二の職業を得て、世界最強になりました～
乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…
ライブダンジョン！

- df2

>異世界食堂
誰かこの状況を説明してください
針子の乙女
私はおとなしく消え去ることにします
中堅(中年)サラリーマンのまったり異世界産業革命

- df4

>ありふれた職業で世界最強
無職転生　- 異世界行ったら本気だす -
デスマーチからはじまる異世界狂想曲（ web版 ）
Ｒｅ：ゼロから始める異世界生活
陰の実力者になりたくて！【web版】

- df6

>転生したらスライムだった件
とんでもスキルで異世界放浪メシ
私、能力は平均値でって言ったよね！
蜘蛛ですが、なにか？
聖女の魔力は万能です

一部納得いかない分類もあるが、ここは我慢する

||df1|df2|df4|df6|
|:--|--:|--:|--:|--:|--:|	
|count	|500.000000	|500.000000	|500.00000	|500.000000|
|mean	|36.506000	|35.246000	|38.74200	|37.668000|
|std	|11.489211	|14.927396	|9.70091	|13.106691|
|min	|1.000000	|0.000000	|6.00000	|0.000000|
|25%	|28.000000	|25.000000	|32.75000	|30.000000|
|50%	|36.000000	|35.000000	|39.00000	|38.000000|
|75%	|44.000000	|44.250000	|45.00000	|46.000000|
|max	|70.000000	|98.000000	|71.00000	|96.000000|

この結果を見ると、大きな差は無いもののdf2が全体的に少なく、逆にdf6が多い結果になった。
尚、母数を500ずつにしているのは最初の母数が2000だったからであって、2000ずつ表示にしたときdf2はさらに下がり34％であった。

こうみると会話率は文体にもかかわってないようだ。~~やっぱりジャンルなのかな~~

#感想
あまり上手くいかない分析結果になってしまったが、今後仕事としてやっていくときの練習にはなったのかなとは思った。
また面白いデータ分析を思いついたらやってみたいと思う。
読み返してみたら転スラの会話率の低さに驚いた。心の中の会話が多いからか？