Hướng dẫn python simulate probability - python mô phỏng xác suất

Các trường hợp sử dụng ứng dụng sử dụng Python

Tôi tin rằng xác suất và đặc biệt là mô phỏng là hai trong số các công cụ hiệu quả nhất mà chúng tôi có trong khi xử lý sự không chắc chắn nhưng rất được sử dụng, đặc biệt là trong các kịch bản kinh doanh trong thế giới thực. Mục tiêu của tôi trong blog này là trải qua một số trường hợp sử dụng mà chúng tôi gặp phải trong cuộc sống hàng ngày và một số trường hợp sử dụng kinh doanh. Tôi sẽ trải qua các trường hợp sử dụng thay vì trải qua toán học và khoa học đằng sau cách nó hoạt động. Hy vọng, những trường hợp sử dụng này sẽ khuyến khích nhiều người trong chúng ta sử dụng các phương pháp tương tự để giải quyết các vấn đề khác nhau mà chúng ta gặp phải trong cuộc sống cá nhân hoặc trong môi trường kinh doanh. Khi chúng ta biết các khái niệm cơ bản và cách đóng khung vấn đề, hầu hết các công việc nặng sẽ được thực hiện bằng gói Python Numpy và Gói cay.

Xác suất và kết quả mô phỏng thường có lợi khi chúng tôi không thể nhận được câu trả lời cho vấn đề của chúng tôi bằng cách sử dụng các mô hình phân tích. Ví dụ, xác suất có nhà đầy đủ trong poker là gì, xác suất của hai người trong phòng có cùng ngày sinh nhật là gì Xác suất mất tiền trong các khoản đầu tư mới, số lượng sản phẩm tối ưu mà doanh nghiệp cần sản xuất để kiếm lợi nhuận là gì, sự kết hợp tối ưu của phân bổ tài sản trong danh mục đầu tư để chúng tôi có đủ tiền để nghỉ hưu và nhiều người khác.

Trong bước đầu tiên, hãy để bắt đầu với cách xác định và đóng khung vấn đề. Có một vài bước cơ bản mà chúng ta cần tuân theo trước bất kỳ bài tập xác suất và mô phỏng.

1. Xây dựng không gian hoặc dân số mẫu và xác định kết quả có thể xảy ra cho các biến ngẫu nhiên

2. Gán xác suất cho từng kết quả, phân phối xác suất và xác định cách mô phỏng kết quả

3. Xác định mối quan hệ giữa nhiều biến ngẫu nhiên và xác định quy tắc thành công

4. Vẽ các mẫu từ phân phối xác suất nhiều lần và đếm thành công

5. Phân tích kết quả mẫu và tính tần số thành công như một ước tính về xác suất

Bây giờ, hãy để nhảy thẳng vào các trường hợp sử dụng và bắt đầu có một số niềm vui. Tôi sẽ trình bày một vài trường hợp sử dụng trong blog này và sự phức tạp của các trường hợp sử dụng sẽ trở nên khó khăn hơn khi chúng tôi đi cùng. Nếu bạn muốn sao chép kết quả của tôi, xin vui lòng kiện giống như của tôi. Và nếu bạn muốn hiểu cách thức hoạt động của mã, vui lòng đọc nhận xét trước mỗi khối mã mô tả những gì mã đang làm.seed as mine. And if you want to understand how the code works, please read the comment before each code block which describes what the code is doing.

  1. Trò chơi xúc xắc

Hãy bắt đầu với 101 xác suất, trò chơi xúc xắc. Ở đây, chúng tôi sẽ chơi một trò chơi xúc xắc. Vì vậy, hãy tạo ra một cái chết sáu mặt với xác suất bằng nhau để hiển thị và xem số chúng ta thấy là gì khi chúng ta lăn xúc xắc. Chúng tôi sẽ sử dụng np.random.choice để mô phỏng kết quả.

# Define die outcomes and probabilitiesimport numpy as np
import pandas as pd
np.random.seed(123)
die, probabilities, throws =[1,2,3,4,5,6], [1/6,1/6,1/6,1/6,1/6,1/6],1
# Use np.random.choice to throw the die once and record the outcome
outcome= np.random.choice(die, size=throws, p=probabilities)
print("The Outcome of the throw is: {}".format(outcome[0]))

Kết quả của cú ném là 5.

Đó là dễ dàng, chỉ với một biến ngẫu nhiên. Bây giờ, hãy để Lừa xem xét loại trò chơi xúc xắc khác nhau với hai biến ngẫu nhiên trong đó chúng tôi giành chiến thắng nếu hai con xúc xắc hiển thị cùng một số. Một lần nữa, cả hai con xúc xắc đều công bằng với tất cả các con số có cùng một xác suất hiển thị.

Trò chơi của cơ hội ____

Dice cho thấy 5 và 2. Bạn thua!

Vì vậy, chúng tôi đã thua, nhưng hãy để tiếp tục chơi. Ở đây, chúng tôi sẽ thực hiện lấy mẫu ngẫu nhiên lặp đi lặp lại, tức là ném xúc xắc 100.000 lần và xem chúng tôi đã thắng bao nhiêu lần và chúng tôi mất bao nhiêu lần khi mô phỏng một kết quả một khi không cho chúng tôi biết nhiều về mức độ thường xuyên của chúng tôi sẽ thấy kết quả đó.

# Initialize model parameters & simulate dice throw
np.random.seed(111)
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
sims, wins= 100000,0
#Write a for loop to repeat throwing the dice.
for i in range(sims):
outcomes=np.random.choice(die, size=num_dice, p=probabilities)
# Increment `wins` by 1 if the dice show same number
if outcomes[0]==outcomes[1]:
wins=wins+1

print("In {} games, you win {} times. Decision to play or walk away is your choice". format(sims, wins))

Trong 100000 trò chơi, bạn giành chiến thắng 16911 lần. Quyết định chơi hoặc bỏ đi là lựa chọn của bạn

Trong 100.000 trận đấu, bạn giành chiến thắng 16.911 lần, tức là chúng tôi chỉ thắng 16,91% thời gian, vì vậy tôi sẽ rất cẩn thận trước khi đặt cược tiền trong trò chơi này.

2. Tình huống khó xử xổ số

Trò chơi xổ số

Hãy tạo ra một kịch bản trong đó có cơ hội để giành giải độc đắc xổ số 1.000.000 đô la với 1.000.000 tổng số vé, tức là xác suất giành được là 1 trên 1.000.000 và mỗi vé có giá 5 đô la. Hãy để điều hành mô phỏng với giá 2.000.000 lần và xem mức chi trả trung bình là gì. Nếu chiến thắng trung bình lớn hơn chi phí cho vé, sẽ có ý nghĩa khi mua vé nếu không, thì việc mua vé đó không hợp lý.

# Initialize size and simulate outcome
np.random.seed(111)
lottery_ticket_cost, num_tickets, grand_prize = 5, 1000000, 1000000
chance_of_winning = 1/num_tickets
size = 2000000
payoffs = [-lottery_ticket_cost, grand_prize-lottery_ticket_cost]
probs = [1-chance_of_winning, chance_of_winning]
outcomes = np.random.choice(a=payoffs, size=size, p=probs, replace=True)# Mean of Outcomes
answer=outcomes.mean()
print("Average payoff from {} simulations = {}".format(size, answer))

Thanh toán trung bình từ năm 2000000 mô phỏng = -4.0

Vì mức chi trả trung bình của chúng tôi là âm 4 đô la, tôi sẽ tránh xa việc mua vé vì chi phí vé là 5 đô la.

Như tôi đã đề cập trước đó, mô phỏng cho phép chúng tôi hỏi câu trả lời cho các câu hỏi mà mô hình phân tích điển hình không thể trả lời vì mô phỏng cho phép chúng tôi có được nhiều kết quả mẫu thay vì giải quyết công thức toán học phức tạp. Theo ví dụ về xổ số của chúng tôi, hãy để cố gắng hiểu mức giá tối ưu mà chúng ta nên sẵn sàng trả cho vé số dựa trên mức chi trả trung bình của $ 4. Hãy để điều hành mô phỏng 2 triệu lần một lần nữa.

# Initialize simulations and cost of ticket
np.random.seed(111)
sims, lottery_ticket_cost = 2000000, 0
# Use a while loop to increment `lottery_ticket_cost` till average value of outcomes falls below zero
while 1:
outcomes = np.random.choice([-lottery_ticket_cost, grand_prize-lottery_ticket_cost],
size=sims, p=[1-chance_of_winning, chance_of_winning], replace=True)
if outcomes.mean() < 0:
break
else:
lottery_ticket_cost += 1
answer = lottery_ticket_cost - 1
print("As the average expected payoff is negative. The highest price at which it makes sense to buy the ticket is {}".format(answer))

Vì mức chi trả trung bình dự kiến ​​là âm. Giá cao nhất mà nó có ý nghĩa để mua vé là 1.

Bây giờ, chúng ta biết dễ dàng hiểu được các kịch bản khác nhau như thế nào chỉ với một vài dòng mã.

3. Trò chơi poker

Như chúng ta đã biết, trò chơi bài là trò chơi cơ hội và xác suất. Hãy để mô phỏng một số xác suất trong trò chơi poker, trò chơi tôi đang cố gắng học. Trong trò chơi dưới đây, chúng tôi sẽ tạo ra một trò chơi poker nơi mỗi người chơi được xử lý năm thẻ và người chơi có chiến thắng tốt hơn. Hãy để ước tính xác suất nhận được ít nhất hai loại, tức là 2 thẻ của các bộ khác nhau nhưng cùng các giá trị số (ví dụ: 2 trái tim, 2 trong số các thuổng và 3 thẻ khác). Tôi đã tạo ra một mảng có tên là Deck_of_cards về cơ bản đã tạo ra một bộ bài. Nó là một phần lớn, vì vậy tôi chỉ đặt một vài dòng mã đầu tiên. Chúng tôi sẽ chạy mô phỏng trong 5 triệu lần và ước tính xác suất để có được ít nhất hai loại.

deck_of_cards = [('Heart', 0),('Heart', 1),('Heart', 2),('Heart', 3),('Heart', 4)]# Shuffle deck & count card occurrences in the hand
np.random.seed(111)
n_sims, two_kind = 5000000, 0
for i in range(n_sims):
np.random.shuffle(deck_of_cards)
hand, cards_in_hand = deck_of_cards[0:5], {}
for card in hand:
# Use .get() method on cards_in_hand
cards_in_hand[card[1]] = cards_in_hand.get(card[1], 0) + 1

# Condition for getting at least 2 of a kind
highest_card = max(cards_in_hand.values())
if highest_card>=2:
two_kind += 1

print("The probability of seeing at least two of a kind = {} ".format(two_kind/n_sims))

Xác suất nhìn thấy ít nhất hai loại = 0,49331

49% vẫn còn ít hơn là lật một đồng xu, vì vậy tôi sẽ chơi trò chơi không. Bạn biết những gì, tôi sẽ thử. Hãy để, chơi một trò chơi poker nữa.

Lần này để ước tính xác suất của tôi khi nhìn thấy một ngôi nhà đầy đủ. Một ngôi nhà đầy đủ là khi bạn nhận được hai thẻ có bộ đồ khác nhau có cùng giá trị số và ba thẻ khác có cùng giá trị số (ví dụ: 2 của Hearts & Spades, Jacks of Club, Diamonds, & Spades). Một ngôi nhà đầy đủ là xác suất nhận được chính xác ba trong số một loại có điều kiện để có được chính xác hai loại giá trị khác. Thời gian này, hãy để mô phỏng trò chơi trong 1 triệu lần.Full House. A full house is when you get two cards of different suits that share the same numeric value and three other cards that have the same numeric value (e.g., 2 of hearts & spades, jacks of clubs, diamonds, & spades). A full house is the probability of getting exactly three of a kind conditional on getting exactly two of a kind of another value.This time let’s simulate the game for 1 million times.

Nhà đầy đủ

Xác suất nhìn thấy một ngôi nhà đầy đủ = 0,001474

0,147% Tôi cách ít hơn những gì tôi mong đợi trong đầu. Vì vậy, tôi không nghĩ rằng tôi sẽ đi đến Full House với xác suất dưới 1%.

4. Vấn đề sinh nhật

Hãy cố gắng giải quyết một vấn đề sinh nhật thú vị khác. Chúng tôi sẽ cố gắng tìm ra có bao nhiêu người chúng tôi cần trong một căn phòng để đảm bảo rằng có 80% cơ hội để hai người trong số những người có chung sinh nhật. Cách dễ nhất để suy nghĩ về vấn đề này là nếu chúng ta có 366 người, thì chúng ta có thể chắc chắn 100% rằng 2 người có cùng sinh nhật với chỉ có 365 ngày trong một năm. Nhưng chúng tôi muốn tìm ra số lượng người mà chúng tôi cần trong một căn phòng có cơ hội 80%. Hãy cùng chạy 2 triệu mô phỏng và xem có bao nhiêu người chúng ta cần giải quyết câu trả lời này.

Vấn đề sinh nhật
# Draw a sample of birthdays & check if each birthday is unique
np.random.seed(123)
days = np.arange(1,366)
people = 2
def birthday_sim(people):
sims, unique_birthdays = 500000, 0
for _ in range(sims):
draw = np.random.choice(days, size=people, replace=True)
if len(draw) == len(set(draw)):
unique_birthdays += 1
out = 1 - unique_birthdays / sims
return out
# Break out of the loop if probability greater than 0.8
while (people > 0):
prop_bds = birthday_sim(people)
if prop_bds > 0.8:
break
people += 1
print("With {} people, there's a 80% chance that two share a birthday.".format(people))

Với 35 người, có 80% cơ hội mà hai người chia sẻ sinh nhật.

Không phải là một vấn đề khó để giải quyết sau tất cả các quyền?

5. Tối ưu hóa chi phí

Ở đây chúng tôi sẽ xem xét kịch bản kinh doanh nơi công ty đang cố gắng mô hình hóa sản xuất sản phẩm, sau đó mô hình lợi nhuận và cuối cùng tối ưu hóa chi phí. Hãy bắt đầu bằng cách mô hình hóa việc sản xuất sản phẩm, hãy để nói TV. Giả sử rằng sản xuất TV chỉ phụ thuộc vào 2 yếu tố, người dân chi tiêu và chi phí. Chúng tôi có thể kiểm soát mô hình chi tiêu của mọi người, nhưng chúng tôi có thể kiểm soát chi phí. Hãy để giả sử mô hình chi tiêu thường được phân phối với giá trị trung bình là 1500 và độ lệch chuẩn là 500. Hãy để cho rằng chi phí của chúng tôi được cố định ở mức 20.000 đô la mỗi tháng. Sản xuất TV trong bất kỳ tháng nào là một biến ngẫu nhiên Poisson và sản xuất TV trung bình có thể được thể hiện trong phương trình dưới đây.production of product, then model profit and finally optimize the cost. Let’s start by modeling the production of product, let’s say TV. Assume that TV production depends on just 2 factors, people spending pattern and cost. We can’t control the people spending pattern, but we do can control the cost. Let’s assume spending pattern is normally distributed with mean of 1500 and standard deviation of 500. Let’s assume our cost is fixed at $20,000 per month. TV production in any month is a Poisson random variable and the average tv production can be expressed in equation below.

100 × (chi phí) 0,1 × (chi tiêu) 0,2

# Initialize variables
np.random.seed(111)
cost = 20000
spend = np.random.normal(1500, 500)
# TV Production Model
def tv_produced(spend, cost):
mean_tv = 100*(cost**0.1)*(spend**0.2)
tv = np.random.poisson(mean_tv)
return tv
# Simulate and print tv production
tv_result = tv_produced(spend, cost)
print("Simulated tv Production = {}".format(tv_result))

Sản xuất TV mô phỏng = 1051

Vì vậy, dựa trên mô phỏng đơn, chúng ta nên sản xuất 1051 TV trong tháng. Vì vậy, bây giờ, hãy để cố gắng mô hình hóa lợi nhuận giả định giá của TV thường được phân phối với giá trị trung bình là 200 đô la và độ lệch chuẩn là 25 đô la. Trước tiên, hãy tạo chức năng nhu cầu TV và tính lợi nhuận tùy thuộc vào mối quan hệ giữa cung và cầu của TV.

# Tv demand function
np.random.seed(101)
def tv_demanded(price):
mean_tv = 1000 - 8*price
tv = np.random.poisson(abs(mean_tv))
return tv
# Function to calculate profits
def profits(cost):
spend = np.random.normal(1500, 500)
price = np.random.normal(200, 25)
supply = tv_produced(spend, cost)
demand = tv_demanded(price)
equil_short = supply <= demand
if equil_short == True:
tmp = supply*price - cost
return tmp
else:
tmp2 = demand*price - cost
return tmp2
result = profits(cost)
print("Simulated profit = {}".format(result))

Lợi nhuận mô phỏng = 133149.35558092417

Vì vậy, dựa trên lợi nhuận mô phỏng, chúng tôi sẽ có lợi nhuận là $ 133,149 khá tốt. Bây giờ, hãy để cố gắng tìm ra chi phí mỗi tháng, chúng tôi sẽ có thể tối đa hóa lợi nhuận trung bình mỗi tháng. Điều duy nhất mà chúng ta có thể kiểm soát để tối đa hóa lợi nhuận trung bình là chi phí, vì mô hình chi tiêu của mọi người nằm ngoài tầm kiểm soát của chúng ta. Nhưng những gì chúng ta có thể làm là sử dụng mô phỏng để mô phỏng sự không chắc chắn và xem lợi nhuận của chúng ta bị ảnh hưởng như thế nào. Hãy để giả định rằng chúng tôi có khả năng chọn chi phí của mình ở bất cứ đâu từ 10.000 đến 20.000 với mức tăng 1.000. Chúng tôi muốn chọn chi phí tối đa hóa lợi nhuận. Vì vậy, cho phép mô phỏng chi phí ở các cấp độ khác nhau và tìm ra chi phí tối ưu.

Optimization
# Initialize number of dice, simulate & record outcome
np.random.seed(123)
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
outcomes = np.random.choice(die, size=num_dice, p=probabilities)
# Win if the two dice show the same number
if outcomes[0]== outcomes[1]:
answer='win'
else:
answer='lose'

print("The dice shows {} and {}. You {}!".format(outcomes[0], outcomes[1], answer))

0

Lợi nhuận trung bình được tối đa hóa khi chi phí = 14000

Vì vậy, kết quả cho chúng tôi biết rằng chúng tôi sẽ có lợi nhuận trung bình cao nhất trong tháng khi chi phí của chúng tôi là $ 14000.

6. Mô phỏng danh mục đầu tư

Mô phỏng danh mục đầu tư

Ở đây chúng tôi sẽ xây dựng một danh mục tài chính bao gồm nhiều công cụ tài chính và xem sẽ có được bao nhiêu tiền lãi trong 25 năm kể từ bây giờ. Ở đây, các khoản đầu tư ban đầu của tôi là 50.000. Chúng tôi sẽ giả định rằng lợi nhuận theo phân phối bình thường, lợi nhuận dự kiến ​​trung bình là 6% mỗi năm với độ lệch chuẩn là 20.portfolio comprising of multiple financial instruments and see how much will be its return be in 25 years from now. Here, my initial investments is 50,000. We would assume that return follows a normal distribution, average expected return is 6% per year with standard deviation of 20.

# Initialize number of dice, simulate & record outcome
np.random.seed(123)
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
outcomes = np.random.choice(die, size=num_dice, p=probabilities)
# Win if the two dice show the same number
if outcomes[0]== outcomes[1]:
answer='win'
else:
answer='lose'

print("The dice shows {} and {}. You {}!".format(outcomes[0], outcomes[1], answer))

1

Lợi nhuận danh mục đầu tư sau 25 năm = 214247.08712715306

Không tệ, khoản đầu tư của tôi gần như gần 4 lần các khoản đầu tư ban đầu của tôi. Nhưng danh mục đầu tư của tôi có biến động cao mặc dù điều đó có nghĩa là lợi nhuận của tôi không được đảm bảo. Tôi có thể làm gì ở đây để tự tin. Tôi sẽ cần phải tìm ra khoảng tin cậy về phân phối lợi nhuận. Hãy để điều đó làm điều đó.confidence interval on the distribution of returns. Let’s do that.

# Initialize number of dice, simulate & record outcome
np.random.seed(123)
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
outcomes = np.random.choice(die, size=num_dice, p=probabilities)
# Win if the two dice show the same number
if outcomes[0]== outcomes[1]:
answer='win'
else:
answer='lose'

print("The dice shows {} and {}. You {}!".format(outcomes[0], outcomes[1], answer))

2

Khoảng tin cậy 95% của lợi nhuận: thấp hơn = 17885.915163852736, trên = 881657.83956018

Thật thú vị, có vẻ như do sự biến động cao của các cổ phiếu trong danh mục đầu tư của tôi, danh mục đầu tư của tôi có thể có một sự thay đổi lớn từ 18 nghìn đến 881 nghìn đô la.

Vì vậy, những gì chúng ta có thể làm, thường là trong kịch bản như vậy mọi người cân bằng lại danh mục đầu tư của họ. Vì vậy, hãy để Lừa làm điều đó cho danh mục đầu tư trên của chúng tôi. Bây giờ chúng ta hãy quyết định chúng ta muốn rời khỏi danh mục đầu tư của mình như hoặc cân bằng lại với một số công cụ biến động thấp như trái phiếu. Trong kịch bản của chúng tôi, chúng tôi có tùy chọn cân bằng lại danh mục đầu tư để lợi nhuận trung bình 3% từ 6% nhưng đồng thời cân bằng lại làm giảm độ lệch chuẩn xuống còn 8%. Cho phép mô phỏng cả kịch bản và xem số tiền nào tạo ra số tiền ít nhất dựa trên xác suất 85%, tức là phần trăm thứ 15.bonds. In our scenario, we have option to re-balance the portfolio so it make average return of 3% from 6% but at the same time re-balancing reduces standard deviation to 8%. Lets simulate both scenario and see which generates least amount based on 85% probability, i.e 15th percentile.

# Initialize number of dice, simulate & record outcome
np.random.seed(123)
die, probabilities, num_dice = [1,2,3,4,5,6], [1/6, 1/6, 1/6, 1/6, 1/6, 1/6], 2
outcomes = np.random.choice(die, size=num_dice, p=probabilities)
# Win if the two dice show the same number
if outcomes[0]== outcomes[1]:
answer='win'
else:
answer='lose'

print("The dice shows {} and {}. You {}!".format(outcomes[0], outcomes[1], answer))

3

Bám sát cổ phiếu giúp bạn có thêm lợi nhuận là -12630.359636929272

Trả lại tiêu cực cho thấy rằng tôi có lẽ nên cân bằng lại danh mục đầu tư của mình.

Kết luận

Các trường hợp sử dụng trên chỉ là phần nổi của tảng băng. Xác suất và mô phỏng có thể được áp dụng cho hầu hết những điều chúng ta làm và gặp phải trong cuộc sống cá nhân và công việc của chúng ta. Hy vọng, tôi đã có thể tạo ra một số sự tò mò và nhiệt tình trong tâm trí độc giả liên quan đến việc sử dụng xác suất và mô phỏng sự không chắc chắn.