Menskalakan distribusi normal dengan Python

Sep 17 2020

Saya ingin memplot histogram untuk distribusi normal dan juga memplot distribusi normal yang sesuai di atasnya. Ada beberapa contoh yang tersedia online mengenai distribusi normal dengan sumbu y yang dinormalisasi dengan density=True. Dalam contoh saya, saya mencoba membentuk kurva distribusi normal tanpa normalisasi tipe kepadatan. Mungkin, ini bisa menjadi pertanyaan matematika secara implisit tetapi saya tidak dapat menemukan cara untuk "menormalkan" kurva distribusi. Berikut adalah kode saya:

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

mu = 1e-3
std = 1.0e-4
nsize = 10000
ymax = 5000

# Generate some data for this demonstration.
data = norm.rvs(mu, std, size=nsize)

# Plot the histogram.
plt.hist(data, bins=20, color='b', edgecolor='black')

# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)                      # something to do with this line
plt.plot(x, p, 'k', linewidth=2)
plt.axvline(mu, linestyle='dashed', color='black')
plt.ylim([0, ymax])

Ini menghasilkan plot berikut.

Seperti yang bisa dilihat, area di bawah histogram akan sama dengan 10000 ( nsize) yang merupakan jumlah titik data. Namun, tidak demikian halnya dengan "kurva distribusi". Bagaimana cara mendapatkan kurva yang cocok dengan histogram?

Jawaban

4 QuangHoang Sep 17 2020 at 10:15

Sepertinya pltpengembalian histyang totalnya menjadi nsize. Jadi kita bisa menskalakan p:

# Plot the histogram.
hist, bins, _ = plt.hist(data, bins=20, color='b', edgecolor='black')

# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()

# changes here
p = norm.pdf(bins, mu, std)           
plt.plot(bins, p/p.sum() * nsize , 'r', linewidth=2)

Keluaran: