データの中身を確認するにあたり、
2値データ等がどれだけ含まれるかを一つの棒グラフで表現したい時があるはずです。
探し方が悪かったのか、
一つの棒グラフで表す簡潔な方法が出てこなかったのでアウトプットも含めて記載します。
今回は、2値データだけでなく6値のデータも含めた棒グラフを作成しています。
環境
Google Colabを使用しました。
使用したライブラリのバージョンは以下になります。
ライブラリ | バージョン |
---|---|
python | 3.6.9 |
pandas | 1.1.4 |
seaborn | 0.11.0 |
matplotlib | 3.2.2 |
ライブラリのインポート
上記のモジュールを使用するにあたり、インポートしておきます。
%matplotlib inline
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
データセットのインポート
今回は、seabornに含まれる学習用データセットのtipsを利用します。
このデータセットには、
ディナーとランチの総支払額と含まれるチップの額や支払った人の性別などが含まれます。
# データフレームのインポート
tips = sns.load_dataset('tips')
# 先頭5行を確認
display(tips.head())
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
上記のような出力があればインポートは成功です。
データの加工
以下の4つのカラムを用いて棒グラフを作成します。
グラフの作成にあたり、定性的な値を定量的な値に変換する必要があります。
カラム名 | 概要 | 方針 |
---|---|---|
sex | 性別 (Male/Female) | Male -> 0, Female -> 1 |
smoker | 喫煙 (No/Yes) | No -> 0, Yes -> 1 |
time | 食事の時間 (Lunch/Dinner) | Lunch -> 0, Dinner -> 1 |
size | 人数 (1 ~ 6) | そのまま利用 |
これを実現するには色々な方法があると思いますが、
以下のように実施しました。
# sexを定量化 (Male1 -> 0, Female -> 1)
tips.sex = tips.sex.replace("Male", 0).replace("Female", 1)
# smokerを定量化 (No -> 0, Yes -> 1)
tips.smoker = tips.smoker.replace("No", 0).replace("Yes", 1)
# timeを定量化 (Lunch -> 0, Dinner -> 1)
tips.time = tips.time.replace("Lunch", 0).replace("Dinner", 1)
# 先頭5行を確認
display(tips.head())
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | 1 | 0 | Sun | 1 | 2 |
1 | 10.34 | 1.66 | 0 | 0 | Sun | 1 | 3 |
2 | 21.01 | 3.50 | 0 | 0 | Sun | 1 | 3 |
3 | 23.68 | 3.31 | 0 | 0 | Sun | 1 | 2 |
4 | 24.59 | 3.61 | 1 | 0 | Sun | 1 | 4 |
このように、0と1に置き換えられたことが確認できます。
頻度のグラフ化
さて、本題になります。
棒グラフに含めるカラム名をリスト形式でlabelに定義します。
次に各カラムに対してユニークな値とその個数を取得します。
このままではindexがカラム名、カラム名が値の状態なので入れ替えを実行しています。
# 棒グラフに収めるラベル一覧の定義
label = ["sex", "smoker", "time", "size"]
# 各ラベルに対してユニークな値の取得
tips_ = [tips[l].value_counts() for l in label]
# データフレームに変換してindexとカラムを入れ替え
tips_ = pd.DataFrame(tips_).transpose()
# グラフの表示
tips_.plot.bar()
plt.grid()
plt.title("Frequency of values in each label")
plt.ylabel("counts")
plt.xlabel("value")
plt.show()
このように求めたかったグラフを作成することができました。
まとめ
value_countsを使用してデータフレームを新たに作成し、頻度の棒グラフを出力しました。