Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Giới thiệu

Có nhiều mô hình tinh vi mà mọi người có thể xây dựng để giải quyết vấn đề dự báo. Tuy nhiên, chúng thường gắn bó với các mô hình Excel đơn giản dựa trên các giá trị lịch sử trung bình, trực giác và một số phương pháp phỏng đoán cụ thể về miền cấp cao. Cách tiếp cận này có thể đủ chính xác cho vấn đề trong tay nhưng có những lựa chọn thay thế có thể bổ sung thêm thông tin vào dự đoán với số lượng hợp lý của & NBSP; nỗ lực.

Một cách tiếp cận có thể tạo ra sự hiểu biết tốt hơn về phạm vi kết quả tiềm năng và giúp tránh lỗ hổng của trung bình, là một mô phỏng Monte Carlo. Phần còn lại của bài viết này sẽ mô tả cách sử dụng Python với Gandas và Numpy để xây dựng mô phỏng Monte Carlo để dự đoán phạm vi giá trị tiềm năng cho ngân sách bồi thường bán hàng. Cách tiếp cận này có nghĩa là đủ đơn giản để nó có thể được sử dụng cho các vấn đề khác mà bạn có thể gặp phải nhưng cũng đủ mạnh để cung cấp những hiểu biết mà mô hình cơ bản của Gut Gut-cảm giác không thể cung cấp trên chính nó.

Problem Background

Trong ví dụ này, chúng tôi sẽ cố gắng dự đoán chúng tôi nên ngân sách bao nhiêu tiền cho hoa hồng bán hàng trong năm tới. Vấn đề này rất hữu ích cho việc mô hình hóa vì chúng tôi có một công thức được xác định để tính toán hoa hồng và chúng tôi có thể có một số kinh nghiệm với hoa hồng năm trước & NBSP; thanh toán.

Vấn đề này cũng rất quan trọng từ góc độ kinh doanh. Hoa hồng bán hàng có thể là một chi phí bán hàng lớn và điều quan trọng là lập kế hoạch phù hợp cho chi phí này. Ngoài ra, việc sử dụng mô phỏng Monte Carlo là một cải tiến tương đối đơn giản có thể được thực hiện để tăng cường những gì thường là một ước tính không tinh vi & NBSP;

Trong ví dụ này, Ủy ban bán hàng mẫu sẽ trông như thế này đối với việc bán hàng 5 người & NBSP; lực lượng: lực lượng:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Trong ví dụ này, Ủy ban là kết quả của điều này & NBSP; Công thức:

Số tiền hoa hồng = bán hàng thực tế * hoa hồng & nbsp; tỷ lệ

Tỷ lệ hoa hồng dựa trên phần trăm này để lên kế hoạch & nbsp; bảng:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Trước khi chúng tôi xây dựng một mô hình và chạy mô phỏng, hãy để Lôi xem xét một cách tiếp cận đơn giản để dự đoán vào năm tới của Ủy ban & NBSP;

Cách tiếp cận ngây thơ đối với & nbsp; vấn đề

Hãy tưởng tượng nhiệm vụ của bạn là nhà phân tích Amy hoặc Andy là nói với tài chính bao nhiêu ngân sách cho hoa hồng bán hàng cho năm tới. Một cách tiếp cận có thể là cho rằng mọi người thực hiện 100% mục tiêu của họ và kiếm được tỷ lệ hoa hồng 4%. Cắm các giá trị này vào excel mang lại & nbsp; này:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Hãy tưởng tượng bạn trình bày điều này để tài chính, và họ nói, chúng tôi không bao giờ có mọi người nhận được tỷ lệ hoa hồng tương tự. Chúng tôi cần một mô hình chính xác hơn & nbsp;

Đối với vòng hai, bạn có thể thử một vài & nbsp; phạm vi:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Hoặc một & nbsp; một:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Bây giờ, bạn có thêm một chút thông tin và quay lại tài chính. Lần này tài chính cho biết, phạm vi này rất hữu ích nhưng sự tự tin của bạn trong phạm vi này là gì? Ngoài ra, chúng tôi cần bạn làm điều này cho một lực lượng bán hàng là 500 người và mô hình hóa một số mức giá khác nhau để xác định số tiền cho ngân sách. Hmmm… Bây giờ, bạn & nbsp; làm gì?

Cách tiếp cận đơn giản này minh họa phương pháp lặp cơ bản cho mô phỏng Monte Carlo. Bạn lặp lại trong quá trình này nhiều lần để xác định một loạt các giá trị hoa hồng tiềm năng trong năm. Làm điều này bằng tay bằng tay là một thách thức. May mắn thay, Python làm cho cách tiếp cận này nhiều & nbsp; đơn giản hơn.

Monte Carlo

Bây giờ chúng tôi đã đề cập đến vấn đề ở cấp độ cao, chúng tôi có thể thảo luận về cách phân tích Monte Carlo có thể là một công cụ hữu ích để dự đoán chi phí hoa hồng cho năm tới. Ở cấp độ đơn giản nhất, phân tích Monte Carlo (hoặc mô phỏng) liên quan đến việc chạy nhiều kịch bản với các đầu vào ngẫu nhiên khác nhau và tóm tắt phân phối & nbsp; kết quả.

Sử dụng phân tích hoa hồng, chúng tôi có thể tiếp tục quy trình thủ công mà chúng tôi đã bắt đầu ở trên nhưng chạy chương trình 100 100 hoặc thậm chí 1000 lần và chúng tôi sẽ nhận được phân phối số tiền hoa hồng tiềm năng. Phân phối này có thể thông báo cho khả năng rằng chi phí sẽ nằm trong một cửa sổ nhất định. Vào cuối ngày, đây là một dự đoán vì vậy chúng tôi có thể sẽ không bao giờ dự đoán chính xác nó. Chúng ta có thể phát triển một ý tưởng thông tin hơn về rủi ro tiềm năng của dưới hoặc trên & nbsp; ngân sách.

Có hai thành phần để chạy Monte Carlo & NBSP; Mô phỏng:

  • phương trình để & nbsp; đánh giá
  • các biến ngẫu nhiên cho & nbsp; đầu vào

Chúng tôi đã mô tả phương trình trên. Bây giờ chúng ta cần suy nghĩ về cách thực hiện các biến ngẫu nhiên & nbsp;

Một cách tiếp cận đơn giản sẽ là lấy một con số ngẫu nhiên từ 0% đến 200% (đại diện cho trực giác của chúng tôi về tỷ lệ hoa hồng). Tuy nhiên, vì chúng tôi trả hoa hồng mỗi năm, chúng tôi hiểu vấn đề của chúng tôi chi tiết hơn một chút và có thể sử dụng kiến ​​thức trước đó để xây dựng mô hình chính xác hơn & NBSP;

Bởi vì chúng tôi đã thanh toán hoa hồng trong vài năm, chúng tôi có thể xem xét một phân phối lịch sử điển hình của phần trăm cho & nbsp; mục tiêu:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Phân phối này trông giống như phân phối bình thường với giá trị trung bình 100% và độ lệch chuẩn là 10%. Cái nhìn sâu sắc này rất hữu ích vì chúng tôi có thể mô hình hóa phân phối biến đầu vào của mình để nó tương tự như thế giới thực & nbsp; kinh nghiệm.

Nếu bạn quan tâm đến các chi tiết bổ sung để ước tính loại phân phối, tôi đã tìm thấy bài viết này & nbsp; thú vị.

Xây dựng một Python & NBSP;

Chúng ta có thể sử dụng gấu trúc để xây dựng một mô hình sao chép tính toán bảng tính Excel. Có những cách tiếp cận Python khác để xây dựng các mô hình Monte Carlo nhưng tôi thấy rằng phương pháp Pandas này dễ hiểu về mặt khái niệm nếu bạn đến từ một nền tảng Excel. Nó cũng có thêm lợi ích của việc tạo ra các khung dữ liệu gấu trúc có thể được kiểm tra và xem xét cho & nbsp; tính hợp lý.

Trước tiên, hãy hoàn thành nhập khẩu của chúng tôi và đặt âm mưu & nbsp; style:

import pandas as pd
import numpy as np
import seaborn as sns

sns.set_style('whitegrid')

Đối với mô hình này, chúng tôi sẽ sử dụng một tạo số ngẫu nhiên từ Numpy. Khía cạnh tiện dụng của Numpy là có một số trình tạo số ngẫu nhiên có thể tạo các mẫu ngẫu nhiên dựa trên phân phối & NBSP được xác định trước.

Như đã mô tả ở trên, chúng tôi biết rằng phần trăm lịch sử của chúng tôi cho hiệu suất mục tiêu tập trung vào khoảng trung bình 100% và độ lệch chuẩn là 10%. Hãy để xác định các biến đó cũng như số lượng đại diện bán hàng và mô phỏng mà chúng tôi đang & NBSP; Mô hình hóa:

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000

Bây giờ chúng ta có thể sử dụng Numpy để tạo danh sách tỷ lệ phần trăm sẽ tái tạo lịch sử của chúng ta bình thường & nbsp; phân phối:

pct_to_target = np.random.normal(avg, std_dev, num_reps).round(2)

Trong ví dụ này, tôi đã chọn làm tròn nó đến 2 số thập phân để làm cho nó rất dễ dàng để xem các ranh giới & nbsp;

Đây là những gì 10 mục đầu tiên nhìn & nbsp; như:

array([0.92, 0.98, 1.1 , 0.93, 0.92, 0.99, 1.14, 1.28, 0.91, 1.  ])

Đây là một kiểm tra nhanh tốt để đảm bảo các phạm vi nằm trong & nbsp;

Vì chúng tôi đang cố gắng cải thiện cách tiếp cận đơn giản của mình, chúng tôi sẽ gắn bó với phân phối bình thường cho phần trăm để nhắm mục tiêu. Bằng cách sử dụng Numpy, chúng ta có thể điều chỉnh và sử dụng phân phối khác cho các mô hình trong tương lai nếu chúng ta phải. Tuy nhiên, tôi cảnh báo rằng bạn không nên sử dụng các mô hình khác mà không thực sự hiểu chúng và cách chúng áp dụng cho tình huống của bạn.

Có một giá trị khác mà chúng ta cần mô phỏng và đó là mục tiêu bán hàng thực tế. Để minh họa một phân phối khác, chúng tôi sẽ giả định rằng phân phối mục tiêu bán hàng của chúng tôi trông giống như & nbsp; điều này:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Đây chắc chắn không phải là một phân phối bình thường. Phân phối này cho chúng ta thấy rằng các mục tiêu bán hàng được đặt thành 1 trong 6 thùng và tần số thấp hơn khi số tiền tăng. Phân phối này có thể là dấu hiệu của một quy trình thiết lập mục tiêu rất đơn giản trong đó các cá nhân được đưa vào một số nhóm nhất định và được đưa ra các mục tiêu liên tục dựa trên nhiệm kỳ, quy mô lãnh thổ hoặc doanh số của họ & NBSP;

Vì lợi ích của ví dụ này, chúng tôi sẽ sử dụng phân phối đồng đều nhưng chỉ định tỷ lệ xác suất thấp hơn cho một số giá trị & nbsp;

Đây là cách chúng ta có thể xây dựng điều này bằng cách sử dụng

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
1

sales_target_values = [75_000, 100_000, 200_000, 300_000, 400_000, 500_000]
sales_target_prob = [.3, .3, .2, .1, .05, .05]
sales_target = np.random.choice(sales_target_values, num_reps, p=sales_target_prob)

Phải thừa nhận rằng đây là một ví dụ hơi giả tạo nhưng tôi muốn cho thấy cách các phân phối khác nhau có thể được kết hợp vào mô hình & NBSP của chúng tôi.

Bây giờ chúng tôi đã biết cách tạo hai bản phân phối đầu vào của mình, hãy để Lôi xây dựng một gấu trúc & nbsp; dataFrame:

df = pd.DataFrame(index=range(num_reps), data={'Pct_To_Target': pct_to_target,
                                               'Sales_Target': sales_target})

df['Sales'] = df['Pct_To_Target'] * df['Sales_Target']

Đây là những gì DataFrame mới của chúng tôi trông & nbsp; như:

Pct_To_TargetSales_TargetViệc bán hàng
00.92 100000 92000.0
10.98 75000 73500.0
21.10 500000 550000.0
30.93 200000 186000.0
40.92 300000 276000.0

Bạn có thể nhận thấy rằng tôi đã thực hiện một mẹo nhỏ để tính toán số tiền bán hàng thực tế. Đối với vấn đề này, số tiền bán hàng thực tế có thể thay đổi rất nhiều trong nhiều năm nhưng phân phối hiệu suất vẫn phù hợp đáng kể. Do đó, tôi đã sử dụng các bản phân phối ngẫu nhiên để tạo đầu vào của mình và sao lưu vào doanh số thực tế & nbsp;

Món mã cuối cùng chúng ta cần tạo là một cách để ánh xạ

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
2 của chúng ta theo tỷ lệ hoa hồng. Đây là & nbsp; hàm:

def calc_commission_rate(x):
    """ Return the commission rate based on the table:
    0-90% = 2%
    91-99% = 3%
    >= 100 = 4%
    """
    if x <= .90:
        return .02
    if x <= .99:
        return .03
    else:
        return .04

Lợi ích bổ sung của việc sử dụng Python thay vì Excel là chúng ta có thể tạo ra logic phức tạp hơn nhiều, dễ hiểu hơn so với nếu chúng ta cố gắng xây dựng một câu lệnh nếu được lồng vào & nbsp; excel.

Bây giờ chúng tôi tạo tỷ lệ hoa hồng của chúng tôi và nhân nó thời gian & nbsp; bán hàng:

df['Commission_Rate'] = df['Pct_To_Target'].apply(calc_commission_rate)
df['Commission_Amount'] = df['Commission_Rate'] * df['Sales']

Mang lại kết quả này, trông rất giống một mô hình Excel mà chúng tôi có thể & nbsp; build:

Pct_To_TargetSales_TargetViệc bán hàngCommission_RateCommission_Amount
097.0 100000 97000.0 .03 2910.0
192.0 400000 368000.0 .03 11040.0
297.0 200000 194000.0 .03 5820.0
3103.0 200000 206000.0 .04 8240.0
487.0 75000 65250.0 .02 1305.0

Bạn có thể nhận thấy rằng tôi đã thực hiện một mẹo nhỏ để tính toán số tiền bán hàng thực tế. Đối với vấn đề này, số tiền bán hàng thực tế có thể thay đổi rất nhiều trong nhiều năm nhưng phân phối hiệu suất vẫn phù hợp đáng kể. Do đó, tôi đã sử dụng các bản phân phối ngẫu nhiên để tạo đầu vào của mình và sao lưu vào doanh số thực tế & nbsp;

Món mã cuối cùng chúng ta cần tạo là một cách để ánh xạ

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
2 của chúng ta theo tỷ lệ hoa hồng. Đây là & nbsp; hàm:

Nếu chúng ta tổng hợp các giá trị (chỉ 5 người đứng đầu được hiển thị ở trên) trong cột

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
3, chúng ta có thể thấy rằng mô phỏng này cho thấy chúng ta sẽ trả & NBSP; $ 2,923,100.

Hãy để Lừa & NBSP; Loop

Ma thuật thực sự của người Hồi giáo của mô phỏng Monte Carlo là nếu chúng ta chạy mô phỏng nhiều lần, chúng ta bắt đầu phát triển một bức tranh về phân phối kết quả có khả năng. Trong Excel, bạn sẽ cần VBA hoặc một plugin khác để chạy nhiều lần lặp. Trong Python, chúng ta có thể sử dụng vòng lặp

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
4 để chạy nhiều mô phỏng như chúng ta đã làm.VBA or another plugin to run multiple iterations. In python, we can use a
avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
4 loop to run as many simulations as we’d like.

Ngoài việc chạy từng mô phỏng, chúng tôi lưu các kết quả mà chúng tôi quan tâm trong một danh sách mà chúng tôi sẽ biến thành một khung dữ liệu để phân tích thêm về phân phối & nbsp; kết quả.

Đây là toàn bộ cho Loop & nbsp; mã:

# Define a list to keep all the results from each simulation that we want to analyze
all_stats = []

# Loop through many simulations
for i in range(num_simulations):

    # Choose random inputs for the sales targets and percent to target
    sales_target = np.random.choice(sales_target_values, num_reps, p=sales_target_prob)
    pct_to_target = np.random.normal(avg, std_dev, num_reps).round(2)

    # Build the dataframe based on the inputs and number of reps
    df = pd.DataFrame(index=range(num_reps), data={'Pct_To_Target': pct_to_target,
                                                   'Sales_Target': sales_target})

    # Back into the sales number using the percent to target rate
    df['Sales'] = df['Pct_To_Target'] * df['Sales_Target']

    # Determine the commissions rate and calculate it
    df['Commission_Rate'] = df['Pct_To_Target'].apply(calc_commission_rate)
    df['Commission_Amount'] = df['Commission_Rate'] * df['Sales']

    # We want to track sales,commission amounts and sales targets over all the simulations
    all_stats.append([df['Sales'].sum().round(0),
                      df['Commission_Amount'].sum().round(0),
                      df['Sales_Target'].sum().round(0)])

Mặc dù điều này có vẻ hơi đáng sợ lúc đầu, chúng tôi chỉ bao gồm 7 câu lệnh Python bên trong vòng lặp này mà chúng tôi có thể chạy bao nhiêu lần tùy thích. Trên máy tính xách tay tiêu chuẩn của tôi, tôi có thể chạy 1000 mô phỏng trong 2,75S để không có lý do gì tôi có thể làm điều này nhiều lần nữa nếu cần & nbsp;

Tại một số điểm, có lợi nhuận giảm dần. Kết quả của 1 triệu mô phỏng không nhất thiết phải hữu ích hơn 10.000. Lời khuyên của tôi là hãy thử các số tiền khác nhau và xem đầu ra & nbsp; thay đổi như thế nào.

Để phân tích kết quả mô phỏng, tôi sẽ xây dựng một khung dữ liệu từ

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
5:

results_df = pd.DataFrame.from_records(all_stats, columns=['Sales',
                                                           'Commission_Amount',
                                                           'Sales_Target'])

Bây giờ, thật dễ dàng để xem phạm vi kết quả trông như thế nào & nbsp; như:

avg = 1
std_dev = .1
num_reps = 500
num_simulations = 1000
0

Việc bán hàngCommission_AmountSales_Target
đếm1,000.0 1,000.0 1,000.0
bần tiện83,617,936.0 2,854,916.1 83,619,700.0
STD2,727,222.9 103,003.9 2,702,621.8
Tối thiểu74,974,750.0 2,533,810.0 75,275,000.0
25%81,918,375.0 2,786,088.0 81,900,000.0
50%83,432,500 2,852,165.0 83,525,000.0
75%85,318,440.0 2,924,053.0 85,400,000.0
Tối đa92,742,500.0 3,214,385.0 91,925,000.0

Về mặt đồ họa, nó trông giống như & nbsp; này:

Hướng dẫn monte carlo simulation python - monte carlo mô phỏng trăn

Vì vậy, biểu đồ này và đầu ra của mô tả cho chúng ta? Chúng ta có thể thấy rằng chi phí hoa hồng trung bình là 2,85 triệu đô la và độ lệch chuẩn là 103 nghìn đô la. Chúng ta cũng có thể thấy rằng khoản thanh toán hoa hồng có thể thấp tới 2,5 triệu đô la hoặc cao như & nbsp; 3,2 triệu đô la.

Dựa trên những kết quả này, bạn thoải mái như thế nào rằng chi phí hoa hồng sẽ dưới 3 triệu đô la? Hoặc, nếu ai đó nói, thì Let Let chỉ có ngân sách 2,7 triệu đô la, bạn có cảm thấy thoải mái khi chi phí của bạn sẽ thấp hơn số tiền đó không? Có lẽ & nbsp; không.

Trong đó có một trong những lợi ích của mô phỏng Monte Carlo. Bạn phát triển sự hiểu biết tốt hơn về việc phân phối các kết quả có thể xảy ra và có thể sử dụng kiến ​​thức đó cộng với sự nhạy bén trong kinh doanh của bạn để tạo ra một thông tin & NBSP;

Giá trị khác của mô hình này là bạn có thể mô hình hóa nhiều giả định khác nhau và xem điều gì sẽ xảy ra. Dưới đây là một số thay đổi đơn giản bạn có thể thực hiện để xem kết quả & nbsp; thay đổi: thay đổi như thế nào:

  • Tăng tỷ lệ hoa hồng hàng đầu lên & nbsp; 5%
  • Giảm số lượng bán hàng & NBSP;
  • Thay đổi độ lệch chuẩn dự kiến ​​thành số cao hơn & nbsp;
  • Sửa đổi phân phối & nbsp; mục tiêu

Bây giờ mô hình được tạo ra, việc thực hiện các thay đổi này cũng đơn giản như một vài điều chỉnh biến và chạy lại mã của bạn. Bạn có thể xem sổ ghi chép liên quan đến bài đăng này trên GitHub.

Một quan sát khác về mô phỏng Monte Carlo là chúng tương đối dễ dàng để giải thích cho người dùng cuối của dự đoán. Người nhận được ước tính này có thể không có nền tảng toán học sâu sắc nhưng có thể hiểu trực giác những gì mô phỏng này đang làm và làm thế nào để đánh giá khả năng của phạm vi tiềm năng & nbsp; kết quả.

Cuối cùng, tôi nghĩ rằng cách tiếp cận được hiển thị ở đây với Python dễ hiểu và sao chép hơn một số giải pháp Excel mà bạn có thể gặp phải. Bởi vì Python là ngôn ngữ lập trình, có một luồng tuyến tính theo các tính toán mà bạn có thể & nbsp; làm theo.

Sự kết luận

Mô phỏng Monte Carlo là một công cụ hữu ích để dự đoán kết quả trong tương lai bằng cách tính một công thức nhiều lần với các đầu vào ngẫu nhiên khác nhau. Đây là một quá trình bạn có thể thực hiện trong Excel nhưng nó không đơn giản để làm mà không có một số plugin bên thứ ba hoặc có khả năng đắt tiền. Sử dụng Numpy và Pandas để xây dựng một mô hình và tạo ra nhiều kết quả tiềm năng và phân tích chúng tương đối đơn giản. Lợi ích bổ sung khác là các nhà phân tích có thể chạy nhiều kịch bản bằng cách thay đổi đầu vào và có thể chuyển sang các mô hình tinh vi hơn nhiều trong tương lai nếu nhu cầu phát sinh. Cuối cùng, kết quả có thể được chia sẻ với người dùng phi kỹ thuật và tạo điều kiện cho các cuộc thảo luận xung quanh sự không chắc chắn của kết quả Final & NBSP;VBA or potentially expensive third party plugins. Using numpy and pandas to build a model and generate multiple potential results and analyze them is relatively straightforward. The other added benefit is that analysts can run many scenarios by changing the inputs and can move on to much more sophisticated models in the future if the needs arise. Finally, the results can be shared with non-technical users and facilitate discussions around the uncertainty of the final results.

Tôi hy vọng ví dụ này hữu ích cho bạn và cung cấp cho bạn những ý tưởng mà bạn có thể áp dụng cho các vấn đề của riêng bạn. Xin vui lòng để lại nhận xét nếu bạn thấy bài viết này hữu ích cho việc phát triển các mô hình ước tính & NBSP;

Cập nhật

  • 19-Mar-2019: Dựa trên các bình luận từ Reddit, tôi đã thực hiện một triển khai khác là & NBSP; nhanh hơn.