グラフの作成

データを概観するためには,記述統計量を求めるとともに,グラフを作成して視覚的にデータの特性を捉えることも重要である。一変数の分布を概観するにはヒストグラムや箱ひげ図,変数間の関係を概観するには散布図を描いてみるのが有効。

Pythonでは,matplotlibseabornというパッケージを用いればモダンなグラフを作成することができる。matplotlibは基本的なグラフ作成ライブラリで,seabornmatplotlibをベースにしたより高機能なライブラリである。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

plt.rcParams['font.family'] = 'Noto Sans CJK JP'  # または利用可能な日本語フォント名

また,練習用データとしてirisを用いる。

iris = sns.load_dataset('iris')

matplotlibを使ったグラフ作成

ヒストグラム

まず,150のアヤメの萼片の長さについて,ヒストグラムを作成してみよう。

matplotlibでグラフを作成するには,plt.hist()関数を使う。

plt.hist(iris['sepal_length'])
plt.show()

とくに何も指定しなくても,Pythonが適当に区間を分割してヒストグラムを描いてくれる。

このままだと見にくいので,ヒストグラムのビンの幅を変更し,枠線や塗り色を指定してみよう。ヒストグラムの細かい設定は,plt.hist()の引数に指定すれば良い。bins引数でビンの数を指定できる。colorで塗り色,edgecolorで枠線の色を指定できる。

また,グラフのタイトルや軸のラベルも追加する。

plt.hist(
    iris['sepal_length'],
    bins=20,
    color='blue',
    edgecolor='black'
)
plt.xlabel('萼片長')
plt.ylabel('頻度')
plt.title('アヤメの萼片長の分布')
plt.show()

箱ひげ図

一変数の分布だけに関心があるときにはヒストグラムが有用だが,複数の変数の分布を比較したいときには箱ひげ図が便利である。

まず,アヤメの萼片長の箱ひげ図を描いてみよう。

plt.boxplot(iris['sepal_length'])
plt.ylabel('萼片長')
plt.title('アヤメの萼片長の箱ひげ図')
plt.show()

箱ひげ図の場合には,plt.boxplot()で変数を指定してやるだけで良い。横向きの箱ひげ図を描くには,vert=Falseを指定すれば良い。

次に,アヤメの種類ごとに箱ひげ図を描いて,萼片長の分布を比較しよう。matplotlibで種類ごとに箱ひげ図を描くには,データをグループに分けてから描く必要がある。groupby()を使うと,より簡潔に書ける。

# 種類ごとにデータをグループ化してリストに変換
data = []
labels = []
for name, group in iris.groupby('species'):
    data.append(group['sepal_length'].values)
    labels.append(name)

# 箱ひげ図を描画
plt.boxplot(data, tick_labels=labels)
plt.ylabel('萼片長')
plt.xlabel('種類')
plt.title('種類別の萼片長の分布')
plt.show()

ここで,iris.groupby('species')は種類ごとにデータをグループ化し,for name, group in ...で各グループを順に取り出す。nameにはグループ名(‘setosa’, ‘versicolor’, ‘virginica’),groupにはそのグループのデータフレームが入る。group['sepal_length'].valuesで,そのグループのsepal_lengthの値をNumPy配列として取得し,dataリストに追加する。labelsリストにはグループ名を追加する。

散布図

次に,変数の間の関係を分析するために,散布図を作成してみよう。ここでは,アヤメの萼片の長さを横軸に,萼片の幅を縦軸にとって,この二変数の関係を表す散布図を作成する。

plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.xlabel('萼片長')
plt.ylabel('萼片幅')
plt.title('萼片の長さと幅の関係')
plt.show()

散布図の場合は,plt.scatter()でx軸の変数とy軸の変数を指定する。あとは,plt.xlabel()plt.ylabel()plt.title()で軸ラベルやタイトルを指定すれば,単純な散布図を描くことができる。

散布図も,アヤメの種類ごとに色分けして描くことができる。色分けを行うには,groupby()を使って種類ごとにデータを分けて,それぞれ異なる色で描画する。

# 種類ごとにデータをグループ化して散布図を描画
for name, group in iris.groupby('species'):
    plt.scatter(
        group['sepal_length'],
        group['sepal_width'],
        label=name,
        alpha=0.7
    )
plt.xlabel('萼片長')
plt.ylabel('萼片幅')
plt.title('萼片の長さと幅の関係')
plt.legend()
plt.show()

label引数で凡例のラベルを指定し,plt.legend()で凡例を表示する。alpha引数で透明度を指定できる。

seabornを使ったグラフ作成

seabornを使うと,matplotlibよりも簡単にきれいなグラフを作成できる。特に,データフレームを直接指定できるため,コードが簡潔になる。

ヒストグラム

seabornでヒストグラムを作成するには,sns.histplot()関数を使う。

sns.histplot(
    data=iris,
    x='sepal_length',
    bins=20,
    color='blue',
    edgecolor='black'
)
plt.xlabel('萼片長')
plt.ylabel('頻度')
plt.title('アヤメの萼片長の分布')
plt.show()

data引数にデータフレームを指定し,x引数に変数名を文字列で指定する。これにより,データフレームから直接変数を指定できる。

箱ひげ図

seabornで箱ひげ図を作成するには,sns.boxplot()関数を使う。seabornboxplot()関数では,x引数にカテゴリ変数を指定すれば,その変数のレベルごとに箱ひげ図を描くことができる。ここでは,speciesを指定して,アヤメの種類ごとに箱ひげ図を描いている。 また,塗り色を分けるには,hue引数を使う。ここでは,speciesを指定して,アヤメの種類ごとに塗り色を分けている。

sns.boxplot(
    data=iris,
    y='sepal_length',
    x='species',
    hue='species'
)
plt.ylabel('萼片長')
plt.xlabel('種類')
plt.title('種類別の萼片長の分布')
plt.show()

散布図

seabornで散布図を作成するには,sns.scatterplot()関数を使う。散布図も,アヤメの種類ごとに色分けして描くことができる。色分けを行うには,hue引数でカテゴリ変数を指定すれば良い。この場合は,speciesによって点の色を変えるので,以下のように書く。

sns.scatterplot(
    data=iris,
    x='sepal_length',
    y='sepal_width',
    hue='species'
)
plt.xlabel('萼片長')
plt.ylabel('萼片幅')
plt.title('萼片の長さと幅の関係')
plt.show()

seabornを使うと,matplotlibよりもコードが簡潔になり,特にカテゴリ変数による色分けなどが簡単にできる。