ケース別データの可視化パターンとpythonによる実装
データが与えられた時、まずは可視化してデータの特徴を把握することが大切です。しかし、何を軸にしてどのように可視化するのかということに関しては、あまりルール化されていないのが現状だと思います。
データから何を知りたいのか?ということから、パターン別にどのように可視化したらいいのかということをチートシート形式で示し、さらにpythonでの可視化方法を順に紹介していきたいと思います。
上のチートシートを参考に、
- Distribution|分布
- Composition|構成
- Relationship|関係
- Comparison|比較
の4つの項目に分けて、どのようなデータパターンではどのように可視化するとわかりやすいか、pythonではどのように実装するのかを記していきます。
準備
import matplotlib.pyplot as plt import pandas as pd import numpy as np import seaborn as sns plt.style.use('ggplot') plt.rcParams.update({'font.size':15}) %matplotlib inline
可視化には主に、matplotlib.pyplot
、seaborn
を使います。seabornに馴染みのない方は、この記事を見るといいと思います。
Distribution|分布
1変数の分布
データポイントが数個の場合|ヒストグラム
x = np.random.normal(size = 1000) plt.hist(x) plt.show()
データポイントが多い場合|線グラフヒストグラム
x = np.random.normal(size = 1000) # ここのみ、seabornを用いて可視化 sns.distplot(x)
2変数の分布|散布図
x = range(1, 101) y = np.random.randn(100)*15 + range(1, 101) plt.scatter(x, y) plt.show()
Composition|構成
時間ごとの構成
時間軸が複数個の場合
割合のみを見たい場合|累積棒グラフ
x = [1, 2, 3, 4, 5] y1 = [80, 60, 40, 20, 5] y2 = [20, 40, 60, 80, 95] plt.bar(x, y1) plt.bar(x, y2, bottom=y1)
割合と値を両方見たい場合|棒グラフ
x = [1, 2, 3, 4, 5] y1 = [100, 200, 300, 400, 500] y2 = [1000, 800, 600, 400, 200] plt.bar(x, y1) plt.bar(x, y2, bottom=y1)
時間軸が多い場合
割合のみを見たい場合|累積エリアチャート
x = range(1, 7) y1 = [0, 20, 40, 30, 40, 100] y2 = [40, 50, 20, 40, 55, 0] y3 = [60, 30, 40, 30, 5, 0] plt.stackplot(x, y1, y2, y3) plt.show()
割合と値自体を両方見たい場合|エリアチャート
x=range(1, 7) y1=[1, 4, 6, 8, 9, 3] y2=[2, 2, 7, 10, 12, 10] y3=[2, 8, 5, 10, 6, 8] plt.stackplot(x,y1, y2, y3) plt.show()
静的カテゴリごとの構成
全体に占める割合を見たい場合|円グラフ
x = [100, 200, 300, 400, 500] label = ["A", "B", "C", "D", "E"] plt.pie(x, labels=label) plt.axis('equal') # 出力が楕円形になるのを防ぐため plt.show()
構成の構成を見たい場合|累積棒グラフ
x = [1, 2, 3, 4, 5] y1 = [80, 60, 40, 20, 5] y2 = [20, 40, 60, 80, 95] plt.bar(x, y1) plt.bar(x, y2, bottom=y1)
全体に対する累積値と値自体を見たい場合|ツリーマップ
import squarify x = [13,22,35,5] label = ["A", "B", "C", "D"] squarify.plot(x, label=label) plt.axis('off') plt.show()
Relationship|関係
変数が2つの場合|散布図
x = range(1, 101) y = np.random.randn(100)*15 + range(1, 101) plt.scatter(x, y) plt.show()
変数が3つの場合|散布図
x = np.random.rand(40) y = np.random.rand(40) z = np.random.rand(40) plt.scatter(x, y, s=z*1000, alpha=0.5) plt.show()
Comparison|比較
アイテム間の比較
アイテムごとの1変数を比較したい場合
カテゴリが少ない場合|縦棒グラフ・横棒グラフ
x = [1, 2, 3, 4, 5] y = [80, 60, 40, 20, 5] plt.bar(x, y) plt.show()
x = [1, 2, 3, 4, 5] y = [80, 60, 40, 20, 5] plt.barh(x, y) plt.show()
カテゴリが多い場合
iris = sns.load_dataset("iris") sns.pairplot(iris, hue="species", size=2.5)
アイテムごとの2変数を比較したい場合|棒グラフ
y = [3, 12, 5, 18, 45] x = ('A', 'B', 'C', 'D', 'E') x_width = [0.1, 0.2, 3, 1.5, 0.3] y_pos = [0, 0.3, 2, 4.5, 5.5] plt.bar(y_pos, y, width=x_width) plt.xticks(y_pos, x) plt.show()
時間軸による比較
時間軸が少ない場合
カテゴリが1つもしくは数個の場合|棒グラフ
x = [1, 2, 3, 4, 5] y = [80, 60, 40, 20, 5] plt.bar(x, y) plt.show()
カテゴリが多い場合|線グラフ
x = range(1,11) y1 = np.random.randn(10) y2 = np.random.randn(10)+range(1,11) y3 = np.random.randn(10)+range(11,21) plt.plot(x, y1) plt.plot(x, y2) plt.plot(x, y3) plt.show()
時間軸が多い場合
非循環データの場合|線グラフ
y = np.cumsum(np.random.randn(1000,1)) plt.plot(y)