kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

『Pythonからはじめる数学入門』2章 データをグラフで可視化する

Pythonからはじめる数学入門』

2章 データをグラフで可視化する

の解説です。 www.oreilly.co.jp

f:id:kaeken:20171201232820p:plain 機械学習で数値データを提示する際には、

グラフを用いることが多いです。

今回は、

Pythonでグラフを使う方法についてご説明します。

2章 データをグラフで可視化する

2.1 デカルト座標平面を理解する

デカルト座標平面とは、いわゆるx-y平面のことです。

高校数学で出てくるので、用語のみ記載します。

座標coordinates
原点origin
集合set
プロットplot
グラフgraph

2.2 リストとタプルの操作

リスト:可変的な要素のかたまり(あとで変更できる)

タプル:固定された要素のかたまり(あとで変更できない)

2.2.1 リストやタプルで繰り返す

リストやタプルはfor文で繰り返すことができます。

>>> list = [1,2,3]

>>> for item in list:
...     print(item)
...
1
2
3

>>> for index, item in enumerate(list):
...     print(index, item)
...
(0, 1)
(1, 2)
(2, 3)

2.3 matplotlibでグラフを作る

matplotlibは、Pythonのグラフ描画パッケージです。

インストール方法は、次のコマンドでインストールするか、 別途「matplotlib インストール」などで検索してみてください。

pip install matplotlib

さっそく以下のコードを打ち込んでいきますが、

#点(1,2), (2,4), (3,6)をプロット
x = [1,2,3]
y = [2,4,6]

from pylab import plot, show
plot(x, y)
show()

以下は、説明でにグラフ描画を表示するため、 コマンドラインではなく、 Jupyter Notebookを使って実行していきます。

上記の実行結果です。 f:id:kaeken:20171201221735p:plain

2.3.1 グラフで点を作る

プロットを明示する場合です。

plot(x, y, marker='o')

実行結果です。 f:id:kaeken:20171201222133p:plain

マーカーのみ表示する場合は、以下のように記載します。

plot(x, y, 'o')

f:id:kaeken:20171201222458p:plain

2.3.2 ニューヨーク市の年間平均気温をグラフ化する

複数のプロットをしていけば、データの傾向をつかめます。

nyc_temp=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4,57.3]
plot(nyc_temp, marker='o')

f:id:kaeken:20171201222912p:plain

x軸に年など特定の値を設定する方法です。

years = range(2000,2013)
plot(years, nyc_temp, marker='o')

f:id:kaeken:20171201223134p:plain

2.3.3 ニューヨーク市の月間気温傾向を比較する

複数のグラフを重ね合わせる方法です。

#データはダミー
y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

f:id:kaeken:20171201224222p:plain legend()で、凡例の指定ができます。

細かい引数の指定方法は、以下を参照してください。

legend and legend_handler — Matplotlib 2.1.0 documentation

2.3.4 グラフのカスタマイズ

タイトル、X軸名、Y軸名など、

他にカスタマイズする方法は、以下のとおりです。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
#title
title('matplotlib title')

#xlabel
xlabel('Month')

#ylabel
ylabel('Temp')

f:id:kaeken:20171201225039p:plain

また、

axis()によって、軸の最小値、最大値を指定できます。

Y軸の最小値を0にした場合です。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
title('matplotlib title')
xlabel('Month')
ylabel('Temp')

from pylab import axis
axis(ymin=0)

f:id:kaeken:20171201232626p:plain

また、

X軸の最小値・最大値、Y軸の最小値・最大値を以下の通り指定できます。

y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4]
y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1]
y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4]
months = range(1,13)
plot(months, y2000, months, y2006, months, y2012, marker='o')

from pylab import legend
legend([2000,2006,2012])

from pylab import title, xlabel, ylabel
title('matplotlib title')
xlabel('Month')
ylabel('Temp')

from pylab import axis
axis([0,13,0,100])

f:id:kaeken:20171201232820p:plain

最後に、対話シェルではなく、プログラムの一部として、グラフを使う場合は、

pylabではなくpyplotを使います。

import matplotlib.pyplot as plt
def create_graph():
    x  = [1,2,3]
    y = [2,4,6]
    plt.plot(x,y)

if __name__ == '__main__':
  create_graph()

f:id:kaeken:20171201233326p:plain

2.3.5 プロットの保存

グラフを保存するには、savefig()を使います。

from pylab import plot,savefig
x = [1,2,3]
y = [2,4,6]
plot(x,y)
savefig('mygraph.png')

2.4 式をプロットする

今までのご説明は、

すでにプロットするデータがあった場合ですが、

数式からプロットする方法があります。

2.4.1 ニュートン万有引力の法則

詳細説明は省略しますが、イメージとして以下のようなグラフを描画できます。

import matplotlib.pyplot as plt

def draw_graph(x,y):
  plt.plot(x, y, marker='o')
  plt.xlabel('Distance in meters')
  plt.ylabel('Gravitational force in newtons')
  plt.title('Gravitational force and distance')
  plt.show()

def generate_F_r():
  r = range(100, 1001, 50)
  F = []
  G = 6.674*(10**-11)
  m1 = 0.5
  m2 = 1.5
  for dist in r:
    force = G*(m1*m2)/(dist**2)
    F.append(force)
  draw_graph(r, F)

if __name__=='__main__':
  generate_F_r()

f:id:kaeken:20171201234548p:plain

2.4.2 投射運動

以上、

Pythonからはじめる数学入門』2章 データをグラフで可視化する

の解説でした。