同人音楽データをpandasで集計してみる

こんにちは。シーシャを吸いながら初稿を書いています。もくもくです。
Qiitaへの投稿はおよそ3ヶ月ぶりです。ご無沙汰しています。

## あらすじ
[茶太](http://chata.moo.jp/)さんご存知でしょうか。まったりと同人歌手として活動しているのですが、「だんご大家族」を歌っていたので名前は知らなくても聴いたことがある人もいるかもしれません。
知人が茶太さんの楽曲データベースを作っていて、そのデータをいただくことができたのでpandasを使って分析してみたいと思います。

## 今回やること
分析といえるほどのものではないですが、茶太さんの曲が収録されたCDを発売年月で集計します。Seabornの*countplot*を使ったシンプルな方法と年月ごとに集計してから*barplot*で出力する少し遠回りな方法の２つでやってみます。

## データセットについて
CD単位でまとめられたデータを使用します。
"CD名","サークル名1","サークル名2","発売年月日","メジャーレーベルフラグ","備考"からなり、csv形式で保存しています。

## 環境
Ubuntu 16.04
Python 3.5.2 :: Anaconda custom (64-bit)

では始まります。

```
#coding:utf-8

import csv
import pandas as pd
import seaborn as sns

if __name__ == "__main__":

    # CSVを読み込む
    dfCD = pd.read_csv("ChataData_CD.csv")

    # 発売年月
    releaseYear = []
    # CSV格納データフレームを回して発売年月日を取得
    # i:行名, row:series(行の値)
    for i,row in dfCD.iterrows():
        ymd = str(row['ReleaseYmd'])
        # 発売年月日をスライスして発売年月にする
        releaseYear.append(ymd[0:4])

    # データフレームに発売年月リストを入れる
    chataCD = pd.DataFrame({'year':releaseYear})

    # seabornに日本語フォントをセット
    sns.set(font='TakaoPGothic')
```

***iterrows***で元データの入ったデータフレームを回してCDの発売年月を取得していきます。
***iterrows***は**行名**と**行の値**からなるタプルを回すメソッドです。
データフレームを縦方向に回していくイメージでしょうか？
(参考:http://sinhrks.hatenablog.com/entry/2015/06/18/221747)
データセットには発売年月日として登録されているので、"yyyymm"となるようにスライスしてリストに入れます。

pd.DataFrame({**ラベル名**:***Series***})で発売年月のリストをデータフレームに入れます。
Seriesは１次元のリストです。私は最初、元データを回しながら発売年月(文字列)を追加していこうとして失敗しました。

Seabornに日本語フォントをセットして準備は終わりです。
ここではTakaoPGothicを指定しています。
日本語フォント指定については以下を参考にしました。
[【Seaborn】日本語を表示する (フォントを変更する)](http://qiita.com/keisuke-nakata/items/2309764d21438645f6b9)

ではSeabornを使って可視化していきます。
まずはシンプルな方法から。

```
    fig = sns.countplot(x='year',data=chataCD,palette='Greens_r').get_figure()
    fig.suptitle('茶太さん曲収録CDリリース数の推移(2000-2016)')
    sns.plt.savefig('countByYear_simple.png')
```

***countplot***はX軸もしくはY軸のデータをカウントしてくれるメソッドです。
CDごとの発売年月が入ったデータフレームを渡すだけで集計するので簡単ですね。
[pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その2]
(http://qiita.com/hik0107/items/7233ca334b2a5e1ca924)
***paletter***ではカラーパレットを指定します。
[Seabornのカラーパレットの選び方](http://qiita.com/Tsutomu-KKE@github/items/c79c9973a92e1e2c77a7)が参考になりました。
以下が出力されたグラフです。
![countByYear_simple.png](https://qiita-image-store.s3.amazonaws.com/0/139506/66cdcb74-fbdd-209b-68c7-fd330944dca8.png)


次に少し遠回りな方法です。手間は増えますがこちらの方がpandasの勉強になりそうです。

```
    # 年月ごとのリリース数を求める
    yrCount = chataCD['year'].value_counts(ascending=True).sort_index()
    year = []
    count = []
    for row in yrCount.iteritems():
        year.append(row[0])
        count.append(row[1])
    dfCount = pd.DataFrame({'year':year,'count':count})

    barplot = sns.barplot(x='year',y='count',data=dfCount,palette='Greens_r').get_figure()
    barplot.suptitle('茶太さん曲収録CDリリース数の推移(2000-2016)')
    sns.plt.savefig('countByYear.png')
```

遠回りな方では発売年月とリリース数の２種類のデータを持つデータフレームを作ります。
まず**DataFrame.value_counts**で要素の数を集計します。

**DataFrame.value_counts**は*Series*を返します。今回の場合は*index*が年月、*values*が枚数となります。
発売年月とリリース数それぞれのリストを作り、そこに値を入れます。
***iteritems***は*index*と*values*からなるタプルを回すので、発売年月には*row[0]*、リリース数には*row[1]*を加えていきます。

発売年月とリリース数のリストからデータフレームを作ったら後はSeabornで可視化です。
いわゆる棒グラフを描画する***barplot***を使います。
![countByYear.png](https://qiita-image-store.s3.amazonaws.com/0/139506/297c76cf-eb98-21dd-587f-655973387960.png)

## 話は逸れますが
Seabornをインポートして実行すると以下のWarningが出るのですが原因がわからず困っています…
```
/.pyenv/versions/anaconda3-4.1.0/lib/python3.5/site-packages/PIL/Image.py:85: RuntimeWarning: The _imaging extension was built for another  version of Pillow or PIL
  warnings.warn(str(v), RuntimeWarning)
```
コメントにて原因をご教示いただけたら幸いです。