Pandasにもヒストグラムを作成する関数hist()が存在します。この関数は値を表示するのではなく、ヒストグラムをmatplotlibを使ってプロットします。単純に頻度の数値データが欲しい場合はvalues_counts関数が便利な関数です。

本記事では

  • ヒストグラムの作成の仕方
  • value_counts関数を使った非数値データの頻度の出力方法

について解説します。

今回扱うサンプルデータはKaggleのチュートリアルからとってきたものです。

Titanic - Kaggle

ここのtrain.csvという名前のファイルを使います。 (ダウンロードするためにはユーザー登録が必要ですが簡単なものなのでしておくことをお勧めします。)

1つ注意点ですが、Pandas付属のhist関数やplot関数は欠損値をスルーしてくれていることを忘れないようにしましょう。逆に言えば、 matplotlibは Pandasのデータにある欠損値をスルーしないということになります。

ヒストグラムを作成するhist関数

hist関数はDataFrameやSeriesのデータからヒストグラムを作成してくれる関数で、matplotlibを使ってグラフに描画してくれます。

まずは、簡単にグラフを表示させてみます。グラフの表示のためにはmatplotlibも必要なのでどちらもインポートします。

In [1]: import pandas as pd

In [2]: import matplotlib.pyplot as plt

In [3]: df = pd.read_csv("train.csv")

In [4]: del df["Name"], df["Ticket"], df["Cabin"] # 今回使わない列データは削除する

In [6]: df.head()
Out[6]:
   PassengerId  Survived  Pclass     Sex   Age  SibSp  Parch     Fare Embarked
0            1         0       3    male  22.0      1      0   7.2500        S
1            2         1       1  female  38.0      1      0  71.2833        C
2            3         1       3  female  26.0      0      0   7.9250        S
3            4         1       1  female  35.0      1      0  53.1000        S
4            5         0       3    male  35.0      0      0   8.0500        S


In [7]: from pylab import rcParams

In [8]: rcParams['figure.figsize'] = 10, 10 # グラフが見きれないようにするためサイズを大きくしておく

In [9]: df.hist(); # 一括でヒストグラムを描画する

In [10]: plt.tight_layout() # グラフ同士が重ならないようにする関数

In [11]: plt.show() # グラフの表示

この時のグラフは以下のようになります。

hist_all.png

グラフを見てみると、数値データではなかった Sex Embarkedはグラフに描画されてないことがわかります。

数値データ以外のものをヒストグラムとして表示する方法は後ほど解説します。次は1つ1つのヒストグラムについて詳しい設定を施しましょう。

基数の数を変更する (bins)

bins引数の値を変更することで頻度を分析する階級値の細かさを指定することができます。

デフォルトでは10となっているので、値を変えてみます。ここではAgeのデータを使って見ていくことにしましょう。

# いったん先ほどの設定をクリアするために再起動する  

In [1]: import pandas as pd

In [2]: import matplotlib.pyplot as plt

In [3]: df = pd.read_csv("train.csv")

In [18]: df['Age'].hist(bins=20); # 基数の数を20個にする  

In [19]: plt.savefig("age_bins.png")

In [20]: plt.show()

この時のグラフは以下のようになります。

age_bins.png

先ほどのものと比べてみると

age_bins_10.png

ピークの位置がより正確にわかるようになりました。

ラベルを元にヒストグラムを作成する by

by引数を使うと与えられたラベルごとにヒストグラムを作成してくれます。例えば、先ほどのAgeのヒストグラムを男女別で見たい時などに有効です。

In [28]: df['Age'].hist(by=df['Sex']);

In [30]: plt.show()

この時のグラフは以下のようになります。

by_sex.png

これにより男女間での年齢分布が比べやすくなりました。

非数値データの頻度をヒストグラムで表示する

今度はvalue_counts関数を使って非数値データの頻度を表示させてみましょう。

先ほどのhist関数を使わず、plot関数で棒グラフを表示させる形でヒストグラムの作成をしたいと思います。

先ほどのデータのembarkedを使いましょう。どこの港からタイタニック号に乗船したかを示しており、C = Cherbourg, Q = Queenstown, S = Southamptonになるようです。

先ずはvalue_countsデータの出力をみてみます。

In [36]: df['Embarked'].value_counts()
Out[36]:
S    644
C    168
Q     77
Name: Embarked, dtype: int64

このように値ごとの頻度が返されました。

次にこれを使ってヒストグラムを描画していきます。Pandasのplot関数を使ってkind="bar"とすることでヒストグラムを描画します。

In [38]: df["Embarked"].value_counts().plot(kind="bar")
Out[38]: <matplotlib.axes._subplots.AxesSubplot at 0x1146189e8>

In [40]: plt.show()

embarked_hist.png

うまく描画できました。

まとめ

今回はPandasの付属関数histを使った簡単なヒストグラムの作成方法と、非数値データの頻度をヒストグラムとして表す方法について紹介しました。

より細かい設定をして見た目を綺麗にしたいという方はmatplotlibを使って設定していく方が良いですが、とりあえず概要だけ掴みたい!という場合にはPandasのhist関数を使うと便利だと思います。

また、Pandasのhist関数やplot関数だと 欠損値をスルー してくれるのでdropnaなどの欠損値処理をせずとも手軽にグラフがかけるのが魅力的です。

参考