Salta el contingut
 

Estadística bàsica

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Estadística bàsica

L'aprenentatge automàtic està basat en models matemàtics i estadístics. Per això, és important tindre una base sòlida en estadística per entendre el funcionament dels algoritmes d'aprenentatge automàtic i analitzar els resultats obtinguts.

L'estadística és una disciplina que estudia la recopilació, anàlisi i interpretació de dades.

En aquests apunts veurem operacions bàsiques com la mitjana, la mediana, la moda, la desviació estàndard i la variància.

Mitjana aritmètica (\(\bar{X}\))

La mitjana aritmètica és el valor obtingut en sumar tots els valors d'una mostra i dividir-los pel nombre total de valors.

\[ \bar{X} = \frac{1}{N} \sum_{i=1}^{N} x_i \]

Exemple

Donades les edats d'un grup de persones \(X = \{ 20, 20, 50, 60, 80 \}\), la mitjana aritmètica és:

\[ \bar{X} = \frac{1}{5} (20 + 20 + 50 + 60 + 80) = 46 \]

Exemple amb Pandas

import pandas as pd

df = pd.DataFrame({"A":[12,  4,  5, 44,  1],
                   "B":[ 5,  2, 54,  3,  2],
                   "C":[20, 16,  7,  3,  8],
                   "D":[14,  3, 14,  3, 14]})

print("DataFrame:")
print(df)

# axis = 0 calculará la mitjana de cada columna (A, B, C, D)
column_mean = df.mean(axis = 0)
print("Mitjana de cada columna:")
print(column_mean)

# axis = 1 calculará la mitjana de cada fila (0, 1, 2, 3, 4)
row_mean = df.mean(axis = 1)
print("Mitjana de cada fila:")
print(row_mean)
DataFrame:
    A   B   C   D
0  12   5  20  14
1   4   2  16   3
2   5  54   7  17
3  44   3   3   2
4   1   2   8   6
Mitjana de cada columna:
A    13.2
B    13.2
C    10.8
D    10.2
dtype: float64
Mitjana de cada fila:
0    12.75
1     6.25
2    20.75
3    13.00
4     6.25
dtype: float64

Exemple mitjana d'una fila

Amb l'anterior DataFrame, podem utilitzar la funció iloc per seleccionar una fila i calcular la mitjana dels seus valors.

mean = df.iloc[0].mean()
print("Mitjana de la primera fila:")
print(mean)
Mitjana de la primera fila:
12.75

Exemple mitjana d'una columna

De la mateixa manera, podem calcular la mitjana d'una columna.

mean = df.loc[:,"A"].mean()
print("Mitjana de la columna A:")
print(mean)
Mitjana de la columna A:
13.2

Mediana (\(\tilde{X}\))

La mediana és el valor que divideix la mostra en dues parts iguals, és a dir, la meitat dels valors són més grans que la mediana i l'altra meitat són més xicotets.

Per a calcular la mediana, primer s'ordenen els valors de la mostra de menor a major i es tria el valor central.

  • Si la mostra té un nombre imparell de valors, la mediana és el valor central.
  • Si la mostra té un nombre parell de valors, la mediana és la mitjana aritmètica dels dos valors centrals.

Exemple

Donades les edats d'un grup de persones \(X = \{ 20, 20, 50, 60, 80 \}\), la mediana és:

\[ \tilde{X} = 50 \]

Exemple amb Pandas

median = df.median()
print("Mediana de cada columna:")
print(median)
Mediana de cada columna:
A     5.0
B     3.0
C     8.0
D    14.0
dtype: float64

Moda

La moda és el valor que més vegades apareix en una mostra.

Exemple

Donades les edats d'un grup de persones \(X = \{ 20, 20, 50, 60, 80 \}\), la moda és:

\[ \text{moda}(X) = 20 \]

Nota

El mètode mode() de Pandas retorna la moda de cada columna.

Si hi ha més d'una moda, el mètode retorna totes les modes.

Exemple amb Pandas

mode = df.mode()
print("Moda de cada columna:")
print(mode)
Moda de cada columna:
    A    B   C     D
0   1  2.0   3   3.0
1   4  NaN   7  14.0
2   5  NaN   8   NaN
3  12  NaN  16   NaN
4  44  NaN  20   NaN

Variància (\(\sigma^2\))

La variància és una mesura de la dispersió dels valors d'una mostra respecte a la mitjana.

Es calcula com la mitjana dels quadrats de les diferències entre cada valor i la mitjana.

\[ \sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \bar{X})^2 \]

Nota

Les diferències són elevades al quadrat per a que siguen sempre positives.

Exemple

Donades les edats d'un grup de persones \(X = \{ 20, 20, 50, 60, 80 \}\), la variància és:

\[ \sigma^2 = \frac{1}{5} ((20-46)^2 + (20-46)^2 + (50-46)^2 + (60-46)^2 + (80-46)^2) \\ \sigma^2 = \frac{1}{5} (676 + 676 + 16 + 196 + 1156) \\ \sigma^2 = \frac{2720}{5} = 544 \]

Exemple amb Pandas

variance = df.var()
print("Variància de cada columna:")
print(variance)
Variància de cada columna:
A    312.7
B    521.7
C     48.7
D     44.7
dtype: float64

Desviació estàndard (\(\sigma\))

La desviació estàndard és la arrel quadrada de la variància. Mesura la dispersió dels valors respecte a la mitjana, però indica la dispersió en les mateixes unitats que els valors.

\[ \sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \bar{X})^2} \]

Exemple

Donades les edats d'un grup de persones \(X = \{ 20, 20, 50, 60, 80 \}\), la desviació estàndard és:

\[ \sigma = \sqrt{544} = 23.32 \]

Exemple amb Pandas

std = df.std()
print("Desviació estàndard de cada columna:")
print(std)
Desviació estàndard de cada columna:
A    17.683325
B    22.840753
C     6.978539
D     6.685806
dtype: float64

Quantils

Els quantils són mesures de posició que divideixen una mostra de manera que una proporció determinada de valors queda a cada costat del quantil.

Els quantils més importants són els quartils, decils i percentils.

Percentils

Els percentils divideixen la mostra en cent parts iguals, cadascuna amb el 1% dels valors.

És una de les mesures més utilitzades en estadística per a comparar valors.

Quartils en Pandas

import numpy as np
import pandas as pd

edats = [
    34, 48, 48, 55, 39, 39, 39, 35, 18, 54, 53, 29, 40, 37, 38,  23, 38,
    51, 71, 49, 46, 40, 39, 54, 48, 38, 34, 43, 39, 45, 42, 49,  32, 56,
    73, 57, 47, 54, 35, 29, 78, 63, 54, 59, 56, 71, 76, 80, 80,  78, 67,
    62, 52, 82, 67, 65, 83, 59, 79, 73, 57, 68, 81, 79, 87, 73, 108, 59,
    12, 15,  3, 26, 24, 16, 11,  2,  9, 23, 14, 12, 21, 27, 18,  19, 29,
    18, 13, 22, 13, 12, 28, 13, 19, 12, 13, 20, 14, 18
]

df = pd.DataFrame(edats, columns=['edat'])

percentils = df.quantile([0.20, 0.85])
print(percentils)
Percentils:
      edat
0.20  18.4
0.85  71.9

Quartils

Els quartils divideixen la mostra en quatre parts iguals.

Per tant, obtenim tres punts de tall: \(Q_1\), \(Q_2\) i \(Q_3\), corresponents als percentils 25%, 50% i 75%.

Quartils
Autor desconegut
Figura 1: Quartils

Quartils en Pandas

quartils = df.quantile([0.25, 0.5, 0.75])
print("Quartils:")
print(quartils)
Quartils:
       edat
0.25  22.25
0.50  40.00
0.75  59.00

Decils

Els decils divideixen la mostra en deu parts iguals, cadascuna amb el 10% dels valors.

Decils
Autor desconegut
Figura 2: Decils

Decils en Pandas

percentils = df.quantile(np.arange(0.1, 1, 0.1))
print("Decils:")
print(percentils)
Decils:
     edat
0.1  13.0
0.2  18.4
0.3  27.1
0.4  36.6
0.5  40.0
0.6  49.0
0.7  55.9
0.8  66.2
0.9  78.0

Unitat tipificada (standard-score)

La unitat tipificada (standard-score o z-score) és una mesura que serveix per comparar una observació dins d'una distribució estadística.

Aquesta unitat indiquen el nombre de desviacions típiques que una observació està per damunt o per davall de la mitjana.

És molt útil per a comparar observacions de diferents distribucions, ja que el seu valor no depén de les unitats de les variables.

La unitat tipificada es calcula com:

\[z = \frac{x - \mu}{\sigma}\]

Exemple

Donada la població de persones \(X={20,20,50,60,80}\):

  • La mitjana és \(\mu = 46\).
  • La desviació estàndard és \(\sigma = 23.9\).

Per cada observació de la població, calculem la unitat tipificada:

\[ z_i = \frac{x_i - \mu}{\sigma} \]

La població amb les seues unitats tipificades és:

\[ Z = \{ -1.087, -1.087, 0.1673, 0.5858, 1.4226 \} \]

Covariància

La covariància és una mesura de la relació entre dues variables.

\[ S_{XY} = \frac{1}{N - ddof} \sum_{i=1}^{N} (x_i - \bar{X}) (y_i - \bar{Y}) \]

on \(ddof\) és el grau de llibertat, que normalment és 1.

Aquesta mesura indica si les dues variables són independents o si tenen una relació lineal.

  • Si \(S_{XY} \gt 0\) és positiva, les dues variables són directament proporcionals.
  • Si \(S_{XY} \lt 0\) és negativa, les dues variables són inversament proporcionals.
  • Si \(S_{XY} \approx 0\) és zero, les dues variables són independents.
Dues variables directament proporcionals
Autor desconegut
Figura 3: Dues variables directament proporcionals
Dues variables inversament proporcionals
Autor desconegut
Figura 4: Dues variables inversament proporcionals

La matriu de covariància és una taula que conté les covariàncies entre totes les parelles de variables d'un conjunt de dades.

En Python, podem utilitzar la funció cov() de Pandas per a calcular la covariància entre les columnes d'un DataFrame.

Per defecte, cov() utilitza el grau de llibertat ddof igual a 1.

Covariància en Python

import pandas as pd

data = [[5, 6, 7],
        [2, 6, 9]]

df = pd.DataFrame(data)
print("DataFrame:")
print(df)
print()

cov = df.cov()
print("Matriu de covariància:")
print(cov)
DataFrame:
   0  1  2
0  5  6  7
1  2  6  9

Matriu de covariància:
     0    1    2
0  4.5  0.0 -3.0
1  0.0  0.0  0.0
2 -3.0  0.0  2.0
\[ M_{0,0} = \frac{1}{2 - 1}((5 - 3.5)(5 - 3.5) + (2 - 5)(2 - 5)) = 4.5 \\ M_{0,1} = \frac{1}{2 - 1}((5 - 3.5)(6 - 6) + (2 - 5)(6 - 6)) = 0.0 \\ M_{0,2} = \frac{1}{2 - 1}((5 - 3.5)(7 - 6.5) + (2 - 5)(9 - 6.5)) = -3.0 \\ ... \]

Correlació

Similar a la covariància, la correlació és una mesura normalitzada de la relació entre dues variables.

La diferència principal és que el valor de la covariància depèn de les unitats de les variables, i té una difícil interpretació.

En canvi, la correlació \(r\) és un valor que oscil·la entre -1 i 1 en qualsevol cas, que facilita la seua interpretació.

  • Si \(r = 1\) les dues variables tenen una correlació positiva perfecta.
  • Si \(r = -1\) les dues variables tenen una correlació negativa perfecta.
  • Si \(r = 0\) les dues variables són independents.

Quan \(r\) més s'aproxima a 1 o -1, més forta és la relació entre les dues variables.

Els tipus de correlació més comuns són Pearson, Rho de Spearman i Tau de Kendall.

Correlació de Pearson

La correlació de Pearson és la covariància calculada a partir de les unitats tipificades de les dues variables.

Aquesta mesura funciona bé amb variables quantitatives que tenen una distribució normal o similar. És més sensible als valors extrems que les altres dues alternatives.

\[ r_{xy} = S(z_x, z_y) \]

Aquesta expressió s'expandeix com:

\[ r_{xy} = \frac{1}{N} \sum_{i=1}^{N} \left( \frac{x_i - \bar{X}}{\sigma_X} \right) \left( \frac{y_i - \bar{Y}}{\sigma_Y} \right) \\ r_{xy} = \frac{1}{N} \frac{\sum_{i=1}^{N} (x_i - \bar{X})(y_i - \bar{Y})}{\sigma_X \sigma_Y} \]

Arribant a la simplificació:

\[ r_{xy} = \frac{S_{XY}}{\sigma_X \sigma_Y} \]

Aquesta fórmula pots ser interpretada com la covariància dividida pel producte de les desviacions estàndard de les dues variables.

En Python, podem utilitzar la funció corr() amb l'argument method='pearson' (valor per defecte) per a calcular la correlació de Pearson.

Correlació de Pearson en Python

corr = df.corr()
print("Correlació de Pearson:")
print(corr)
Correlació de Pearson:
     0   1    2
0  1.0 NaN -1.0
1  NaN NaN  NaN
2 -1.0 NaN  1.0

Info

NaN indica que no es pot calcular la correlació quan una de les variables té desviació estàndard zero, és a dir, és constant.

Correlació de Spearman

La correlació de Spearman \(\rho\) (rho) és una mesura de la relació que utilitza la posició dels valors quan han sigut ordenats.

Aquesta mesura és útil quan les dades no són lineals.

La fórmula de la correlació de Spearman és:

\[ \rho = 1 - \frac{6 \sum_{i=1}^{N} d_i^2}{N(N^2 - 1)} \]

on \(d_i\) és la diferència entre les posicions de les dues variables.

Correlació de Spearman en Python

spearman = df.corr(method='spearman')
print("Correlació de Spearman:")
print(spearman)
Correlació de Spearman:
     0   1    2
0  1.0 NaN -1.0
1  NaN NaN  NaN
2 -1.0 NaN  1.0

Correlació de Spearman

Utilitzant les dades \(X = \{5, 2\}\) i \(Y = \{7, 9\}\) que corresponen a les columnes 0 i 2 del DataFrame.

Les posicions de les variables ordenades són:

\(X\) \(Y\) \(O_X\) \(O_Y\) \(d_i\) \(d_i^2\)
2 9 1 2 1 1
5 7 2 1 -1 1

La correlació de Spearman és:

\[ \rho_{02} = 1 - \frac{6(1^2 + 1^2)}{2(2^2 - 1)} = 1 - \frac{12}{6} = 1 - 2 = -1 \]

Correlació de Kendall

La correlació de Kendall \(\tau\) (tau) és una mesura de la relació que utilitza els rangs de les variables per a calcular la correlació.

Aquesta mesura és preferible a la de Spearman quan hi ha molt poques dades i a més hi ha molts empats.

La fórmula de la correlació de Kendall és:

\[ \tau = \frac{C - D}{C + D} \]

on:

  • \(C\) és el nombre de parelles concordants.
  • \(D\) és el nombre de parelles discordants.

Info

Vegeu el vídeo Kendall's Tau Easily Explained per a una explicació detallada.

Codi font

  • estadistica_basica.py

    #!/usr/bin/env python3
    
    import pandas as pd
    
    df = pd.DataFrame({"A":[12,  4,  5, 44,  1],
                       "B":[ 5,  2, 54,  3,  2],
                       "C":[20, 16,  7,  3,  8],
                       "D":[14,  3, 17,  3, 14]})
    
    print("DataFrame:")
    print(df)
    
    # axis = 0 calculará la mitjana de cada columna (A, B, C, D)
    column_mean = df.mean(axis = 0)
    print("Mitjana de cada columna:")
    print(column_mean)
    
    # axis = 1 calculará la mitjana de cada fila (0, 1, 2, 3, 4)
    row_mean = df.mean(axis = 1)
    print("Mitjana de cada fila:")
    print(row_mean)
    
    mean = df.iloc[0].mean()
    print("Mitjana de la primera fila:")
    print(mean)
    
    mean = df.loc[:,"A"].mean()
    print("Mitjana de la columna A:")
    print(mean)
    
    median = df.median()
    print("Mediana de cada columna:")
    print(median)
    
    mode = df.mode()
    print("Moda de cada columna:")
    print(mode)
    
    variance = df.var()
    print("Variància de cada columna:")
    print(variance)
    
    std = df.std()
    print("Desviació estàndard de cada columna:")
    print(std)
    
  • quantils.py

    #!/usr/bin/env python3
    
    import numpy as np
    import pandas as pd
    
    edats = [
        34, 48, 48, 55, 39, 39, 39, 35, 18, 54, 53, 29, 40, 37, 38,  23, 38,
        51, 71, 49, 46, 40, 39, 54, 48, 38, 34, 43, 39, 45, 42, 49,  32, 56,
        73, 57, 47, 54, 35, 29, 78, 63, 54, 59, 56, 71, 76, 80, 80,  78, 67,
        62, 52, 82, 67, 65, 83, 59, 79, 73, 57, 68, 81, 79, 87, 73, 108, 59,
        12, 15,  3, 26, 24, 16, 11,  2,  9, 23, 14, 12, 21, 27, 18,  19, 29,
        18, 13, 22, 13, 12, 28, 13, 19, 12, 13, 20, 14, 18
    ]
    
    df = pd.DataFrame(edats, columns=['edat'])
    percentils = df.quantile([0.20, 0.85])
    print("Percentils:")
    print(percentils)
    
    
    quartils = df.quantile([0.25, 0.5, 0.75])
    print("Quartils:")
    print(quartils)
    
    decils = df.quantile(np.arange(0.1, 1, 0.1))
    print("Decils:")
    print(decils)
    
  • covariancia.py

    #!/usr/bin/env python3
    
    import pandas as pd
    
    data = [[5, 6, 7],
            [2, 6, 9]]
    
    df = pd.DataFrame(data)
    print("DataFrame:")
    print(df)
    print()
    
    cov = df.cov()
    print("Matriu de covariància:")
    print(cov)
    print()
    
    pearson = df.corr(method='pearson')
    print("Correlació de Pearson:")
    print(pearson)
    print()
    
    spearman = df.corr(method='spearman')
    print("Correlació de Spearman:")
    print(spearman)
    print()
    

Recursos addicionals

Bibliografia

Comentaris