(1).やったこと
【2-3】Scipyの基礎
Scipyは科学技術計算をするためのライブラリで、多様な数学処理ができる。
(線形代数の計算とか、フーリエ変換とか)
(1).Scipyのライブラリのインポート
Scipyにおける線形代数用のライブラリをインポートする。
すでにSipyをインポートしてるが、ここでは「as sp」としているので、
「sp.機能名」でScipyライブラリを使えるようになってる。
下記ではさらに、線形代数用のライブラリをlinalg、最適化計算(最小値)用の関数
をminimize_scalarのように、より短い名前で使えるようにします。
――――
#線形代数用のライブラリ
import scipy.linalg as linalg
#最適化計算(最小値)用の関数
from scipy.optimize import minimize_scalar
――――
(2).行列計算
行列式を計算するにはdet関数を使う。
①.行列式と逆行列の計算
行列式を計算するにはdet関数を使う。
――――
matrix = np.array([[1,-1,-1], [-1,1,-1],[-1,-1,1]])
#行列式
print('行列式')
print(linalg.det(matrix))
――――
逆行列を計算するにはinv関数を使う。
――――
#逆行列
print('逆行列')
print(linalo.inv(matrix))
――――
②.固有値と固有ベクトル
linalg.eig()を使う。
※固有ベクトル
変形しても向きが変わらないベクトル。
※固有値
その時の伸び縮みの倍率。
(3).ニュートン法
最適化計算についてをここではやる。
※最適化計算とは
限られた条件の中で、一番いい(効率的な・無駄のない)解を探す計算。
データサイエンスの中では、誤差やコストを数式で定義して、それを最小
(あるいは最大)にするようにパラメータを調整する計算。
※ニュートン法とは
方程式の解を数値的に近似的に求める方法。
手計算や正確な解が難しい時に近い値を出す方法。
①.方程式の解を求める。
f(x)=x^2+2x+1
これをニュートン法で解いてみる。
※簡単な式にわざわざニュートン法を使うのは、ニュートン法がどのように
作用しているかがわかりやすくなるため。
まずは関数の定義
――――
#関数の定義
def my_function(x)
return(x**2 + 2*x + 1)
――――
次に、f(x)=0となるxを求めるためにnewton関数を使う。
一つ目の引数に今定義した関数、2つ目の引数に解を決める条件式となる
f(x)=0をセットする。
――――
#ニュートン法の読み込み
from scipy.optimize import newton
#計算実行
pirnt(newton(my_function,0))
――――
②.最小値を求める
今回はminimize_scalar関数を使って最小値を求める。
methodというパラメータで指定している「Brent]は、Brent法を使うことを示
している。
Brent法については割愛。
実はほかにもいろいろなアプローチがある。
――――
#計算実行
print(minimize_scalar(my_function, method = 'Brent'))
――――
※とりあえず、Scipyはこんな感じでいろんな複雑な計算をするときに使う
ライブラリだと覚えれば良い。(線形代数をきちんと学ぶのはいずれ)
【2-4】Pandasの基礎
データの前処理をするときに便利なライブラリ。
様々なデータの加工処理を実施することができ、表計算やデータの抽出などの操作
ができるようになる、
(1).Pandasのライブラリのインポート
すでにインポートしているが、今回はさらに一元の配列を扱うときのSiriesライ
ブラリと、二次元の配列を扱うときのDataFrameライブラリをインポートする。
――――
from pandas import Series, DataFrame
――――
(2).Seriesの使い方
Seriesは1次元の配列のようなオブジェクトである。
PandasのベースはNumpyのarrayである。
いかに、Seriesオブジェクトに10個の要素を設定する、簡単な例を示す。
――――
#Series
sample_pansas_data = pd.Series([0,10,20,30,40,50,60,70,80,90])
print(Sample_dpandas_data)
――――
出力されたものの、先頭の10行は要素のインデックスと値、dtypeはデータの型
インデックスは要素を特定するキーのこと
Seriesオブジェクトに対して、値だけを指定した場合、インデックスは0、1,2
のように連番が付く。
データの値とインデックスの値は、それぞれ次のようにValueプロパティとindex
プロパティを指定することで、別々に取り出すこともできる。
――――
#indexをアルファベットでつける
sample_pandas_index_data = pd.Series(
[0, 10,20,30,40,50,60,70,80,90],
index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',])
print(sample_pandas_index_data)
――――
――――
print('データの値:', sample_pandas_index_data.values)
print('インデックスの値:', sample_pandas_index_data.index)
――――
(3).DataFrameの使い方
DataFrameオブジェクトは2次元の配列。
それぞれの列で、異なるdtype(データ型)を持たせることもできる。
下記は、ID,City,などの4つの列を持つデータ構造を示した例。
print関数で表示すると、そのデータは表形式で表示される。
――――
attri_data1 = {'ID':['100','101','102','103','104'],
'City':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'Birth_year':['1990','1989','1992','1997','1982'],
'Name':['Hroshi','Akiko','Yuki','Satoru','Steve']}
attri_data_frame1 = DataFrame(attri_deta1)
print(attri_deta_frame1)
――――
※これは、このデータフレームっていうやり方を使うと表形式で配列できると
いうこと、
この形が2次元配列(要は縦横がある表)
さっきのSeriesも、要は、プログラミングで一次元の配列をするやり方。
一番左に表示されている番号はインデックスの値。
DataFrameオブジェクトもSeriesオブジェクトと同様に、インデックスを変更
したり、インデックスとして文字を指定したりすることもできる。
次のようにインデックスを指定すると、attri_data_1の値に対して、新しい
インデックスを指定した、attri_data_frame_index1というDataFrameオブジェ
クトを作ることができる。
Seriesも同様のことができる。
――――
attri_data_frame_index1 = DataFrame(attri_deta1,index=['a','b','c','d','e',])
print(attri_data_frame_index1)
――――
①.Jupyter環境におけるデータ表示
Jupyter環境では次のように記述すると、SeriesオブジェクトやDataFrameオブジ
ェクトと認識され、罫線などが付いた見やすい表示になる。
――――
attri_data_frame_index1
――――
※オブジェクトを含んだ変数を入れると、オブジェクトを認識して見やす
い罫線などを入れてくれる。
(4).行列操作
DataFrameは様々な行列操作ができる。
①.転置
行列の転置のように、行と列を入れ替える場合にはTメソッドを使う。
――――
#転置
attri_data_frame1.T
――――
②.特定列のみを取り出す
特定の列だけを指定したい時は、データの後にその列名を指定する。
複数の列を指定したい時は、それらをPythonのリスト形式で指定する。
――――
#列名の指定(1つの場合)
attri_data_frame1.Birth_year
――――
――――
#列名の指定(複数の場合)
attri_data_frame1[['ID', 'Birth_year']]
――――
(5).データの抽出
DataFrameジョブジェクトでは、特定の条件を満たすデータを取り出したり、複数
のデータを結合したりすることもできる。
次の例は、CityがTokyoのみのデータを抽出する例。
bool値を使って、Tokyoがtrueであるデータを抽出する形で、フィルターの役割を
果たしている。(詳細はp53を参照)
――――
#条件(フィルタ-)
attri_data_frame1[attri_data_frame1['City'] == 'Tokyo']
――――
条件部分の式は、City列の要素一つ一つとTokyoを比較して、TrueとFalseにより
分けている。
そこだけ表示すると、実際にそうなってることがわかる。
――――
attri_data_frame1['City'] == 'Tokyo'
――――
条件を複数指定したい時は、次のようにisin(リスト)を使う。
――――
#条件(フィルター、複数の値)
attri_data_frame1[attri_data_frame1['City'].isin(['Tokyo','Osaka'])]
――――
(6).データの削除と結合
①.列や行の削除
特定の列や行を削除するにはdropメソッドを使う。
axisパラメータに軸を指定する。
「axis=0が行」「axis=1が列」(ほかの場面でも使うから覚えておくこと)
・行削除の場合:1つ目の引数に削除したい行のインデックスをリストとして
指定。axisパラメータには「0」を指定。
・列削除の場合:1つ目の引数に削除したい列名をリストとして指定。
axisパラメータには「1」を指定。
次は、Birth_year列を削除する例
――――
attri_data_frame1.drop(['Birth_year'], axis = 1)
――――
なお、上記で列を削除しても元のデータの列が削除されたわけではないので注意。
置き換えたい場合は、改めて
attri_deta_frame1 = attri_deta_frame1.drop(['Birth_year'], axis = 1)
のように設定する。
あるいは、オプションのinplace=Trueをパラメータとして指定する。
②.データの結合
DataFrameオブジェクト同士は結合できる。
結合先のDataFrameオブジェクトを次のようにattri_data_frame2という変数で用意。
――――
attri_data2 = {'ID':['100','101','102','105','107'],
'Math':[50,43,33,76,98],
'English':[90,30,20,50,30],
'Sex':['M','F','F','M','M']}
attri_data_frame2 = DataFrame(attri_data2)
attri_data_frame2
――――
そして、これまで使ってきたattri_data_frame1とこのattri_data_frame2を結合して
みる。
結合するときはmargeメソッドを使う。
キーを明示しないときは、自動で同じキーの値であるものを見つけて結合する。
婚礼の場合、キーはIDになる。100,101,102が共通であるため、それが合致する
データが結合される。
※ここ、ミスって、MathとEnglishにも''を入れてしまい、データ型をオブジェクト
にしてしまった。今後はデータの内容をきちんと確認すること。
――――
#データのマージ(内部結合、詳しくは6章で)
pd.merge(attri_data_frame1,attri_data_frame2)
――――
(7)集計
DataFrameオブジェクトでは、データの集計もできる。
groupbyメソッドを使えば、ある特定の列を軸とした集計ができる。
以下は、「Sex」の列を軸として、数学のスコア平均を算出する例。
(Sexの同じ値毎に集計して平均とかを出す、の意味)
スコア平均を計算するには、meanメソッドを使う。ほかにも最大値を計算するmax
メソッドや、最小限を計算するminメソッドなどもある。
――――
#データのグループ集計(詳しくは次の章で)
attri_data_frame2.groupby('Sex')['Math'].mean()
――――
(8).値のソート
SeriesオブジェクトやDataFrameオブジェクトのデータは、ソートすることもできる。
値だけではなく、インデックスをベースにソートもできる。
まずは、ソート対象のサンプルデータを次のように定義する。
(ソートの効果がわかりやすくするために、わざとインデックスを英語にする時に
データをばらばらに並べている)
――――
attri_data2 = {'ID':['100','101','102','103','104'],
'City':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
'Birth_year':[1990,1989,1992,1997,1982],
'Name':['Hroshi','Akiko','Yuki','Satoru','Steve']}
attri_data_frame2 = DataFrame(attri_data2)
attri_data_frame_index2 = DataFrame(attri_data2,index=['e','b','a','d','c',])
attri_data_frame_index2
――――
・インデックスでソートする差には、sort_indexメソッドを使う。
――――
#indexによるソート
attri_data_frame_index2.sort_index()
――――
・値でソートする場合は、sort_valuesメソッドを使う。
――――
attri_data_frame_index2.Birth_year.sort_values()
――――
(9).nan(null)の判定
データ分析では、データが欠損しており、該当のデータが存在しないことがある。
それらをそのまま計算すると、平均などを求めた時に、正しい値が得られないので、
除外するなどの操作が必要となる。
欠損地などのデータはnanという特別な値で格納されるので、その扱いについて補足
する。
①.条件に合致したデータの比較
まずは、nanの話ではなく、普通に条件検索する例について。
次の例は、attri_data_frame_index2の全要素を対象にTokyoという文字列があるか
どうかをisinで調べる例。
その結果は、それぞれのセルにTrueかFalseで返される。
この操作が、条件に合致するデータを探すときの基本となる。
――――
attri_data_frame_index2.isin(['Tokyo'])
――――
#isinは、表の各セルの内容を、指定されたものと同じかどうか判定するメソッド
前述の抽出は、その判定結果(bool値)がTrueになったものを抽出した形。
②.nanとnullの例
次の例はName列の値をわざとnanに設定した例。
nanかどうかを判定するにはisnullメソッドを使う。
――――
#欠損値の取り扱い
#name をすべてnanにする
attri_data_frame_index2['Name'] = np.nan
attri_data_frame_index2.isnull()
――――
そして、nanであるものの総数を求めるには、次のようにする。
Nameが5になってるのは、上記のコードを実行した結果、Trueが5つあり、それを
カウントしているから
――――
#nullを判定し、合計する。
attri_data_frame_index2.isnull().sum()
――――
(2).気づいたこと・学んだこと・疑問
・結合しなかったデータってどこに行ったんだろう?
キーが一緒で、結合できたデータだけが表示されている。
キーが別だけど、データとしては追加されているはずだけれども、それの表示方法がわ
からない。
後に調べてみよう。
(3).簡単な復習
・Valueとキー
辞書(dict)でやったところ。
'banana':100とやった時に、bananaがキー、100がValue
キーを指定することでValueを取り出すことができる。