
AI 実装検定への道(12)
AI 実装検定 A級合格へ向けて学習を進めています。
前回投稿が11回目で、引き続きGoogle Colaboratoryを利用してプログラミングの章を進めて書いています。
前回は、その前の回から1か月長怠けてしまっていたので、改めてGoogle Colaboratoryの環境に触れ、「Series」「DataFrame」について「concact」関数を使った連結をしたり、「append」関数についても勉強しました。久々の勉強だったので、少ししか進みませんでしたが、今回は、公式テキスト256ページの下段から再開します。「merge」を使って横方向の連結を学んでいきます。
「merge」を使った横方向の連結
まずは、最初にDF1とDF2を作成します。
公式テキスト通りに、従業員の名前と所属を表す情報を「DF1」、入社年を表す情報を「DF2」として整備します。
(コード記述)
DF1=pd.DataFrame({"employee":["James","John","Maria","Robert"],"group":["HR","Accounting","Engineering","Engineering"]})
DF1
(結果)

(コード記述)
DF2=pd.DataFrame({"employee":["Maria","James","John","Robert"],"hire_date":["2010","2014","2018","2020"]})
DF2
(結果)

上記の「DF1」と「DF2」を、「merge」を使って横に連結します。
(コード記述)
DF3=pd.merge(DF1,DF2)
DF3
(結果)

「merge」を利用すると、ここでは名前を軸に揃えることが出来ました。
そんなに便利なものということなのでしょうか?
次に各所属の上司情報を「DF4」に整理します。
(コード記述)
DF4=pd.DataFrame({"group":["HR","Accounting","Engineering"],"supervisor":["Susan","Mary","david"]})
DF4
(結果)

このDF4を、先のDF3に「merge」します。
(コード記述)
DF5=pd.merge(DF3,DF4)
DF5
(結果)

次に、所属部門におけるスキルを「DF6」に整理します。
(コード記述)
DF6=pd.DataFrame({"group":["HR","HR","Accounting","Accounting","Engineering","Engineering"],"skills":["spreadsheet","organization","Math","spreadsheet","coding","linux"]})
DF6
(結果)

この情報「DF6」をその前の「DF5」に「merge」してみます。
(コード記述)
DF7=pd.merge(DF5,DF6)
DF7
(結果)

「merge」は、項目を指定して、それを軸に「merge」するということもできるそうです。
今一度「DF1」と「DF2」についてみてみましょう。
(コード記述)
DF3=pd.merge(DF1,DF2)
DF3
(結果)

次は、DF8として「employee」を軸として「merge」してみましょう。
(コード記述)
DF8=pd.merge(DF1,DF2, on="employee")
DF8
(結果)

同じ結果になりました。
では、
DF9として「group」を軸として「merge」してみると・・・
(コード記述)
DF9=pd.merge(DF1,DF2, on="group")
DF9
(結果)

ちょっと、良く分からないエラーになってしまいました。
DF5とDF6について、「group」を軸に「merge」してみます。
(コード記述)
DF10=pd.merge(DF5,DF6, on="group")
DF10
(結果)

う〜ん、これも前の結果と同じになってしまう・・・
ちょっと、分からないので、次に進みますね。
新しいDataFrameとして「DF11」と「DF12」を用意します。
(これ、英語の入力が面倒なんだけど・・・)
(コード記述)
DF11=pd.DataFrame({"name":["Peter","Paul","Mary"],
"food":["fish","beans","bread"]},
columns=["name","food"])
DF11
(結果)

(コード記述)
DF12=pd.DataFrame({"name":["Mary","Josegph"],
"drink":["wine","beer"]},
columns=["name","drink"])
DF12
(結果)

ここで、「DF11」と「DF12」について「merge」します。
(コード記述)
pd.merge(DF11,DF12)
(結果)

公式テキスト261ページの説明でようやく掴めてきました。
普通に「merge」すると『inner』という方法で、共通部分が整理されるわけで、それ以外に『outer』『left』『right』の連結方法があるそうです。この因数の指定は「how=」を利用します。
(コード記述)
pd.merge(DF11,DF12,how="outer")
(結果)

ここで、理解しておかねばならないのは、『outer』で指定した場合、値がない場所には「NaN」(非数)が表示されるということです。一応、試しに『left』と『right』についてもやってみます。
(コード記述)
pd.merge(DF11,DF12,how="left")
(結果)

(コード記述)
pd.merge(DF11,DF12,how="right")
(結果)

『left』とした場合、foodで共通点を見出して抽出されました。一方、『right』とした場合にはdrinkでの共通点という解説になるのだろうか?左方向、右方向という説明が現段階ではできないけど、出てきた情報だけ残しておきます。
その説明が、公式テキスト262ページの最初にありました。

こんな感じに理解したらいいのかな?『outer』で全抽出されたデータに対して、左側の列(ここでは、food)について抽出されたので、そこに情報のない「Josegph」は省略されてしまった。そして右側の列(ここでは、drink)に抽出されたのが下のような場合。こうして、『left』と『right』の違いが理解できたとしておきます。

次に、DataFrameの「集約」と「グループ化」について勉強します。
まずは、ランダムな値が5つ入った『Series』を用意します。
(コード記述)
ser=pd.Series(np.random.rand(5))
ser
(結果)

『Series』の各値の合計を、「sum関数」を使って求めます。
(コード記述)ser.sum()
(結果)3.585907191453766
『Series』の各値の平均を求める場合は、「mean関数」を使います。
(コード記述)ser.mean()
(結果)0.7171814382907532
『DataFrame』についても、同じように平均値を表示することができます。
(コード記述)
DF15=pd.DataFrame({"A":np.random.rand(5),"B":np.random.rand(5)})
DF15
(結果)

DF15.mean( )として、A列の平均とB列の平均を表します。
(コード記述)DF15.mean()
(結果)

「axis」で「columns」を指定すると、各行の平均値を示します。
(コード記述)DF15.mean(axis="columns")
(結果)

ちょっとややこしくなってきそうですが、第21講はあと3ページなので、続けます。
このほかに、『pandas』には「平均値(mean)」や「標準偏差(std)」などデータの前処理を行う際に用いる値をまとめて表示する「describe関数」が用意されているそうです。「iris」のサンプルデータを用いて
「describe関数」の動作を確認していきます。
まずは、「iris」のサンプルデータセットを読み込んで『pandas』形式に置き換え、それに対して「describe関数」を用いて統計的な情報整理をしていきます。
(コード記述)
import pandas as pd
from sklearn import datasets
iris=datasets.load_iris()
DF20=pd.DataFrame(iris.data, columns=iris.feature_names)
DF20.describe()
(結果)

次にグループ化を見ていきます。
グループ化は同じものを合体させる処理です。
(コード記述)
DF21=pd.DataFrame({"key":["A","B","C","A","B","C"],
"data":range(6)},
columns=["key","data"])
DF21
(結果)

このDataFrameにおいて、key列のA、B、Cについて、まとめます。
(コード記述)
DF21.groupby("key")
(結果)<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f677d0c88b0>
これで出来ているのかどうか不安ですが・・・
(コード記述)
DF21.groupby("key").sum()
(結果)

確かに、先に表示されたものが合計されています。
(あれ?「iris」のサンプルデータは使わないのか??)
ほかに、列ごとに最小値、中央値、最大値を求める「aggregate」関数があります。(「aggregate」とは集計という意味)
今一度、DataFrameを用意していきましょう。
(コード記述)
DF22=pd.DataFrame({"key":["A","B","C","A","B","C"],
"data1":range(6),
"data2":np.random.randint(0,10,6)},
columns=["key","data1","data2"])
DF22
(結果)

A、B、Cをグループ化します。
(コード記述)DF22.groupby("key")
(結果)<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f677d0c8280>
今回も出来ているか不安ですが・・・次に「aggregate」関数を使ってみます。
(コード記述)
DF22.groupby("key").aggregate(["min",np.median,max])
(結果)

ちょっと一抹の不安が残る。
折角、「iris」のサンプルデータを読み込んだのに統計処理に利用しなかったのか?それとも、あれで一気にサンプルデータを「describe関数」を使って処理したということだったのかな・・・
兎に角、今回は公式テキスト256ページの下段から再開し、「merge」によるデータのまとめ方、「merge」に対して因数指定「how=」を利用して、『inner』『outer』『left』『right』の連結方法を勉強し、DataFrameの「集約」と「グループ化」に進み。『Series』の各値を合計する「sum関数」(Excelではお馴染みですね)と平均を求める「mean関数」を経験したのちに、『DataFrame』についても確認。最後には、『pandas』における「平均値(mean)」や「標準偏差(std)」などデータの前処理を行う際に用いる値をまとめて表示する「describe関数」について「iris」のサンプルデータを用いて動作確認し、列ごとに最小値、中央値、最大値を求める「aggregate」関数にまで進みました。
次回は、第22講。公式テキスト267ページから『Matplotlibでグラフの可視化』へ進んでいきます。