【Python初心者】matplotlibとseabornで箱ひげ図を描いてみる(データの可視化)

スポンサーリンク
Python
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...
【初心者】プログラミング学習、独学かスクールか問題
プログラミングを学習する方法は大きく分けて2つあります。 すなわち、独学とスクールです。 どちらにもメリットとデメリットがあります。独学とスクールのメリットとデメリットの確認して、自分にあった学習方法を見つけ...

データサイエンティストにとって、データの可視化は楽しみのひとつです。地味で時間がかかる前処理が終わり、いよいよデータ分析の始まりである、データの可視化はわくわくします。

今回は、箱ひげ図を描いていきましょう。

箱ひげ図はドットプロットより解釈しやすいグラフです。ドットプロットは点があるだけなので、データの分布を知ることができますが、全体的に分かりにくい場合があります。箱ひげ図は中央値や四分位範囲、外れ値が分かりやすいので、データの大まかな理解がしやすいグラフです。

箱ひげ図(Boxplot)

オレンジの横線が中央値

四角の横線の下が、小さい数値から数えて25%にあたる数値

四角の横線の上が、小さい数値から数えて75%にあたる数値

この四角の範囲が、四分位範囲といって、データの半分がこの範囲にあります。「箱」と呼ばれているのはこのためです。

はこから上下にでている線、は「ひげ」です。上の線は第三四分位から四分位範囲の1.5倍まで出ています。反対に、下の線は第一四分位から四分位範囲の1.5倍まで出ています。
ひげはデフォルトでは四分位範囲の1.5倍ですが、指定することができます。

上にある点は、ひげ以上のデータを表しています。つまり、外れ値です。
外れ値の定義はさまざまですが、今回はひげより大きいまたは小さい数値を外れ値とします。

Pythonの環境構築はAnacondaからJupyter Labを使っています。以下の記事を参照して下さい。

【2021年最新】M1 mac でanacondaをインストールする方法

【2021年最新】WindowsでAnacondaをインストールする方法

必要なライブラリをインポート

import matplotlib.pyplot as plt
import seaborn as sns


plt.style.use("ggplot")     # グラフのデザインを指定する
sns.set_palette('Set2')     # グラフの色を指定する

import warnings
warnings.filterwarnings('ignore') # 警告メッセージを出ないようにしている

seabornのデータセットから、「tips」を読み込む

df = sns.load_dataset('tips')
df

出力:

データの中身を確認する

  • total_bill : 総支払額(食事代、税込み) (USドル)
  • tip : チップ(USドル)
  • sex : 性別
  • smoker : 喫煙者か否か
  • day : 曜日(木・金・土・日のいずれか)
  • time : 食事の時間(昼食か夕食か)
  • size : 人数

箱ひげ図(matplotlib)

plt.figure(figsize=(10,6))
plt.boxplot(df["tip"])
plt.show()

出力:

横向きにする

plt.figure(figsize=(10,6))
plt.boxplot(df["tip"],vert=False)
plt.show()

出力:

曜日別のチップをグラフ化する

まずは、曜日(day)の種類を確認してみましょう。

df.day.unique()

出力:
[‘Sun’, ‘Sat’, ‘Thur’, ‘Fri’]
Categories (4, object): [‘Sun’, ‘Sat’, ‘Thur’, ‘Fri’]

曜日は “Sun”、”Sat”、”Thur”、”Fri” の4種類あることが確認できた。

箱ひげ図を曜日別で描いてみる

plt.figure(figsize=(10,6))
plt.boxplot([df["tip"][df["day"]==df.day.unique()[0]],
             df["tip"][df["day"]==df.day.unique()[1]],
             df["tip"][df["day"]==df.day.unique()[2]],
             df["tip"][df["day"]==df.day.unique()[3]]
            ],labels=df.day.unique())
plt.show()

出力:

箱ひげ図(seaborn)

import japanize_matplotlib       # グラフに日本語が使える

plt.figure(figsize=(10,6))

sns.boxplot(x=df["day"], y=df["tip"],width=0.5,order=df.day.unique())

plt.title("曜日別のチップ",fontsize=20)   # タイトルを指定する、文字の大きさを指定
plt.ylabel("チップ",fontsize=20)         # y軸のラベルを指定、文字の大きさを指定
plt.xlabel("曜日",fontsize=20)           # x軸のラベルを指定、文字の大きさを指定

plt.show()


出力:

ドットプロットを追加する

plt.figure(figsize=(10,6))

sns.boxplot(x=df["day"], y=df["tip"],width=0.5,order=df.day.unique())
sns.swarmplot(x=df["day"], y=df["tip"],color="r",order=df.day.unique())    # ドットプロットを追加

plt.title("曜日別のチップ",fontsize=20)
plt.ylabel("チップ",fontsize=20)
plt.xlabel("曜日",fontsize=20)
plt.ylim(df["tip"].min()-1,df["tip"].max()+1)

plt.show()

出力:

ドットプロットを追加した方が、分布が分かりやすいですね。

“Sun”と”Sat”と”Thur”のチップは2が多くなっています。

さらに性別でグループ分けして描画する

plt.figure(figsize=(10,6))

sns.boxplot(x="day", y="tip",data=df,width=0.5,order=df.day.unique(),hue="sex")

plt.title("曜日別のチップ",fontsize=20)
plt.ylabel("チップ",fontsize=20)
plt.xlabel("曜日",fontsize=20)

plt.show()

出力:

ドットプロットを追加する

plt.figure(figsize=(10,6))

sns.boxplot(x="day", y="tip",data=df,width=0.5,order=df.day.unique(),hue="sex")
sns.swarmplot(x="day", y="tip",data=df,color="r",order=df.day.unique(),hue="sex",dodge=True)

plt.title("曜日別のチップ",fontsize=20)
plt.ylabel("チップ",fontsize=20)
plt.xlabel("曜日",fontsize=20)
plt.ylim(df["tip"].min()-1,df["tip"].max()+1)

plt.show()

出力:

こんな感じですね。
seabornの方が扱いやすいですね。だた、matplotlibはカスタマイズしやすい(コードは当然多くなるが)かもしれませんね。
わたしはそこまで詳細にカスタマイズしないですがね。

【2022年最新】初心者が学ぶ目的別Pythonおすすめ書籍18選|プログラミング・数学・データ分析・機械学習
Pythonはプログラミング言語として非常に人気の高いです。 その理由は、色々な目的で使えることと、初心者にも学習しやすいことです。 Pythonの学習方法はスクールに行くのも一つですが、お金も高いので、まずは独...

【Python初心者】matplotlibで棒グラフと円グラフを描いてみよう(データの可視化)

【Python初心者】matplotlibとseabornで折れ線グラフを描いてみよう(データの可視化)

【Python初心者が知らない】ドットプロットでデータを可視化する簡単な方法

【Python初心者】matplotlibとseabornで散布図を描いてみよう(データの可視化)

コメント

タイトルとURLをコピーしました