Python はじめてのデータ分析

この記事では、Python初心者がある程度のPythonの基礎を勉強した後、pandasやseabornといったライブラリを使用してデータ分析（っぽい） 実装を試してみたものです。

内容については、以下のQiita記事も参考にさせていただきました。
- [Pythonでデータ分析実践演習 ~2016 New Coder Survey 編~](https://qiita.com/shizuma/items/448140c2da10b4616f50)

# 実装環境
Pythonをインストールする方法はいくつかありますが、今回はAnacondaをインストールします。
私の環境では、V1.6.5を使用しています。pythonは3.6.2です。
また、Pythonコードの実行にはJunyper Notebookを使用しました。Anacondaのインストールと同時に利用可能となるツールで、Pythonコードをインタラクティブに実行できるので、初心者が色々コードと実行結果を確認しながら進めることができ、とても便利です。

Anacondaについて、インストール方法については以下が参考になります。
- [Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

# データの準備
今回、分析に使用するデータは参考記事でも使用している[kaggle](https://www.kaggle.com/)で探してみました。
ちょうど時期もあり気になってしまった以下を使ってみることにします。
- [A Year of Pumpkin Prices](https://www.kaggle.com/usda/a-year-of-pumpkin-prices)
※データのダウンロードにはユーザー登録が必要となりますのでご注意ください。

# Pythonライブラリ Pandas と Seaborn
データ分析を行うにあたり、今回は以下のライブラリを使用します。
#### Pandas
[Pandas](http://pandas.pydata.org/)はデータを読み込んだり、データを操作したりする機能が備わったライブラリです。
（ちょっと名前が可愛いなと思ってしまいました。。）
#### Seaborn
[Seaborn](https://seaborn.pydata.org/)はデータを可視化するための様々な機能が備わったライブラリです。
データの可視化にはmatplotlibもありますが、Seabornはmatplotlibのラッパとして実装され、より綺麗なグラフが描けるのが特徴です。

# Step1. データを読み込んで表示してみる
早速使ってみます。まずは必要なライブラリのインポート。

```py3
import pandas as pd
import seaborn as sns
%matplotlib inline
```

最後の`%matplotlib inline`はJunyper Notebook上にグラフを描画するために記載します。

先ほどダウンロードしたデータを読み込みます。
いくつかファイルがあり、Bostonのデータが最もデータ数が多そうでしたのでこちらを使うことにしました。
pandasで読み込みます。

```py3
boston_df = pd.read_csv('a-year-of-pumpkin-prices/boston_9-24-2016_9-30-2017.csv', low_memory=False)
```

試しに、データ数を表示してみます。
shapeプロパティを使うとデータの行数、項目数を取れるので、

```py3
boston_df.shape
```

```
>> (352, 25)
```

352データ、25の項目があるようです。
色々な切り口で分析できそうです。

早速読み込んだデータでグラフを表示してみます。
Pumpkinの産地は色々あるようなので、手始めにどの産地のものが多いのか出してみます。
産地ごとにデータをカウントできれば良いので、seabornのcountplotを使って直接表示できそうです。

```py3
sns.countplot('Origin',data=boston_df)
```

結果↓
![スクリーンショット 2017-10-26 10.59.32.png](https://qiita-image-store.s3.amazonaws.com/0/173887/223b4404-50c3-2a77-8d03-6c4c73857953.png)

とりあえず出せましたが、x軸の文字がかぶっていて読めません。。
色々方法はありそうですが、最も手軽にプリセットされているスタイルを[set_context](http://seaborn.pydata.org/generated/seaborn.set_context.html)で変更してみて見栄えを変えてみます。

```py3
sns.set_context('paper')
sns.countplot('Origin',data=boston_df)
```

![スクリーンショット 2017-10-26 11.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/173887/b5c96b74-2717-e98f-6013-b5f7f1d372f2.png)

デフォルトのスタイルはnotebookですが、さらに文字が小さいpaperを使うとx軸は読めるようになりました。
ちなみにスタイルは４種類、他にもtalk, posterがあります。
詳しくは以下の記事が参考になります。
- [seabornにset_contextで渡せる4つのスタイルの比較](https://qiita.com/sz_dr/items/c74f913316cade7df33d)

どうやら(当たり前かもしれませんが)MASSACHUSETTESのPumpkinが多いようなので、次はMASSACHUSETTESのデータのみを抽出して分析してみたいと思います。

# Step2. 複数のデータを表示して値を比較してみる

まずはMASSACHUSETTESのデータのみを抽出します。

```py3
from_massachusetts_df = boston_df.where(boston_df['Origin'] == "MASSACHUSETTS")
```

まずはPumpkinの価格がどのように推移するかみたいので、折れ線グラフのようなものを表示してみたいと思います。
seabornのfactorplotはいくつかグラフのタイプが選べるようですが、デフォルトが'point'となっていて、これが折れ線グラフのようなグラフを表示できそうなので、ひとまず…

```py3
sns.factorplot(x='Date', y='Low Price', hue="Item Size", data=from_massachusetts_df)
```
Pumpkinのサイズごとにx軸をDateとして表示してみます。
そして結果が…

![スクリーンショット 2017-10-26 11.45.21.png](https://qiita-image-store.s3.amazonaws.com/0/173887/952585c0-0ac3-d02f-5160-7b7aeeae8a1a.png)

とりあえず出ましたが訳がわかりません…
色々問題がありそうなので一つづつ…

### データの絞り込みとソート
まずはデータをそのままプロットしてしまっているのがよくないので少し整理します。
MASSACHUSETTSのデータに絞り込むだけでなく、一旦2016年のデータのみに絞ります。
また、Dateでソートします。
コードは以下。

```py3
from_massachusetts_df = boston_df.where(boston_df['Origin'] == 'MASSACHUSETTS')
from_massachusetts_df['Date'] = pd.to_datetime(from_massachusetts_df['Date']).dt.strftime('%Y/%m/%d')
from_massachusetts_df = from_massachusetts_df.where(pd.to_datetime(from_massachusetts_df['Date']).dt.year == 2016)
from_massachusetts_df.sort_values(by='Date')
```

pandasには日付を扱うための機能も色々あるようです。
データの日付は"mm/dd/YYYY"形式になっていて、そのままでは比較できないので、to_datetimeで日付として読み込んだ後、strftimeで任意の形式に。
2016年のデータの絞り込みではyearを抽出して比較します。
（多分やり方は複数あり、もっと効率が良い書き方があるかも…）

### グラフの見栄え調整
デフォルト表示のままでは、まず横幅が詰まっていて読めません。
aspectオプションを使うとx軸のメモリの幅を調整できるので、これを２とします。（デフォルトは1）
また、x軸の項目の表示を横向きではなく回転させて見えやすくします。
コードは以下。

```py3
graph = sns.factorplot(x='Date', y='Low Price', hue="Item Size", data=from_massachusetts_df, aspect=2)
graph.set_xticklabels(rotation=30)
```

最後に表示させて、

```py3
graph.map
```

結果がこちら。

![スクリーンショット 2017-10-26 15.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/173887/472cab75-647c-1b54-f4f1-dfd74b2bbe2a.png)

データの順番や見えやすさは問題なさそうです。
グラフをみてみると、10/22あたりが全体的に価格が高く、その後、少し下がっているのがわかります。
（もしかしてハ○ウィンとか関係あるんでしょうか？ないか。）
また、11/05以降は2サイズ以外はデータがなく、最終的に12/10でデータが終わっているので、ここまででPumpkinの出荷が終わっているのかもしれません。

グラフからわかるのはこれくらいかなと思います。（期待するほど面白い結果は出ないもの。。）
グラフでは各ポイントで点から上下に線が伸びていますが、これは同じDate, サイズで複数のデータがあるからのようです。
サイズ以外にもいくつかの要素があり、それによって価格が変わるようなので他にも分析の切り口はありそうです。

また、今回はMASSACHUSETTESからのデータに絞りましたが、他の地域のデータも含めて別な視点で分析するのも良さそう…

（時間があれば続きを。）

↓
続編を書きました。
[続・Python はじめてのデータ分析](https://qiita.com/knatsumi/items/f30d73c99807813baf26)