Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで実現するデータ平滑化:ビニング(ビン分割)手法の基本と実装

統計分析を正確かつ定性的に行うためには、データの品質を整えることが重要です。そのために広く使われているのが「データ平滑化」という手法です。データ平滑化の過程では、あらかじめ範囲(ビン)を定義し、その範囲に含まれるすべてのデータ値を対応するビンへ振り分けます。この方法はビニング(ビン分割)と呼ばれます。

本記事では、まずビニングの具体的な例を確認し、その後、Pythonプログラムを使ってビニングを実現する方法を解説します。

ビニングの基本例

一連の数値データを例に考えてみましょう。手順は以下の通りです。

  1. データ列の中から最大値最小値を見つける
  2. 分析に必要なデータポイントの数に応じて、ビンの数を決める
  3. グループ(ビン)を作成し、各数値を該当するビンに割り当てる

なお、各ビンの上限値は除外され、次のビンに属する点に注意してください。

具体例

与えられた数値: 12, 32, 10, 17, 19, 28, 22, 26, 29, 16
グループ数: 4

最大値: 32
最小値: 10

したがって、グループは以下のようになります –
(10-15), (15-21), (21-27), (27-32)

出力結果

各数値をビンに振り分けると、次のような結果が得られます −

12 -> (10-15)
32 -> (27-32)
10 -> (10-15)
17 -> (15-21)
19 -> (15-21)
28 -> (27-32)
22 -> (21-27)
26 -> (21-27)
29 -> (27-32)
16 -> (15-21)

Pythonによるビニングプログラム

このプログラムでは、2つの関数を定義します。

  • 1つ目の関数:下限値と幅を指定してビンを作成する関数
  • 2つ目の関数:入力値をそれぞれのビンに割り当てる関数

各ビンにはインデックス(番号)が付与され、どの入力値がどのビンに属するかを判定するとともに、特定のビンにいくつの値が含まれるかも集計します。

サンプルコード

from collections import Counter
def Binning_method(lower_bound, width, quantity):
    binning = []
    for low in range(lower_bound, lower_bound + quantity * width + 1, width):
        binning.append((low, low + width))
    return binning
def bin_assign(v, b):
    for i in range(0, len(b)):
        if b[i][0] <= v < b[i][1]:
            return i
the_bins = Binning_method(lower_bound=50,
    width=4,
    quantity=10)
print("The Bins: \n",the_bins)
weights_of_objects = [89.2, 57.2, 63.4, 84.6, 90.2, 60.3,88.7, 65.2, 79.8, 80.2, 93.5, 79.3,72.5, 59.2, 77.2, 67.0, 88.2, 73.5]
print("\nBinned Values:\n")
binned_weight = []
for val in weights_of_objects:
    index = bin_assign(val, the_bins)
    #print(val, index, binning[index])
    print(val,"-with index-", index,":", the_bins[index])
    binned_weight.append(index)
freq = Counter(binned_weight)
print("\nCount of values in each index: ")
print(freq)

実行結果

上記のコードを実行すると、以下の結果が出力されます −

The Bins:
    [(50, 54), (54, 58), (58, 62), (62, 66), (66, 70), (70, 74), (74, 78), (78, 82), (82, 86), (86, 90), (90, 94)]
Binned Values:
89.2 -with index- 9 : (86, 90)
57.2 -with index- 1 : (54, 58)
63.4 -with index- 3 : (62, 66)
84.6 -with index- 8 : (82, 86)
90.2 -with index- 10 : (90, 94)
60.3 -with index- 2 : (58, 62)
88.7 -with index- 9 : (86, 90)
65.2 -with index- 3 : (62, 66)
79.8 -with index- 7 : (78, 82)
80.2 -with index- 7 : (78, 82)
93.5 -with index- 10 : (90, 94)
79.3 -with index- 7 : (78, 82)
72.5 -with index- 5 : (70, 74)
59.2 -with index- 2 : (58, 62)
77.2 -with index- 6 : (74, 78)
67.0 -with index- 4 : (66, 70)
88.2 -with index- 9 : (86, 90)
73.5 -with index- 5 : (70, 74)
Count of values in each index:
Counter({9: 3, 7: 3, 3: 2, 10: 2, 2: 2, 5: 2, 1: 1, 8: 1, 6: 1, 4: 1})

まとめ

このように、ビニング手法を活用することで、連続的な数値データを整理された区間ごとに分類でき、ヒストグラムの作成やノイズ除去など、統計分析の前処理として非常に有用です。Pythonでは標準ライブラリのみでも簡単に実装できるため、ぜひ実際のデータ分析に取り入れてみてください。

  1. Pythonで身につける統計的思考 ― グラフとチャートによるデータ分析入門

    統計学は、機械学習(ML)やAIを学ぶうえで欠かせない基礎知識です。これらの技術分野ではPythonが事実上の標準言語となっているため、統計分析を取り入れたPythonプログラムの書き方をマスターすることが重要になります。本記事では、さまざまなPythonライブラリを活用してグラフやチャートを作成する方法を解説します。多様なチャートを使いこなせるようになると、データを素早く分析し、結論を視覚的に導き出せるようになります。 データの準備 ここでは、さまざまな種子(シード)に関するデータを含むデータセットを使用します。このデータセットはKaggleから入手でき、URLは後述のサンプルコード内に記載

  2. Pythonで国勢調査データを分析する方法|インドの人口統計データを可視化してみよう

    国勢調査(センサス)とは、特定の対象人口に関する情報を体系的に記録・収集する取り組みです。収集されるデータには、人口統計、経済状況、居住環境など、さまざまなカテゴリの情報が含まれています。これらのデータは、政府が現状を正確に把握し、将来に向けた政策立案を行ううえで重要な基礎資料となります。本記事では、Pythonを活用してインドの国勢調査データを分析する方法を解説します。人口動態や経済指標など複数の観点からデータを掘り下げ、その結果をグラフとして視覚的に表現します。使用するデータセットはKaggleから入手した「India Districts Census 2011」です。データの準備と読み込