2019年5月4日土曜日

[Python] matplotlib seaborn によるデータの可視化


可視化のための準備
まずはライブラリを読み込みます.numpyとpandasは計算用で,matplotlibからインポートしたpyplotが描画用です.
>>> import numpy as np
>>> import pandas as pd
>>> from matplotlib import pyplot as plt

折れ線グラフ
インポートしたpyplotで様々なグラフを描くことができます.まずは,折れ線グラフを描いてみます.
まずは,データを用意します.
>>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y = np.array([2, 3, 4, 3, 5, 4, 6, 7, 4, 8])

折れ線グラフを描画して,lineplotという名前で保存してみます.
>>> plt.plot(x, y, color = 'black')
[<matplotlib.lines.Line2D object at 0x11ca6f210>]
>>> plt.title("lineplot matplotlib")
Text(0.5, 1.0, 'lineplot matplotlib')
>>> plt.xlabel("x")
Text(0.5, 0, 'x')
>>> plt.ylabel("y")
Text(0, 0.5, 'y')

>>> plt.savefig("lineplot")

グラフを描くのはplt.plot関数です.x軸,y軸のデータ(アレイやシリーズ)を引数に入れるだけです.また,オプションとして色を指定することができます.
グラフを書いた後に,plt.title()でグラフのタイトルを,plt.xlabel(),  plt.ylabel()でx軸とy軸のラベルを設定しています.また,最後にplt.savefig("ファイル名") でグラフをファイルに保存することができます.

注:これ以降は,入力をREPLで示していますが,実際にはJupyter Notebookで実行していますので,こちらをご参照ください.

seaborn をインポートしてヒストグラムを書くには,
>>> import seaborn as sns
>>> sns.set()
として,先と同じようにグラフを描画する指示を書きます.すると,以下のようなグラフが描かれ,pyplotの時とは見栄えが異なります.
ヒストグラム
pyplotではなく,seabornの関数を用いてヒストグラムを描いてみます(seabornの関数を使っても,中身はpyplotとほぼ同じなので,plt.title などを使ってグラフタイトルを追加するなどのことができます).

まずは,データの準備を行います.
>>> fish_data = np.array([2, 3, 3, 4, 4, 4, 4, 5, 5, 6])
>>> fish_data
array([2, 3, 3, 4, 4, 4, 4, 5, 5, 6])

続けてヒストグラムを描いてみます.
>>> sns.distplot(fish_data, bins = 5, color = 'black', kde = False)

描画にはsns.distplot関数を用いています.bins = 5 と指定することで5つの区間に分割して度数を求めて図示しています.kde = False はカーネル密度推定をしないという指定です.

カーネル密度推定によるヒストグラム平滑化
上記の例では kde = False としてカーネル密度推定をしないという指定をしました.
カーネル密度推定:ヒストグラムの平滑化を行うための1つの方法.
 カーネル密度推定の結果を図示するには,kde = False の指定を無くするだけです.以下では,bins の指定もなくしています.
>>> sns.distplot(fish_data, color = 'black')

上図を見ると,ヒストグラムに対して,滑らかな曲線が描かれています.また,縦軸の値も変わっています.これは,ヒストグラムの面積の合計が1になるように縦軸が自動で調整されているためです(ヒストグラムの面積を確率のようにして,解釈しやすくしている).明示的にこの指定をしたい場合は,norm_hist = True とします.

2変量データに対するヒストグラム
2変量のデータを用いて,ヒストグラムを重ねて描くこともできます.
まずは,2変量のデータ 3-3-2-fish_multi_2.csv* を読み込みます.
>>> fish_multi = pd.read_csv("3-3-2-fish_multi_2.csv")
>>> print(fish_multi)
   species  length
0        A       2
1        A       3
2        A       3
3        A       4
4        A       4
5        A       4
6        A       4
7        A       5
8        A       5
9        A       6
10       B       5
11       B       6
12       B       6
13       B       7
14       B       7
15       B       7
16       B       7
17       B       8
18       B       8
19       B       9

種類(AとB)の統計量を計算してみます.
>>> fish_multi.groupby("species").describe()
        length                                          
         count mean       std  min   25%  50%   75%  max
species                                                 
A         10.0  4.0  1.154701  2.0  3.25  4.0  4.75  6.0
B         10.0  7.0  1.154701  5.0  6.25  7.0  7.75  9.0

種類毎に体長データを取り出して変数に格納します.
>>> length_a = fish_multi.query('species == "A"')["length"]
>>> length_b = fish_multi.query('species == "B"')["length"]
ちなみに,体長データを格納した変数(例えば length_a)の中身は,以下のようになります.
>>> length_a
0    2
1    3
2    3
3    4
4    4
5    4
6    4
7    5
8    5
9    6
Name: length, dtype: int64

ヒストグラムを描く関数を2回連続で実行すると,重ね合わされたヒストグラムを描くことができます.
>>> sns.distplot(length_a, bins = 5, color = 'black', kde = False)
>>> sns.distplot(length_b, bins = 5, color = 'gray', kde = False)
箱髭図
種類別の カテゴリ型の変数 x 数値型の変数 の組み合わせのデータを図示する場合には箱髭図(ボックスプロット)が用いられます.箱髭図を描くには sns.boxplot 関数を用います.
>>> sns.boxplot(x = "species", y = "length", data = fish_multi, color = 'gray')
バイオリンプロット
箱髭図によく似たものとして,バイオリンプロットがあります.これは,箱髭図の「箱」の代わりに,カーネル密度推定の結果をプロットしたものです.バイオリンプロットを行うには,sns.violinplot 関数を用います.
>>> sns.violinplot(x = "species", y = "length", data = fish_multi, color = 'gray')
棒グラフ
棒グラフを描くには,seabornのbarplot関数を用います.関数の名称が変わるだけで,使い方は箱髭図の場合と同じです.
>>> sns.barplot(x = "species", y = "length", data = fish_multi, color = 'gray')
棒グラフの棒の高さは平均値を表しています.上部の黒い線はエラーバーと呼ばれ,信頼区間を表します.

散布図
続いて,数値型の変数 x 数値型の変数 の組み合わせのグラフ(散布図)を描いてみます.
まず,データの読み込みを行います.
>>> cov_data = pd.read_csv("3-2-3-cov.csv")
>>> print(cov_data)
      x   y
0  18.5  34
1  18.7  39
2  19.1  41
3  19.7  38
4  21.5  45
5  21.7  41
6  21.8  52
7  22.0  44
8  23.4  44
9  23.8  49

続いて,描画してみます(以下の例では散布図とヒストグラムを併せた図になります).
>>> sns.jointplot(x = "x", y = "y", data = cov_data, color = 'black')

ペアプロット
多くの変数を持つデータを図示してみます.2つ以上の変数をまとめて図示する場合にはプログラムの記載方法も少し変わります.

データとしては,seaborn に組み込まれているiris(菖蒲)データを用います.iris データは,データ分析のサンプルによく用いられ,菖蒲の種類(species)毎に,ガク(sepal)や花弁(petal)の長さと幅の,カテゴリ型の変数と数値型の変数が混じった5種類の変数が記録されているデータです.
>>> iris = sns.load_dataset("iris")
>>> iris.head(n = 3)
   sepal_length  sepal_width  petal_length  petal_width species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa

データの特徴を見るために,菖蒲の種類別,特徴別の平均値を求めてみます.
>>> iris.groupby("species").mean()
            sepal_length  sepal_width  petal_length  petal_width
species                                                         
setosa             5.006        3.428         1.462        0.246
versicolor         5.936        2.770         4.260        1.326
virginica          6.588        2.974         5.552        2.026
これを図示するには,pairplot関数を用います.
>>> sns.pairplot(iris, hue = "species", palette = 'gray')
pairplot関数は,データフレームのみを指定した場合は散布図を並べて描画されますが,hue = "カテゴリ変数の列名" という指定をすると,カテゴリ別に色分けされたグラフが描画されます.

3-3-2-fish_multi_2.csv の中身
species,length
A,2
A,3
A,3
A,4
A,4
A,4
A,4
A,5
A,5
A,6
B,5
B,6
B,6
B,7
B,7
B,7
B,7
B,8
B,8
B,9



0 件のコメント :

コメントを投稿