プログラミングを頑張る土木系専攻大学院生のブログ

主にプログラミングについて開発備忘録的な形で投稿しています。

【Python】データ分析ライブラリの使い分け10選|pandas・numpy・mathはこう使い分ける!

Python】データ分析ライブラリの使い分け10選|pandas・numpy・mathはこう使い分ける!

Pythonでデータ処理や数値計算を行う際、あなたはpandasnumpymathなどのライブラリをどう使い分けていますか?

何となく使っていて「これ、どれで書くのが正解?」と迷ったことはないでしょうか?

本記事では、処理速度・記述効率・コードの見通しといった観点から、それぞれのライブラリをどう使い分ければよいか、実例と丁寧な解説つきで10パターン紹介します。


💡 はじめに:各ライブラリの特性を整理

ライブラリ 主な用途 特徴
pandas 表形式データの操作・整形・入出力 表計算のような柔軟性、列・行ベースの操作に強い
numpy 配列・ベクトル・行列の高速計算 Cベースの高速演算、ベクトル化処理に最適
math スカラー値の数式処理 軽量で関数単位の数値処理に特化

✅ パターン①:数値演算はpandasではなくNumPy配列で行う

import pandas as pd
import numpy as np

df = pd.read_csv('data.csv')
values = df['value'].to_numpy()  # NumPy配列に変換
result = np.log(values + 1)      # ログ計算(ベクトル化)

解説:

pandasのSeriesやDataFrameでも数値演算は可能ですが、内部的にはNumPy配列を使っています。そのため、演算処理ではNumPyに変換して行ったほうが処理速度も記述の明確さも向上します。

特に、ループ処理を避けたい場合や、大量の数値に対する一括処理が必要な場面では、NumPy配列に変換してベクトル演算を行うのがベストです。


✅ パターン②:平方根の繰り返し処理はNumPyでベクトル演算する

import numpy as np

arr = np.array([1, 4, 9, 16, 25])
result = np.sqrt(arr)

解説:

math.sqrt()スカラー(単一の値)にしか使えず、リストや配列に対してはループ処理が必要です。これに対し、numpy.sqrt()配列全体に対して高速に一括処理できます。

大量のデータを処理する場合、for文を避けてベクトル演算することで、10倍以上の処理速度改善も珍しくありません


✅ パターン③:定数はmathでなくnumpyから取得する

import numpy as np

theta = np.pi / 2
print(np.sin(theta))  # → 1.0

解説:

math.pinumpy.piはどちらも同じ円周率を表しますが、NumPyの定数はそのまま配列演算に組み込めるという利点があります。

例えば、複数の角度に対して三角関数を使いたいとき、mathではエラーになりますが、numpy.sin()numpy.piの組み合わせならベクトル演算が可能です。


✅ パターン④:条件分岐はNumPyのwhere()でベクトル化する

import numpy as np

scores = np.array([45, 80, 67, 92])
labels = np.where(scores >= 70, 'Pass', 'Fail')

解説:

条件付きラベル付けやフィルタ処理はforif-elseで書くと冗長になりがちですが、np.where()を使えば配列全体に対して高速かつ明解な一括処理が可能です。

コードの可読性を保ちつつ、ループをベクトル処理に置き換えられる代表的なテクニックです。


✅ パターン⑤:apply()は便利だが遅い。数値処理はNumPy優先

# 良い例(ベクトル演算)
df['log'] = np.log(df['value'] + 1)
# 悪い例(遅くなる)
import math
df['log'] = df['value'].apply(lambda x: math.log(x + 1))

解説:

apply()は関数を行や列に適用できる柔軟な機能ですが、内部でPythonの関数を逐次呼び出しているため遅くなることが多いです。

処理対象が単純な数値変換(対数、平方根、正規化など)の場合は、NumPyで一括処理した方が、処理速度も数倍高速になりますし、コードも短く明快です。


✅ パターン⑥:スカラー処理はmath、配列処理はnumpyを使う

import math
print(math.sin(math.pi / 2))  # スカラーにはOK
import numpy as np
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles))  # 配列にはNumPy

解説:

mathモジュールは軽量で、スカラー(単一値)に対する関数(sin, log, sqrtなど)を実行するには非常に適しています。

ただし、配列に対してはエラーになります。一方、numpyは配列・行列に対する演算を効率的に処理できるため、用途に応じて明確に使い分けることが重要です。


✅ パターン⑦:統計量(平均・標準偏差)はNumPyで一括取得

arr = np.array([10, 20, 30, 40])
print(np.mean(arr))  # → 25.0
print(np.std(arr))   # → 11.18...

解説:

pandasにも.mean().std()はありますが、DataFrameの構造を意識する必要があります。単純な数値配列やベクトルの統計量を取るときは、NumPyの方が高速かつ直感的です。

統計演算を繰り返すような処理では、オーバーヘッドの少ないNumPyを基本とするのがベストプラクティスです。


✅ パターン⑧:累積計算はNumPyのcumsum()cumprod()で簡単に

x = np.array([1, 2, 3, 4])
print(np.cumsum(x))   # → [1 3 6 10]
print(np.cumprod(x))  # → [1 2 6 24]

解説:

累積和や累積積は、時間軸のデータや指数型増加などの計算でよく使われます。NumPyにはこれ専用の関数があり、ループを使わず1行で実現可能です。

pandasでも似た機能はありますが、配列ベースで作業する場面ではNumPyが明確に便利です。


✅ パターン⑨:線形代数処理はNumPyに任せる(内積・行列積など)

a = np.array([1, 2])
b = np.array([3, 4])

print(np.dot(a, b))       # 内積 → 11
print(np.matmul(a, b))    # 行列積(スカラーの場合は同じ)

解説:

線形代数処理(内積・行列積・逆行列固有値など)は、NumPyが圧倒的に強力です。ベクトル・行列の扱いを簡潔に記述できるうえ、BLASLAPACKといった数値計算ライブラリと連携しており、非常に高速に動作します


✅ パターン⑩:DataFrame演算は「構造が一致」していることが前提

import pandas as pd

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [10, 20], 'B': [30, 40]})

print(df1 + df2)

解説:

pandasのDataFrame同士で演算を行う場合、インデックスや列名が一致していないと期待した結果にならないことがあります。

一方、NumPyでは位置ベースで演算されるため、構造の一致に神経質になる必要はありません。つまり、「構造ありき」の処理はpandas、それ以外はNumPyという判断軸が役立ちます。


🧠 まとめ:こんなふうに使い分けよう!

処理内容 ベストなライブラリ 理由
表形式の前処理・入出力 pandas 読み書き・整形が得意
ベクトル・行列の数値演算 numpy 高速で記述も簡潔
スカラーの数式処理 math 軽量でインポートも早い