0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2025年10月7日の学習記録 Scipy、Pandas基礎学習 【東京大学のデータサイエンティスト育成講座,p45~59】

Posted at

(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を取り出すことができる。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?