Python의 다양한 데이터 세트에 푸아송 분포 맞추기

Jay Shaw 2024년2월15일
  1. Python의 다양한 데이터 세트에 푸아송 분포 맞추기
  2. 파이썬에서 푸아송 분포를 맞추는 Binned Least Squares 방법
  3. 과도하게 분산된 데이터 세트에 대해 포아송 분포를 맞추기 위해 음이항 사용
  4. 음이항식을 사용한 고도로 분산된 데이터에 대한 포아송 분포
  5. 결론
Python의 다양한 데이터 세트에 푸아송 분포 맞추기

푸아송 확률 분포는 고정된 기간 또는 공간에서 이벤트가 발생할 확률을 보여줍니다. 이 데이터는 이벤트 발생률을 관찰하기 위해 Python을 사용하여 히스토그램으로 그릴 수 있습니다.

분포는 데이터 세트에 가장 적합한 곡선을 찾기 위해 히스토그램 또는 기타 구조에 그릴 수 있는 곡선입니다. 이 기사에서는 Python을 사용하여 데이터 세트에 푸아송 분포를 맞추는 방법을 알려줍니다.

Python의 다양한 데이터 세트에 푸아송 분포 맞추기

SciPy 및 Python을 사용하여 데이터 집합에 여러 분포를 플로팅하고 푸아송 분포를 맞추는 방법을 이해해 보겠습니다.

파이썬에서 푸아송 분포를 맞추는 Binned Least Squares 방법

이 예에서는 더미 포아송 데이터 세트가 생성되고 이 데이터로 히스토그램이 그려집니다. 히스토그램이 그려진 후 비닝된 최소 제곱법은 푸아송 분포에 맞게 히스토그램에 곡선을 맞춥니다.

프로그램의 가져오기 기능

이 프로그램은 다음 가져오기 기능을 사용합니다.

  1. Matplotlib의 수학적 암 - Numpy.
  2. 차트를 그리기 위한 Matplotlib 하위 라이브러리 Pyplot.
  3. 곡선 적합을 가져오기 위한 SciPy curve_fit.
  4. 데이터 세트에 대한 포아송.

푸아송 분포를 위한 더미 데이터 세트를 만들고 데이터 세트로 히스토그램을 플로팅합니다.

변수 dataset_sizenp.random.poisson() 함수를 사용하여 4-20,000 범위 내에서 푸아송 편차 숫자로 생성됩니다. 임의의 포아송 값이 있는 배열을 반환합니다.

data_set = np.random.poisson(4, 2000)

히스토그램 데이터의 차이는 새 변수 bins에 저장됩니다. np.arrange() 함수를 사용하여 0.5에서 20 범위 사이의 값을 가진 배열을 반환하고 0.5를 평균 차이로 반환합니다.

bins = np.arange(20) - 0.5

히스토그램은 plt.hist() 함수를 사용하여 플롯되며 여기서 매개변수는 다음과 같습니다.

  1. 사용된 데이터에 대한 data_set.
  2. 차이점에 대한 bins.
  3. true로 설정된 density.
  4. 플롯에 레이블을 추가하는 레이블.

히스토그램이 그려지는 동안 세 개의 값이 plt.hist() 함수에서 반환되며 세 개의 새 변수에 저장됩니다. entries는 히스토그램 빈 값, bin_edges는 빈 가장자리, patches입니다. 히스토그램의 개별 패치용.

entries, bin_edges, patches = plt.hist(data_set, bins=bins, density=True, label="Data")

곡선 맞춤을 사용하여 곡선을 히스토그램에 맞춤

히스토그램이 그려지면 곡선 맞춤 기능을 사용하여 푸아송 분포를 데이터에 맞춥니다. 곡선 함수는 분산된 데이터 세트에서 가장 적합한 선을 플로팅합니다.

곡선 맞춤에는 값 배열을 포아송 분포로 변환하고 곡선을 그릴 매개변수로 반환하는 맞춤 함수가 필요합니다. 메소드 fit_functionkparameters라는 두 개의 매개변수를 사용하여 생성됩니다.

SciPy 라이브러리 poisson.pmf는 매개변수를 가져오는 데 사용됩니다. pmf는 확률 질량 함수를 나타내며 이 함수는 임의 분포의 빈도를 반환합니다.

변수 k는 이벤트가 발생한 횟수를 저장하고 변수 lamb는 곡선 함수의 적합 매개변수로 사용되는 popt(감소된 제곱의 합)입니다.

SciPy curve_fit 함수는 fit_function, middle_binsentries의 세 가지 매개변수를 사용하고 매개변수(제곱 잔차의 합을 줄이는 최적 값) 및 cov_matrix(매개변수 추정 공분산).

parameters, cov_matrix = curve_fit(fit_function, middles_bins, entries)

곡선을 그리기 위해 15개의 오름차순 값의 데이터 세트가 생성되고 이러한 오름차순 값의 포아송 분포는 fit_function 방법을 사용하여 피팅됩니다. 플롯의 속성이 제공되고 결과가 표시됩니다.

x_plot = np.arange(0, 15)

plt.plot(
    x_plot,
    fit_function(x_plot, *parameters),
    marker="D",
    linestyle="-",
    color="red",
    label="Fit result",
)

완전한 코드:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.stats import poisson

# get random numbers that are poisson deviated
data_set = np.random.poisson(4, 2000)

# the bins have to be kept as a positive integer because poisson is a positive integer distribution
bins = np.arange(20) - 0.5
entries, bin_edges, patches = plt.hist(data_set, bins=bins, density=True, label="Data")

# calculate bin centers
middles_bins = (bin_edges[1:] + bin_edges[:-1]) * 0.5


def fit_function(k, lamb):
    # The parameter lamb will be used as the fit parameter
    return poisson.pmf(k, lamb)


# fit with curve_fit
parameters, cov_matrix = curve_fit(fit_function, middles_bins, entries)

# plot poisson-deviation with fitted parameter
x_plot = np.arange(0, 15)

plt.plot(
    x_plot,
    fit_function(x_plot, *parameters),
    marker="D",
    linestyle="-",
    color="red",
    label="Fit result",
)
plt.legend()
plt.show()

출력:

푸아송 분포에 맞추기 위한 Binned Least Squares 방법

과도하게 분산된 데이터 세트에 대해 포아송 분포를 맞추기 위해 음이항 사용

이 예제에서는 고도로 분산된 데이터로 푸아송 분포 데이터 프레임을 만들고 이 데이터에 푸아송 분포를 맞추는 방법을 알아봅니다.

포아송 분포가 평균을 중심으로 한 마지막 예와 달리 이 데이터는 고도로 분산되어 있으므로 포아송 분포를 개선하기 위해 다음 섹션에서 이 데이터에 음의 이항을 추가합니다.

데이터 세트 만들기

이 예에서는 Pandas 데이터 프레임이 생성되어 변수 dataset에 저장됩니다. 이 데이터 세트에는 2000 푸아송 값과 200으로 설정된 람다 값이 있는 Occurrence 열이 있습니다.

dataset = pd.DataFrame({"Occurrence": np.random.poisson(200, 2000)})

데이터 세트로 히스토그램 플로팅

히스토그램을 플로팅하려면 빈 간격(값 버킷), 빈의 시작 및 빈의 끝이라는 세 가지 값을 제공해야 합니다. 이것은 다음에 의해 수행됩니다.

width_of_bin = 15
xstart = 150
xend = 280
bins = np.arange(xstart, xend, width_of_bin)

빈 값이 설정되면 히스토그램을 플로팅합니다.

hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)

푸아송 분포 곡선을 히스토그램에 맞추기

분포 곡선을 플로팅하여 포아송 분포에 맞추려면 데이터 세트의 평균과 크기가 필요합니다. 두 개의 새 변수인 mun에서 각각 데이터 세트의 평균과 크기가 저장됩니다.

푸아송 분포 곡선을 그리는 알고리즘은 다음과 같습니다.

bins + width_of_bin / 2, n * (
    poisson.cdf(bins + width_of_bin, mu) - poisson.cdf(bins, mu)
)

마지막으로 곡선이 히스토그램에 표시됩니다.

완전한 코드:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import poisson

dataset = pd.DataFrame({"Occurrence": np.random.poisson(200, 2000)})

width_of_bin = 15
xstart = 150
xend = 280
bins = np.arange(xstart, xend, width_of_bin)

hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)
mu = dataset["Occurrence"].mean()
n = len(dataset)
plt.plot(
    bins + width_of_bin / 2,
    n * (poisson.cdf(bins + width_of_bin, mu) - poisson.cdf(bins, mu)),
    color="red",
)
plt.show()

출력:

음이항을 사용하여 과도하게 분산된 데이터 세트에 푸아송 분포를 맞춥니다

음이항식을 사용한 고도로 분산된 데이터에 대한 포아송 분포

앞서 언급했듯이 이 데이터 세트 내부의 데이터는 과도하게 분산되어 있기 때문에 곡선이 포아송 분포 곡선과 완벽하게 유사하지 않습니다. 푸아송 분포에 맞추기 위해 아래 예에서 음의 이항이 사용됩니다.

데이터 세트는 음의 이항을 주입하여 생성됩니다.

dataset = pd.DataFrame({"Occurrence": nbinom.rvs(n=1, p=0.004, size=2000)})

히스토그램의 빈은 0에서 시작하여 100의 공통 간격으로 2000에서 끝납니다.

binwidth = 100
xstart = 0
xend = 2000
bins = np.arange(xstart, xend, binwidth)

빈과 데이터 세트가 생성된 후 히스토그램이 그려집니다.

hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)

곡선에는 분산(Var), 평균(mu), p(평균/분산), r(고려할 항목) 및 n(데이터 집합의 총 항목)의 5개 매개 변수가 필요합니다.

분산 및 평균은 분산mu의 두 변수에서 계산됩니다.

Var = dataset["Occurrence"].var()
mu = dataset["Occurrence"].mean()

다음 공식은 pr을 찾는 데 사용됩니다.

p = mu / Var
r = mu ** 2 / (Var - mu)

총 항목 수는 새 변수 n에 데이터 세트의 길이를 저장하여 저장됩니다.

n = len(dataset)

마지막으로 곡선이 히스토그램에 표시됩니다.

plt.plot(
    bins + binwidth / 2,
    n * (nbinom.cdf(bins + binwidth, r, p) - nbinom.cdf(bins, r, p)),
)

완전한 코드:

import numpy as np
from scipy.stats import nbinom
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

dataset = pd.DataFrame({"Occurrence": nbinom.rvs(n=1, p=0.004, size=2000)})

binwidth = 100
xstart = 0
xend = 2000
bins = np.arange(xstart, xend, binwidth)

hist = sns.histplot(data=dataset["Occurrence"], kde=True, bins=bins)

Var = dataset["Occurrence"].var()
mu = dataset["Occurrence"].mean()
p = mu / Var
r = mu ** 2 / (Var - mu)
n = len(dataset)

plt.plot(
    bins + binwidth / 2,
    n * (nbinom.cdf(bins + binwidth, r, p) - nbinom.cdf(bins, r, p)),
    color="red",
)
plt.show()

출력:

음 이항을 사용하여 고도로 분산된 데이터에 대한 푸아송 분포

결론

이 문서에서는 푸아송 분포를 Python의 데이터 세트에 맞추는 세 가지 방법을 설명합니다. 기사를 읽은 후 독자는 더미 푸아송 데이터 세트와 과도하게 분산된 데이터 세트에 대해 푸아송 분포를 맞출 수 있습니다.

관련 문장 - Python Math