見出し画像

AI 実装検定への道(13)

AI 実装検定 A級合格へ向けて学習を進めています。

前回投稿が12回目で、引き続きGoogle Colaboratoryを利用してプログラミングの章を進めて書いています。(12)の公開が3/25だったので丸っと1ヶ月空いたことになる。ちょっと、この1ヶ月は目まぐるしく手がつかなかったが、また再開。

前回は公式テキスト256ページの下段から再開し、「merge」によるデータのまとめ方、「merge」に対して因数指定「how=」を利用して、『inner』『outer』『left』『right』の連結方法を勉強し、DataFrameの「集約」と「グループ化」に進み。『Series』の各値を合計する「sum関数」(Excelではお馴染みですね)と平均を求める「mean関数」を経験したのちに、『DataFrame』についても確認。最後には、『pandas』における「平均値(mean)」や「標準偏差(std)」などデータの前処理を行う際に用いる値をまとめて表示する「describe関数」について「iris」のサンプルデータを用いて動作確認し、列ごとに最小値、中央値、最大値を求める「aggregate」関数にまで進みました。

今回は、第22講。公式テキスト267ページから『Matplotlibでグラフの可視化』へ進んでいきます。データの可視化を行うライブラリ「Matplotlib」を体験します。「Matplotlib」を用いるとさまざまな数値データを可視化することができ、折れ線グラフ、ヒストグラム、密度分布、3次元グラフや散布図などが容易に・・・(簡単じゃないんだろうけど)・・・作成できるそうです。

公式テキストには、これまでを利用してきたアヤメの花のデータセットを用いて散布図にすることで傾向を見ると解説されています。Excelのようにグラフで可視化するだけでなく、画像データに様々な加工も出来るそうです。また、「Matplotlib」と併せて「seaborn」ライブラリもよく用いられるそうです。「seaborn」は統計データや観測データの可視化に特化したライブラリと解説されています。「Matplotlib」と「seaborn」それぞれに特徴があるようですが、公式テキストではシンプルなグラフや日常遣いに「Matplotlib」、綺麗なグラフを用意して資料作成するには「seaborn」が有効と解説下さっています。

では、具体的に利用していきます。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

plt.plot ([0,1,2,3],[2,0,3,1])

(結果)

ちょっと数値を変えてやってみましょう。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

plt.plot ([0,0.5,1,1.5,2,2.5,3],[5,1,2.5,0,4,2,3])

(結果)

このように、折れ線グラフを書くためには「Matplotlib」にある「plot」関数を利用するために、コード記述ではまず「Matplotlib」を「matplotlib.pyplot」として読み込む必要があり、これを慣例として「plt」と略きして読み込むのだそうです。その後、plt.plot として[X軸の数値]と[Y軸の数値]をプロットしたいだけ用意する・・・という感じですね。

あら、「Matplotlib」では、グラフの色を変えることができるようです。
X軸とY軸の指定の後に、color="red"と入れてみましょう。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

plt.plot ([0,0.5,1,1.5,2,2.5,3],[5,1,2.5,0,4,2,3], color="red")

(結果)

赤色の線にできました!

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.cos(x), color="black")

(結果)

cosのグラフを黒い線で表した

この辺疎いんだよな・・・数学の微分・積分は苦手だった・・・

上記グラフは、cosのグラフ。
このように滑らかなグラフを描くには、Numpyにあるlinspace関数を使ってXの値を細かくして「y=cos(x)」の値はNumpyのcos関数「np.cos(x)」を使って描けるのだそうです。

紫にも出来るぞ!(どうでもいいけど)

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.cos(x), color="purple")

(結果)

紫のラインになった!

次に、グラフのラインのスタイルを変更します。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.cos(x), color="purple", linestyle="-.")

(公式テキストに物申す!!「,」(カンマ)と「.」(ピリオド)の区別が紙面じゃ良く分からなくなるぞ!なんとかしてくれ〜・・・って、これ慣れた人なら、ここは「,」じゃなくて「.」って分かるんだろうけど、初心者にはムズイ!)

(結果)

紫で一点破線のグラフになった!

試しに、「linestyle」の部分にもう一つ「.」を加えて、下記のように実行してみました。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.cos(x), color="purple", linestyle="-..")

(結果)
すると結果は、下記のようにエラーになりました。
ValueError: '-..' is not a valid value for ls; supported values are '-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'

ってことは、「-..」って指定はできないけど、'-', '--', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted'ってのが出来るようですね。

やってみましょう〜!

(結果)'-'と'solid'は、ノーマルな実線。

'-'と'solid'は、実線

(結果)'--'と'dashed'は、破線。

'--'と'dashed'は、破線

(結果)':'と'dotted'とすると、より細かな破線

':'と'dotted'とすると、より細かな破線

(結果)'None', ' ', '',とすると、線が消えちゃった!

'None', ' ', '',とすると、線が消えた

(結果)'dashdot'は、'-.'と同じく一点破線

'dashdot'は、'-.'と同じく一点破線

次は、cosグラフからsinグラフに変えて、さらにはプロットのマーカーを指定してみます。

(結果)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.sin(x), color="purple", marker="o", linestyle=" ")

(結果)

美しいグラフができた!

これに、ラインも加えられるのか?
カラーはグリーンにしてみよう!

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0, 10, 100)
plt.plot (x, np.sin(x), color="green", marker="o", linestyle="-")

(結果)

美しい〜!

これ、マーカーを丸にしたい時に、このように小文字のオー"o"を記述したけど、ラインの記述のように色々出来るんだろうか?試しに、四角を表す英語「square」と入れてみたらエラーになった。

(結果)"x"ってすると面白くないけど・・・

(結果)ダイスの意味で"d"は?

ダイヤの"d"か!菱形でプロット。

(結果)では「square」の"s"では?

当り!四角でプロットしたい時は、「square」の"s"

公式テキストでは、基本的に散布図は「plot」関数、複雑な散布図は「scatter」関数を利用するとあります。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

plt.scatter(
np.random.randn(100),
np.random.randn(100),
c=np.random.randn(100),
s=np.random.randn(100)*200,
alpha=0.5
)

(結果)
/usr/local/lib/python3.10/dist-packages/matplotlib/collections.py:963: RuntimeWarning: invalid value encountered in sqrt
scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor

美しいけれど、意味は分かりません・・・

scatter関数では、各ポイントにおける丸の「大きさ」と「色」を変更すること、ならびに「alpha=0.5」との指定で透明度まで記述することが出来るようです。本件は、ランダムな数値を用いているので、同じ結果を得られませんが、「alpha=0.5」の部分を触ってみます。

(結果)「alpha=0.3」とすると・・・薄くなった

(結果)「alpha=0.8」とすると、濃くなった。

(結果)「alpha=1.5」とするとエラー。
ValueError: alpha (1.5) is outside 0-1 rangeとエラーが表示されたので、0〜1までで指定せねばならないことが分かりました。

次は、密度の可視化です。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y-np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contour(X, Y, f(X, Y)

(結果)おっちょこちょいなので、時々エラーになります。
plt.contour(X, Y, f(X, Y)
^
これ、もうちょっと優しく教えてくれないかな・・・もう一つカッコ忘れてまっせ!的な・・・

(コード記述)import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y-np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contour(X, Y, f(X, Y))

(結果)最後は二重カッコ「))」にして・・・またエラー!
6
7 x=np.linspace(0,5,50)
----> 8 y-np.linspace(0,5,40)  ←(ここ、Y=になってないよ〜!)
9
10 X, Y=np.meshgrid(x,y)

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y=np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contour(X, Y, f(X, Y))

(結果)やっと出来た!

これも美しい〜

このコードも理解しようとしたら、結構難しい。
公式テキストによると、この当高線のような密度をの図を描くためには、「contour」関数を使います。1つ目の因数をx、2つ目の因数をyとし、それぞれx方向とy方向を表し、これに密度の分布を示すもう一つの因数を設定するのだそうです。

「contour」に「f」をつけた「contourf」関数を用いると下記のように濃淡で描いてくれます。

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y=np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contourf(X, Y, f(X, Y), 20, cmap="RdGy")

(結果)

これも美しい!

これ、「cmap="RdGy"」ってところ、RedとGrayって意味なのかな?
グリーンとブルーに置き換えるのに、"GrBl"だとどうなるだろう?

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y=np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contourf(X, Y, f(X, Y), 20, cmap="GrBl")

(結果)おっとこれではダメらしい。
エラー内容を見ると・・・長いけど・・・"GnBu"みたいですね。

ValueError: 'GrBl' is not a valid value for cmap;
supported values are 'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean', 'oce...

(コード記述)
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
return np.cos(x)**10+np.sin(10+y*x)*np.sin(x)

x=np.linspace(0,5,50)
y=np.linspace(0,5,40)

X, Y=np.meshgrid(x,y)
plt.contourf(X, Y, f(X, Y), 20, cmap="GnBu")

(結果)

これも綺麗!

今回はここまでにします。
今回は、第22講公式テキスト267ページから『Matplotlibでグラフの可視化』へ突入し277ページまで進みました。グラフのラインを変えたり、プロットの図形を変えてみたり、さらにはカラーも変えられたり、若干お遊び要素も体験しつつ、進めてきました。

データの可視化を行うライブラリ「Matplotlib」を用いることにより、折れ線グラフ、密度分布や散布図などを作成しました。「plot」関数、linspace関数、それに「linestyle」でラインを変化させたり、scatter関数では「alpha=」を用いて透明度を変化させたり、当高線を表す「contour」と「contourf」関数も勉強しました。

次回は公式テキスト278ページ『ヒストグラム』へ進みます。

以上


この記事が気に入ったらサポートをしてみませんか?