import scipy.stats as st
import numpy as np
import matplotlib.pyplot as plt
Considere que pesquisadores tenham uma linguagem de programação preferida. conforme a seguir:
- Python: 40%
- C++: 30%
- Java: 20%
- Outros: 10%
Escolhem-se aleatoreamente 10 pesquisadores para responder sobre sua linguagem preferida. Contam-se quantas vezes cada uma das linguagens é citada.
- Qual a propabilidade de nenhum pesquisador que prefere Java ser escolhido?
- Qual a probabilidade de se escolher no máximo 4 pesquisadores que preferem Python?
- Qual a probabilidade de se escolher mais de 4 pesquisadores que preferem Python?
- Qual a probabilidade de se escolher mais de 2 pesquisadores que preferem Java?
#Solução do item 1.
p = 20/100 # Java
x = 0
n = 10
P = st.binom.pmf(x, n, p) # Probability mass function
print(f'1. P = {P}')
- P = 0.1073741824
#Solução do item 2.
p = 40/100 # Python
x = 4
n = 10
P = st.binom.cdf(x, n, p) # cumulative function
print(f'2. P = {P}')
- P = 0.6331032576
#Solução do item 3.
p = 40/100 # Python
x = 4
n = 10
P = st.binom.sf(x, n, p) # cumulative function
print(f'3. P = {P}')
- P = 0.36689674240000003
#@title Solução do item 4.
p = 20/100 # Java
x = 2
n = 10
P = st.binom.sf(x, n, p) # cumulative function
print(f'4. P = {P}')
- P = 0.3222004736000005
O ilusionista Deren Brown pretende produzir um vídeo para o epsódio 'The System' em que lança 10 vezes em sequência uma moeda e obtém cara 10 vezes. Qual a probabilidade de obter o resultado em até 100 tentativas (99 fracassos + 1 sucesso). Dica: cada lançamento de 10 moedas é um evento independente.
#Solução da questão 2.
# A probabilidade p de obter 10 caras em dez lançamentos é 1/2**10 = 1/1024
p = 1/1024 # 1024 = 2**10
x = 99
r = 1
P = st.nbinom.cdf(x, r, p)
print(f'P = {P}')
P = 0.09308265650895883
Seja X uma variável aleatória normalmente distribuída com média 5 e desvio padrão 1. Calcule:
$P(X>4)$ $P(X<10)$ $P(3<X<6)$ -
$x$ tal que$P(X<x) = 0.05$
#Solução do item 1.
P = st.norm.sf(4, scale=1, loc=5)
print(f'1. P = {P}')
- P = 0.8413447460685429
#@title Solução do item 2.
P = st.norm.cdf(10, scale=1, loc=5)
print(f'2. P = {P}')
- P = 0.9999997133484281
#Solução do item 3.
# Item 3.
P = st.norm.cdf(6, scale=1, loc=5) - st.norm.cdf(3, scale=1, loc=5)
print(f'3. P = {P}')
- P = 0.8185946141203637
#Solução do item 4.
x = st.norm.ppf(0.05, scale=1, loc=5)
print(f'4. x = {x}')
- x = 3.355146373048527
Uma variável aleatória
- O desvio padrão
$\sigma(T)$ . $P(T>1)$ $P(T<2)$ $P(-1<T<2)$ -
$t$ tal que$P(T>t)= 0.025$ .
#@title Solução do item 1
std = st.t.std(df=3)
print(f'1. Desvio padrão = {std}')
- Desvio padrão = 1.7320508075688772
#@title Solução do item 2
P = st.t.sf(1, df=3) # degrees of freedom
print(f'2. P = {P}')
- P = 0.19550110947788527
#@title Solução do item 3
# Item 3
P = st.t.cdf(2, df=3)
print(f'3. P = {P}')
- P = 0.9303370157205785
#@title Solução do item 4
P = st.t.cdf(2, df=3) - st.t.cdf(-1, df=3)
print(f'4. P = {P}')
P = 0.7348359062426932
#@title Solução do item 5
x = st.t.isf(0.025, df=3)
print(f'5. x = {x}')
- x = 3.1824463052842638
Uma variável aleatória
- A média
$\mu(F)$ - A variância
$\sigma(F)$ . -
$P(F>1)$ . -
$f$ tal que$P(F>f)= 0.025$ .
#@title Solução do item 1.
media = st.f.mean(3, 5)
print(f'1. Média = {media}')
- Média = 1.6666666666666667
#@title Solução do item 2.
var = st.f.var(3, 5)
print(f'2. Variância = {var}')
- Variância = 11.11111111111111
#@title Solução do item 3.
P = st.f.sf(1, 3, 5)
print(f'3. P = {P}')
- P = 0.46485478999363516
#@title Solução do item 4.
f = st.f.isf(0.025, 3, 5)
print(f'4. f = {f}')
- f = 7.763589482018546
-
Considere os pontos dados e calcule os coeficiente da reta
$y = ax+ b$ que melhor aproxima os pontos pelo critério dos mínimos quadrados. -
Trace o gráfico com os pontos dados e a reta de regressão.
# Dados:
x = np.linspace(0, 10, 21)
y = np.array([ 0.77, 0.59, 4.43, 2.95, 3.71, 3.69, 3.64, 4.8 , 7.04,
5.92, 14.64, 6.54, 8.72, 8.33, 7.1 , 7.96, 8.59, 9.18, 11.71,
10.04, 18.91])
#Solução
a, b, r_value, p_value, std_err = st.linregress(x, y)
yest = a*x + b
fig, ax = plt.subplots()
ax.plot(x, y, '*')
ax.plot(x, yest, '-')
ax.grid()
plt.show()
print(f'a = {a}, b = {b}')
-
Para os dados do problema anterior, calcule o array formado pela diferença entre os dados e o os valores estimados pela reta:
$e_j = y_j - (ax_j + b)$ . -
Trace o boxplot e verifique a existência de outliers.
-
Identifique os outliers e construa arrays filtrados sem eles. Lembre de remover de x e y.
#@title Traça boxplot
e = y - yest
fix, ax = plt.subplots()
ax.boxplot(e, vert=False)
plt.show()
#@title Filtra outliers
# Solução
Q1 = np.percentile(e, 25)
Q3 = np.percentile(e, 75)
limiar_de_outlier = Q3 + 1.5*(Q3-Q1)
n_outliers = e <= limiar_de_outlier # Gera um array de booleanos com os outliers
x_filtrado = x[n_outliers]
y_filtrado = y[n_outliers]
e <= limiar_de_outlier
array([ True, True, True, True, True, True, True, True, True,
True, False, True, True, True, True, True, True, True,
True, True, False])
-
Faça uma nova regressão e encontre a reta
$y = a_2x + b_2$ que melhor aproxima os pontos dados sem os outliers. -
Trace um gráfico com os pontos e ambas as retas.
#@Solução
a2, b2, r_value, p_value, std_err = st.linregress(x_filtrado, y_filtrado)
yest2 = a2*x_filtrado + b2
fig, ax = plt.subplots()
ax.plot(x_filtrado, y_filtrado, '*', color='blue')
ax.plot(x[e>limiar_de_outlier], y[e>limiar_de_outlier], 'o', color='orange')
ax.plot(x_filtrado, yest2, '-', color='green')
ax.plot(x, yest, '-', color='red')
ax.legend(['Dados não discrepantes', 'Dados discrepantes',
'Regressão sem discrepantes', 'Regressão com discrepantes'],
loc='upper left', bbox_to_anchor=(1, 1))
ax.grid()
fig.suptitle('Retas de regressão com e sem outliers.')
fig.set_facecolor('white')
ax.text(1.1, 0.5, f'y = {a:.2f}x+{b:.2f}', transform=ax.transAxes, color='green')
ax.text(1.1, 0.4, f'y = {a2:.2f}x+{b2:.2f}', transform=ax.transAxes, color='red')
plt.show()
# print(f'a = {a}, b = {b}')
# print(f'a2 = {a2}, b2 = {b2}')