Dúvida em estrutura de repetição (Coeficiente correlação linear de Pearson)

Estou tendo uma dificuldade da hora de montar a fórmula de Pearson. Na verdade, eu montei tudo direitinho e testei com 2 valores para x e 2 valores para y e fiz print de cada valor. Eles bateram com os resultados da calculadora, mas na hora da fórmula, ou seja, na hora de mostrar o coeficiente p, se encontra um valor complexo.

1

CÓDIGO:

nome = input("Olá usuário, por gentileza, informe seu nome: ")
print(f"Seja bem vindo(a) {nome}! Vamos calcular o coeficiente de correlação linear de Pearson! ")
N=int(input("Me informe, por gentileza, a quantidade de números que serão digitados para x e y: "))
print(f"Certo, {nome}, você irá digitar {N} números. Vamos começar! ")

contador=1
somaa = 0
b=0
c=0
d=0
e=0
f=0
g=0
while N>=contador:
    x = float(input("Digite um valor para x: "))
    y = float(input("Digite um valor para Y: "))
#   Primeiro termo de p
    a=x*y
    somaa+=a
#   Segundo termo de p
#   Soma de x
    b+=x
#   Soma de y
    c+=y
    multiplicacaobc=b*c
#   Terceiro termo de p
    d+=(x**2)
    e=b**2
    somade=d-e
#   Quarto termo de p
    f+=(y**2)
    g=c**2
    somafg=f-g
    contador += 1

p=((N*somaa)-(multiplicacaobc))/(((N*somade)**(1/2))*((N*somafg)**(1/2)))

print(f"Prezado {nome}, o coeficiente de correção linear de Pearson pra os valores informados é {p:.2f}")

Desde já, muito obrigado!

Bom, ao fazer numero ** (1/2) você está elevando o número a 1/2, que é o mesmo que calcular a raiz quadrada do número.

E se o número for negativo, a raiz quadrada dele será um número complexo (o Python faz essas conversões automaticamente). Então o comportamento está certo…

1 curtida

Eu também pensei isso. O problema é que, ao meu ver, o código está todo certinho, de acordo com a equação fornecida, mas o resultado está dando diferente do esperado, embora ao plotar cada somatório individualmente, os valores estão batendo com os realizados pela calculadora!

Eu já fiz todos estes códigos no meu primeiro semestre de engenharia, mas fiz em C. Agora, que formei, estou estudando Python e para fixar, estava repassando eles a limpo e, alguns, tive um pouquinho de dificuldade por não conhecer alguns macetes do Python.

3

Eu tentei colocar os valores de duas maneiras… O código restringe somente a 10 valores, mas eu deixei o usuário a vontade para colocar quantos valores quiser. Na primeira maneira, coloquei contando 10 valores para x e depois para y (linhas vermelhas e azul) e, na segunda, intercalei x e y, e os resultados de ambas deram diferente. :sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile: .Porém, quando eu ploto cada valor individual de cada somatório, o resultado na calculadora dá direitinho. Pode ser algum erro na fórmula, mas acho difícil .

Ah, deve ser por causa disso: https://stackoverflow.com/q/33684948

Basicamente, usar o operador ** para elevar a 1/2 pode produzir resultados diferentes de usar cmath.sqrt - veja aqui um exemplo.

Tente trocar todas as ocorrências de ** 1/2 por cmath.sqrt. Ou seja, em vez de:

numero ** (1/2)

Use:

import cmath

cmath.sqrt(numero)
1 curtida