この記事では、Python初心者がある程度のPythonの基礎を勉強した後、pandasやseabornといったライブラリを使用してデータ分析(っぽい) 実装を試してみたものです。
内容については、以下のQiita記事も参考にさせていただきました。
実装環境
Pythonをインストールする方法はいくつかありますが、今回はAnacondaをインストールします。
私の環境では、V1.6.5を使用しています。pythonは3.6.2です。
また、Pythonコードの実行にはJunyper Notebookを使用しました。Anacondaのインストールと同時に利用可能となるツールで、Pythonコードをインタラクティブに実行できるので、初心者が色々コードと実行結果を確認しながら進めることができ、とても便利です。
Anacondaについて、インストール方法については以下が参考になります。
データの準備
今回、分析に使用するデータは参考記事でも使用しているkaggleで探してみました。
ちょうど時期もあり気になってしまった以下を使ってみることにします。
-
A Year of Pumpkin Prices
※データのダウンロードにはユーザー登録が必要となりますのでご注意ください。
Pythonライブラリ Pandas と Seaborn
データ分析を行うにあたり、今回は以下のライブラリを使用します。
Pandas
Pandasはデータを読み込んだり、データを操作したりする機能が備わったライブラリです。
(ちょっと名前が可愛いなと思ってしまいました。。)
Seaborn
Seabornはデータを可視化するための様々な機能が備わったライブラリです。
データの可視化にはmatplotlibもありますが、Seabornはmatplotlibのラッパとして実装され、より綺麗なグラフが描けるのが特徴です。
Step1. データを読み込んで表示してみる
早速使ってみます。まずは必要なライブラリのインポート。
import pandas as pd
import seaborn as sns
%matplotlib inline
最後の%matplotlib inline
はJunyper Notebook上にグラフを描画するために記載します。
先ほどダウンロードしたデータを読み込みます。
いくつかファイルがあり、Bostonのデータが最もデータ数が多そうでしたのでこちらを使うことにしました。
pandasで読み込みます。
boston_df = pd.read_csv('a-year-of-pumpkin-prices/boston_9-24-2016_9-30-2017.csv', low_memory=False)
試しに、データ数を表示してみます。
shapeプロパティを使うとデータの行数、項目数を取れるので、
boston_df.shape
>> (352, 25)
352データ、25の項目があるようです。
色々な切り口で分析できそうです。
早速読み込んだデータでグラフを表示してみます。
Pumpkinの産地は色々あるようなので、手始めにどの産地のものが多いのか出してみます。
産地ごとにデータをカウントできれば良いので、seabornのcountplotを使って直接表示できそうです。
sns.countplot('Origin',data=boston_df)
とりあえず出せましたが、x軸の文字がかぶっていて読めません。。
色々方法はありそうですが、最も手軽にプリセットされているスタイルをset_contextで変更してみて見栄えを変えてみます。
sns.set_context('paper')
sns.countplot('Origin',data=boston_df)
デフォルトのスタイルはnotebookですが、さらに文字が小さいpaperを使うとx軸は読めるようになりました。
ちなみにスタイルは4種類、他にもtalk, posterがあります。
詳しくは以下の記事が参考になります。
どうやら(当たり前かもしれませんが)MASSACHUSETTESのPumpkinが多いようなので、次はMASSACHUSETTESのデータのみを抽出して分析してみたいと思います。
Step2. 複数のデータを表示して値を比較してみる
まずはMASSACHUSETTESのデータのみを抽出します。
from_massachusetts_df = boston_df.where(boston_df['Origin'] == "MASSACHUSETTS")
まずはPumpkinの価格がどのように推移するかみたいので、折れ線グラフのようなものを表示してみたいと思います。
seabornのfactorplotはいくつかグラフのタイプが選べるようですが、デフォルトが'point'となっていて、これが折れ線グラフのようなグラフを表示できそうなので、ひとまず…
sns.factorplot(x='Date', y='Low Price', hue="Item Size", data=from_massachusetts_df)
Pumpkinのサイズごとにx軸をDateとして表示してみます。
そして結果が…
とりあえず出ましたが訳がわかりません…
色々問題がありそうなので一つづつ…
データの絞り込みとソート
まずはデータをそのままプロットしてしまっているのがよくないので少し整理します。
MASSACHUSETTSのデータに絞り込むだけでなく、一旦2016年のデータのみに絞ります。
また、Dateでソートします。
コードは以下。
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軸のメモリの幅を調整できるので、これを2とします。(デフォルトは1)
また、x軸の項目の表示を横向きではなく回転させて見えやすくします。
コードは以下。
graph = sns.factorplot(x='Date', y='Low Price', hue="Item Size", data=from_massachusetts_df, aspect=2)
graph.set_xticklabels(rotation=30)
最後に表示させて、
graph.map
結果がこちら。
データの順番や見えやすさは問題なさそうです。
グラフをみてみると、10/22あたりが全体的に価格が高く、その後、少し下がっているのがわかります。
(もしかしてハ○ウィンとか関係あるんでしょうか?ないか。)
また、11/05以降は2サイズ以外はデータがなく、最終的に12/10でデータが終わっているので、ここまででPumpkinの出荷が終わっているのかもしれません。
グラフからわかるのはこれくらいかなと思います。(期待するほど面白い結果は出ないもの。。)
グラフでは各ポイントで点から上下に線が伸びていますが、これは同じDate, サイズで複数のデータがあるからのようです。
サイズ以外にもいくつかの要素があり、それによって価格が変わるようなので他にも分析の切り口はありそうです。
また、今回はMASSACHUSETTESからのデータに絞りましたが、他の地域のデータも含めて別な視点で分析するのも良さそう…
(時間があれば続きを。)
↓
続編を書きました。
続・Python はじめてのデータ分析