Creating a covariance program with Python

Asked

Viewed 454 times

2

I’m working out a little bit with the lists and trying to create statistical operations with them and I’m having a hard time calculating the covariance

inserir a descrição da imagem aqui

Basically I’m trying to create separate elements and perform the calculation as a product between two summations of the same index i.

Basically, a list for samples X, ump for samples Y One to calculate the total sum of the length of each list (The sum of the list of X and the list Y gives the total N). I started the i in 1 counters to match the operation (n-1) And I basically tried to create the standard deviation for X and the standard deviation for Y, divide it by adding up the length of the lists X and Y and then display the covariance as a numerical result

This is my code

    #Covariância
 #Índice referente ao número da amostra.
n=int(input("Insira o número total de amostras"))

#Contador para percorrer os índices
i=1    #Amostras X e Amostras Y
Amostrax=[]
Amostray=[]

#Tamanho total da lista de cada variável
 for i in range(n):        
    #Adiciona o valor da amostra X dentro da lista de amostras
    Amostrasx.append(int(input("Insira o valor das amostras associadas a X")))
#Escreve a lista de amostras X na tela para o usuário
print(Amostrasx)
#Soma das variáveis para gerar as médias de X e Y
Xi = 0
Nx = len(Amostrax)


j=1
for j in range(n):        
    #Adiciona o valor da amostra X dentro da lista de amostras
    Amostrasy.append(int(input("Insira o valor das amostras associadas a Y")))
#Escreve a lista de amostras X na tela para o usuário
print(Amostrasy)
 Yi = 0
 Ny = len(Amostray)
#Preenchendo as listas de amostras
for amostraix in Amostrax:
    Xi +=amostraix
for amostraiy in Amostray:
    Yi +=amostraiy  
Médiax=Xi/Nx
Médiay=Yi/Ny

print ("Esse é o valor da soma das amostras", Xi)
print ("Esse é o valor da soma das amostras", Yi)
print ("Este é a quantidade de amostras X que você possui", Nx)
print ("Este é a quantidade de amostras Y que você possui", Ny)
print ("Esta é a média da variável X", Médiax)
print ("Esta é a média da variável Y", Médiay)

DesviosMédiosx=[] 
DesviosMédiosy=[]
for i in range (n):
    DesviosMédiosx.append(Amostrax[i]-Médiax)
XiMenosXmédio=0
for desviosmediosi in DesviosMédiosx:
    XiMenosXmédio+=DesviosMédios[i]

for j in range (n):
    DesviosMédiosy.append(Amostray[j]-Médiay)
YiMenosXmédio=0
for desviosmediosi in DesviosMédiosy:
    YiMenosYmédio+=DesviosMédios[j]

Covariância=(XiMenosXmédio*YiMenosXmédio)/(Nx+Ny)
print ("Este é cada desvio médio individual:", DesviosMédiosx)
print ("Este é cada desvio médio individual:", DesviosMédiosy)
print ("Este é o desvio médio:",Covariância)

The problem was solved by Elton Nunes in the post below, just wanted to edit to attach an alternative solution using another formula that is mathematically equivalent and that I managed to develop (References - Estimates and Experimental Errors in Physics - Editora UERJ, 3 edição, page 26)

#Covariância
 #Índice referente ao espaço amostral associadas as variáveis X e Y.
n=int(input("Insira o número total de amostras"))    
#Contador para percorrer os índices
i=1    #Amostras X e Amostras Y
Amostrax=[]
Amostray=[]  
Amostraxy=[]
#Tamanho total da lista de cada variável
for i in range(n):
    #Adiciona o valor da amostra X dentro da lista de amostras
    Amostrax.append(int(input("Insira o valor das amostras associadas a X")))
#Escreve a lista de amostras X na tela para o usuário
print("Estas são as amostras da variável X:", Amostrax)
#Soma das variáveis para gerar as médias de X e Y
Xi = 0
Nx = len(Amostrax)   
j=1
for j in range(n):        
    #Adiciona o valor da amostra X dentro da lista de amostras
    Amostray.append(int(input("Insira o valor das amostras associadas a Y")))
#Escreve a lista de amostras X na tela para o usuário
print(Amostray)
Yi = 0
Ny = len(Amostray)
#Preenchendo as listas de amostras
for amostraix in Amostrax:
    Xi +=amostraix
for amostraiy in Amostray:
    Yi +=amostraiy
Médiax=Xi/Nx
Médiay=Yi/Ny
for k in range(n):
    Amostraxy.append(Amostrax[k]*Amostray[k])

Nxy=len(Amostraxy)
XiYi=0
for amostraixy in Amostraxy:
    XiYi +=amostraixy

Médiaxy=XiYi/Nxy
Covariância=Médiaxy-(Médiax * Médiay)

print ("Esse é o valor da soma das amostras X", Xi)
print ("Esse é o valor da soma das amostras Y", Yi)
print ("Este é o produto das amostras X e Y:", Amostraxy)
print ("Este é a quantidade de amostras X que você possui", Nx)
print ("Este é a quantidade de amostras Y que você possui", Ny)
print ("Esta é a média da variável X", Médiax)
print ("Esta é a média da variável Y", Médiay)
print ("Esta é a média do produto X com Y:", Médiaxy)
print ("Esta é a covariância:", Covariância)
  • I’m taking a look at what the statement of 'Deviations' should look like'?

  • The operation concerning the sum, of (Xi - Xmedio) / Nx is the mean deviation of X and (Yi-médiay) is the mean deviation of Y so I separated into 2 lists, Deviations and Deviations

  • 1

    yes, but you are using before declaring, this generating an error is not?

  • Yeah, I didn’t know that’s where that mistake was. ?

  • 1

    before using them, however they will be empty and will give another error, index error out of range

1 answer

2


I did the exercise following this example in wikihow

I left it very raw for you to see my step by step,

and it’s one thing I recommend to do when you’re training, you run the code every line you add and check if it’s going right

n=9

Amostrax=[1, 3, 2, 5, 8, 7, 12, 2, 4]
Amostray=[8, 6, 9, 4, 3, 3, 2, 7, 7]

media_x = round(sum(Amostrax) / n, 2)
media_y = round(sum(Amostray) / n, 2)

dif_x = [round(x - media_x, 2)
    for x in Amostrax]

dif_y = [round(y - media_y, 3)
    for y in Amostray]

produto = [round(x*y, 2)
    for x,y in zip(dif_x, dif_y)]

produto_soma = sum(produto)

covariance = round(produto_soma /(n-1), 2)

print(media_x,                                                                                                         
    media_y,
    dif_x,
    dif_y,
    produto,
    produto_soma,
    covariance,
    sep='\n')

use quite the round function in the code, it rounds

print(round(1.111111111, 2))

will print the value rounded to 2 squares after the comma, in the code above I also used 3 to set decimals, it was my mistake was to be 2 too, but it does not interfere to execute the code, and you can see a version with only one use of this function

amostrax=[1, 3, 2, 5, 8, 7, 12, 2, 4]
amostray=[8, 6, 9, 4, 3, 3, 2, 7, 7]

def covariance(x, y): 
    n = len(x)
    media_x = sum(x)/n
    media_y = sum(y)/n

    diferença_x = [i - media_x
        for i in x]

    diferença_y = [j - media_y
        for j in y]                                                                                                

    produto = [i*j
        for i,j in zip(diferença_x, diferença_y)]

    produto_soma = sum(produto)

    return round(produto_soma/(n-1), 2)

cov = covariance(amostrax, amostray)
print(cov)
  • 2

    Good response Elton, I believe worth mentioning about how to execute a table test and

  • 2

    table test is what I always do when I learn a new tool, it was worth the tip

  • Elton, I just ran your code and looked at its results, but I didn’t understand a few steps of the syntax itself. 

media_x = round(sum(Amostrax) / n, 2)
media_y = round(sum(Amostray) / n, 2)

dif_x = [round(x - media_x, 2)
 for x in Amostrax]

dif_y = [round(y - media_y, 3)
 for y in Amostray]

produto = [round(x*y, 2) for x,y in zip(dif_x, dif_y)] producto_soma = sum(product) covariance = round(product_soma /(n-1), 2) What are these values "2" and "3" after commas? , and what is this Round command for to pass on each element of the list?

  • 1

    added the explanation to a formatted code

  • I added another solution to the problem, I took yours and I will try to have another fine tune in the code because there are some commands you used that I have not yet learned xD

Browser other questions tagged

You are not signed in. Login or sign up in order to post.