01.17 在雙變量分佈中使用蒙特卡羅模擬

智力(以IQ衡量)能有效地預測工作成功嗎?

對於智商高於平均水平的員工,他/她的表現高於平均水平的概率是多少呢?研究表明智商和成功之間的相關性為0.5。表現和智商都是正態分佈的。

在這篇文章中,我們將使用蒙特卡羅模擬來回答這個問題。我們將探討聯合概率分佈、相關性和雙變量正態分佈的概念。

聯合概率分佈

解決這個問題最重要的想法是理解聯合概率分佈的概念。在這種情況下,我們希望計算“成功(Success)”和“智商(IQ)”的聯合概率分佈函數(PDF)。要了解聯合PDF,我們可以採用最簡單的投幣方式。假設我們有2個硬幣,我們一個接一個地拋擲它們。每次拋擲都是Bernoulli trail ,具有伯努利分佈。硬幣投擲的聯合概率密度函數定義了每對結果的概率,如下所示。

在雙變量分佈中使用蒙特卡羅模擬

拋硬幣的聯合概率分佈

計算“成功”和“智商”的聯合PDF文件有點複雜,因為這些變量是連續的。但是你可以想象這樣一種情況,你想計算“成功”的概率在一個特定的範圍內,而“智商”在另一個範圍內。作為一個例子,你可以用如下表格計算“成功”和“智商”(另外注意:這兩個變量的比例是任意的)。

在雙變量分佈中使用蒙特卡羅模擬

如果我們能夠生成上表,我們將能夠計算出高於平均水平的“智商”人的成功程度。但在我們做到這一點之前,我們必須理解相關性和/或協方差的概念。

相關性和協方差

在上面拋硬幣的例子中,投擲次數是獨立的。投擲2和投擲1沒有關係。因此,當我們把正面(head)看成結果1時,我們得到正面(head)或反面(tail)的概率是相等的。在這種情況下,“成功”和“智商”的變量是相關的。關於成功和智商之間的關係有很多研究。一些研究表明相關性高,一些研究表明相關性低。這裡我們堅持0.5的高相關性一些研究已經把相關性降低到0.3。

此外,我們假設“成功”和“智商”都是正態分佈的。智商按定義是正態分佈的。Success可能不是。許多組織使用正態曲線來評價他們的員工,但是在現實世界中,“成功”可能不是正態分佈的。在我們的例子中,我們假設成功也是正態的。由於我們兩個變量都是正態分佈,所以我們知道聯合概率分佈為雙變量正態分佈或雙變量高斯分佈。

雙變量正態分佈

如果X和Y是兩個正態分佈的隨機變量。他們的雙變量正態分佈的聯合PDF由下式給出:

在雙變量分佈中使用蒙特卡羅模擬

其中ρ是相關係數。

相關性

讓我們來探討一下“成功”和“智商”是相互獨立的。在這種情況下相關性是零。在下面的圖表中,觀察PDF在x-y, x-z和y-z平面上的投影。x投影,y投影是正態分佈。而z投影是圓形等高線圖。

在雙變量分佈中使用蒙特卡羅模擬

PDF with = 0

查看地址:https://plot.ly/create/?fid=csaurav:6

Z的投影非常清晰地展示了X和y的獨立性,輪廓橢圓沿著X和y軸是圓形和對稱的。

在雙變量分佈中使用蒙特卡羅模擬

Projection of the PDF along XY plane

如果“成功”和“智商”高度相關 - 比如ρ= 0.9,我們應該觀察到一個細長的橢圓,其軸傾斜45度。以下幾個圖表演示了“成功”和“智商”高度相關的情況。

在雙變量分佈中使用蒙特卡羅模擬

PDF with = .9

查看地址:https://plot.ly/create/?fid=csaurav:12


在雙變量分佈中使用蒙特卡羅模擬

Projection of the PDF along XY plane

使用蒙特卡羅模擬計算概率

下圖的相關性為0.5,顯示了我們感興趣的區域。為了計算概率,我們需要在我們感興趣的區域內計算PDF下的volume。

在雙變量分佈中使用蒙特卡羅模擬

使用Python中的numpy計算新員工成功的概率實際上非常簡單。我們將使用函數numpy .random.multivariate_normal()。由於此函數接受協方差作為參數,我們必須將相關性轉換為協方差矩陣。如果我們假設IQ和Success的方差均為1(任何其他關於方差的假設都會給出相同的結果)。協方差矩陣與相關矩陣相同。我們使用該函數繪製10000個“成功”和“智商”值。假設兩個變量均值為零,相關係數為0.5。

下面的代碼應該給出大約0.67的結果。我們的新員工表現優於平均水平的概率比我們對“智商”隨機選擇過程的預期高出約17%。Python代碼如下:

在雙變量分佈中使用蒙特卡羅模擬

在Python中創建一個雙變量正態PDF圖

Python完整代碼如下:

# imports
import plotly
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

import numpy as np
# setup plotly credentials
plotly.tools.set_credentials_file(username='csaurav', api_key='')
value_range = 2
xx = np.sort(np.random.normal(0, 1, 300)) # draw xx from a normal distribution
yy = np.sort(np.random.normal(0, 1, 300)) # drwa yy from a normal distribution
x,y=np.meshgrid(xx, yy)
mu_x = np.mean(xx)
sd_x = np.std(xx)
mu_y = np.mean(yy)
sd_y = np.std(yy)
rho = 0.5 # the expected correlation
# the formula to generate the pdf given X, Y
z = ((np.exp(-(1 / (2 * (1 - rho ** 2)))*(((x - mu_x) / sd_x) ** 2 + ((y - mu_y) / sd_y) ** 2
- 2 * rho * (x - mu_x) * (y - mu_y)/(sd_x * sd_y))))
/ (2 * np.pi * sd_x * sd_y * np.sqrt(1 - rho ** 2)))
init_notebook_mode(connected=True)
colorscale = [[0.0, 'rgb(20,29,67)'],
[0.1, 'rgb(28,76,96)'],
[0.2, 'rgb(16,125,121)'],
[0.3, 'rgb(92,166,133)'],
[0.4, 'rgb(182,202,175)'],
[0.5, 'rgb(253,245,243)'],
[0.6, 'rgb(230,183,162)'],
[0.7, 'rgb(211,118,105)'],
[0.8, 'rgb(174,63,95)'],
[0.9, 'rgb(116,25,93)'],
[1.0, 'rgb(51,13,53)']]
textz = [['IQ: '+'{:0.5f}'.format(x[i][j])+'
Success: '+'{:0.5f}'.format(y[i][j]) +
'
z: '+'{:0.5f}'.format(z[i][j]) for j in range(z.shape[1])] for i in range(z.shape[0])]
trace1 = go.Surface(
x=tuple(x),
y=tuple(y),
z=tuple(z),
colorscale=colorscale,
text=textz,
hoverinfo='text',
)
axis = dict(
showbackground=True,
backgroundcolor="rgb(230, 230,230)",
showgrid=False,
zeroline=False,
showline=False)
layout = go.Layout(title="Bi-variate Probabilty Distribution Function",
autosize=False,
width=700,
height=600,

scene=dict(xaxis=dict(axis, range=[-1 * value_range, value_range],
title='IQ'),
yaxis=dict(
axis, range=[-1 * value_range, value_range],
title='Success'),
zaxis=dict(
axis, range=[np.min(z) - (np.max(z) - np.min(z)), np.max(z)],
title='Probability P("Success", "IQ")'),
aspectratio=dict(x=1,
y=1,
z=0.95)
)
)
z_offset = (np.min(z) - (np.max(z) - np.min(z)))*np.ones(z.shape)
x_offset = -2*np.ones(z.shape)
y_offset = -2*np.ones(z.shape)
def proj_z(x, y, z): return z # projection in the z-direction
colorsurfz = proj_z(x, y, z)
def proj_x(x, y, z): return x
colorsurfx = proj_z(x, y, z)
def proj_y(x, y, z): return y
colorsurfy = proj_z(x, y, z)
textx = [['Success: '+'{:0.5f}'.format(y[i][j])+'
z: '+'{:0.5f}'.format(z[i][j]) +
'
IQ: '+'{:0.5f}'.format(x[i][j]) for j in range(z.shape[1])] for i in range(z.shape[0])]
texty = [['IQ: '+'{:0.5f}'.format(x[i][j])+'
z: '+'{:0.5f}'.format(z[i][j]) +
'
Success: '+'{:0.5f}'.format(y[i][j]) for j in range(z.shape[1])] for i in range(z.shape[0])]
tracex = go.Surface(z=list(z),
x=list(x_offset),
y=list(y),
colorscale=colorscale,
showlegend=False,
showscale=False,
surfacecolor=colorsurfx,
text=textx,
hoverinfo='text'
)
tracey = go.Surface(z=list(z),
x=list(x),
y=list(y_offset),
colorscale=colorscale,
showlegend=False,
showscale=False,
surfacecolor=colorsurfy,
text=texty,
hoverinfo='text'
)

tracez = go.Surface(z=list(z_offset),
x=list(x),
y=list(y),
colorscale=colorscale,
showlegend=False,
showscale=False,
surfacecolor=colorsurfx,
text=textz,
hoverinfo='text'
)
data = [trace1, tracex, tracey, tracez]
fig = go.Figure(data=data, layout=layout)
iplot(fig)
plotly.tools.set_credentials_file(username='csaurav', api_key='')
py.plot(fig)
mean = (0, 0) # Mean for both success and IQ is zero
cov = [[1, .5], [.5, 1]] # covarnance matrix with assumption of sd =1 (any other sd gives the same result)
x = np.random.multivariate_normal(mean, cov, 10000) # we draw from both IQ and Success from a Multivariate
count_both = 0
count_pos_iq = 0
for i in range(len(x)):
if (x[i, 0] > 0):
count_pos_iq += 1
if (x[i, 1] > 0):
count_both += 1
p = p + 1
count_both/count_pos_iq # ration of values where Succuess > 0, IQ >0 to those where IQ > 0
在雙變量分佈中使用蒙特卡羅模擬

在雙變量分佈中使用蒙特卡羅模擬

在雙變量分佈中使用蒙特卡羅模擬


分享到:


相關文章: