seabornmatplotlibをベースにしたデータビジュアライゼーションライブラリです。countplot はカテゴリカルデータを集計から度数分布図までを一気に行なってくれる大変便利なツールです。

前回はseaborn countplot の棒グラフに度数のannotationをつけるcountplotで度数をannotationする方法を紹介しました。 今回は、barplot で棒グラフを作成し、各々のbarの値をannotationしたいと思います。Excelの代わりにseanborn でサクサク、グラフ化の参考の第二弾になります。

サンプルデータセット

日本語化した棒グラフを作成するためにデータセットを用意します。seaborn countplot の棒グラフに度数のannotationをつけると同様に サンプルデータセットで紹介しているデータセット3 のHRデータを編集して使っています。HRデータのうち、Age, EducationField, TotalWorkingYears MonthlyIncome の列をそれぞれ、「年齢」、「専攻」、「勤続年数」、「月収」と書き換えました。 さらに、EducationFieldで含まれるカテゴリカルデータを日本語するとろまでは同じです。

今回は二次元データを作るために、「専攻」のカテゴリカルデータを軸にgroupbyメソッドでデータを集約します。groupbyメソッドを使うとmean()平均値 やsum()トータルで各カテゴリー値を集約できます。今回は、平均値で各カテゴリの値を集約したいと思います。

groupby での集約のイメージ

groupby_image

reset_index()でx軸、y軸をColumnに配置する

seabornbarplotを利用するためには、x軸、y軸ともデータフレームのcolumn で指定する必要があります。 しかし、groupby で集約したカテゴリカルデータのcolumn は、集約化されたデータフレームではラベルインデックスとして配置されています。 従って、reset_index()でカテゴリをcolumnに再配置させます。そのコードとデータフレームを図示しておきます。

1
2
3
4
5
#月収の列のみにする
df_gsum =  df_gsum.iloc[:, [2]]

#ラベルインデックスをreset_index()で列に配置する
df_gsum = df_gsum.reset_index()

reset_index()

Python コードの紹介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
import pandas as pd
import seaborn as sns
#matplotlibのグラフをRetinaの高解像度で表示する
%config InlineBackend.figure_formats = {'png', 'retina'}
#Jupyter Notebookの中で作図した画像を表示させる
%matplotlib inline
#matplotlib をインポートする
import matplotlib.pyplot as plt

#日本語タイトルのため、japanizeをインポートする
import japanize_matplotlib
plt.rcParams['font.family'] = 'IPAexGothic'

order = ['マーケティング', '理工学', '医薬、保健','人文科学','教育・人事','その他']
title = '専攻分野別平均月収'
y_name = '月収'
x_name = '専攻'
y_label = '平均月収(US$)'

ax = plt.subplots(figsize =(9,9))
ax = sns.barplot(x = x_name, y = y_name,
                   data = df_gsum, 
                   palette='pastel',
                  order = order)

plt.title(title, fontsize=18, fontweight='bold' )
plt.xticks(rotation=90)
plt.xlabel(x_name, fontsize = 14, fontweight='bold')
plt.ylabel(y_label, fontsize = 14, fontweight='bold')

for p in ax.patches:
    ax.annotate(format(p.get_height(), '.2f'), 
                   (p.get_x() + p.get_width() / 2., 
                    p.get_height()), 
                    ha = 'center', 
                    va = 'center', 
                    xytext = (0, 9), 
                    textcoords = 'offset points',
                    fontsize = 14,
                    color = 'blue')

小数点何位までの表示とするかの指定

数字表記の肝心な点として小数点何位まで表記するかだと思います。 平均値のため、小数点第二位まで表記するようにしています。 以下のformat( '.2f')の部分がそれに相当します。

format(p.get_height(), '.2f')
値pの小数点以下何位まで表記かを指定する .2f = 小数点第二位

度数分布図、任意のカテゴリー順

order = ['マーケティング', '理工学', '医薬、保健','人文科学','教育・人事','その他']として order = orderとすると、orderで指定した順に棒グラフが並びます。イメージは以下のとおりです。

月収平均


参照ページ一覧

本ブログは、以下のネットの記事等を参考に作成しました。 

1) seaborn countplot の棒グラフに度数のannotationをつける
2) seaborn barplot で棒グラフを隣接させY軸、annotationをパーセント表示する
3) seaborn
4) matplotlib
5) EXCELの達人からPythonの達人へ:住民基本台帳年齢階級別人口から都道府県別人口を作成する
6) 日本語対応した matplotlib 2軸グラフ