Introducció a l'Estadística

Història de l'Estadística

L'estadística va sorgir a Europa al 1663, inicialment enfocada en la "ciència de l'estat" per prendre decisions polítiques basades en dades econòmiques i demogràfiques. Avui en dia, té aplicacions molt més àmplies.

Branques de l'Estadística

La variabilitat de les DADES. Els processos aleatoris que generen aquestes dades, és a dir, la PROBABILITAT.

  • Estadística Descriptiva (se centra amb les dades)

    • Resum de les dades observades.
  • Estadística Inferencial (se centra amb les probabilitats)

    • Extrapolar una informació que tinc d’unes mostres a tota la població.

Definicions Clau

  • Dada: Unitat d'informació rellevant.
  • Probabilitat: Mesura de la certesa d'un esdeveniment, sempre entre 0 i 1. 0 vol dir que el succés és impossible que passi, i 1 que segur que passa.
  • Aleatorietat: Falta aparent de predictibilitat en esdeveniments; ja que el resultat d'un succés

Relació entre Dades i Probabilitat

  • Si tenim dades observades, podem deduir probabilitats.
  • Si tenim probabilitats, podem predir esdeveniments futurs.

Llibreries útils per a la estadística.

  • Statistics llibreria inclosa al nucli de Python per obtenir estadístiques de llistes. Si uses Pandas no et caldrà.

  • Numpy Té moltes útilitats: generar números i mostres aleatoris, tractament valors NaN i arrays. Si hem de fer càlculs estadístics avançats amb Numpy podem considerar descarregar SciPy.

  • Pandas Ens ve molt bé organitzar les dades tabulars en DataFrames o Series i proporciona mètodes per obtenir estadístiques totals i per calcular estadístiques de dades seleccionades ràpidament.

  • Matplotlib Llibreria de baix nivell per dibuixar trames i generar tot tipus de gràfics. Funciona molt bé amb estructures de Python, arrays, series, dataFrames...

Requereix més codi que Seaborn, però ofereix el màxim nivell de personalització.

  • Seaborn Llibreria d'alt nivell. Ideal per gent amb deadlines ajustats. Amb menys codi que Matplotlib i un rendiment no gaire inferior, obtens gràfics molt decents.

Estadística Descriptiva

Definicions i Conceptes

  • Població: Conjunt d'elements o esdeveniments d'interès.
  • Mostra: Subconjunt de la població que es pot observar.
  • Variable: Característica mesurable de la mostra.

Si llenço un dau 10 cops només, no tinc suficient informació per saber si el dau està trucat.

Però si el llenço 10.000 cops, i cada cara no surt aproximadament el mateix número de cops, llavors sí que puc dubtar del dau.

Per exemple, si vull saber la satisfacció dels alumnes dels cicles formatius, per a què la mostra sigui significativa n'escolliré de diverses families professionals (Salut, Mecànica, ...), de diversos nivells (PFI, CFGM, CFGS), a alumnes de diverses edats, que no hi hagi un excés d'homes i dones, etc...

Conclusió: El tamany de la mostra IMPORTA.

Tipus de Variables

  • Quantitatives:

    • Continues: Exemples com pes, la edat o alçada. En alguns estudis ens interessa molt agrupar-les per a què siguin discretes, per exemple, en grups d'edat (grup50_60,grup60_70 ...) per tal de poder representar gràfics o estudiar per separat cada franja.

    • Discretes: Exemples com nombre de fills.

  • Qualitatives (o de categories):

    • Ordinals: Amb un ordre implícit (Excel·lent, Notable ...)

    • Nominals: Sense ordre explícit, com classes de malalties (Sida,Càncer,Grip...)

El valor d'una variable també es pot anomenar "freqüència"

  • Freqüència absoluta: El valor absolut.

  • Freqüència relativa: El valor dividit per la mida de la mostra.

És molt important calcular aquestes freqüències per fer gràfics com els diagrama de barres, de línies, de punts, mapes de calor...

Estadística descriptiva: Mesures de Tendència Central

En estadística descriptiva es fan servir diferents mesures per intentar descriure la tendència central de les nostres dades.

  • Mitjana: La mitjana aritmètica o mitjana és el valor obtingut en sumar totes les dades i dividir el resultat entre el nombre total elements.

    • En anglès es diu MEAN (Pandas, Numpy) o AVERAGE (LO Calc).
  • Mitjana Ponderada: La mitjana ponderada ens interessa quan algunes de les dades tenen més pes dins del valor de la mitjana que altres.

    • Per exemple, en calcular les notes finals d'un mòdul on la Pràctica Pt1 compta un 70%, i l'examen compta el 30% restant.
    • En anglès es diu WEIGHTED MEAN.
  • Moda: La moda és el valor que té més freqüència absoluta. Per calcular-ho hem de comptar el número de vegade.

Exemple

Tenim les notes de 4 alumnes (4 files) en 3 examens (3 columnes) en un array de Numpy i en un DataFrame.

Volem calcular-ne la mitjana aritmètica, la mitjana ponderada tenint en compte els pesos 0.2, 0.3 i 0.5 per cada examen.

També necessitem la moda de tots els resultats.

import numpy as np
from statistics import mode

# Definim l'array bidimensional x amb les notes dels alumnes
x = np.array([
    [7.0, 6.0, 5.5],
    [4.0, 8.0, 7.5],
    [9.0, 5.0, 8.5],
    [7.0, 9.0, 8.0]
])

# Rcordem, és la mitjana de cada alumne (files)
mean = np.mean(x, axis=1)

mode = mode(x.flatten().tolist())

print("Mitjana aritmètica per a cada alumne:")
for i in range(len(mean)):
    print(f"Alumne {i+1} : {mean[i]:.2f}")

print(mode)

# Definim l'array de pesos w per a cada nota
w = np.array([0.2, 0.3, 0.5])
wmean = np.sum(w * x, axis=1) / np.sum(w)

print("Mitjana ponderada per a cada alumne:")
for i, mean2 in enumerate(wmean):
    print(f"Alumne {i+1}: {mean2:.2f}")

Resultat:

Mitjana aritmètica per a cada alumne:
Alumne 1 : 6.17
Alumne 2 : 6.50
Alumne 3 : 7.50
Alumne 4 : 8.00
7.0
Mitjana ponderada per a cada alumne:
Alumne 1: 5.95
Alumne 2: 6.95
Alumne 3: 7.55
Alumne 4: 8.10

Si en canvim tenim aquestes notes en un dataFrame, on hi podem tenir més informació; els resultats els podem obtenir així.

Al final, s'ha optat per guardar els resultats en un nou dataset.

import pandas as pd
import numpy as np

# Dades dels alumnes (columnes) i les seves notes
data = {
    'Alumne': ['Anna', 'Bernat', 'Carla', 'David'],
    'Examen1': [7.0, 4.0, 9.0, 7.0],
    'Examen2': [6.0, 8.0, 5.0, 9.0],
    'Examen3': [5.5, 7.0, 8.5, 8.0]
}

# Calculem la mitjana aritmètica per a cada alumne
df = pd.DataFrame(data)

# Calculem la mitjana aritmètica d'un examen (així el professor sap si l'ha fet molt difícil)
print("Mitjana aritmètica examen 1 = ",df['Examen1'].mean(axis=0))

# Pesos per a la mitjana ponderada (exemple)
pesos = [0.2, 0.3, 0.5]

# Calculem la mitjana ponderada per a cada alumne
df['Mitjana_Ponderada'] = np.average(df[['Examen1', 'Examen2', 'Examen3']], weights=pesos, axis=1)

print("Mitjana ponderada final examens.")
print(df)

# Calculem la moda de tot el DataFrame (hi pot haver més d'una)
moda_total = df.stack().mode()[0]
print("Moda dels examens.",moda_total)

Estadística descriptiva: Mesures de Variabilitat o dispersió

Per complementar les mesures de tendència central, es fan servir les mesures de variabilitat, que descriuen com varien les dades respecte al seu centre.

  • Mediana: La mediana és el valor que ocupa el lloc central de totes les dades quan aquestes estan ordenades de menor a major. Recomanable fer la gràfica de totes les observacions ordenades.

    • En anglès es diu median.
  • Rang: El rang és la diferència entre l'observació més alta (màxim) i la més baixa (mínim).

    • Rang = | Màx - Mín |
  • Desviació respecte a la mitjana: La desviació respecte a la mitjana és la diferència en valor absolut entre cada valor de la variable estadística i la mitjana aritmètica. Aquest càlcul es fa per a fer rectes de regressió.

  • Variança: La variància és la mitjana aritmètica del quadrat de les desviacions respecte a la mitjana d'una distribució estadística. La variància intenta descriure la dispersió de les dades. En resum, la variància seria la mitjana de les desviacions al quadrat.

    • Es representa com σ2 (sigma minúscula al quadrat).
  • Desviació típica: La desviació típica és l'arrel quadrada de la variància. Es representa amb la lletra grega σ.

    • En anglès es conèix com std = Standard Desviation.
  • Quantil: Els quantils són punts presos a intervals regulars de la funció de distribució d’una variable aleatòria. Les mostres s'ordenen segons els valors de menor a major, i el quantil és el valor en aquest punt.

    • Si el punt es pren en tant per cent de les observacions, s'anomenen percentil. Si les observacions es divideixen en quatre quarts, les tres divisions es diuen quartils (Q1=25%, Q2=50%, Q3=75%). Q2 és la Mediana. També hi ha decils (D1=10%, … D9=90%) si volem filar més prim.

    • L'aplicació pràctica que haureu vist dels quantils és ordenar les publicacions científiques per H-Index, on les del Q1 són les més recomanades.

  • Rang interquartílic:

RI = Q3 − Q1.

  • Valor atípic (outlier): Un valor atípic (outlier) és una observació que s'allunya massa de la moda; aquesta molt lluny de la tendència principal de la resta de dades. Sempre cal considerar-ne la causa.

Si són causats per errors en la lectura de les dades o mesures inusuals s'esborren, però si no cal considerar-les.

Pandas és una molt bona llibreria, però encara no ha previst com calcular els outliers.

De tota manera, amb aquest senzill codi podrem trobar-los i eliminar-los.

Si només volem trobar-los, ens oblidem del loc.

def remove_outliers(df_in, col_name):
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
   return df_out
  • Boxplot: Un boxplot és una gràfica que mostra diversos descriptors alhora: Els tres quartils, el "mínim" i "màxim" calculats i els outliers. Són usats en molts àmbits.

Les llibreries com Seaborn o Matplotlib els generen molt fàcilment.

Exemple 1. Estadístiques de dispersió i outliers

Ens han donat un dataframe amb la edat, altura, pressió sistòlica i diastòlica de diversos pacients.

La pressió arterial normal, en el cas de la majoria dels adults, es defineix com una pressió sistòlica de menys de 120 i una pressió diastòlica de menys de 80.

Doncs bé, ens demanen mostrar estadístiques centrals i de dispersió de totes les variables, calcular l'amplitud interquartilica de les pressions i crear un nou dataframe sense els outliers de la pressió (sigui sis o dia).

def iqr(df_in, col_name):
    '''
      Calcula l'amplitud interquartilica (-1,5*iqr,+1,5*iqr)
      i retorna els valors inferior i superior.
    '''
    q1 = df_in[col_name].quantile(0.25)
    q3 = df_in[col_name].quantile(0.75)
    iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
    fence_high = q3+1.5*iqr
    # Si, es poden retornar 2 valors.
    return fence_low, fence_high

def remove_outliers(df_in, col_name):
    '''
      Esborra valors outliers (-1,5*iqr,+1,5*iqr)
      d'una columna d'un dataframe.
    '''
    fence_low, fence_high = iqr(df_in,col_name)
    df_out = df_in.loc[(df_in[col_name] > fence_low) & (df_in[col_name] < fence_high)]
    return df_out

df_pacients = pd.DataFrame({
    'edat' : [50,43,22,61,64,54,38,98],
    'altura' : [1.75,1.57,1.6,1.66,1.63,1.79,1.70,1.61],
    'pr_sis' : [125,105,150,800,130,114,105,119],
    'pr_dia' : [81,74,84,76,80,78,69,81]
})

print(df_pacients.describe())
print('IQR pr_sis',iqr(df_pacients,'pr_sis'))
print('IQR pr_dia',iqr(df_pacients,'pr_dia'))
# la edat també té un iqr, però no l'esborrem perquè no passa res per 
# tenir pacients grans.
# print('IQR edat',iqr(df_pacients,'edat'))

df_pacients_clean = remove_outliers(df_pacients,'pr_sis')
print(df_pacients_clean)
print(df_pacients_clean.describe())

Estadística descriptiva: Mesures de correlació entre dues variables.

Ens mostren si hi ha una relació entre 2 variables d'una mostra.

Per exemple entre el temps i les temperatures, entre el pes i l'alçada de persones, l'edat i el nivell de sucre o el pes i el nivell de sucre.