Python で SciPy、NumPy、Pandas を使用してデータをビン化する

Zeeshan Afridi 2023年10月8日
  1. Python でのビニング
  2. データビニングの重要性
  3. Python でデータをビン化するさまざまな方法
Python で SciPy、NumPy、Pandas を使用してデータをビン化する

データとユースケースが指数関数的に増加するにつれて、このデータを理解するためにデータのビニングまたは分類が必要になります。

データ ビニングに関しては、データ クラスタリングや回帰分析などのより古典的な統計手法など、さまざまな手法を利用できます。

なぜデータ ビニングが必要なのか、どの手法がどのコンテキストに最も適しているのかを見ていきます。

Python でのビニング

ビニングは、さまざまな変数の関係を推測するための最も強力な分析手法の 1つです。

ビニングは、変数をさまざまなセットに分類してパターンと傾向を明らかにする、ノンパラメトリックで柔軟性の高い手法です。 さまざまなデータセットや小さなサンプル サイズに広く適用できます。

ビニングは、データをビンにグループ化するプロセスです。 データ ポイントを範囲別にグループ化する、データ ポイントを密度別にグループ化する、データ ポイントを類似度別にグループ化するなど、さまざまな目的で使用できます。

numpy.digitize() 関数、pandas.cut() 関数の使用、scipy.stats.binned_statistic() 関数の使用など、Python でデータをビン化するさまざまな方法があります。

どの方法にも長所と短所があるため、タスクに適した方法を選択することが不可欠です。

データビニングの重要性

データ ビニングは単純な概念であり、より簡単な分析のためにデータを分類します。 たとえば、CSV にいくつかの大きなデータ テーブルがあり、データを小さなチャンクに分割したい場合があります。

データ ビニングを使用すると、データをさまざまなグループに分けて、より適切に分析できるようになります。また、これを使用してきれいな視覚化を作成することもできます。

では、なぜデータ ビニングが必要なのでしょうか。 まず、データ ビニングは、データをより適切に分析するのに役立つため、不可欠です。 たとえば、データ テーブル全体を、理解しやすく視覚化しやすい小さなチャンクに分割できます。

データ ビニングは、データ内のパターンを見つけるのに役立ち、外れ値を簡単に特定できます。 これにより、大量のデータセットを取得して、問題の本質に到達するための管理を容易にすることができます.

データ ビニングは、連続変数を離散ビンに分割するプロセスです。 大まかな例として、患者の体温変数がある場合、体温を 5つのビンに分けることができます (たとえば、< 36.5, 36.5–37.5, 37.5–38.5, 38.5–39.5 and > 39.5)。

この利点は、ビンの範囲を使用してヒストグラムまたは箱ひげ図で変数を視覚化できることです。

Python でデータをビン化するさまざまな方法

Python でデータをビン化する方法はいくつかありますが、SciPy および NumPy ライブラリを使用するのがおそらく最も効率的です。

SciPyNumPy を使用して Python でデータをビン化する

SciPyNumPy から始めるために、ビンに入れたいデータポイントのリストがあるとしましょう。 最初のステップは、SciPy および NumPy ライブラリをインポートすることです。

import numpy as np
import scipy as sp

次に、ビンのエッジを定義する必要があります。 linspace 関数を使用して実行できます。

bin_edges = np.linspace(start, stop, num=num_bins)

startstop はそれぞれデータの最小値と最大値で、num_bins は作成するビンの数です。 最後に、SciPy ヒストグラム関数を使用してデータをビン化できます。

binned_data = sp.histogram(data, bin_edges)

binned_data 変数には、2つの要素を持つタプルが含まれます。 最初の要素はビン分割されたデータの配列で、2 番目の要素はビンのエッジの配列です。

Numpy を使用して Python でデータをビン化する

コード例:

# import Numpy library
import numpy

# define the edges of bin
data = numpy.random.random(100)
bins = numpy.linspace(0, 1, 10)

# finally, bin the data using numpy
digitized = numpy.digitize(data, bins)
bin_means = [data[digitized == i].mean() for i in range(1, len(bins))]
bins = numpy.linspace(0, 1, 10)

digitized = numpy.digitize(data, bins)
[data[digitized == i].mean() for i in range(1, len(bins))]

出力:

[0.05308461260140375,
 0.16559348769870028,
 0.28950800899648155,
 0.3874228665181473,
 0.5046647094141071,
 0.6254841134474202,
 0.7216935463408317,
 0.8374773268113803,
 0.9421576008815353]

Pandas を使用して Python でデータをビン化する

コード例:

# import libraries
import numpy as np
import pandas

df = pandas.DataFrame({"a": np.random.random(100), "b": np.random.random(100) + 10})

# will Bin the data frame by "a" in 10 bins
bins = np.linspace(df.a.min(), df.a.max(), 10)
groups = df.groupby(pandas.cut(df.a, bins))

# Get the b mean that the values will bin
print(groups.mean().b)

出力:

a
(0.00762, 0.117]    10.576639
(0.117, 0.226]      10.319629
(0.226, 0.335]      10.633805
(0.335, 0.444]      10.404979
(0.444, 0.553]      10.551616
(0.553, 0.662]      10.420306
(0.662, 0.771]      10.434091
(0.771, 0.88]       10.402038
(0.88, 0.989]       10.537547
Name: b, dtype: float64

SciPy を使用して Python でデータをビン化する

コード例:

# import libraries
import numpy as np
from scipy import stats

# define array
arr = [20, 2, 7, 1, 34]
print("\narr : \n", arr)

# start binning
print(
    "\nbinned_statistic for median : \n",
    stats.binned_statistic(arr, np.arange(5), statistic="median", bins=4),
)

出力:

Array = [20, 2, 7, 1, 34]

Binned statistics for median

BinnedStatisticResult(statistic=array([ 2., nan,  0.,  4.]), bin_edges=array([ 1.  ,  9.25, 17.5 , 25.75, 34.  ]), binnumber=array([3, 1, 1, 1, 4], dtype=int64))
著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn