26 scripts interativos (input/print) — agora com Gabarito Comentado em cada arquivo .py.

Scripts Python — Matemática para Ciência de Dados (Semanas 1–26) — Gabarito Comentado

Semana 1 — Vetores em R2

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Vetores em R2

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):

  1. u+v = (2+(-1), 3+4) = (1, 7); u−v = (2−(−1), 3−4) = (3, −1).
  2. Produto escalar: u × v = 2 × (−1) + 3 × 4 = −2 + 12 = 10.
  3. |u| = √(2²+3²) = √(4+9) = √13 ≈ 3,6056 (aproximação manual).
  4. cos θ = (u × v)/(|u||v|). |v|=√((-1)²+4²)=√17≈4,1231 ⇒ cos θ≈10/(3,6056 × 4,1231)≈0,6727; θ≈arccos(0,6727)≈47,7°.

Semana 2 — Tipos de Dados e Representacoes

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Tipos de Dados e Representações

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):

  1. Frequências: Azul=3, Verde=2, Vermelho=1; total n=6. Proporções: Azul = 3 ÷ 6 = 0,5; Verde = 2 ÷ 6 ≈ 0,333; Vermelho = 1 ÷ 6 ≈ 0,167. Moda: Azul.
  2. Média ordinal: {2, 3, 1, 2, 3}. Soma S = 11; N = 5 ⇒ x̄_ord = 11 ÷ 5 = 2,2.

Semana 3 — Matrizes 2x2

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Matrizes 2×2

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):

  1. A × B: c11=4, c12=4, c21=10, c22=8 ⇒ A × B=((4,4),(10,8)).
  2. det(A)=−2.
  3. A⁻¹ = (1/−2)×((4, −2),(−3, 1)) ⇒ ((−2, 1),(1,5, −0,5)).

Semana 4 — Tendencia Central

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Tendência Central

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):

  1. Média=(2+4+4+6+8) ÷ 5 = 4,8. Mediana=4. Moda=4.
  2. Média aparada (20%): retira extremos {2,8} ⇒ {4,4,6} ⇒ 14 ÷ 3 ≈ 4,667.

Semana 5 — Funcao Afim

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Função Afim

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):

  1. m=(7−2) ÷ (4−1) = 5 ÷ 3 ≈ 1,6667; b=2−(5 ÷ 3) = 1 ÷ 3.
  2. Reta: y=(5 ÷ 3)x + 1 ÷ 3. Zero: 0=(5 ÷ 3)x + 1 ÷ 3 ⇒ (5 ÷ 3)x=−1 ÷ 3 ⇒ x=−1 ÷ 5.

Semana 6 — Covariancia e Correlacao

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Covariância e Correlação

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):

  1. X̄=3, Ȳ=4. Cov = Σ((xi−3)(yi−4)) ÷ (n−1) = 6 ÷ 4 = 1,5.
  2. Cov>0 ⇒ r>0 (correlação positiva).

Semana 7 — Normalizacao e Padronizacao

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Normalização e Z-score

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):

  1. Min–Max: (x−10) ÷ 10 ⇒ 10→0; 13→0,3; 15→0,5; 18→0,8; 20→1,0.
  2. Média=15,2; s≈3,962 (amostral).
  3. z(18)=(18−15,2) ÷ 3,962 ≈ 0,707.

Semana 8 — Variancia e Desvio

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Variância e Desvio

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):

  1. Média=6. Pop.: var=8 ÷ 3 ≈ 2,667; desvio=√2,667≈1,633.
  2. Amostral: var=8 ÷ 2 = 4; desvio=2.

Semana 9 — Sistemas Lineares

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Sistemas Lineares

Questão (Q9) — Sistemas Lineares

Enunciado: Resolva o sistema: x+y=5; x−y=1.


Resolução (passo a passo, sem meios eletrônicos):

  1. Somando: 2x=6 ⇒ x=3.
  2. Substituindo: y=2 ⇒ (3,2).

Semana 10 — Probabilidade Basica

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Probabilidade Básica

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):

  1. P(par)=3 ÷ 6 = 1 ÷ 2; P(≥5)=2 ÷ 6 = 1 ÷ 3.
  2. União = 1 ÷ 2 + 1 ÷ 3 − 1 ÷ 6 = 2 ÷ 3.

Semana 11 — Distribuicao Binomial

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Binomial

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):

  1. P(X=3)=C(10,3) × 0,3³ × 0,7⁷ ≈ 0,2668.
  2. E[X]=10 × 0,3 = 3; Var=10 × 0,3 × 0,7 = 2,1.

Semana 12 — Valor Esperado

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Valor Esperado

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):

  1. E[X]=0×0,1 + 1×0,3 + 2×0,4 + 3×0,2 = 1,7.
  2. E[X²]=0²×0,1 + 1²×0,3 + 2²×0,4 + 3²×0,2 = 3,7.

Semana 13 — Normal Padrao e z-score

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Normal/z-score

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):

  1. z=(185−170) ÷ 10 = 1,5 ⇒ P(X≥185)≈0,0668 (tabela‑z).
  2. P(160≤X≤180)≈0,6827.

Semana 14 — Intervalos de Confianca

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Intervalos de Confiança

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):

  1. Erro=1,96 × 12 ÷ 8 = 2,94.
  2. IC: (72−2,94; 72+2,94) = (69,06; 74,94).

Semana 15 — Testes de Hipoteses

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Testes de Hipóteses (z)

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):

  1. z=(72−70) ÷ (12 ÷ 8) = 2 ÷ 1,5 = 1,333.
  2. |z|<1,96 ⇒ não rejeitar H0.

Semana 16 — Regressao Linear (Ajuste)

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Regressão Linear

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):

  1. Por somatórios: b1≈0,86; b0≈0,70.
  2. ŷ(6)=0,70 + 0,86 × 6 ≈ 5,86.

Semana 17 — Residuos e R^2

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Resíduos e R²

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):

  1. R²=1 − SSE ÷ SST = 1 − 3,04 ÷ 100 = 0,9696.
  2. ≈97% da variabilidade explicada.

Semana 18 — Funcao Logistica e Odds

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Logística e Odds

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):

  1. odds = p ÷ (1−p). Para p≈0,731 ⇒ odds≈2,718.
  2. p = odds ÷ (1+odds) ⇒ 2,718 ÷ 3,718 ≈ 0,731.

Semana 19 — Metricas de Classificacao

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Métricas de Classificação

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):

  1. Acurácia=(50+32) ÷ 100 = 0,82; Precisão=50 ÷ 60 ≈ 0,833.
  2. Recall=50 ÷ 58 ≈ 0,862; F1≈0,847.

Semana 20 — Teorema de Bayes

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Teorema de Bayes

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):

  1. P(+) = 0,01 × 0,98 + 0,99 × 0,03 = 0,0395.
  2. PPV = (0,01 × 0,98) ÷ 0,0395 ≈ 0,248.

Semana 21 — Series Temporais

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Séries Temporais

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):

  1. MA(3): 21,0; 22,67; 23,33.
  2. SES(α=0,3): 20; 20,6; 20,72; 22,00; 22,6.

Semana 22 — Amostragem e Margem de Erro

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Amostragem e ME

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):

  1. ME = 1,96 × √(0,52 × 0,48 ÷ 1000) ≈ 0,031.
  2. n ≈ (1,96² × 0,25) ÷ 0,03² ≈ 1068.

Semana 23 — Combinatoria

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Combinatória/Baralho

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):

  1. P(Ás)=4 ÷ 52 = 1 ÷ 13 ≈ 0,0769.
  2. P(Flush)= 4 × C(13,5) ÷ C(52,5) ≈ 0,001981.

Semana 24 — PCA 2D

# 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 estilo vestibular (ETEC/FATEC/SENAI) — PCA 2D

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):

  1. Médias: x̄=2,8; ȳ=2,2; covariâncias calculadas à mão ⇒ S≈[[3,700, 2,300],[2,300, 3,700]].
  2. λ1≈6,0; λ2≈1,4 ⇒ PC1 explica ≈81,1%.

Semana 25 — Distancias e kNN

# 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 estilo vestibular (ETEC/FATEC/SENAI) — Distâncias e kNN

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):

  1. d_E(P,A)=√5≈2,236; d_E(P,B)=√8≈2,828.
  2. k=1 ⇒ classe A.

Semana 26 — k-means (1 iteracao)

# 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 estilo vestibular (ETEC/FATEC/SENAI) — k-means (1 iteração)

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):

  1. Grupos: G1={(1,1),(1,2),(2,1)}, G2={(5,5),(6,5),(5,6)}.
  2. C1=(1,3333,1,3333); C2=(5,3333,5,3333).