
5 thủ thuật Scipy.stats để mô phỏng các kịch bản "Điều gì sẽ xảy ra nếu"
Trong bài viết này, chúng ta sẽ tìm hiểu sâu về scipy.stats, khám phá năm thủ thuật thiết yếu để thiết kế các mô phỏng hiệu suất cao, chặt chẽ chỉ bằng NumPy và SciPy.
5 thủ thuật Scipy.stats để mô phỏng các kịch bản "Điều gì sẽ xảy ra nếu" - KDnuggets
Blog
Bài viết hàng đầu
Giới thiệu
Chủ đề
AI
Lời khuyên nghề nghiệp
Thị giác máy tính
Kỹ thuật dữ liệu
Khoa học dữ liệu
Mô hình ngôn ngữ
Học máy
MLOps
NLP
Lập trình
Python
SQL
Bộ dữ liệu
Sự kiện
Tài nguyên
Tài liệu tham khảo nhanh
Đề xuất
Báo cáo công nghệ
Quảng cáo
Tham gia bản tin
5 thủ thuật Scipy.stats để mô phỏng các kịch bản "Điều gì sẽ xảy ra nếu"
Trong bài viết này, chúng ta sẽ tìm hiểu sâu về scipy.stats, khám phá năm thủ thuật thiết yếu để thiết kế các mô phỏng hiệu suất cao, chặt chẽ chỉ bằng NumPy và SciPy.
Bởi Matthew Mayo, Biên tập viên quản lý KDnuggets vào ngày 27/5/2026 trong Python
# Giới thiệu
Dữ liệu hiếm khi tĩnh. Các quyết định hiếm khi không có rủi ro. Với tư cách là một nhà khoa học dữ liệu, bạn thường xuyên được yêu cầu kiểm tra các giả định kinh doanh, khám phá sự không chắc chắn của phân phối hoặc mô phỏng các thực tế thay thế.
"Điều gì sẽ xảy ra nếu chi phí thu hút người dùng hoạt động hàng ngày của chúng ta tăng gấp đôi?"
"Điều gì sẽ xảy ra nếu lưu lượng truy cập máy chủ của chúng ta tăng đột biến 300% trong một sự kiện khuyến mãi?"
"Xác suất tổn thất hoạt động của chúng ta vượt quá 50.000 USD trong quý này là bao nhiêu?"
Trả lời những câu hỏi "điều gì sẽ xảy ra nếu" này đòi hỏi phải chuyển từ các ước tính điểm đơn giản (như giá trị trung bình đơn giản) sang tư duy xác suất mạnh mẽ. Mặc dù nhiều người thực hành có thể ngay lập tức chuyển sang các công cụ mô phỏng nặng nề, nhưng ngăn xếp khoa học Python tiêu chuẩn đã chứa một công cụ mạnh mẽ chưa được sử dụng hết cho loại mô hình này: scipy.stats. Ngoài danh tiếng phổ biến về việc thực hiện các kiểm định giả thuyết đơn giản hoặc tính toán giá trị p, scipy.stats cung cấp một giao diện lập trình thống nhất để tham số hóa, lấy mẫu và tính toán các chỉ số rủi ro trên hàng chục phân phối xác suất liên tục và rời rạc.
Trong bài viết này, chúng ta sẽ tìm hiểu sâu về scipy.stats, khám phá năm thủ thuật thiết yếu để thiết kế các mô phỏng hiệu suất cao, chặt chẽ chỉ bằng NumPy và SciPy.
# 1. Đóng băng các phân phối để tham số hóa các kịch bản
Khi mô hình hóa các kịch bản, bạn thường muốn biểu diễn các trạng thái thế giới riêng biệt: một đường cơ sở thận trọng, một trường hợp tốt nhất lạc quan và một trường hợp xấu nhất bi quan. Trong mã thủ tục tiêu chuẩn, bạn có thể biểu diễn chúng bằng cách mang theo các từ điển tham số (như vị trí loc và tỷ lệ scale) và giải nén chúng thành các hàm mỗi khi bạn cần đánh giá xác suất hoặc lấy mẫu.
Một mẫu hướng đối tượng vượt trội là đóng băng các phân phối. Trong scipy.stats, việc gọi một lớp phân phối (chẳng hạn như stats.norm, stats.lognorm hoặc stats.gamma) và truyền trực tiếp các tham số của bạn vào hàm tạo sẽ trả về một biến ngẫu nhiên "đóng băng" (một thể hiện của rv_frozen).
Đối tượng bị khóa này gói gọn toàn bộ mô hình xác suất. Bạn có thể truyền nó xung quanh cơ sở mã của mình dưới dạng một đối tượng duy nhất, hoán đổi các định nghĩa kịch bản một cách nhanh chóng và gọi các phương thức như .rvs(), .pdf(), .cdf() hoặc .ppf() mà không cần phải chỉ định lại các tham số.
Giả sử chúng ta đang mô hình hóa nhu cầu sản phẩm hàng ngày. Trong một triển khai thủ công, chúng ta phải kéo các từ điển hoặc biến qua mọi giai đoạn của quy trình xử lý của mình:
import scipy.stats as stats
# Định nghĩa các tham số kịch bản thô
scenarios = {
"recession": {"mean": 800, "std": 250},
"baseline": {"mean": 1200, "std": 150},
"boom": {"mean": 1800, "std": 300}
}
# Việc lấy mẫu hoặc đánh giá rủi ro yêu cầu giải nén tham số thủ công
def simulate_demand(scenario_name, size=5):
params = scenarios[scenario_name]
# Truyền các tham số vào mỗi lệnh gọi thống kê
samples = stats.norm.rvs(loc=params["mean"], scale=params["std"], size=size)
p_exceed_1000 = 1 - stats.norm.cdf(1000, loc=params["mean"], scale=params["std"])
return samples, p_exceed_1000
for name in scenarios.keys():
samples, prob = simulate_demand(name)
print(f"{name.capitalize()} -> Prob > 1000: {prob:.2%}")
Đây là một giải pháp thay thế thanh lịch hơn. Bằng cách khởi tạo phân phối, SciPy đóng băng các tham số và cung cấp cho chúng ta một đối tượng kịch bản độc lập, rõ ràng:
import scipy.stats as stats
# Với scipy, đóng băng các tham số phân phối vào một đối tượng được đặt tên
scenario_models = {
"recession": stats.norm(loc=800, scale=250),
"baseline": stats.norm(loc=1200, scale=150),
"boom": stats.norm(loc=1800, scale=300)
}
# Pipeline chỉ chấp nhận một đối tượng RV (biến ngẫu nhiên) đã đóng băng, tách rời logic khỏi các tham số
def run_scenario_pipeline(rv_frozen, size=5):
# Các phương thức khóa được gọi trực tiếp trên đối tượng
samples = rv_frozen.rvs(size=size)
# sf() là hàm tồn tại (1 - CDF)
p_exceed_1000 = rv_frozen.sf(1000)
return samples, p_exceed_1000
for name, model in scenario_models.items():
_, prob = run_scenario_pipeline(model)
print(f"{name.capitalize()} Scenario | Prob demand > 1000: {prob:.2%}")
Kết quả:
Recession Scenario | Prob demand > 1000: 21.19%
Baseline Scenario | Prob demand > 1000: 90.88%
Boom Scenario | Prob demand > 1000: 99.62%
Bằng cách đóng băng các tham số, chúng ta tách biệt các giả định toán học khỏi logic thực thi. Nếu muốn chuyển đổi mô hình nhu cầu từ phân phối chuẩn sang phân phối log-normal lệch, chúng ta chỉ cần thay đổi một dòng duy nhất nơi khởi tạo đối tượng đã đóng băng. Pipeline tiếp theo vẫn không bị ảnh hưởng.
# 2. Mô phỏng Monte Carlo với .rvs() để định lượng sự không chắc chắn
Trong lập kế hoạch kinh doanh, các nhà thực hành thường xây dựng bảng tính để tính toán doanh thu bằng cách sử dụng các ước tính điểm tĩnh — ví dụ: doanh thu = lưu lượng truy cập hàng ngày * tỷ lệ chuyển đổi * giá trị đơn hàng trung bình. Tuy nhiên, mỗi yếu tố đầu vào này đều có mức độ không chắc chắn cao. Việc nhân các giá trị trung bình với nhau che giấu sự biến động tổng hợp, dẫn đến sai lầm của các giá trị trung bình, hoặc sự đánh giá thấp rủi ro một cách có hệ thống.
Để định lượng sự không chắc chắn này, chúng ta có thể sử dụng mô phỏng Monte Carlo. Tôi
Nguồn tin: KDnuggets — Tác giả: Matthew Mayo. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.