Tutorial 02 – Básico de Simulação no VBA do Excel Este tutorial é a segunda parte da série Tutorial
sobre Simulação Básica no VBA do Excel. Ela fornece tutoriais do VBA DO Excel sobre
como criar estimativas estatísticas que são usadas para analisar os dados de
uma simulação. Muitos dos exemplos usados já estão disponíveis nas
funções do Excel. Os usuários podem usar estas funções do Excel como
ferramentas para verificarem seus resultados oriundos dos exemplos. Estes exemplos exigem habilidades de programação
básica em VBA. Os usuários são estimulados a lerem o Tutorial 01
sobre o Básico de Simulação no VBA do Excel
se eles tiverem problemas de entendimento dos conceitos e termos de
programação usados nesta página. Números Aleatórios e a Declaração Randomize
Percentís e Intervalo de Confiança
Números Aleatórios e a Declaração Randomize Sub rndNo() *
A função CStr() converte números aleatórios em string.
Até
aqui tudo bem. Mas quando fechamos o arquivo, e reabrimos e rodamos a
sub-rotina novamente, os mesmos 5 números aparecem! Sub rndNo()
Function Media(Arr() As Single) A
sub-rotina seguinte lê os dados na coluna um da linha 1 até a linha 10 (da
Plan1) no array, chama ambas as funções passando os argumentos a elas, calcula
a média (average) e o desvio padrão, e retorna os valores numa caixa de
mensagem. Sub compute()
|
Curtose
mede o grau de aguçamento ou achatamento de uma
distribuição comparada com a distribuição normal. Uma curtose positiva
indica uma distribuição relativamente aguçada. Uma curtose negativa
indica uma distribuição relativamente achatada. Freqüentemente, estas duas
estimativas juntamente com a média e o desvio padrão são usadas para testar
para ver se os dados simulados de uma distribuição são legítimos (se os dados
representam a distribuição). A sub-rotina seguinte, calcule(), lê os dados seguintes numa coluna
de 1 até 10 (da planilha ativa) no array,
Dim arr(10)
As Single For
i = 1 To 10 arr(i) = Cells(i, 1) Next i MsgBox "Média: " & vbTab &
Format(MediaA(arr), "0.0000") & vbCrLf & _ "Devio Padrão: " & vbTab
& Format(Var(arr) ^ 0.5, "0.0000") & vbCrLf & _ "Distorção: " & vbTab & Format(Distorc(arr),
"0.0000") & vbCrLf & _ "Curtose: " & vbTab &
Format(Curtose(arr), "0.0000") End Sub
Dim i As Long, n As Long Dim
med As Single, dp As
Single, SomaAte3 As Single n = UBound(arr) med = MediaA(arr) dp = (Var(arr)) ^ 0.5 SomaAte3 = 0 For i
= 1 To n SomaAte3
= SomaAte3 + ((arr(i) - med) / dp) ^ 3 Next i Distorc = SomaAte3 * (n / ((n - 1) * (n - 2))) End Function
Dim i As Long, n As Long Dim
med As Single, dp As
Single, SomaAte3 As Single n = UBound(arr) med = MediaA(arr) dp = (Var(arr)) ^ 0.5 SomaAte4 = 0 For i
= 1 To n SomaAte4
= SomaAte4 + ((arr(i) - med) / dp) ^ 4 Next i Curtose = SomaAte4 * (n * (n + 1) / ((n - 1) * (n
- 2) * (n - 3))) - (3 * (n - 1) ^ 2 / ((n - 2) * (n - 3))) End Function
Dim
Soma As Single Dim i As Long, k As Long k = UBound(arr) Soma = 0 For i
= 1 To k Soma = Soma + arr(i) Next
i MediaA = Soma / k End Function Dim i As Long Dim
med As Single, SomaQ As Single k = UBound(arr) med = MediaA(arr) For i
= 1 To k SomaQ = SomaQ + (arr(i) - med) ^ 2 Next i Var = SomaQ / (k - 1) End Function (Estas
funções são semelhantes às funções DISTORÇÂO() e a CURT() fornecidas
pelo Excel.)
Sub ObterPercentil() Dim arr(10) As Single For i
= 1 To 10 arr(i) = Int(Rnd * 50) + 1 Cells(i, 1) = arr(i) Next i Cells(10, 2) = u_percentil(arr, 0.4) End Sub Dim i As Integer,
n As Integer n
= UBound(arr) Call
Ordenar(arr) x = Application.Max(Application.Min(Int(k
* n), n), 1) u_percentil = arr(x) End Function Dim
Temp As Single Dim i As Long Dim j As Long For j
= 2 To UBound(arr) Temp = arr(j) For
i = j - 1 To 1 Step
-1 If
(arr(i) <= Temp) Then GoTo 10 arr(i + 1) = arr(i) Next
i i = 0 10 arr(i + 1) = Temp If
j Mod 100 = 0 Then Cells(26, 5) = j End If Next j End Sub O exemplo de percentil anterior
mostra como obter o valor que corresponde a um percentil específico. Neste exemplo,
mostraremos a você como obter o percentil com um dado valor. Iniciaremos este tutorial mostrando-lhe
uma simulação muito simples. Entretanto, a simulação não precisa obter
a resposta neste exemplo porque estamos usando hipóteses muito fracas. O
resultado pode realmente ser calculado na sua cabeça se sua matemática for
boa. Assuma que os seus lucros estejam
distribuídos uniformemente. Dos registros passados, vocÊ sabe que seu
lucro médio anual flutua entre -$100.000 até $500.000. Queremos saber qual
é a lucratividade que você terá com $300.000 no próximo ano mantendo todas as
outras coisas constantes. Bastante interessante? Agora repare
isto:
1 - (300.000-(-100.000))/(500.000-(-100.000))
= 1 – 0,666 = 0,333 A probabilidade será 33%. Agora, vamos rodar a simulação e ver
o que acontecerá. Cinco simulações foram rodadas, cada
uma com 1000 iterações. O resultado mostra 5 valores de probabilidades numa
caixa de mensagem. Cada resultado está perto do cálculo matemático de 33%.
Sub ObterProb()
(Esta
função é semelhante à função ORDEM.PORCENTUAL() fornecida pelo Excel). Sub Hist(M As Long, arr()
As Single)
As
classes são os bins ou as interrupcoes. A freqüência contém o número de
valores simulados para cada uma das classes.
|