Pandasにもヒストグラムを作成する関数hist()
が存在します。この関数は値を表示するのではなく、ヒストグラムをmatplotlibを使ってプロットします。単純に頻度の数値データが欲しい場合はvalues_counts
関数が便利な関数です。
本記事では
- ヒストグラムの作成の仕方
- value_counts関数を使った非数値データの頻度の出力方法
について解説します。
今回扱うサンプルデータは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() # グラフの表示
この時のグラフは以下のようになります。
グラフを見てみると、数値データではなかった 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()
この時のグラフは以下のようになります。
先ほどのものと比べてみると
ピークの位置がより正確にわかるようになりました。
ラベルを元にヒストグラムを作成する by
by
引数を使うと与えられたラベルごとにヒストグラムを作成してくれます。例えば、先ほどのAge
のヒストグラムを男女別で見たい時などに有効です。
In [28]: df['Age'].hist(by=df['Sex']);
In [30]: plt.show()
この時のグラフは以下のようになります。
これにより男女間での年齢分布が比べやすくなりました。
非数値データの頻度をヒストグラムで表示する
今度は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()
うまく描画できました。
まとめ
今回はPandasの付属関数hist
を使った簡単なヒストグラムの作成方法と、非数値データの頻度をヒストグラムとして表す方法について紹介しました。
より細かい設定をして見た目を綺麗にしたいという方はmatplotlibを使って設定していく方が良いですが、とりあえず概要だけ掴みたい!という場合にはPandasのhist関数を使うと便利だと思います。
また、Pandasのhist関数やplot関数だと 欠損値をスルー してくれるのでdropnaなどの欠損値処理をせずとも手軽にグラフがかけるのが魅力的です。