Cách vẽ biểu đồ phân phối xác suất trong Python

Trong bài đăng này, tôi sẽ chỉ cho bạn cách làm việc với phân phối xác suất bằng cách sử dụng

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
5. Chúng tôi sẽ bắt đầu bằng cách nhập các gói có liên quan

import scipy.stats as stats
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

Mô-đun

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
6 của
normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
7 cung cấp nhiều bản phân phối để bạn nhất định tìm thấy những gì bạn đang tìm kiếm. Chúng được tổ chức thành ba loại. Liên tục, rời rạc và đa biến. Đây là danh sách đầy đủ. Trong bài đăng trên blog này, chúng tôi sẽ tập trung vào (hai) phân phối liên tục và (hai) phân phối rời rạc

Phân phối liên tục

Chúng ta sẽ bắt đầu với bản phân phối được cho là nổi tiếng nhất. Phân phối bình thường (Gaussian)

Chúng ta bắt đầu với việc tạo một thể hiện của lớp

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
8 và khởi tạo đối tượng này để có giá trị trung bình là 100 và độ lệch chuẩn là 15

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
9

Tiếp theo, chúng ta có thể tạo một mẫu ngẫu nhiên bằng cách gọi phương thức

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
0 trên đối tượng này để tạo 10 số ngẫu nhiên

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
1 chỉ để kết quả có thể lặp lại được. Nếu bạn bao gồm điều này, kết quả này sẽ luôn giống nhau. Nếu bạn muốn lặp lại và nhận được kết quả khác, chỉ cần bỏ qua phần này để mã của bạn đọc là
normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
2

Điều đó thật dễ dàng. Bây giờ kẻo tạo ra 1000 số ngẫu nhiên từ phân phối này và tạo biểu đồ

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()

Đây là kết quả

Biểu đồ gồm 1000 số ngẫu nhiên được tạo từ phân phối chuẩn

Bây giờ hãy tập trung vào PDF, hàm mật độ xác suất. Sử dụng cùng một đối tượng (phân phối) mà chúng tôi đã tạo, chúng tôi có thể truy cập PDF thông qua phương thức

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
3. Đối số đầu tiên có thể là vô hướng của một mảng giá trị

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]

Tiếp theo, hãy xem cách vẽ đồ thị PDF. Đầu tiên tạo một số giá trị cho trục hoành. Chúng tôi sẽ sử dụng

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
4 để tạo ra các số ____6_______5 cách đều nhau giữa ____6_______6 và ____6_______7. Các giá trị có liên quan cho trường hợp của chúng tôi dường như nằm trong khoảng từ 50 đến 150.
normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
8. Chúng sẽ đóng vai trò là giá trị ngang (x) cho cốt truyện

Để có được các giá trị dọc (y), chúng ta có thể tính toán PDF trên các giá trị này.

normal_sample = normal.rvs(size=1000,random_state=123)
plt.hist(normal_sample,density=True,label="Sample")
plt.title("Normal Distribution")
plt.ylabel("Density")
plt.legend()
plt.show()
9. Dưới đây, chúng tôi có mã kết hợp tất cả những thứ này lại với nhau và cung cấp cho chúng tôi một biểu đồ PDF bình thường

t = np.linspace(50,150,100)
plt.plot(t,normal.pdf(t),label="PDF")
plt.legend()
plt.show()

Một cốt truyện của một PDF bình thường

Cuối cùng, chúng ta có thể phủ biểu đồ này lên trên biểu đồ để xem trình tạo số ngẫu nhiên đã hoạt động tốt như thế nào

Biểu đồ của một mẫu từ phân phối chuẩn và biểu đồ tương ứng của PDF

Điều đó có vẻ khá tốt

Một bản phân phối phổ biến khác là bản phân phối Beta. Đây cũng là một phân phối liên tục và được sử dụng để mô hình hóa các biến ngẫu nhiên trong khoảng từ 0 đến 1. Vì vậy, ví dụ, nếu biến ngẫu nhiên là xác suất thành công, thì đây có thể là một phân phối tốt để sử dụng. Bản phân phối Beta có hai tham số, a và b. Do đó, để tạo một đối tượng phân phối beta trong

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
0, chúng tôi đặt
print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
1. Mã bên dưới tạo một mẫu ngẫu nhiên từ phân phối này

beta=stats.beta(a=2,b=5)
beta.rvs(size=5,random_state=133)
>>array([0.13580999, 0.55628319, 0.39061464, 0.51549706, 0.3439727 ])

Như trước đây, hãy lấy 1000 số từ phân phối này, tạo biểu đồ và phủ tệp PDF của nó

beta_sample=beta.rvs(size=1000,random_state=133)
t=np.linspace(0,1,100)
plt.hist(beta_sample,density=True,label="Sample")
plt.plot(t,beta.pdf(t),label="PDF")
plt.legend()
plt.ylabel("Density")
plt.title("Beta Distribution")
plt.savefig("beta_hist_pdf.png")
plt.show()

Biểu đồ của một mẫu từ bản phân phối beta và biểu đồ tương ứng của PDF

Phân phối rời rạc

Đôi khi, chúng ta cần làm việc với các bản phân phối rời rạc. Chúng tôi sẽ chứng minh hai. Nhị thức và Poisson. Phân phối nhị thức được sử dụng để mô hình hóa số lần thành công với thử nghiệm lặp lại trong đó mỗi thử nghiệm có thể dẫn đến “thành công” hoặc “thất bại”, xác suất thành công không đổi từ thử nghiệm này sang thử nghiệm khác, các thử nghiệm độc lập với nhau và . Một ví dụ điển hình là số lần tung đồng xu cố định. Đây là cách chúng tôi lấy các đối tượng phân phối nhị thức trong

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
0 và tạo một số số ngẫu nhiên

binomial=stats.binom(n=10,p=0.4)
binomial.rvs(size=10,random_state=143)
>> array([5, 3, 4, 4, 4, 6, 1, 1, 3, 2])

Hãy nhớ rằng một bản phân phối rời rạc không có PDF. Hàm tương ứng là Hàm khối lượng xác suất hoặc PMF. Trong

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
0, chúng ta có thể truy cập chức năng này cho một đối tượng phân phối như sau.
print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
4. Giống như đối với PDF, chúng ta có thể tính toán PMF của một số hoặc cho một danh sách các số

binomial.pmf(2)
binomial.pmf([2,3,4])
>>> 0.12093235199999994
>>> [0.12093235 0.21499085 0.25082266]

Tiếp theo, hãy vẽ sơ đồ PMF. Vì nó rời rạc nên chúng ta sẽ sử dụng

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
5 thay vì
print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
6. Ngoài ra, PMF bằng 0 ngoại trừ sự hỗ trợ của phân phối này xảy ra là 0, 1, 2, …, 10. Thay vì
print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
7 được sử dụng để tạo các số từ một phạm vi liên tục, chúng tôi sẽ sử dụng
print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
8 để tạo các giá trị theo một tập hợp rời rạc. Đối với chúng tôi, đây sẽ là

t=np.arange(0,11)
t
>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

Lưu ý cách chúng ta phải đặt

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
9 thay vì
t = np.linspace(50,150,100)
plt.plot(t,normal.pdf(t),label="PDF")
plt.legend()
plt.show()
0 vì nó không trả về số cuối cùng. Bây giờ, bằng cách sử dụng các giá trị này, chúng ta có thể vẽ đồ thị PMF của phân phối nhị thức của chúng ta

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
0

Biểu đồ PMF của phân phối nhị thức

Bây giờ chúng tôi sẽ tạo 1000 số ngẫu nhiên từ phân phối này

t = np.linspace(50,150,100)
plt.plot(t,normal.pdf(t),label="PDF")
plt.legend()
plt.show()
1và tạo một biểu đồ. Vì chúng tôi đang xử lý các số rời rạc, chúng tôi phải thêm một số tùy chọn để kiểm soát cách tính toán biểu đồ

  • t = np.linspace(50,150,100)
    plt.plot(t,normal.pdf(t),label="PDF")
    plt.legend()
    plt.show()
    2 để đảm bảo chúng ta có 11 ngăn, mỗi ngăn cho một số 0,1,…,10
  • t = np.linspace(50,150,100)
    plt.plot(t,normal.pdf(t),label="PDF")
    plt.legend()
    plt.show()
    3 để đảm bảo các lớp tương ứng là [0,1), [1,2), …, [10,11)
  • t = np.linspace(50,150,100)
    plt.plot(t,normal.pdf(t),label="PDF")
    plt.legend()
    plt.show()
    4 để đảm bảo rằng thanh được căn chỉnh với PMF (bạn sẽ thấy lý do tại sao sau này khi chúng tôi phủ lên mọi thứ
  • t = np.linspace(50,150,100)
    plt.plot(t,normal.pdf(t),label="PDF")
    plt.legend()
    plt.show()
    5 vì vậy các thanh của biểu đồ là 75% chiều rộng của lớp. Điều này sẽ đảm bảo rằng các thanh không chạm vào nhau để thông báo rằng chúng tôi đang làm việc với dữ liệu rời rạc
  • t = np.linspace(50,150,100)
    plt.plot(t,normal.pdf(t),label="PDF")
    plt.legend()
    plt.show()
    6 để các thanh ở dạng bán trong suốt để lớp phủ trông đẹp mắt

Đây là mã đầy đủ

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
1

Biểu đồ của 1000 số ngẫu nhiên từ phân phối nhị thức

Cuối cùng, đây là mã đặt PMF và biểu đồ cùng nhau

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
2

Biểu đồ của một mẫu ngẫu nhiên từ phân phối nhị thức và biểu đồ của PMF liên quan

Phân phối Poisson cũng được sử dụng rất phổ biến trong thực tế. Nó được sử dụng để mô hình hóa số lượng các sự kiện (chẳng hạn như tai nạn xe hơi) xảy ra trong một khoảng thời gian (hoặc không gian) cố định. Các giá trị mà biến ngẫu nhiên này có thể nhận là 0,1,2,… (nó kéo dài mãi mãi). Trong

print(normal.pdf(120))
print(normal.pdf([120,130,140]))
>> 0.010934004978399577
>> [0.010934 0.0035994 0.00075973]
0, chúng ta có thể thiết lập một đối tượng phân phối Poisson bằng cách
t = np.linspace(50,150,100)
plt.plot(t,normal.pdf(t),label="PDF")
plt.legend()
plt.show()
8. Tạo số ngẫu nhiên giống như các bản phân phối khác

normal.rvs(size=10,random_state=143)
>> array([ 87.50268488, 118.56536514, 62.86403442, 84.42053641,
114.91967271, 102.67337385, 92.6638058 , 93.36867073,
96.22587266, 92.97029531])
3

Dựa trên mọi thứ chúng tôi đã thực hiện ở trên, chúng tôi có thể tạo 1000 số ngẫu nhiên từ phân phối này, vẽ biểu đồ và PMF cùng nhau trên cùng một biểu đồ. Cố gắng tự làm điều này trước khi xem mã bên dưới. Để khuyến khích bạn, trước tiên tôi sẽ hiển thị kết quả cuối cùng và sau đó là mã

Biểu đồ của một mẫu ngẫu nhiên từ phân phối Poisson và đồ thị của PMF liên quan_______0_______4

Một phần khó khăn ở đây là vì sự hỗ trợ của biến ngẫu nhiên Poisson không có điểm kết thúc, chúng ta phải quyết định nơi dừng tính toán. Đối với chúng tôi, đây sẽ là giá trị lớn nhất của dữ liệu mẫu của chúng tôi;

Phân phối xác suất trong Python là gì?

Phân phối xác suất mô tả xác suất của các giá trị mà một biến ngẫu nhiên có thể nhận . Đây là một khái niệm quan trọng trong thống kê và lý thuyết xác suất, và mọi cuốn sách về chủ đề này đều thảo luận về phân phối xác suất cùng với các thuộc tính của chúng.

Đồ thị phân phối xác suất là gì?

Về mặt đồ họa, hàm phân phối xác suất được biểu thị bằng biểu đồ thanh , với trục x biểu thị các giá trị mà biến ngẫu nhiên có thể nhận .