PandasでiTunesライブラリ分析 3

[第1回](https://qiita.com/moco_chan/items/cbe2543d06fd3971fd88) 全体の俯瞰とエンコーダの種類の違いをサイズとビットレートから見ました。
[第2回](https://qiita.com/moco_chan/items/7fd325204d479dde59f3) 再生回数からその他のデータを見ていきました。
今回は自分がどういう音楽を好んで聴いているのか調べます。
# ジャンルでバーチャートランキングを作成。
アーティストで分けても良かったのですが、恐ろしく多くなることが予想できるのでまずはジャンルでまとめてバーチャートで比較していきます。`.set_index`でジャンルをindex化し、`sum`で合計値を出し`.sort_values` で降順に並べます。それを今度はMatplotlibでの単純出力のために辞書化しkeyとvaluesを抜き取りリストに変換します。[^1]

[^1]: ここは本当はseabornのdistplotでもっとスマートに行いたかったのですが、できなかったので苦肉の策を講じました。`bar=`にリストを渡しても不可能でした。こういうやり方があるよ！という方は教えてください笑。


```python

gp = df.set_index('ジャンル')['再生回数'].sum(level=0).sort_values(ascending=False).to_dict()
dkeys = list(gp.keys())
dvals = list(gp.values())

# ｘはジャンル、yは再生回数の合計値
plt.figure(figsize=(20, 12))
plt.xticks(rotation=90)
plt.bar(dkeys, dvals)
```

![ジャンルごとの総再生回数plt_plot.png](https://qiita-image-store.s3.amazonaws.com/0/302092/26f12469-8ef7-2ec5-ea6b-5c63770f8b08.png)

x軸のジャンルが文字潰れを起こしてしまっていますね。ジャンルの項目が多すぎたので再生回数合計が10以下のジャンルは除くことにします。

```python
#gp = df[(df['再生回数'] > 10)].set_index('ジャンル')['再生回数'].sum(level=0).sort_values(ascending=False).to_dict()
#groupbyを使ってより効率的に記述できることを発見。2019-01-20
gp = df[(df['再生回数'] > 10)].groupby(['ジャンル'])['再生回数'].sum().sort_values(ascending=False)
gp.plot(cmap="bwr")
```
![ジャンルごとの総再生回数_2plt_plot.png](https://qiita-image-store.s3.amazonaws.com/0/302092/ba5a8b8e-5a63-9f6d-a9e5-86fdb8afa0ad.png)


僕はボサノヴァやロックやサウンドトラックやJPopなどをよく聴く事がわかりました。

##好きなジャンルではエンコード方法を変えるのか。
ところでお気に入りの音楽であればあるほどエンコードのビットレートを高くする傾向があると思います。
体感としてはそうしていたのですが、本当にそうであるswarmplotでみてみましょう。
**サウンドトラックは英語教材であり、NoGenruはジャンル情報が無いので除外します。*

```python

df_g_divi = df.set_index('ジャンル').loc[['J-Pop', 'Bossa Nova', 'Pop', 'Rock']].reset_index()
r = sns.swarmplot(x=df_g_divi["ジャンル"], y=df_g_divi["ビットレート"], hue=df_g_divi["種類"], data=df_g_divi
)
```
![swarmplot_ジャンルごとのビットレート.png](https://qiita-image-store.s3.amazonaws.com/0/302092/9df3ce54-c9ce-a9b8-5982-886efe5bd5cb.png)
swarmplotはx軸を極端に減らした散布図と言えるもので、名前の通りどのくらいある領域に群がっているのか簡単に視認することができる便利なものです。
お気に入りの４ジャンルの中で特にボサノヴァが高ビットレートでエンコードされている曲が多いことがわかりました。[^2]ところでこれを眺めて気がついたことがあります。
`Lossless`は可変ビットレートという曲調に合わせてビットレートを変化させる方式なのですが、ジャンルによってビットレートの高さが結構違います。基本的に変調が激しい曲ほどビットレートが高くなるので、ボサノヴァは変調があまり激しくない曲ということでしょう。
[^2]: これはパッと見で傾向を見るものであり、本当に比較するためには数値計算が必要です。


##エンコードは再生回数に影響するのか。（ジャンルごとに）

`Lossless`は高音質ですが反対に無圧縮ゆえ領域を取ります。高音質が再生回数に影響がなければあまり使いたくないエンコーダです。[^3]そこでジャンルごとに回帰曲線を使って再生数に関係があるのか見ていきます。

[^3]: `Lossless`は可逆圧縮なのでとりあえずこれでエンコしておけば他のものに変えられます。`wave`もそうです。反対に`Mpeg`、`AAC`は不可逆圧縮と行って符号化後はデータ自体はCD音質に戻すことはできません。人間の耳というフィルターに合わせ（人間の耳は解像度に限界があるのと、聴こえても必要な情報以外は聞かないようになっています。）情報をふるい落としています。


```python
g= sns.lmplot(x="ビットレート", y="再生回数", data=df_g_divi_b_f, hue="種類", col="ジャンル", row=None, palette=None,
           col_wrap=2, height=7, aspect=1, markers="+", sharex=True,)
```

![lmplot_ジャンルごとのビットレート.png](https://qiita-image-store.s3.amazonaws.com/0/302092/93a0a997-4b9b-d0f9-617b-21b08a344e74.png)

優位な差が見て取れるのはBossa Novaと J-Popのみですね。もうこれからはRockとPopで`Lossless`は使わないことにします。笑

最後に実用性はあまりないですが２次元で一つのグラフにいろいろな情報を詰め込んでみたものを作って終了とさせていただきます。

```python
df_g_divi = df_g_divi[(df_g_divi['ビットレート'] < 1_500)]

ax = sns.scatterplot(data=df_g_divi, x="年", y="ビットレート", style="種類", hue="ジャンル", size="再生回数", sizes=(15, 200),
                     legend="brief")
```
![test03再生回数関係なし.png](https://qiita-image-store.s3.amazonaws.com/0/302092/ed96422a-9c23-814d-4ecf-57e102efab0b.png)

ビットレートは外れ値が大きかったので制限をかけています。
パット見で僕は90年代80年代のボサノヴァ[^4]と最近のJ-Popをよく聴くようです。そしてよく聴く音楽はしっかりと`Lossless`にしていることがわかりますね！またBossa Novaはエンコーダにとって優しい音楽ということもなんとなくつかめます。
[^4]: この年代でブームが始まり終わった音楽なのです。



次回は更に特定のジャンルを深く分析していきたいと思います！

###詰まったところ
relplotが回帰曲線に対応しておらず`(x, np.poly1d(np.polyfit(x, y, 1))(x)`でlegendを外したものを重ねてプロットしようとかなり頑張ったができなかったのでlmplotに逃げました。（それはlmで出せよという意味かもしれませんが。笑）