pandasのメソッドだけでそこそこのグラフを描画したい

#はじめに

本記事はこちらの取り組みの一環です。

https://qiita.com/sckln/items/9af07be8df426cbcdb36

#使うデータ

↓このようにして集めてきたデータを使います。

https://qiita.com/sckln/items/ae4c001e5066613171d0

https://qiita.com/sckln/items/d42bc1d5564ae65ff899

結果（画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/738a5541-4d72-a33f-7d01-47508b1af2da.png)

#やりたいこと

Matplotlibは覚えること多くて嫌！サンプルは美しいけど、プレゼン用じゃなくて対象データの概観を掴みたいだけなのに、何でそんな行数書かなきゃいけないの？？１行で何とかしたい！

#使うライブラリ

pandasのグラフ描画用メソッドを使います。裏で動いているのはMatplotlibで、拘らなければこれである程度いけます。
Matplotlib.pyplotもimport必要です。

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.hist.html

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.boxplot.html

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html#pandas.DataFrame.plot

#実践

###準備

```py
%pip install japanize-matplotlib
```
```py
import matplotlib.pyplot as plt
import japanize_matplotlib
japanize_matplotlib.japanize() 

%matplotlib inline
```
matplotlibの日本語化についてはこちら。

https://qiita.com/sckln/items/eb1193963bbdb92e0fdc

###pandas.DataFrame.hist()

``df.hist()``とするだけでとりあえずヒストグラムを書いてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/9cb8ec84-6543-4851-0811-dfbccfe88619.png)
ちょっと狭いので、画像サイズを指定し、また、ビン分割を増やして、度数を対数軸にしてみました。

```py
df.hist(figsize=(20,10), bins=20, log=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/94114c96-ed0a-0ac2-d9a8-09ed1c5e667e.png)

バルコニー140m2とか、平米単価900万とか一体何なんでしょうね。後ほど異常値（元データの入力ミスなど）かどうか調べることにします。

###pandas.DataFrame.plot()

これはさすがに``df.plot()``では何が起きたのかよく分からないグラフが吐き出されます。（エラーにはならない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/ceafa4b5-3e18-42aa-cbf4-d974e96ca228.png)

しかし、グラフの種類と使うカラムを指定すれば、``df.plot(kind='scatter', x="総面積(m2)", y='価格(万円)')``でExcelのデフォルトの散布図くらいのものは描けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/6770f314-3100-994c-32e0-382f2dc9e8b5.png)

もう少しいろいろオプションを指定するとこんな感じ。

```py
df.plot(kind='scatter', x="総面積(m2)", y='価格(万円)', c='築年数', colormap='jet', loglog=True, figsize=(10,6), alpha=0.3, sharex=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/e83a7302-51d3-36a7-23bf-5b058583a72d.png)

* ``c='築年数', colormap='jet'`` カラーマップを使えば、３次元データを可視化できます。jetのほかにも以下から選べばOK

https://matplotlib.org/stable/tutorials/colors/colormaps.html

* ``loglog=True``両対数軸の指定。片対数は``logx=True``あるいは``logy=True``です。尚、ヒストグラムのときの縦軸に対数を取るときは、logyではなく単に``log=True``としました。粉体の粒子径とか、ポリマーの分子量とか、所得とか、ピラミッド状に分布しているものは対数軸を取ると見やすいですね。

* ``figsize=(10,6)``単位はインチ。

* ``alpha=0.3``不透明度？プロットが多い時はalphaを指定したほうがデータの重なり具合が分かりやすい。

* ``sharex=False``はpandasのバグ対応で、デフォルトだとx軸のラベルや目盛り数字が消えてしまいます。

住所（行政区）別にグルーピングしてプロットの色を変えたい、などと思うときには、seabornでhueを指定するのがよいようですが、ここでは扱いません。

###pandas.DataFrame.boxplot()

```py
df.boxplot(column='価格(万円)', by='住所2', figsize=(10,6), rot=90)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/2d82b8c2-77d0-c686-9ad1-40d1393ad690.png)

上側の外れ値が多くて見にくいですが、df.boxplot()メソッドの引数では``logy=True``と指定することが出来ません。これ以上拘るなら、サンプル事例の記事も少ないpandasのメソッドで無理に頭を捻るよりも、Figure, Axesのクラスの意味するところを理解してmatplotlibやseabornの公式のサンプルを参考にしたほうが良さそうです。

```py
fig1, ax1 = plt.subplots(figsize=(10, 6))
ax1.set_yscale('log')
ax1.set_ylabel('価格(万円)')
df.boxplot(ax=ax1, column='価格(万円)', by='住所2', rot=90, showmeans=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1381159/a60c5e7f-8d2d-346a-7a11-ee3a3acb2910.png)




#その他参考情報

https://note.nkmk.me/python-pandas-plot/

xlabelが表示されないpandasのバグの情報は大変助かりました。

https://own-search-and-study.xyz/2016/08/03/pandas%E3%81%AEplot%E3%81%AE%E5%85%A8%E5%BC%95%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99/

こういう気合の入ったブログには頭が下がります。