Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

データの中身を確認するにあたり、
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を使用してデータフレームを新たに作成し、頻度の棒グラフを出力しました。

参考にしたもの

kuma_kuma
IT企業で働くぺーぺーです。 データサイエンスに興味があったりで勉強し始めました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away