Che cosa è la matrice di correlazione? come si costruisce in Python?

AI, INTELLIGENZA ARTIFICIALE, MATEMATICA, Senza categoria, TUTORIAL

Che cosa è la matrice di correlazione? Per rispondere a questa domanda iniziamo con imparare una definizione:

La matrice di correlazione è una tabella quadrata che riporta al suo interno gli indici di correlazione tra due o più variabili.

Prima di addentrarci nel capire come costruire una matrice di correlazione e come leggerla cerchiamo di ricordare il concetto di Correlazione e di comprenderne il significato.

Cos’è la correlazione?

La correlazione è una misura statistica che esprime la relazione tra due variabili ed indica la tendenza che hanno due variabili (X e Y) a variare insieme, ovvero, a “covariare”.  Ad esempio, si può supporre che vi sia una relazione tra peso ed altezza di un individuo , nel senso che all’aumentare dell’altezza  ad esempio  aumenta  il peso.

Le correlazioni possono essere ti tipo Lineare e non Lineare.

Correlazione Lineare

La relazione è di tipo lineare se l’andamento  tra le due variabili osservate, assume  su un sistema di assi cartesiani la forma di una retta. In questo caso, all’aumentare (o al diminuire) di X aumenta (diminuisce) Y. Ad esempio, all’aumentare dell’altezza di una persona aumenta anche il suo peso

Correlazione non lineare

La relazione è di tipo non lineare, se rappresentata su assi cartesiani, ha un andamento curvilineo (parabola o iperbole). In questo caso a livelli bassi e alti di X corrispondono livelli bassi di Y; mentre a livelli intermedi di X corrispondono livelli alti di Y.

Forma della correlazione

Per quanto riguarda la forma della relazione, si distinguono l’entità e la direzione.

La direzione è  positiva, se all’aumentare di una variabile aumenta anche l’altra. Ad esempio, all’aumentare della superficie aumenta aumento il prezzo dell’immobile.

La direzione è , invece, negativa se all’aumentare di una variabile diminuisce l’atra, ad esempio all’aumentare della produzione di un prodotto in genere  il prezzo del prodotto diminuisce. In pratica  all’aumentare dell’offerta il prezzo precipita.

Un altro modo per differenziare le correlazioni è osservando l’entità, ovvero  alla forza della relazione esistente tra due variabili. L’entità spiega quanto sia forte la correlazione osservando i punti nello spazio di dispersione, in pratica quanto più i punteggi sono raggruppati attorno ad una retta, tanto più forte è la relazione tra due variabili.

Se i punteggi sono dispersi in maniera uniforme, invece, tra le due variabili non esiste alcuna relazione.

Come si misura?

Per esprimere la relazione esistente tra due variabili, in termini entità e direzione, si utilizza il coefficiente di correlazione. Tale coefficiente è standardizzato e può assumere valori che vanno da –1.00 (correlazione perfetta negativa) e +1.00 (correlazione perfetta positiva). Una correlazione uguale a 0 indica che tra le due variabili non vi è alcuna relazione

Quali limitazioni ha l’analisi della correlazione?

La correlazione non è in grado di verificare la presenza o l’effetto di altre variabili che non siano le due prese in esame. In particolare, non ci dice niente di causa ed effetto

Coefficienti di correlazione

La correlazione viene descritta mediante un valore che non è dotato di un’unità di misura specifica, chiamato coefficiente di correlazione, compreso tra -1 e +1 e denotato da r.

In riferimento all’indice di correlazione r possiamo affermare che:

  • Più r si avvicina a zero, più la correlazione lineare è debole.
  • Un valore r positivo è indice di una correlazione positiva, in cui i valori delle due variabili tendono ad aumentare in parallelo.
  • Un valore r negativo è indice di una correlazione negativa, in cui il valore di una variabile tende ad aumentare quando l’altra diminuisce.

sono stai formulati di versi  coefficienti di correlazione a seconda del tipo di scala della variabile, in particolare dobbiamo ricordare:

  • Per le scale a intervalli o rapporti equivalenti si usa il coefficiente r di Pearson.
  • Per le scale ordinali si usano il coefficiente rs di Spearman o il coefficiente tau di Kendall.
  • Per le scale categoriali (dicotomiche) si usano il coefficiente rphi o il coefficiente rpbi

Come si può creare la matrice di correlazione in Python?

Per prima cosa dobbiamo procurarci un dataset per poter effettuare le nostre elaborazioni ed allo scopo ho deciso di costruire un dataset, relativo alla distribuzione dei prezzi degli immobili in funzione di alcune variabili:

1) prezzo
2) numero di locali
3) superficie in metri quadri
4) numero di bagni

Per fare ciò vi sottopongo un script per raccogliere velocemente dei dati da internet a solo scopo didattico.

import requests
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

a_prezzo=[]
a_locali=[]
a_m2superficie=[]
a_bagni=[]
a_piano=[]
NUMERO_DI_PAGINE=20

for index in range(0,NUMERO_DI_PAGINE,1):
   print (index)
   page = 'https://www.immobiliare.it/vendita-case/milano/?pag='+str(index)
   web_result = requests.get(page).text
   soup = BeautifulSoup(web_result,'lxml')
   for ul in soup.findAll('ul',{'class':'in-realEstateListCard__features'}):
     li=ul.findAll('li',{'class':'nd-list__item'});
     try:
       prezzo=str(li[0].text)
     except Exception as e:
       prezzo="ND"


     try:
       locali=str(li[1].text).strip()
     except Exception as e:
       locali="ND"

     try:
       m2superficie=str(li[2].text).strip()
     except Exception as e:
       m2superficie="ND"

     try:
       bagni=str(li[3].text).strip()
     except Exception as e:
       bagni="ND"

     try:
       piano=(li[4].text).strip()
     except Exception as e:
       piano="ND"

     try:
       p = float(prezzo.replace('€ ','').replace('.',''))
     except Exception as e: 
     p = 0

     try:
       l = int(locali)
     except Exception as e: 
       l = 0

     try:
       b = int(bagni)
     except Exception as e:
       b = 0

     try:
       s = int(m2superficie.replace('m²',''))
     except Exception as e:
       s = 0

     if (p > 0) and (l > 0) and (b > 0) and (s > 0):
       a_prezzo.append(p)
       a_locali.append(l)
       a_m2superficie.append(s)
       a_bagni.append(b)



df = pd.DataFrame({'prezzo': a_prezzo, 'locali': a_locali, 'm2superficie': a_m2superficie,'bagni' : a_bagni})
df.to_csv('./dataset.csv')

Questo script vi restituirà un dataset in formato csv.. dovreste ottenere qualcosa del genere

prezzo locali m2superficie bagni
0 279000.0 3 70 1
1 170000.0 2 47 1
2 790000.0 3 135 2
3 385000.0 2 65 1
4 290000.0 3 70 1
419 295000.0 3 90 1
420 1290000.0 4 145 3
421 1560000.0 5 195 3
422 280000.0 2 55 1
423 130000.0 2 40

 

Adesso cerchiamo di capire come possiamo generare un array di correlazione usando il metodo DataFrame.corr() e visualizzare la matrice di correlazione usando il metodo pyplot.matshow() in Matplotlib. Useremo il DataFrame ottenuto per generare e visualizzare un array di correlazione.

Generazione della  matrice di correlazione utilizzando il metodo DataFrame.corr()

Carichiamo dal dataset solo le colonne di nostro interesse: [‘prezzo’, ‘locali’,’m2superficie’,’bagni’] e costruiamo al matrice di correlazione

import pandas as pd
fields = ['prezzo', 'locali','m2superficie','bagni']
immobili_df = pd.read_csv ('dataset.csv', skipinitialspace=True, usecols=fields)
print(immobili_df.head())
corr_df = immobili_df.corr()
print("The correlation DataFrame is:")
print(corr_df, "\n")

il risultato sarà qualcosa del genere:

Il metodo utilizzato genera un DataFrame con valori di correlazione tra ogni colonna con ogni altra colonna nel DataFrame.

I valori di correlazione sono calcolati di default usando l’indice di correlazione di Pearson. Possiamo anche usare altri metodi come kendall e spearman per calcolare il coefficiente di correlazione specificando il valore del parametro method nel metodo corr.

ad esempio per utilizzare il coefficiente di correlazione kendall :

corr_df = immobili_df.corr(method='kendall')
oppure per il pearson:
corr_df = immobili_df.corr(method='pearson')
oppure per lo spearman
corr_df = immobili_df.corr(method='spearman')
Per avere una idea anche visiva dei valori delle correlazioni tra le variabili in gioco, possiamo plottare una rappresentazione grafica della matrice usando matplotlib

 

Matrice di correlazione di Pandas usando il metodo seaborn.heatmap()

Con questo approccio possiamo graficare la matrice di correlazione generata dal DataFrame immobili_df  utilizzando la funzione heatmap() del pacchetto seaborn.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
fields = ['prezzo', 'locali','m2superficie','bagni']
immobili_df = pd.read_csv ('dataset.csv',skipinitialspace=True,usecols=fields)
corr_df = immobili_df.corr(method='pearson')
plt.figure(figsize=(8, 6))
sns.heatmap(corr_df, annot=True)
plt.show()

 

 

 

Matrice di correlazione utilizzando DataFrame.style

La proprietà style dell’oggetto DataFrame corr_df restituisce un oggetto Styler. In tal caso sarà possibile  visualizzare l’oggetto DataFrame usando background_gradient per l’oggetto Styler.  Attenzione : Questo metodo può generare solo figure nel notebook IPython.

import pandas as pd
fields = ['prezzo', 'locali','m2superficie','bagni']
immobili_df = pd.read_csv ('dataset.csv',skipinitialspace=True,usecols=fields)
corr_df = immobili_df.corr(method='pearson')
corr_df.style.background_gradient(cmap='coolwarm')

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments