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' # または利用可能な日本語フォント名グラフの作成
データを概観するためには,記述統計量を求めるとともに,グラフを作成して視覚的にデータの特性を捉えることも重要である。一変数の分布を概観するにはヒストグラムや箱ひげ図,変数間の関係を概観するには散布図を描いてみるのが有効。
Pythonでは,matplotlibやseabornというパッケージを用いればモダンなグラフを作成することができる。matplotlibは基本的なグラフ作成ライブラリで,seabornはmatplotlibをベースにしたより高機能なライブラリである。
また,練習用データとして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()関数を使う。seabornのboxplot()関数では,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よりもコードが簡潔になり,特にカテゴリ変数による色分けなどが簡単にできる。