Numpyはデータ分析や機械学習の現場で日々活用されており、データアナリストやデータサイエンティストの必須スキルです
この記事では、Numpyを用いたデータ分析の基本をわかりやすく解説していきます
あなたもNumpyの魅力に触れ、データ分析の世界へ一歩踏み出しましょう
- Numpyの基礎知識
- データ分析のサンプルコード
筆者について
2021年から本格的にPython学習を始め、今ではPythonによる収益化に成功
大学院時代には、R言語とPythonを使って統計処理を行っていたため、Pythonを使ったデータサイエンスの知識が豊富
医療データを機械学習を用いて解析したり、学会発表も行なっている
Contents
Numpyとは?
NumPyは、Pythonで数値計算を効率的に行うためのライブラリです
多次元配列を扱うことができるほか、線形代数や統計処理などの高度な数学的演算が可能で、NumPyはデータサイエンスや機械学習の分野で広く利用されています
NumpyはPandasやScikit-learnなどの基盤ともなっています
Numpyでできること
- 多次元配列の操作
Numpyは、効率的なndarrayという多次元配列を提供しており、リストに比べて高速でメモリ効率が良いのが特徴です
これにより、大量のデータを扱う際にもパフォーマンスを維持しながら、データの操作や計算が可能です
- 数学的関数の提供
Numpyでは、様々な数学的関数を提供しており、これらの関数をndarrayに適用することで、数値データに対する高度な計算が容易に行えます
- 線形代数のサポート
行列の積や転置、逆行列、固有値・固有ベクトルの計算など、線形代数に関する機能も充実
線形代数のサポートによって、機械学習アルゴリズムの実装や最適化問題の解決が効率的に行えます
- 統計関数の提供
平均、中央値、標準偏差、相関係数など、基本的な統計関数も使うことができます
統計関数を使うことで、データ分析や前処理に必要な統計情報を簡単に取得することが可能
- ブロードキャスティング機能
Numpyには、ブロードキャスティングという機能を利用して、異なる形状の配列同士の演算を行うことができます
ブロードキャスティングを使うことで、コードがシンプルかつ効率的になり、計算処理が高速化されます
- 乱数生成
様々な確率分布から乱数を生成する機能あり、シミュレーションや機械学習の初期値設定など、乱数が必要な場面で簡単に利用できます
NumPyのインストールと基本操作
Numpyはデータ分析や機械学習を行う上で重要なPythonライブラリです
ここでは、NumPyのインストール方法と基本操作について解説をしていきます
まずはライブラリを正しくインストールし、基本的な操作に慣れていきましょう
NumPyのインストール方法
NumPyは、Pythonのパッケージ管理ツール(pip)を使って簡単にインストールできます
以下のコマンドを実行して、NumPyをインストールしていきましょう
pip install numpy
Anacondaを使用している場合には、次のコマンドを実行して、インストールしていきます
conda install numpy
NumPyのインポート
NumPyをインストールしたら、PythonスクリプトやJupyter NotebookでNumPyをインポートします
慣習として、npという名前を使ってインポートします
import numpy as np
配列(ndarray)の作成
NumPyの基本的なデータ構造は、ndarrayという多次元配列です
以下のようにnp.array()関数を使って、リストから配列を作成できます
arr = np.array([1, 2, 3, 4, 5])
配列の基本操作
ここからはNumPyで扱う配列の基本操作について解説します
形状変更、配列の属性や形状変更など、配列操作の基本を押さえてデータ分析に臨みましょう
配列の属性
配列には、次元数(ndim)、形状(shape)、要素数(size)、データ型(dtype)などの属性があります
これらの属性を使って、配列の構造を把握することができます
print(arr.ndim)
print(arr.shape)
print(arr.size)
print(arr.dtype)
配列の形状変更
Numpyでは、ndarrayの形状を変更するためにreshape関数を使います
reshape関数を使うことで、データの構造を柔軟に変更し、データ分析に適した形に整形できます
例えば、1次元配列を2次元配列に変換する場合は次のようになります
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = arr.reshape(2, 3)
print(reshaped_arr)
上記のコードでは、6つの要素を持つ1次元配列arrを2行3列の2次元配列に変換しています
reshape関数の引数に新しい形状を指定することで、簡単に配列の形状を変更できます
配列の要素へのアクセス
Numpyのndarrayでは、配列の要素にインデックスを使ってアクセスできます
インデックスは0から始まり、多次元配列の場合はカンマで区切って指定します
2次元配列の要素へのアクセス方法のサンプルコードは以下です
import numpy as np
arr = np.array([[1, 2, 3],
])
# 配列の(0, 1)の位置にある要素を取得
element = arr[0, 1]
print(element) # 結果: 2
上記のコードでは、2行3列の2次元配列arrから、1行目の2列目にある要素を取得しています
Python初心者の方でも簡単に理解できるように、Numpyは慣習的なインデックス表記を採用しています
これにより、データ分析の過程で配列内の特定の要素に素早くアクセスできます
配列の生成と初期化
ここからはNumPy配列を生成・初期化する方法について解説をしていきます
要素が0や1の配列や、ランダムな値を持つ配列など、さまざまな配列を簡単に生成できる方法をマスターしていきましょう
一様乱数を生成する方法
NumPyを使って一様乱数を生成するには、np.random.rand()やnp.random.randint()関数を使用します
これらの関数を使って、任意の範囲の乱数を含む配列を作成できます
random_floats = np.random.rand(3, 3) # 3x3の0から1の一様乱数を含む配列
random_ints = np.random.randint(0, 10, (3, 3)) # 3x3の0から9の整数乱数を含む配列
一様乱数とは、ある範囲内のすべての数値が同じ確率で生成される乱数のこと
一様分布に従う乱数とも言われます
例えば、0から1の範囲で一様乱数を生成すると、この範囲内のどの数値も同じ確率で出現します
ゼロや単位行列の作成
全ての要素がゼロの配列や、単位行列を作成するには、np.zeros()関数やnp.eye()関数を使用します
zeros = np.zeros((3, 3)) # 3x3のゼロ行列
identity = np.eye(3) # 3x3の単位行列
範囲指定での配列生成
np.arange()関数やnp.linspace()関数を使って、特定の範囲や間隔で数値を生成することもできます
arr_range = np.arange(0, 10, 2) # 0から9までの範囲で、2刻みの配列
arr_linspace = np.linspace(0, 1, 11) # 0から1までの範囲を、11個の要素で分割した配列
数学的演算
Numpyは多次元配列を扱える強みがありましたが、さらに力強い機能のひとつが数学的演算です
ここからは、基本的な算術演算から、高度な関数まで、NumPyが提供する豊富な数学的演算を紹介します
配列同士の演算
NumPyを使って、配列同士の要素ごとの加算、減算、乗算、除算などの演算が容易に行うことができます
a = np.array([1, 2, 3])
b = np.array()
addition = a + b
subtraction = a - b
multiplication = a * b
division = a / b
スカラー演算
配列に対してスカラー値を加算、減算、乗算、除算することもできます
c = a + 5
d = a * 2
集約関数(最大値、平均値など)
NumPyには、配列の最大値、最小値、合計、平均値、分散、標準偏差などの統計量を計算する便利な関数もあります
max_value = np.max(a)
min_value = np.min(a)
sum_value = np.sum(a)
mean_value = np.mean(a)
variance = np.var(a)
standard_deviation = np.std(a)
配列の結合と分割
配列の結合や分割は、データ前処理において頻繁に行われる操作です
NumPyを使って効率的に配列を結合・分割する方法を覚えていきましょう
配列の結合(水平・垂直)
NumPyでは、np.concatenate()、np.hstack()、np.vstack()などの関数を使って、配列を水平方向や垂直方向に結合できます
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
horizontal_concat = np.hstack((arr1, arr2))
vertical_concat = np.vstack((arr1, arr2))
配列の分割(水平・垂直)
np.split()、np.hsplit()、np.vsplit()などの関数を使って、配列を指定した数の部分配列に分割できます
arr = np.array([[1, 2, 3], , [7, 8, 9]])
horizontal_split = np.hsplit(arr, 3)
vertical_split = np.vsplit(arr, 3)
インデックスとスライシング
ここからはNumPy配列のインデックスとスライシングについて解説していきます
効率的なデータアクセス方法を習得し、データ分析の作業をスムーズに進めましょう
インデックスを利用した要素の取得
NumPy配列では、インデックスを使って要素を取得できます
リストのインデックスと同様に、負のインデックスを使用して末尾からの要素にアクセスすることもできます
arr = np.array([1, 2, 3, 4, 5])
first_elem = arr[0]
last_elem = arr[-1]
スライシングによる部分配列の取得
配列から部分配列を取得するには、スライシングを使います
スライシングは、start:end:stepの形式で指定します
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
sub_arr = arr[2:8:2] # 2から7までの範囲で、2刻みの要素を取得
ブールインデックス
ブールインデックスを使って、配列内の条件を満たす要素を抽出できます
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
# 配列の各要素が3より大きいかどうかを評価し、ブール値の配列を作成
bool_arr = arr > 3
print(bool_arr) # 結果: [False False False True True True]
# ブールインデックスを使って、条件を満たす要素のみを抽出
result = arr[bool_arr]
print(result) # 結果:
上記のコードでは、arr配列から3より大きい要素を抽出するためにブールインデックスを利用しています
まず、arr > 3という条件式を使って、配列の各要素が3より大きいかどうかを評価し、ブール値の配列bool_arrを作成しています
次に、arr[bool_arr]とすることで、ブール値がTrueに対応する要素のみを新しい配列resultに抽出しています
ブールインデックスは、データ解析や機械学習でよく使用されるため、NumPyを使って効率的なデータ操作を行いたい場合は、ブールインデックスを理解しておくと役立ちます
ブールインデックスとは、NumPy配列に対してブール値(TrueまたはFalse)を使ったインデックス指定の方法
ブールインデックスを用いることで、配列から条件を満たす要素を効率的に抽出することができます
ブロードキャスト
ブロードキャストはNumPyの強力な機能で、異なる形状の配列間で演算を行うことができます
ブロードキャストの仕組みを理解することで、コードをシンプルかつ効率的にすることができます
ブロードキャストの概念
ブロードキャストは、形状の異なる配列間の演算を可能にするNumPyの機能です
自動的に形状を調整して、要素ごとの演算を行います
ブロードキャストの例
次のサンプルコードでは、形状が異なる配列AとBがありますが、ブロードキャストによって形状が自動的に調整され、要素ごとの演算が可能になります
A = np.array([[1, 2, 3], , [7, 8, 9]])
B = np.array([1, 2, 3])
result = A + B # ブロードキャストにより、AとBの形状が調整されて加算が行われる
線形代数の演算
NumPyは線形代数の演算をサポートしています
行列の積、逆行列、固有値などの計算方法を学び、機械学習アルゴリズムの実装や最適化問題に活用していきましょう
行列の積
NumPyでは、np.dot()関数や@演算子を使って、行列の積を計算できます
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
product = np.dot(A, B) # 行列の積
product_alt = A @ B # @演算子を使った行列の積
逆行列と行列式
np.linalg.inv()関数を使って逆行列を計算し、np.linalg.det()関数を使って行列式を求めることができます
A_inv = np.linalg.inv(A) # 逆行列
A_det = np.linalg.det(A) # 行列式
固有値と固有ベクトル
np.linalg.eig()関数を使って、固有値と固有ベクトルを計算できます
eigenvalues, eigenvectors = np.linalg.eig(A)
まとめ
この記事では、Python初心者向けにNumPyの基本的な使い方と応用例を解説しました
NumPyは、データサイエンスやデータ分析・機械学習の分野で広く利用されており、効率的な数値計算が可能です
配列の生成や操作、数学的演算、線形代数の演算など、様々な機能を学ぶことで、NumPyを活用してデータ解析やアルゴリズムの実装ができるようになります
Numpyの理解ができたら、データ分析・機械学習にもチャレンジしてみましょう
Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップ
Pythonで機械学習に学んで実装してみよう【サンプルコードあり】