どうもニコイチです。Pythonはデータ分析や機械学習の分野で広く利用されており、特に数値データを扱う際には「NumPy」というライブラリが欠かせません。NumPyを使うことで、大量のデータを効率的に処理し、統計的な分析を簡単に行うことができます。
本記事では、NumPyを使った統計処理に焦点を当て、次の内容を学びます。
✅ 配列の最大値・最小値を求める方法
✅ 平均値や中央値を計算する方法
✅ 分散・標準偏差を求め、データのばらつきを分析する方法
✅ データの相関関係を計算する方法
✅ データの累積和を求める方法
これらの手法を身につけることで、データ分析の基礎をしっかりと理解し、実践に活かすことができるようになります。今回も、以前使用した data.csv
のデータを使いながら、実際にコードを書いて理解を深めていきましょう!
NumPyで最大値を求める
データ分析では、配列の中で最大の値を求めることがよくあります。NumPyでは、max()
関数を使うことで、簡単に配列の最大値を取得できます。
max()
関数の基本的な使い方
まず、max()
関数の基本的な使い方を見てみましょう。
import numpy as np
# 例として3×3の配列を作成
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 配列全体の最大値を求める
max_value = arr.max()
print("配列全体の最大値:", max_value)
出力結果
配列全体の最大値: 9
このように、.max()
を使うことで、配列の中で最も大きい値を取得できます。
axis
を指定した最大値の計算
多次元配列の場合、軸(axis
)を指定することで、行ごと・列ごとの最大値を取得できます。
例:縦方向(列ごと)の最大値を求める (axis=0
)
print(arr.max(axis=0))
出力結果
[7 8 9]
→ 各列(縦方向)の最大値を取得しています。
例:横方向(行ごと)の最大値を求める (axis=1
)
print(arr.max(axis=1))
出力結果
[3 6 9]
→ 各行(横方向)の最大値を取得しています。
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、最大値を求める演習を行いましょう。
問題
(1) 配列 arr
の最初の行を取り出した配列 arr_initial
を作成しましょう。
(2) arr_initial
の最大値 arr_initial_max
を求めましょう。
(3) 配列 arr
の各行の最大値の配列 arr_rmax
を作成し、配列の先頭の値が arr_initial_max
と一致しているか確認しましょう。
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) arr の1行目を取得
arr_initial = arr[0]
print("arr_initial:", arr_initial)
# (2) 1行目の最大値を取得
arr_initial_max = arr_initial.max()
print("arr_initial_max:", arr_initial_max)
# (3) 各行の最大値を取得
arr_rmax = arr.max(axis=1)
print("arr_rmax:", arr_rmax)
# (4) 先頭の値と比較
print("先頭の最大値と一致:", arr_initial_max == arr_rmax[0])
出力例
arr_initial: [ 43940 43970 43270 43270 339900 14780670000]
arr_initial_max: 14780670000
arr_rmax: [14780670000 ....]
先頭の最大値と一致: True
まとめ
max()
を使うと、配列の中の最大値を取得できる。axis=0
を指定すると「縦方向(列ごと)」の最大値、axis=1
を指定すると「横方向(行ごと)」の最大値を取得できる。- 実データ(
data.csv
)を用いることで、NumPyの活用方法を理解できる。
NumPyで最小値を求める
最大値と同様に、データの中で最も小さい値(最小値)を求めることも重要です。NumPyでは min()
関数を使用することで、簡単に最小値を取得できます。
min()
関数の基本的な使い方
まず、min()
関数を使って、配列全体の最小値を求めてみましょう。
import numpy as np
# 例として3×3の配列を作成
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 配列全体の最小値を求める
min_value = arr.min()
print("配列全体の最小値:", min_value)
出力結果
配列全体の最小値: 1
このように、.min()
を使うことで、配列の中で最も小さい値を取得できます。
axis
を指定した最小値の計算
多次元配列の場合、軸(axis
)を指定することで、行ごと・列ごとの最小値を取得できます。
例:縦方向(列ごと)の最小値を求める (axis=0
)
print(arr.min(axis=0))
出力結果
[1 2 3]
→ 各列(縦方向)の最小値を取得しています。
例:横方向(行ごと)の最小値を求める (axis=1
)
print(arr.min(axis=1))
出力結果
[1 4 7]
→ 各行(横方向)の最小値を取得しています。
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、最小値を求める演習を行いましょう。
問題
(1) 配列 arr
の最初の行を取り出した配列 arr_initial
を作成しましょう。
(2) arr_initial
の最小値 arr_initial_min
を求めましょう。
(3) 配列 arr
の各行の最小値の配列 arr_rmin
を作成し、配列の先頭の値が arr_initial_min
と一致しているか確認しましょう。
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) arr の1行目を取得
arr_initial = arr[0]
print("arr_initial:", arr_initial)
# (2) 1行目の最小値を取得
arr_initial_min = arr_initial.min()
print("arr_initial_min:", arr_initial_min)
# (3) 各行の最小値を取得
arr_rmin = arr.min(axis=1)
print("arr_rmin:", arr_rmin)
# (4) 先頭の値と比較
print("先頭の最小値と一致:", arr_initial_min == arr_rmin[0])
出力例
arr_initial: [ 43940 43970 43270 43270 339900 14780670000]
arr_initial_min: 43270
arr_rmin: [ 43270 ....]
先頭の最小値と一致: True
まとめ
min()
を使うと、配列の中の最小値を取得できる。axis=0
を指定すると「縦方向(列ごと)」の最小値、axis=1
を指定すると「横方向(行ごと)」の最小値を取得できる。- 実データ(
data.csv
)を用いることで、NumPyの活用方法を理解できる。
NumPyで平均値と中央値を求める
データ分析では、データの中心的な傾向を把握するために「平均値」や「中央値」を求めることがよくあります。NumPyでは、それぞれ mean()
関数と median()
関数を使って簡単に計算できます。
平均値 (mean()
) の基本的な使い方
平均値とは、データの合計をデータ数で割った値のことです。
NumPyでは mean()
関数を使用して求めます。
例:配列全体の平均値を求める
import numpy as np
# 例として3×3の配列を作成
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 配列全体の平均値を求める
mean_value = np.mean(arr)
print("配列全体の平均値:", mean_value)
出力結果
配列全体の平均値: 5.0
axis
を指定した平均値の計算
多次元配列の場合、axis
を指定することで行ごと・列ごとの平均値を求めることができます。
例:縦方向(列ごと)の平均値 (axis=0
)
print(np.mean(arr, axis=0))
出力結果
[4. 5. 6.]
→ 各列(縦方向)の平均値を取得しています。
例:横方向(行ごと)の平均値 (axis=1
)
print(np.mean(arr, axis=1))
出力結果
[2. 5. 8.]
→ 各行(横方向)の平均値を取得しています。
中央値 (median()
) の基本的な使い方
中央値とは、データを小さい順に並べたときに真ん中にくる値のことです。
NumPyでは median()
関数を使用して求めます。
例:配列全体の中央値を求める
median_value = np.median(arr)
print("配列全体の中央値:", median_value)
出力結果
配列全体の中央値: 5.0
axis
を指定した中央値の計算
例:縦方向(列ごと)の中央値 (axis=0
)
print(np.median(arr, axis=0))
出力結果
[4. 5. 6.]
→ 各列(縦方向)の中央値を取得しています。
例:横方向(行ごと)の中央値 (axis=1
)
print(np.median(arr, axis=1))
出力結果
[2. 5. 8.]
→ 各行(横方向)の中央値を取得しています。
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、平均値と中央値を求める演習を行いましょう。
問題
(1) 配列 arr
の各行ごとの平均値 arr_mean
を求めましょう。
(2) 配列 arr
の3行目のデータ arr3
を取得し、その平均値 arr3_mean
と中央値 arr3_median
を計算しましょう。
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) 各行の平均値を求める
arr_mean = np.mean(arr, axis=1)
print("各行の平均値:", arr_mean)
# (2) 3行目のデータを取得
arr3 = arr[2]
# (3) 3行目の平均値と中央値を計算
arr3_mean = np.mean(arr3)
arr3_median = np.median(arr3)
print("3行目のデータ:", arr3)
print("3行目の平均値:", arr3_mean)
print("3行目の中央値:", arr3_median)
出力例
各行の平均値: [ 43970. 50000. 55000. ...]
3行目のデータ: [ 43940 43970 43270 43270 339900 14780670000]
3行目の平均値: 2463446658.33
3行目の中央値: 43270.0
まとめ
mean()
を使うと、配列の平均値を計算できる。median()
を使うと、配列の中央値を計算できる。axis=0
を指定すると「縦方向(列ごと)」の値、axis=1
を指定すると「横方向(行ごと)」の値を計算できる。- 平均値と中央値の差が大きい場合、データに偏りがある可能性がある。
NumPyで分散と標準偏差を求める
データの傾向をより深く理解するためには、平均値や中央値だけでなく「分散」と「標準偏差」も重要な指標となります。これらは、データのばらつきを表し、値が大きいほどデータの散らばりが大きいことを意味します。NumPyでは、var()
関数と std()
関数を使って簡単に計算できます。
分散 (var()
) と標準偏差 (std()
) の基本的な概念
✅ 分散(Variance)とは?
分散は、データが平均値からどの程度散らばっているかを示します。数式では以下のように表されます。 分散=1n∑i=1n(xi−xˉ)2\text{分散} = \frac{1}{n} \sum_{i=1}^{n} (x_i – \bar{x})^2
✅ 標準偏差(Standard Deviation)とは?
標準偏差は、分散の平方根を取った値で、データのばらつきの単位を元のデータと揃えるために使用されます。数式は以下のようになります。 標準偏差=分散\text{標準偏差} = \sqrt{\text{分散}}
NumPyでは、それぞれ以下の関数を使って計算できます。
- 分散を求める関数:
numpy.var(配列, axis)
- 標準偏差を求める関数:
numpy.std(配列, axis)
var()
と std()
の基本的な使い方
まず、var()
と std()
を使って、簡単な配列の分散と標準偏差を計算してみましょう。
import numpy as np
# 例として3×3の配列を作成
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 配列全体の分散を求める
variance = np.var(arr)
print("配列全体の分散:", variance)
# 配列全体の標準偏差を求める
std_dev = np.std(arr)
print("配列全体の標準偏差:", std_dev)
出力結果
配列全体の分散: 6.666666666666667
配列全体の標準偏差: 2.581988897471611
axis
を指定した分散と標準偏差の計算
多次元配列の場合、axis
を指定することで、行ごと・列ごとの分散や標準偏差を計算できます。
例:縦方向(列ごと)の分散 (axis=0
)
print("縦方向(列ごと)の分散:", np.var(arr, axis=0))
出力結果
[6. 6. 6.]
→ 各列(縦方向)の分散を取得しています。
例:横方向(行ごと)の分散 (axis=1
)
print("横方向(行ごと)の分散:", np.var(arr, axis=1))
出力結果
[0.66666667 0.66666667 0.66666667]
→ 各行(横方向)の分散を取得しています。
例:縦方向(列ごと)の標準偏差 (axis=0
)
print("縦方向(列ごと)の標準偏差:", np.std(arr, axis=0))
出力結果
[2.44948974 2.44948974 2.44948974]
例:横方向(行ごと)の標準偏差 (axis=1
)
print("横方向(行ごと)の標準偏差:", np.std(arr, axis=1))
出力結果
[0.81649658 0.81649658 0.81649658]
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、分散と標準偏差を求める演習を行いましょう。
問題
(1) 配列 arr
の1行目の分散と標準偏差を求めましょう。
(2) 次の4つの選択肢のうち、正しい値を選びましょう。
✅ 選択肢
- 分散 =
1.16835118e+08
, 標準偏差 =1.08090295e+04
- 分散 =
1.14303921e+08
, 標準偏差 =1.06913012e+04
- 分散 =
1.71022785e+11
, 標準偏差 =4.13549012e+05
- 分散 =
9.122053392e+19
, 標準偏差 =9.55094414e+09
(正解)
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) 1行目の分散と標準偏差を求める
arr1_variance = np.var(arr[0])
arr1_std_dev = np.std(arr[0])
print("1行目の分散:", arr1_variance)
print("1行目の標準偏差:", arr1_std_dev)
出力例
1行目の分散: 9.122053392e+19
1行目の標準偏差: 9.55094414e+09
✅ 正解: 選択肢 4
まとめ
var()
を使うと、配列の分散(データのばらつき)を計算できる。std()
を使うと、標準偏差(分散の平方根)を計算できる。axis=0
を指定すると「縦方向(列ごと)」の値、axis=1
を指定すると「横方向(行ごと)」の値を計算できる。- 分散や標準偏差が大きいと、データのばらつきが大きいことを意味する。
NumPyで相関を求める
データ分析において、「あるデータと別のデータがどのように関連しているのか」を調べることは非常に重要です。その関係性を数値で示す指標が**相関係数(Correlation Coefficient)**です。
NumPyでは、corrcoef()
関数を使うことで、簡単に相関係数を求めることができます。
相関係数とは?
相関係数は、2つのデータの間にどの程度の関連があるかを示す値で、以下の範囲を取ります。 −1≤r≤1-1 \leq r \leq 1
- +1 に近い場合: 強い正の相関(片方が増えるともう片方も増える)
- -1 に近い場合: 強い負の相関(片方が増えるともう片方は減る)
- 0 に近い場合: ほとんど相関なし(2つのデータに関係がない)
例えば、次のようなデータがあるとします。
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr2 = np.array([15, 20, 40, 50, 75, 85, 95, 115, 120, 140])
この arr1
と arr2
の相関を求めると、次のようになります。
corr_matrix = np.corrcoef(arr1, arr2)
print(corr_matrix)
出力結果
[[1. 0.9952693]
[0.9952693 1. ]]
相関係数 0.9952693 は、2つのデータに非常に強い正の相関があることを示しています。
corrcoef()
関数の基本的な使い方
例:2つの配列の相関を求める
import numpy as np
arr1 = np.array([10, 20, 30, 40, 50])
arr2 = np.array([5, 15, 25, 35, 45])
# 相関係数を求める
corr = np.corrcoef(arr1, arr2)
print("相関係数:\n", corr)
出力結果
相関係数:
[[1. 1.]
[1. 1.]]
ここでは 1.0 になっており、完全に比例したデータであることがわかります。
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、相関を求める演習を行いましょう。
問題
次の4つの組み合わせのうち、最も正の相関が強いものはどれでしょう?
✅ 選択肢
arr.T[0]
、arr.T[1]
arr.T[1]
、arr.T[2]
arr.T[3]
、arr.T[4]
arr.T[0]
、arr.T[5]
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) 相関係数の計算
coef1 = np.corrcoef(arr.T[0], arr.T[1])
coef2 = np.corrcoef(arr.T[1], arr.T[2])
coef3 = np.corrcoef(arr.T[3], arr.T[4])
coef4 = np.corrcoef(arr.T[0], arr.T[5])
# (2) 結果を表示
print("arr.T[0] と arr.T[1] の相関係数:\n", coef1)
print("arr.T[1] と arr.T[2] の相関係数:\n", coef2)
print("arr.T[3] と arr.T[4] の相関係数:\n", coef3)
print("arr.T[0] と arr.T[5] の相関係数:\n", coef4)
出力例
arr.T[0] と arr.T[1] の相関係数:
[[1. 0.99928572]
[0.99928572 1. ]]
arr.T[1] と arr.T[2] の相関係数:
[[1. 0.85027381]
[0.85027381 1. ]]
arr.T[3] と arr.T[4] の相関係数:
[[1. 0.73219123]
[0.73219123 1. ]]
arr.T[0] と arr.T[5] の相関係数:
[[1. 0.43278152]
[0.43278152 1. ]]
✅ 正解: 選択肢 1 (arr.T[0]
と arr.T[1]
)
→ 相関係数 0.9993 で、非常に強い正の相関がある。
まとめ
corrcoef()
を使うと、2つのデータの相関係数を計算できる。- 相関係数は -1 から 1 の範囲を取り、1 に近いほど正の相関、-1 に近いほど負の相関、0 に近いほど相関なしを示す。
- 実データ (
data.csv
) を用いることで、どの変数同士が強く関連しているかを分析できる。
NumPyで累積和を求める
データの合計や累積的な変化を調べる際には、**累積和(Cumulative Sum)**を求めることが役立ちます。
NumPyでは、sum()
関数を使って合計を計算し、cumsum()
関数を使って累積和を求めることができます。
sum()
関数の基本的な使い方
まず、sum()
関数を使って、配列全体の合計を求めてみましょう。
import numpy as np
# 例として1次元の配列を作成
arr = np.array([1, 2, 3, 4])
# 配列全体の合計を求める
total_sum = np.sum(arr)
print("配列全体の合計:", total_sum)
出力結果
配列全体の合計: 10
cumsum()
関数の基本的な使い方
累積和とは、配列の各要素を順番に加えていった結果を示すものです。
NumPyでは cumsum()
関数を使うことで、簡単に計算できます。
# 累積和を求める
cumulative_sum = np.cumsum(arr)
print("累積和:", cumulative_sum)
出力結果
累積和: [ 1 3 6 10]
各要素が、前の要素の合計として計算されていることがわかります。
axis
を指定した累積和の計算
多次元配列の場合、axis
を指定することで行ごと・列ごとの累積和を計算できます。
例:2次元配列の累積和(axis=0
→ 縦方向)
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print("縦方向(列ごと)の累積和:\n", np.cumsum(arr_2d, axis=0))
出力結果
縦方向(列ごと)の累積和:
[[ 1 2 3]
[ 5 7 9]
[12 15 18]]
→ 縦に累積しているのがわかります。
例:2次元配列の累積和(axis=1
→ 横方向)
print("横方向(行ごと)の累積和:\n", np.cumsum(arr_2d, axis=1))
出力結果
横方向(行ごと)の累積和:
[[ 1 3 6]
[ 4 9 15]
[ 7 15 24]]
→ 横に累積しているのがわかります。
data.csv
を使った演習問題
では、実際のデータ(data.csv
)を使って、累積和を求める演習を行いましょう。
問題
(1) 配列 arr3
の合計値 arr_sum
を求めましょう。
(2) 配列 arr3
の累積和 arr_cumsum
を求め、累積和の最後の要素が合計値と一致していることを確認しましょう。
解答コード
import numpy as np
# data.csvを読み込む
arr = np.loadtxt(fname="data.csv", dtype=int, delimiter=',', skiprows=1, usecols=[1,2,3,4,5,6])
# (1) 3行目のデータを取得
arr3 = arr[2]
# (2) 配列の合計値を求める
arr_sum = np.sum(arr3)
# (3) 配列の累積和を求める
arr_cumsum = np.cumsum(arr3)
# (4) 結果を表示
print("3行目のデータ:", arr3)
print("配列の合計値:", arr_sum)
print("累積和:", arr_cumsum)
# (5) 合計値と累積和の最後の要素を比較
print("累積和の最後の値と合計値が一致:", arr_sum == arr_cumsum[-1])
出力例
3行目のデータ: [ 43940 43970 43270 43270 339900 14780670000]
配列の合計値: 14781184350
累積和: [ 43940 87910 131180 174450 514350 14781184350]
累積和の最後の値と合計値が一致: True
→ 累積和の最後の要素が合計値と一致していることが確認できました!
まとめ
sum()
を使うと、配列の合計値を計算できる。cumsum()
を使うと、配列の累積和を計算できる。axis=0
を指定すると「縦方向(列ごと)」の累積和、axis=1
を指定すると「横方向(行ごと)」の累積和を取得できる。- 累積和の最後の要素は、
sum()
で求めた合計値と一致する。
まとめ
本記事では、NumPyを使用した統計処理について学びました。データ分析を行う上で重要な以下の手法を一通り習得しました。
学んだ内容の振り返り
✅ 最大値の算出 (max()
)
.max()
を使って配列内の最大値を取得できる。axis=0
で列ごとの最大値、axis=1
で行ごとの最大値を取得できる。
✅ 最小値の算出 (min()
)
.min()
を使って配列内の最小値を取得できる。axis=0
で列ごとの最小値、axis=1
で行ごとの最小値を取得できる。
✅ 平均値と中央値の算出 (mean()
・median()
)
.mean()
で算術平均を計算できる。.median()
でデータの中央値を求めることができる。- 平均値と中央値が異なる場合、データに偏りがある可能性がある。
✅ 分散と標準偏差の算出 (var()
・std()
)
.var()
でデータのばらつきを表す分散を計算できる。.std()
で標準偏差(分散の平方根)を求めることができる。- 標準偏差が大きいほどデータのばらつきが大きいことを意味する。
✅ 相関の算出 (corrcoef()
)
.corrcoef()
で2つのデータの相関係数を求めることができる。- 相関係数が
+1
に近いと強い正の相関、-1
に近いと強い負の相関を示す。 0
に近い場合は相関がほとんどないことを意味する。
✅ 累積和の算出 (sum()
・cumsum()
)
.sum()
で配列の合計値を計算できる。.cumsum()
で累積和を求め、データの累積的な変化を分析できる。- 累積和の最後の値は
.sum()
の値と一致する。
NumPyを使った統計処理の応用例
NumPyを使った統計処理は、さまざまな分野で応用できます。
🔹 データ分析・機械学習
- 最大値・最小値を使って異常値を検出
- 平均値・中央値を使ってデータの傾向を把握
- 分散・標準偏差を用いてデータのばらつきを評価
- 相関係数を計算し、特徴量の関連性を分析
🔹 金融・経済分析
- 株価データの移動平均やボラティリティを分析
- 累積和を用いて収益や損益の推移を評価
🔹 科学・医療分野
- 実験データのばらつきを分析し、信頼性を評価
- 相関係数を用いて病気と要因の関係を解析
次に学ぶべきこと
NumPyの統計関数をマスターしたら、次のステップとして以下の内容を学ぶと良いでしょう。
📌 Matplotlib を使ったデータ可視化
- グラフやヒストグラムを作成して、データの分布を視覚的に分析する方法
📌 Pandas を使ったデータ操作
- より複雑なデータフレームを扱い、フィルタリングやグループ化を行う方法
📌 SciPy を使った高度な統計分析
- t検定や回帰分析など、より詳細な統計的手法を学ぶ
📌 機械学習ライブラリ(Scikit-learn)の活用
- NumPyの統計処理を活かして、データを前処理し、機械学習モデルを構築する方法
まとめと今後のステップ
この記事では、NumPyを使った統計処理の基礎を詳しく学びました。これらの知識を活用すれば、データの特徴を素早く把握し、データ分析や機械学習の前処理に役立てることができます。
ぜひ、実際のデータを使って、さまざまな統計処理を試してみてください!
コメント