# semana_01_vetores.py
# Operacoes basicas com vetores 2D
import math
def main():
print('--- Vetores em R2 ---')
u1 = float(input('u1: '))
u2 = float(input('u2: '))
v1 = float(input('v1: '))
v2 = float(input('v2: '))
soma = (u1+v1, u2+v2)
sub = (u1-v1, u2-v2)
norm_u = math.hypot(u1,u2)
dot = u1*v1 + u2*v2
norm_v = math.hypot(v1,v2)
ang = math.degrees(math.acos(dot/(norm_u*norm_v))) if norm_u*norm_v!=0 else float('nan')
print('u+v =', soma)
print('u-v =', sub)
print('||u|| =', round(norm_u,4))
print('u × v =', dot)
print('angulo(u,v) (graus) =', round(ang,2))
if __name__ == '__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo de entrada:
# u1=2, u2=3, v1=-1, v2=4
# Saída esperada:
# u+v = (1, 7)
# u-v = (3, -1)
# ||u|| = 3.6056
# u × v = 10
# angulo(u,v) (graus) ≈ 47.73
# Explicação: produto escalar e normas determinam cos(θ)= (u × v)/(||u|| × ||v||).
Questão (Q1) — Vetores em R2
Enunciado: Dados u=(2,3) e v=(−1,4), calcule u+v, u−v, u × v, |u| e o ângulo entre u e v (graus).
Resolução (passo a passo, sem meios eletrônicos):
# semana_02_tipos_dados.py
# Frequencia de categorias e media ordinal (Baixo<Médio<Alto)
from collections import Counter
def main():
print('--- Frequencia de categorias ---')
txt = input('Digite categorias separadas por virgula (ex: Azul,Verde,Azul): ').strip()
cats = [c.strip() for c in txt.split(',') if c.strip()]
freq = Counter(cats)
total = len(cats)
for k in sorted(freq):
print(f"{k}: {freq[k]} ({freq[k]/total:.3f})")
print('
--- Media ordinal (Baixo<Médio<Alto) ---')
mapa = {'Baixo':1,'Medio':2,'Médio':2,'Alto':3}
serie = [s.strip() for s in input('Serie ordinal (ex: Medio,Alto,Baixo): ').split(',') if s.strip()]
valores = [mapa.get(s, None) for s in serie]
if None in valores:
print('Atencao: valores invalidos foram ignorados.')
valores = [x for x in valores if x is not None]
media = sum(valores)/len(valores) if valores else float('nan')
print('Valores numericos:', valores)
print('Media ordinal =', round(media,2))
if __name__ == '__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo 1 (categorias):
# Entrada: Azul, Verde, Azul, Vermelho, Azul, Verde
# Contagens: Azul=3, Verde=2, Vermelho=1 (proporção Azul≈0.500)
# Exemplo 2 (ordinal):
# Entrada: Medio, Alto, Baixo, Medio, Alto → valores [2, 3, 1, 2, 3]
# Média ordinal ≈ 2.20
Questão (Q2) — Tipos de Dados e Representações
Enunciado: Monte a tabela de frequências e a média ordinal para: Azul, Verde, Azul, Vermelho, Azul, Verde e sequência ordinal Médio, Alto, Baixo, Médio, Alto (Baixo=1, Médio=2, Alto=3).
Resolução (passo a passo, sem meios eletrônicos):
# semana_03_matrizes_2x2.py
# Produto, determinante e inversa de matriz 2x2; produto com B
def det2(a11,a12,a21,a22):
return a11*a22 - a12*a21
def inv2(a11,a12,a21,a22):
d = det2(a11,a12,a21,a22)
if d == 0:
return None
return (a22/d, -a12/d, -a21/d, a11/d)
def main():
print('--- Matriz A 2x2 ---')
a11=float(input('A11: ')); a12=float(input('A12: '))
a21=float(input('A21: ')); a22=float(input('A22: '))
print('--- Matriz B 2x2 ---')
b11=float(input('B11: ')); b12=float(input('B12: '))
b21=float(input('B21: ')); b22=float(input('B22: '))
# Produto C = A*B
c11=a11*b11 + a12*b21
c12=a11*b12 + a12*b22
c21=a21*b11 + a22*b21
c22=a21*b12 + a22*b22
print('A*B = [[',c11, c12,']; [', c21, c22,']]')
d = det2(a11,a12,a21,a22)
print('det(A) =', d)
inv = inv2(a11,a12,a21,a22)
if inv:
print('A^-1 = [[', round(inv[0],4), round(inv[1],4), ']; [', round(inv[2],4), round(inv[3],4), ']]')
else:
print('A nao possui inversa (det=0).')
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo:
# A = ((1, 2), (3, 4)), B = ((2, 0), (1, 2))
# A*B = ((4, 4), (10, 8))
# det(A) = -2
# A^-1 ≈ ((-2.00, 1.00), (1.50, -0.50))
Questão (Q3) — Matrizes 2×2
Enunciado: Para A=(1 2; 3 4) e B=(2 0; 1 2), calcule A × B, det(A) e A⁻¹ (se existir).
Resolução (passo a passo, sem meios eletrônicos):
# semana_04_tendencia_central.py
# Media, mediana, moda e media aparada
from statistics import mean, median, multimode
def trimmed_mean(vals, p=0.2):
if not vals:
return float('nan')
n = len(vals)
k = int(n*p/2)
xs = sorted(vals)[k: n-k or None]
return sum(xs)/len(xs) if xs else float('nan')
def main():
nums = [float(x) for x in input('Valores (ex: 2,4,4,6,8): ').split(',')]
print('Media =', round(mean(nums),4))
print('Mediana =', median(nums))
try:
print('Moda(s) =', multimode(nums))
except Exception:
print('Moda indisponivel')
p = float(input('Proporcao de aparo total (ex 0.2 para 20%): ') or '0.2')
print('Media aparada =', round(trimmed_mean(nums, p),4))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: [2, 4, 4, 6, 8]
# Media = 4.8; Mediana = 4; Moda = [4]
# Para visualizar efeito do aparo, use p=0.4 (20% em cada lado):
# Sem extremos → [4, 4, 6]; Média aparada ≈ 4.667
Questão (Q4) — Tendência Central
Enunciado: Para 2,4,4,6,8 calcule média, mediana, moda e média aparada (20%).
Resolução (passo a passo, sem meios eletrônicos):
# semana_05_funcao_afim.py
# Avaliacao de y=mx+b e reta por dois pontos
def main():
print('--- y = m x + b ---')
m = float(input('m: ')); b = float(input('b: '))
x = float(input('x para avaliar: '))
y = m*x + b
x0 = -b/m if m!=0 else float('nan')
print('y =', y)
print('Intercepto em x quando y=0:', x0)
print('
--- Reta por dois pontos ---')
x1=float(input('x1: ')); y1=float(input('y1: '))
x2=float(input('x2: ')); y2=float(input('y2: '))
m2 = (y2-y1)/(x2-x1)
b2 = y1 - m2*x1
print(f'y = 1.6666666666666667 x + 0.33333333333333326')
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Parte 1: m=2.0, b=1.0, x=3.5 → y=8.0, intercepto x=-0.50
# Parte 2: P1=(1,2), P2=(4,7) → m=1.6667, b=0.3333
Questão (Q5) — Função Afim
Enunciado: Encontre a reta por P1=(1,2) e P2=(4,7) e o zero da função.
Resolução (passo a passo, sem meios eletrônicos):
# semana_06_cov_corr.py
# Covariancia amostral e correlacao de Pearson
import math
def parse_list(prompt):
return [float(x) for x in input(prompt).split(',') if x.strip()]
def main():
x = parse_list('X (ex: 1,2,3): ')
y = parse_list('Y (ex: 2,4,5): ')
if len(x)!=len(y) or len(x)<2:
print('Listas devem ter mesmo tamanho >=2.')
return
n=len(x)
mx = sum(x)/n; my=sum(y)/n
cov = sum((xi-mx)*(yi-my) for xi,yi in zip(x,y))/(n-1)
sx = math.sqrt(sum((xi-mx)**2 for xi in x))
sy = math.sqrt(sum((yi-my)**2 for yi in y))
r = sum((xi-mx)*(yi-my) for xi,yi in zip(x,y)) ÷ (sx*sy) if sx*sy!=0 else float('nan')
print('Covariancia (amostral) =', round(cov,6))
print('Correlacao de Pearson r =', round(r,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: X=[1, 2, 3, 4, 5], Y=[2, 4, 5, 4, 5]
# Covariância≈ 1.500
# r≈ 0.775
Questão (Q6) — Covariância e Correlação
Enunciado: Para X={1,2,3,4,5}, Y={2,4,5,4,5} calcule a covariância amostral e discuta r.
Resolução (passo a passo, sem meios eletrônicos):
# semana_07_normalizacao_padronizacao.py
# Min-Max e Z-score
import math
def main():
xs = [float(x) for x in input('Dados (ex: 10,13,15,18,20): ').split(',')]
xmin, xmax = min(xs), max(xs)
mm = [(x - xmin)/(xmax - xmin) if xmax!=xmin else 0.0 for x in xs]
n=len(xs)
media = sum(xs)/n
s = math.sqrt(sum((x-media)**2 for x in xs)/(n-1)) if n>1 else float('nan')
z = [(x - media)/s for x in xs] if s and s!=0 else [float('nan')]*n
print('Min-Max:', [round(v,3) for v in mm])
print('Media =', round(media,3), 'Desvio (amostral) =', round(s,3))
print('Z-score:', [round(v,3) for v in z])
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: [10, 13, 15, 18, 20]
# Min-Max≈ [0.0, 0.3, 0.5, 0.8, 1.0]
# Média≈ 15.200; Desvio≈ 3.962
# Z-scores≈ [-1.312, -0.555, -0.05, 0.707, 1.211]
Questão (Q7) — Normalização e Z-score
Enunciado: Dado 10,13,15,18,20: Min–Max, média, desvio amostral e z(18).
Resolução (passo a passo, sem meios eletrônicos):
# semana_08_variancia_desvio.py
# Variancia e desvio padrao (populacional e amostral)
import math
def main():
xs = [float(x) for x in input('Dados: ').split(',')]
n=len(xs)
mu = sum(xs)/n
var_pop = sum((x-mu)**2 for x in xs)/n
var_sam = sum((x-mu)**2 for x in xs)/(n-1) if n>1 else float('nan')
print('Media =', round(mu,4))
print('Var(pop) =', round(var_pop,6), ' Desvio(pop) =', round(math.sqrt(var_pop),6))
print('Var(amostral) =', round(var_sam,6), ' Desvio(amostral) =', round(math.sqrt(var_sam),6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: [4, 6, 8]
# Média=6.0; Var(pop)=2.667; Var(amostral)=4.000
Questão (Q8) — Variância e Desvio
Enunciado: Para 4,6,8 calcule variâncias (pop e amostral) e desvios padrão.
Resolução (passo a passo, sem meios eletrônicos):
# semana_09_sistemas_lineares.py
# Resolucao de sistemas 2x2 e 3x3
def solve2(a):
(a11,a12,b1),(a21,a22,b2) = a
d = a11*a22 - a12*a21
if d==0: return None
x = (b1*a22 - a12*b2)/d
y = (a11*b2 - b1*a21)/d
return x,y
def solve3(m):
# Regra de Cramer simples
a11,a12,a13,b1 = m[0]
a21,a22,a23,b2 = m[1]
a31,a32,a33,b3 = m[2]
D = (a11*(a22*a33-a23*a32) - a12*(a21*a33-a23*a31) + a13*(a21*a32-a22*a31))
if D==0: return None
Dx = (b1*(a22*a33-a23*a32) - a12*(b2*a33-a23*b3) + a13*(b2*a32-a22*b3))
Dy = (a11*(b2*a33-a23*b3) - b1*(a21*a33-a23*a31) + a13*(a21*b3-a31*b2))
Dz = (a11*(a22*b3-b2*a32) - a12*(a21*b3-b2*a31) + b1*(a21*a32-a22*a31))
return Dx/D, Dy/D, Dz/D
def main():
print('--- Sistema 2x2 ---')
a11=float(input('a11: ')); a12=float(input('a12: ')); b1=float(input('b1: '))
a21=float(input('a21: ')); a22=float(input('a22: ')); b2=float(input('b2: '))
sol2 = solve2([(a11,a12,b1),(a21,a22,b2)])
print('Solucao 2x2:', sol2)
print('
--- Sistema 3x3 ---')
a11=float(input('a11: ')); a12=float(input('a12: ')); a13=float(input('a13: ')); b1=float(input('b1: '))
a21=float(input('a21: ')); a22=float(input('a22: ')); a23=float(input('a23: ')); b2=float(input('b2: '))
a31=float(input('a31: ')); a32=float(input('a32: ')); a33=float(input('a33: ')); b3=float(input('b3: '))
sol3 = solve3([(a11,a12,a13,b1),(a21,a22,a23,b2),(a31,a32,a33,b3)])
print('Solucao 3x3:', sol3)
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# 2x2: x+y=5; x-y=1 → (x,y)=(3,2)
# 3x3: 2x+y−z=8; −3x−y+2z=−11; −2x+y+2z=−3 → (x,y,z)=(2,3,-1)
Questão (Q9) — Sistemas Lineares
Enunciado: Resolva o sistema: x+y=5; x−y=1.
Resolução (passo a passo, sem meios eletrônicos):
# semana_10_prob_basica.py
# Probabilidade em dado e moedas
from math import comb
def dado():
n = int(input('Numero de faces do dado (ex 6): ') or '6')
k = int(input('Limiar para evento >=k (ex 5): ') or '5')
pares = n//2
p_par = pares/n
p_ge = (n-k+1)/n if 1<=k<=n else 0.0
inter = len([i for i in range(k,n+1) if i%2==0])/n
p_union = p_par + p_ge - inter
print('P(par) =', round(p_par,3))
print('P(>=k) =', round(p_ge,3))
print('P(par U >=k) =', round(p_union,3))
def moedas():
m = int(input('Numero de moedas independentes: ') or '2')
h = int(input('Numero de caras desejadas: ') or '2')
total = 2**m
formas = comb(m,h)
print('P(exatamente',h,'caras) =', round(formas/total,3))
if __name__=='__main__':
print('--- Dado ---')
dado()
print('
--- Moedas ---')
moedas()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Dado: n=6, k=5 → P(par)=0,5; P(>=5)=0,333; inter=1 ÷ 6; união≈0,667
# Moedas: m=2, h=2 → 1 ÷ 4 = 0,25
Questão (Q10) — Probabilidade Básica
Enunciado: Num dado honesto, calcule P(par), P(≥5) e P(par ∪ ≥5).
Resolução (passo a passo, sem meios eletrônicos):
# semana_11_binomial.py
from math import comb
def main():
n = int(input('n ensaios: '))
p = float(input('p sucesso (0-1): '))
k = int(input('k sucessos: '))
pk = comb(n,k)*(p**k)*((1-p)**(n-k))
EX = n*p
Var = n*p*(1-p)
print(f'P(X={k}) = {pk:.6f}')
print(f'E[X] = {EX:.4f}, Var(X) = {Var:.4f}')
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: n=10, p=0.3, k=3 → P≈0.26683; E[X]=3.0; Var=2.10
Questão (Q11) — Binomial
Enunciado: Moeda com p=0,3, n=10: P(X=3), E[X], Var(X).
Resolução (passo a passo, sem meios eletrônicos):
# semana_12_valor_esperado.py
# E[X] e E[X^2] para variavel discreta
def main():
xs = [float(x) for x in input('Suporte X (ex: 0,1,2,3): ').split(',')]
ps = [float(x) for x in input('Probabilidades p(x) (mesmo tamanho): ').split(',')]
if len(xs)!=len(ps) or abs(sum(ps)-1)>1e-6:
print('Erro: tamanhos diferentes ou probabilidades nao somam 1.')
return
EX = sum(x*p for x,p in zip(xs,ps))
EX2 = sum((x**2)*p for x,p in zip(xs,ps))
print('E[X] =', round(EX,6))
print('E[X^2] =', round(EX2,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: xs=[0, 1, 2, 3], ps=[0.1, 0.3, 0.4, 0.2] → E[X]=1.70; E[X^2]=3.70
Questão (Q12) — Valor Esperado
Enunciado: X∈{0,1,2,3} com p={0,1;0,3;0,4;0,2}: E[X] e E[X²].
Resolução (passo a passo, sem meios eletrônicos):
# semana_13_normal_zscore.py
# Probabilidades na normal usando aproximacao da CDF via erf
import math
def phi(z):
return 0.5*(1+math.erf(z/(2**0.5)))
def main():
mu = float(input('Media (mu): '))
sigma = float(input('Desvio padrao (sigma>0): '))
x = float(input('Valor x para P(X>=x): '))
z = (x-mu)/sigma
right = 1 - phi(z)
print('z =', round(z,4), ' P(X>=x) =', round(right,6))
a = float(input('Intervalo inferior a: '))
b = float(input('Intervalo superior b: '))
p = phi((b-mu)/sigma) - phi((a-mu)/sigma)
print('P(a<=X<=b) =', round(p,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: mu=170, sigma=10, x=185 → z=1.50; P>=x≈0.0668
# Intervalo [160,180] → P≈0.6827
Questão (Q13) — Normal/z-score
Enunciado: Normal(170,10²): z para x=185, P(X≥185) e P(160≤X≤180).
Resolução (passo a passo, sem meios eletrônicos):
# semana_14_intervalos_confianca.py
# IC para media: z (sigma conhecido) e t aproximado (t* tabelado comum)
import math
ZCRIT = {90:1.645, 95:1.96, 99:2.576}
TCRIT_DF15 = {90:1.753, 95:2.131, 99:2.947} # aproximacao para df=15
def main():
print('--- z-IC (sigma conhecido) ---')
xb = float(input('xbar: ')); sigma=float(input('sigma: ')); n=int(input('n: '))
conf = int(input('Confianca (90 ÷ 95 ÷ 99): ') or '95')
z = ZCRIT.get(conf,1.96)
moe = z*sigma/(n**0.5)
print(f'IC {conf}%: ({xb-moe:.4f}, {xb+moe:.4f})')
print('
--- t-IC (sigma desconhecido, df~15 aproximado) ---')
xb2=float(input('xbar: ')); s=float(input('s (desvio amostral): ')); n2=int(input('n: '))
conf2 = int(input('Confianca (90 ÷ 95 ÷ 99): ') or '95')
t = TCRIT_DF15.get(conf2,2.131)
moe2 = t*s/(n2**0.5)
print(f'IC {conf2}%: ({xb2-moe2:.4f}, {xb2+moe2:.4f})')
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# z-IC 95%: x̄=72, σ=12, n=64 → (69.06, 74.94)
# t-IC 95%: x̄=5.2, s=1.1, n=16, t*≈2.131 → (4.614, 5.786)
Questão (Q14) — Intervalos de Confiança
Enunciado: IC 95% para μ com σ=12, n=64, x̄=72.
Resolução (passo a passo, sem meios eletrônicos):
# semana_15_testes_hipoteses.py
# z-teste de media e de proporcao (bicaudal)
import math
def phi(z):
return 0.5*(1+math.erf(z/(2**0.5)))
def main():
print('--- z-teste (media, sigma conhecido) ---')
mu0=float(input('H0: mu = '))
xb=float(input('xbar: ')); sigma=float(input('sigma: ')); n=int(input('n: '))
z=(xb-mu0)/(sigma/(n**0.5))
p=2*(1-phi(abs(z)))
print('z =', round(z,4), ' p-valor =', round(p,6))
print('
--- z-teste (proporcao) ---')
n2=int(input('n: ')); x=int(input('sucessos x: ')); p0=float(input('H0: p = '))
phat = x/n2
z2=(phat-p0)/math.sqrt(p0*(1-p0)/n2)
pval=2*(1-phi(abs(z2)))
print('phat =', round(phat,4), ' z =', round(z2,4), ' p-valor =', round(pval,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Média: H0:μ=70, x̄=72, σ=12, n=64 → z≈1.333, p≈0.1824
# Proporção: n=200, x=130 → p̂=0.650, z≈1.443, p≈0.1489
Questão (Q15) — Testes de Hipóteses (z)
Enunciado: Teste z: H0:μ=70 (σ=12,n=64), x̄=72, α=5% bicaudal.
Resolução (passo a passo, sem meios eletrônicos):
# semana_16_regressao_linear.py
# Ajuste b0,b1 por MQO e previsao
def main():
X=[float(x) for x in input('X (ex: 1,2,3,4,5): ').split(',')]
Y=[float(y) for y in input('Y (mesmo tamanho): ').split(',')]
if len(X)!=len(Y) or len(X)<2:
print('Listas invalidas.'); return
n=len(X); mx=sum(X)/n; my=sum(Y)/n
sxx=sum((x-mx)**2 for x in X)
sxy=sum((x-mx)*(y-my) for x,y in zip(X,Y))
b1=sxy/sxx if sxx!=0 else 0.0
b0=my-b1*mx
print('b1 =', round(b1,6), ' b0 =', round(b0,6))
xq=float(input('x para prever: '))
print('y_hat =', round(b0+b1*xq,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: X=[1, 2, 3, 4, 5], Y=[1.5, 2.4, 3.6, 3.8, 5.1] → b1≈0.8600, b0≈0.7000; ŷ(6)≈5.860
Questão (Q16) — Regressão Linear
Enunciado: Regressão: estime b1, b0 e ŷ(6) para X={1..5}, Y≈{1,5;2,4;3,6;3,8;5,1}.
Resolução (passo a passo, sem meios eletrônicos):
# semana_17_residuos_r2.py
# Residuos e R^2
def main():
X=[float(x) for x in input('X: ').split(',')]
Y=[float(y) for y in input('Y: ').split(',')]
n=len(X); mx=sum(X)/n; my=sum(Y)/n
sxx=sum((x-mx)**2 for x in X)
sxy=sum((x-mx)*(y-my) for x,y in zip(X,Y))
b1=sxy/sxx if sxx!=0 else 0.0
b0=my-b1*mx
yhat=[b0+b1*x for x in X]
residuos=[y - yh for y,yh in zip(Y,yhat)]
sst=sum((y-my)**2 for y in Y)
sse=sum((y-yh)**2 for y,yh in zip(Y,yhat))
r2 = 1 - sse/sst if sst!=0 else float('nan')
print('Residuos =', [round(r,4) for r in residuos])
print('R^2 =', round(r2,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Resíduos≈ [-0.06, -0.02, 0.32, -0.34, 0.1]
# R²≈ 0.9696
Questão (Q17) — Resíduos e R²
Enunciado: Dado SST=100 e SSE=3,04, calcule R² e interprete.
Resolução (passo a passo, sem meios eletrônicos):
# semana_18_logistica_odds.py
# Funcao sigmoide e odds
import math
def sigmoid(x):
return 1/(1+math.exp(-x))
def main():
xs=[float(x) for x in input('x valores (ex: -2,-1,0,1,2): ').split(',')]
print('sigma(x) =', [round(sigmoid(x),6) for x in xs])
p=float(input('p (0<p<1) para odds p/(1-p): ') or '0.5')
odds = p/(1-p)
print('odds =', round(odds,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# sigma([-2, -1, 0, 1, 2])≈ [0.1192, 0.2689, 0.5, 0.7311, 0.8808]
# Para x=1: p≈0.731059; odds≈2.718282
Questão (Q18) — Logística e Odds
Enunciado: Logística: calcule odds de p=0,731 e recupere p de odds=2,718.
Resolução (passo a passo, sem meios eletrônicos):
# semana_19_metricas_classificacao.py
# Acuracia, Precisao, Recall, F1
def main():
TP=int(input('TP: ')); FP=int(input('FP: ')); FN=int(input('FN: ')); TN=int(input('TN: '))
total = TP+FP+FN+TN
acc = (TP+TN)/total if total else 0.0
prec = TP/(TP+FP) if (TP+FP)>0 else 0.0
rec = TP/(TP+FN) if (TP+FN)>0 else 0.0
f1 = 2*prec*rec/(prec+rec) if (prec+rec)>0 else 0.0
print('Acuracia =', round(acc,4))
print('Precisao =', round(prec,4))
print('Recall =', round(rec,4))
print('F1 =', round(f1,4))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: TP=50, FP=10, FN=8, TN=32 → acc=0.820, prec=0.833, rec=0.862, F1=0.847
Questão (Q19) — Métricas de Classificação
Enunciado: TP=50, FP=10, FN=8, TN=32: acurácia, precisão, recall, F1.
Resolução (passo a passo, sem meios eletrônicos):
# semana_20_bayes.py
# P(A|B) e exemplo de teste medico
def main():
print('--- P(A|B) ---')
PA=float(input('P(A): ')); PBgA=float(input('P(B|A): ')); PBgNA=float(input('P(B|~A): '))
PB = PA*PBgA + (1-PA)*PBgNA
PA_B = (PA*PBgA)/PB if PB>0 else float('nan')
print('P(B) =', round(PB,6), ' P(A|B) =', round(PA_B,6))
print('
--- Teste medico ---')
prev=float(input('Prevalencia: ')); sens=float(input('Sensibilidade: ')); esp=float(input('Especificidade: '))
Ppos = prev*sens + (1-prev)*(1-esp)
PPV = (prev*sens)/Ppos if Ppos>0 else float('nan')
print('P(+) =', round(Ppos,6), ' PPV = P(Doenca|+) =', round(PPV,6))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo 1: P(A)=0.2, P(B|A)=0.9, P(B|¬A)=0.1 → P(B)=0.26; P(A|B)≈0.692
# Exemplo 2: prev=0.01, sens=0.98, esp=0.97 → P(+)≈0.0395; PPV≈0.248
Questão (Q20) — Teorema de Bayes
Enunciado: Teste médico: sens=98%, esp=97%, prev=1%: P(+) e PPV.
Resolução (passo a passo, sem meios eletrônicos):
# semana_21_series_temporais.py
# Media movel e suavizacao exponencial simples
def moving_average(xs, k):
if k<=0 or k>len(xs):
return []
out=[]
for i in range(k, len(xs)+1):
out.append(sum(xs[i-k:i])/k)
return out
def exp_smooth(xs, alpha):
s=[xs[0]]
for t in range(1,len(xs)):
s.append(alpha*xs[t] + (1-alpha)*s[-1])
return s
def main():
xs=[float(x) for x in input('Serie (ex: 20,22,21,25,24): ').split(',')]
k=int(input('Janela MA k: ') or '3')
alpha=float(input('Alpha suavizacao (0-1): ') or '0.3')
print('MA(k) =', [round(v,3) for v in moving_average(xs,k)])
print('Suavizacao =', [round(v,3) for v in exp_smooth(xs,alpha)])
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: série=[20, 22, 21, 25, 24, 26, 28] → MA(3)=[21.0, 22.67, 23.33, 25.0, 26.0]
# Suavização (α=0,3)≈ [20, 20.6, 20.72, 22.0, 22.6, 23.62, 24.94]
Questão (Q21) — Séries Temporais
Enunciado: Série 20,22,21,25,24: MA(3) e SES(α=0,3) com S1=20.
Resolução (passo a passo, sem meios eletrônicos):
# semana_22_amostragem_margem.py
# Margem de erro e tamanho de amostra (proporcao)
import math
ZCRIT={90:1.645,95:1.96,99:2.576}
def main():
print('--- Margem de erro ---')
n=int(input('n: ')); phat=float(input('p_hat: '))
conf=int(input('Confianca (90 ÷ 95 ÷ 99): ') or '95')
z=ZCRIT.get(conf,1.96)
me = z*math.sqrt(phat*(1-phat)/n)
print('ME =', round(me,6), ' IC: (', round(phat-me,4), ',', round(phat+me,4), ')')
print('
--- Tamanho de amostra ---')
E=float(input('Margem desejada E (ex 0.03): ') or '0.03')
p=float(input('p aproximado (use 0.5 se desconhecido): ') or '0.5')
nreq = (z**2)*p*(1-p)/(E**2)
print('n necessario ~', math.ceil(nreq))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# ME (n=1000, p̂=0.52, 95%)≈ 0.0310 → IC≈ (0.489, 0.551)
# Tamanho para E=0,03 (95%, p=0,5) ≈ 1068
Questão (Q22) — Amostragem e ME
Enunciado: n=1000, p̂=0,52: ME(95%). Estime n para E=0,03 (95%, p≈0,5).
Resolução (passo a passo, sem meios eletrônicos):
# semana_23_combinatoria.py
# Probabilidade de As e de flush em baralho padrao
from math import comb
def main():
print('--- Baralho padrao ---')
p_ace = 4 ÷ 52
total_5 = comb(52,5)
flush = 4*comb(13,5)/total_5
print('P(carta As) =', round(p_ace,6))
print('P(Flush 5 cartas) =', round(flush,8))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# P(Ás)=4 ÷ 52≈0.077; P(Flush)=4 × C(13,5)/C(52,5)≈0.001981
Questão (Q23) — Combinatória/Baralho
Enunciado: Baralho: P(Ás) e P(Flush em 5 cartas).
Resolução (passo a passo, sem meios eletrônicos):
# semana_24_pca_2d.py
# PCA 2D: matriz de covariancia, autovalores e variancia explicada
def parse_points(s):
pts=[]
for part in s.split(';'):
part=part.strip()
if not part: continue
x,y = part.split()
pts.append((float(x),float(y)))
return pts
def main():
txt=input('Pontos "x y; x y; ..." (ex: "2 0; 0 2; 3 1; 4 3; 5 5"): ')
pts = parse_points(txt)
n=len(pts)
mx=sum(x for x,_ in pts)/n
my=sum(y for _,y in pts)/n
xs=[x-mx for x,_ in pts]; ys=[y-my for _,y in pts]
sxx=sum(x*x for x in xs)/(n-1)
syy=sum(y*y for y in ys)/(n-1)
sxy=sum(x*y for x,y in zip(xs,ys))/(n-1)
# autovalores da matriz [[sxx,sxy],[sxy,syy]]
import math
tr = sxx+syy
det = sxx*syy - sxy*sxy
disc = math.sqrt(max(tr*tr - 4*det, 0.0))
l1 = (tr + disc)/2
l2 = (tr - disc)/2
total = l1+l2 if (l1+l2)!=0 else 1.0
print('Cov = [[', round(sxx,4), round(sxy,4), ']; [', round(sxy,4), round(syy,4), ']]')
print('Autovalores ~', round(l1,4), round(l2,4))
print('Variancia explicada ~', round(l1/total,4), round(l2/total,4))
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: [(2, 0), (0, 2), (3, 1), (4, 3), (5, 5)]
# Cov≈ [[3.700, 2.300]; [2.300, 3.700]]
# Autovalores≈ 6.000, 1.400
# Variância explicada ≈ 0.811, 0.189
Questão (Q24) — PCA 2D
Enunciado: PCA 2D: matriz de covariância e componente mais explicativa.
Resolução (passo a passo, sem meios eletrônicos):
# semana_25_distancias_knn.py
# Distancias Euclidiana e Manhattan; kNN k=1 com dois vizinhos A e B
import math
def main():
print('Ponto P')
px=float(input('px: ')); py=float(input('py: '))
print('Vizinho A')
ax=float(input('ax: ')); ay=float(input('ay: '))
print('Vizinho B')
bx=float(input('bx: ')); by=float(input('by: '))
deA = math.hypot(px-ax, py-ay)
deB = math.hypot(px-bx, py-by)
dmA = abs(px-ax)+abs(py-ay)
dmB = abs(px-bx)+abs(py-by)
print('d_E(P,A)=', round(deA,6), ' d_E(P,B)=', round(deB,6))
print('d_M(P,A)=', round(dmA,6), ' d_M(P,B)=', round(dmB,6))
print('Classe k=1 =', 'A' if deA<deB else 'B')
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Entrada: P=(2, 3), A=(1, 1), B=(4, 5)
# d_E(P,A)≈2.236, d_E(P,B)≈2.828; d_M(P,A)=3, d_M(P,B)=4
# Classe k=1 → A
Questão (Q25) — Distâncias e kNN
Enunciado: P=(2,3), A=(1,1), B=(4,5): distâncias e k=1.
Resolução (passo a passo, sem meios eletrônicos):
# semana_26_kmeans_1iter.py
# k-means: atribuicao + recomputo dos centros (1 iteracao)
import math
def parse_points(s):
pts=[]
for part in s.split(';'):
part=part.strip()
if not part: continue
x,y = part.split()
pts.append((float(x),float(y)))
return pts
def main():
pts = parse_points(input('Pontos "x y; x y; ...": '))
cents = parse_points(input('Centros iniciais "x y; x y; ...": '))
k = len(cents)
# atribuicao
assigns=[]
for (x,y) in pts:
dists=[math.hypot(x-cx, y-cy) for (cx,cy) in cents]
j=min(range(k), key=lambda i: dists[i])
assigns.append(j)
# recomputo
new_c=[ [0.0,0.0,0] for _ in range(k) ]
for (x,y),j in zip(pts,assigns):
new_c[j][0]+=x; new_c[j][1]+=y; new_c[j][2]+=1
for j in range(k):
if new_c[j][2]>0:
new_c[j][0]/=new_c[j][2]
new_c[j][1]/=new_c[j][2]
print('Atribuicoes =', assigns)
print('Novos centros ~', [(round(cx,4), round(cy,4)) for cx,cy,_ in new_c])
if __name__=='__main__':
main()
# ===============================
# GABARITO (exemplo comentado)
# ===============================
# Exemplo: pontos=[(1, 1), (1, 2), (2, 1), (5, 5), (6, 5), (5, 6)]; centros iniciais=[(1, 1), (6, 5)]
# Atribuições=[0, 0, 0, 1, 1, 1]
# Novos centros≈ (1.3333333333333333, 1.3333333333333333) e (5.333333333333333, 5.333333333333333)
Questão (Q26) — k-means (1 iteração)
Enunciado: k-means: pontos (1,1),(1,2),(2,1),(5,5),(6,5),(5,6), centros (1,1),(6,5): 1ª atribuição e novos centros.
Resolução (passo a passo, sem meios eletrônicos):