見出し画像

AI 実装検定への道(8)

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

前回投稿が7回目で、引き続きGoogle Colaboratoryを利用してプログラミングの章を進めて書いていて、227ページの途中まで進みました。
(10ページしか進めなかったので、今回はもう少し進みたい・・・)

第7回目では、多次元の配列(行列)について合計(sum)、最大(max)、最小(min)を求めたり、それを「axis」を使って列ごと(縦方向)であったり、行ごと(横方向)に抜き出してみたり。「mask」を使って条件に合致した判別と「mean」による平均値算出。最後に「NumPy」のような拡張ライブラリのひとつである「pandas」を使って表形式に文字を並べ、そこからデータを選択するというところまで進めました。

今回も引き続き、「Series」についてアレンジを勉強していきます。
またいつものように、NumPyとpandasを呼び出しておきます。

(コード記述)
import numpy as np
import pandas as pd

[2,5,1,3,0,7]のような要素を持つ配列(行列)をpandasのSeriesに渡すと、番号が追加 Indexとペアで値を出力します。

(コード記述)
pd.Series ([2,5,1,3,0,7])

(結果)
0 2 1 5 2 1 3 3 4 0 5 7 dtype: int64

次の例は、Indexに対して任意の複数候補を記述し、それぞれに同じ7という値を割り当てた例を記述します。

(コード記述)
pd.Series(7, index=[125,138,269])

(結果)
125 7 138 7 269 7 dtype: int64

公式テキストにわかりやすく説明されています。
辞書機能
上記のようにIndexに割り当てたのを名前(key)と配列(行列)の値(value)をペアにしてデータを格納する方法。確かに、こう説明されると理解しやすいです。私たちが、パソコンなので短縮入力したい時、例えば・・・私の名前「前田雅之」を全部入力するのではなく「ま」と入力したら「前田雅之」と入力させる独自辞書・・・ちょうど「ま」が名前(key)であり、「前田雅之」が配列(行列)の値(value)というペアになっています。

次に簡単に3つのワードで辞書を作ってみます。
3、4、2をIndexに割り当てたのを名前(key)とし、それに対する配列(行列)の値(value)を愛知、名古屋、熱田としてみます。

(コード記述)
pd.Series({3:"愛知",4:"名古屋",2:"熱田"})

(結果)
3 愛知 4 名古屋 2 熱田 dtype: object

これに対して、Indexに指定していない1を加えて、1、2、3と指定してみます。

(コード記述)
pd.Series({3:"愛知",4:"名古屋",2:"熱田"},index=[1,2,3])

(結果)
1 NaN 2 熱田 3 愛知 dtype: object

Indexに指定していない1の部分には『NaN』と表示されました。
NaN(Not a Number)という意味だそうで、非数として欠損していること欠損値を表すとのことです。

これまでのSeriesは、pandasの中で一次元データで1列を表す機能でしたが、次にDataFrameを使って2次元のデータを扱っていきます。また、Seriesのデータとして中間考査(midscore)、期末考査(endscore)を準備して次に進みます。

(コード記述)
midscore=pd.Series({"国語":85,"算数":95,"理科":90,"社会":75,"英語":65})
midscore

(結果)
国語 85 算数 95 理科 90 社会 75 英語 65 dtype: int64

これは、前回勉強した「score」と似ています。
(同じ点数を設定しています。)

(コード記述)
score=pd.Series({"国語":85,"算数":95,"理科":90,"社会":75,"英語":65})
score

(結果)
国語 85 算数 95 理科 90 社会 75 英語 65 dtype: int64

結果は同じに見えますが、どのように変わっていくでしょうか?
期末考査(endscore)には、少しいい点数を設定しておきます。(笑)

(コード記述)
endscore=pd.Series({"国語":87,"算数":98,"理科":95,"社会":85,"英語":82})
endscore

(結果)
国語 87 算数 98 理科 95 社会 85 英語 82 dtype: int64

これで、中間考査(midscore)、期末考査(endscore)を準備ができました。これを2次元の1つのDataFrameに格納するわけですが・・・

(コード記述)
score=pd.DataFrame({"中間":midscore,"期末":endoscore})
score

おっと、ここで、下記のようなエラーが表示されました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
NameError Traceback (most recent call last)
<ipython-input-10-922a9e0caff0> in <module>
----> 1 score=pd.DataFrame({"中間":midscore,"期末":endoscore})
2 score

NameError: name 'endoscore' is not defined

『endoscore』なんて、ありませんよ!的なアラートです。
endscore・・・「o」が一つ余分でした。

(コード記述)
score=pd.DataFrame({"中間":midscore,"期末":endscore})
score

(結果)
中間 期末
国語 85 87
算数 95 98
理科 90 95
社会 75 85
英語 65 82

おっと、なんだかちゃんとした表のように表されました。
これは、DataFrameについては、今利用している「Google Colaboratory」の機能において、表形式にまとめて見易いようにしてくれるんだそうです。

これだけでも十分見易いのですが、「Google Colaboratory」において下記の鉛筆(あるいはチョーク?)のようなマークをクリックすると・・・

鉛筆マークをクリックすると・・・
こんなふうに表形式に・・・

ま、数値が2列しかないので、こんな感じですが、もっとたくさんになるとExcelで見るような表になりそうです。で、さらに右上の「Filter」をクリックすると下記のように、下記のように詳細条件でデータ抽出されるんだそう。これは便利ですね。

Filterをクリックすると、詳細条件で絞り込みができる。

学級の中で、生徒の指名付きで分類して、次の指導に役立てるとか出来そうですね。では、もう一つデータを追加しておきましょう。endscore2 として再試験後のデータ・・・(嫌な響きだけど)を加えます。

(コード記述)
endscore2=pd.Series({"国語":92,"算数":98,"理科":97,"社会":90,"英語":92})
endscore2

(結果)
国語 92 算数 98 理科 97 社会 90 英語 92 dtype: int64

これも含めてDataFrameにまとめます。

(コード記述)
score=pd.DataFrame({"中間":midscore,"期末":endscore},"再試":endscore2})
score

(結果)
中間 期末 再試
国語 85 87 92
算数 95 98 98
理科 90 95 97
社会 75 85 90
英語 65 82 92

鉛筆マークをクリックすると・・・

3列データで表らしくなってきた

こんなふうに、pandasのDataFrameを利用して、Excelのようにデータを扱えることがわかってきました。一方、pandasではSeriesのIndexが各データの値(value)にアクセスするための手段(紐付けというか・・・)として用意されましたが、DataFrameにもIndexが準備されています。

ま、表形式に表すと、国語の上に「Index」と表示されているので、わかるようなものですが、ここで「Index」を読み込んでみましょう。

(コード記述)
score.index

(結果)
Index(['国語', '算数', '理科', '社会', '英語'], dtype='object')

次に列のタイトル(columns)を読み込んでみます。

(コード記述)
score.columns

(結果)
Index(['中間', '期末', '再試'], dtype='object')

自身が指定した通りにちゃんと返してくれます。

このDataFrameには、中間考査(midscore)、期末考査(endscore)ならびに期末後の再試験のデータがまとめて保持されています。DataFrameは2次元のデータであり列のタイトル(columns)には考査(中間、期末、再試)と、行のタイトル(Index) には国語, 算数, 理科, 社会, 英語の教科が格納されていました。

また、別の見方をすると、中間、期末、再試の3つのSeriesで構成されているとも言え、それぞれのSeriesを呼び出すことも可能です。

(コード記述)
score["再試"]

(結果)
国語 92 算数 98 理科 97 社会 90 英語 92 Name: 再試, dtype: int64

今回は短いですが、ここまでにします。
前回から引き続き「NumPy」のような拡張ライブラリのひとつである「pandas」を使って表形式に並べていくことを勉強しました。「Series」を使って各格納データを整理し、「score」を使って「Series」を定義づけるのだが、同時に「midscore」「endscore」なるものを生成しておいて「DataFrame」でExcelのような表形式に表現できました。「Google Colaboratory」の機能において、DataFrameについては表形式にまとめて見易いようにしてくれるそうです。
(今回は、間違い2回含めて15本)

次回は、234ページから進めていきます。


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