GCIデータサイエンス講座 Chapter2 メモ

科学計算、データ加工、グラフ描画ライブラリの使い方の基礎

  • Numpy:基本的な配列処理や数値計算をするライブラリ。高度で複雑な計算ができるほか、Pythonの通常の計算に比べて処理速度が速い。さまざまなところで使われており、データ分析で使うのに基本中の基本とも言えるライブラリ
  • Scipy:Numpyをさらに機能強化するライブラリ。統計や信号計算ができる
  • Pandas: データフレーム形式で様々なデータを加工するためのライブラリ
  • Matplotlib: データをグラフ化するためのライブラリ

ライブラリの読み込み

モジュール、機能を import, from で利用できるようにする

マジックコマンド:Jupyter Notebookからライブラリの設定を行える機能。 標準のマジックコマンド(ビルドインマジックコマンド)は %quickref を実行すると表示される。

Numpyの基礎

配列

データ型(int, uint, float, bool)。データ型を調べるには 変数.dtype

. まで打ってタブキーを押すと補完が聞くので便利

配列の次元(変数.ndim)、要素数(変数.size)

配列に対してスカラ値加減乗除累乗等を行うと要素全体に適用される

ソート:変数.sort()(昇順。変数が指す配列の要素がソートされる(順序変更される))。降順は 変数[::-1].sort()

最大:.max()、最小:.min()、合計:.sum()、積み上げ:.cumsum()( np.array([1,2,3]).cumsum() => array([1, 3, 6]))、積み上げ割合:.cumsum() / .sum()

乱数

シード、種類によって色々ある Random sampling (numpy)

%timeit 式 で式の計算時間を測れる

行列

arange、reshape、スライス、積(np.dot())、np.zeros(), np.ones()

練習問題

1から50の和をforを使わずnumpyで求める

素数10の配列を乱数を発生させて作り、最小値、最大値、合計値を求める

5x5、全要素3の行列を作り、各要素を2乗する

SciPyの基礎

# Scipyのライブラリ
import scipy as sp

# 線形代数用のライブラリ
import scipy.linalg as linalg

# 最適化計算(最小値)用の関数
from scipy.optimize import minimize_scalar

行列計算

行列式:linalg.det()、逆行列 linalg.inv()、固有値固有ベクトル:val, vec = linalg.eig()

ニュートン法

from scipy.optimize import newton
print(newton(sample_function,0))  # sample_function(x) == 0 となる x を求める

minimize_scalar関数の紹介

練習問題

行列式計算、固有値固有ベクトル計算、3次元方程式を解く

Pandasの基礎

Series: numpyの配列 (.value) +インデックス(.index)、インデックスは Series の引数indexで任意の値(文字列とか)に変更可能(配列指定)

DataFrame: 2次元の配列。インデックス値は Series と同様

# キー毎に列になる、1番目の要素が1行目、2番目の要素が2行目、...
attri_data1 = {'ID':['100','101','102','103','104'],
               'City':['Tokyo','Osaka','Kyoto','Hokkaido','Tokyo'],
               'Birth_year':[1990,1989,1992,1997,1982],
               'Name':['Hiroshi','Akiko','Yuki','Satoru','Steve']}

df1 = DataFrame(attri_data1)

Series, DataFrameはJupyter Notebook上で評価すると罫線がかかった表で表示される

転置:df1.T

1列取り出し:df1.Birth_year

複数列取り出し:df1[['ID', 'Birth_year']]

列CityがTokyoである行の抽出:df1[df1.City == 'Tokyo']

列CityがTokyoまたはOsakaである行を抽出:df1[df1.City.isin('Tokyo', 'Osaka')]

列削除(複数可)df1.drop(['City'], axis=1)

行削除(複数可):df1.drop([0,1], axis=0)

マージ(同じキーがあればそこで内部結合):pandas.merge(df1, df2)

集計(groupby()で指定した項目毎に集計 性別毎に数学の平均点を集計):df1.groupby('Sex')['Math'].mean()

ソート(インデックス):df1.sort_index()

ソート(値):df1.Birth_year.sort_values()

表全体指定値検索:df1.isin(['Tokyo'])

表全体nan検索:df1.isnull() (nanの数を数えたいときは df1.isnull().sum()

練習問題

行の絞り込み、groupby()、merge()

Matplotlibの基礎

# matplotlib と seabornの読み込み
# seabornはきれいに図示できる
import matplotlib as mpl
import seaborn as sns

# pyplotにはpltの別名で実行できるようにする
import matplotlib.pyplot as plt

# Jupyter Notebook上でグラフを表示させるために必要なマジックコマンド
%matplotlib inline

散布図

plt.plot(x, y, 'o') もしくは plt.scatter(x, y)

グラフの分割

# 2行1列のグラフの1つ目
plt.subplot(2,1,1)
...
plt.plot(x, y) 

# 2行1列のグラフの2つ目
plt.subplot(2,1,2)
...
plt.plot(x, 7) 

関数グラフの描画

plt.plot(x, y) の y を x の関数に置き換える

ヒストグラム

plt.hist(配列、bins=..., range=...) 

binsでビンの個数、rangeで範囲。help(plt.hist)で詳細表示。

コラム:d3js 紹介

練習問題

5x - 3のグラフ、cos(x)、一様乱数のヒストグラム表示

総合問題

モンテカルロ法で円周率の近似値を求める