LoginSignup
0
0

More than 3 years have passed since last update.

データフレームに含まれる2値データの頻度をPythonを用いて1つの棒グラフで表してみる

Last updated at Posted at 2020-11-07

データの中身を確認するにあたり、
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()

image.png

このように求めたかったグラフを作成することができました。

まとめ

value_countsを使用してデータフレームを新たに作成し、頻度の棒グラフを出力しました。

参考にしたもの

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0