# Numpy, Estadística, Probabilidades

## Estadística

En esta parte vamos a revisar conceptos de estadística descriptiva.

La estadística descriptiva busca describir, sumarizar y comprender los datos.

Para ello empleamos Medidas de Tendencia Central, y medidas de Variabilidad.

La función de las Medidas de Tendencia Central es proveer información descriptiva sobre el valor numérico que es considerado el más usual para una variable cuantitativa.

Las medidas de tendencia central son
* **Media**

Dados los n números ${\{x_{1},x_{2},\ldots ,x_{n}\}}$ la media aritmética se define como: 

\begin{equation}
    \bar {x} = {\frac {1}{n}} \sum _{i=1}^{n}x_{i} ={\frac {x_{1}+x_{2}+\cdots +x_{n}}{n}}
\end{equation}

* **Mediana**

Sean ${ x_{1},x_{2},x_{3},\ldots ,x_{n} }$ los datos de una muestra ordenada en orden creciente y designando la mediana como $M_{e}$, distinguimos dos casos:

a) Si n es impar, la mediana es el valor que ocupa la posición $(n+1)/2$ una vez que los datos han sido ordenados (en orden creciente o decreciente), porque este es el valor central. Es decir: $M_{e}=x_{{(n+1)/2}}$.

b) Si n es par, la mediana es la media aritmética de los dos valores centrales. Cuando $n$ es par, los dos datos que están en el centro de la muestra ocupan las posiciones $n/2$ y $(n/2)+1$. Es decir: $M_{e}=(x_{{{\frac{n}{2}}}}+x_{{{{\frac{n}{2}}}+1}})/2$.


* **Moda**

Es el valor del dato con mayor frecuencia en un conjunto.

Las medidas de variabilidad o dispersión nos indican si los valores de los datos están próximos entre sí o si 
por el contrario están muy dispersos. Estas medidas se determinan en función de la distancia entre los datos y algún estadístico de tendencia central.

Las medidas de variabilidad son
* **Rango**

Sean ${ x_{1},x_{2},x_{3},\ldots ,x_{n} }$ los datos de una muestra ordenada en orden creciente, el rango es $x_{n} - x_{1}$


* **Varianza**

Si tenemos un conjunto de valores de una variable, la varianza se calcula de la siguiente forma:

\begin{equation}
\sigma_{n}^{2} = \frac{1}{n} \sum _{i=1}^{n} (x_i - \bar{X})^{2}
\end{equation}

Siendo:

$x_{i}$: cada dato

$\bar{X}$: media de los datos

$n$: número de datos


* **Desvío Estándar**

Es la raíz cuadrada de la varianza

\begin{equation}
\sigma_{n} = \sqrt{\frac{1}{n} \sum _{i=1}^{n} (x_i - \bar{X})^{2}}
\end{equation}


* **Coeficiente de Variación**

Es el desvío estándar dividido por la media

\begin{equation}
CV = \frac{\sigma_{n}}{\bar{X}} . 100 
\end{equation}




NumPy tiene funciones para calcular todas estas medidas.

---



Vamos a ver cómo calcular algunas medidas de estadística descriptiva usando Numpy.

Para eso, usaremos datos que tenemos en un csv con tres poblaciones:
* conejos
* linces 
* zanahorias

Leeremos los datos del csv usando `genfromtxt` de Numpy

La primera columna de la matriz corresponde al año, la segunda a la población de conejos, la tercera corresponde a la población de linces, y la cuarta a la población de zanahorias.

Y luego vamos a convertir en arrays, que aprendimos a usar recientemente, cada una de sus columnas. ¿Cómo hacemos esto?


```python
import numpy as np

data_location = '../Data/populations.txt'
data = np.genfromtxt(data_location, skip_header=1, delimiter='\t')
data
```

Definimos variables con el índice que corresponde a cada población:


```python
anno_col_index  = 0
conejos_col_index = 1
linces_col_index = 2
zanahorias_col_index = 3
```

Vamos a crear un array de Numpy para cada población y para el año, usando slicing (si no lo recuerdan, revisen la clase  de Numpy):


```python
anno = data[:, anno_col_index]
#print(anno)
conejos = data[:, conejos_col_index]
#print(conejos)
linces = data[:, linces_col_index]
#print(linces)
zanahorias = data[:, zanahorias_col_index]
#print(zanahorias)
```

Y por último vamos crear una variable poblaciones, que tenga todos los datos de la matriz data menos la columna "# year"


```python
poblaciones = data[:, 1:]
poblaciones
```

<a id="section_descriptive"></a> 
### Estadística descriptiva
[volver a TOC](#section_toc)

Para cada variable de la serie histórica, calculamos la media y el desvío. Redondeamos los valores para que tengan sólo 2 decimales.

Vamos a usar los métodos de Numpy
* **mean**: calcula la media de los valores pasados en el primer parámetro https://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html
* **std**: calcula el desvio standard de los valores pasados en el primer parámetro  https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
* **around**: redondea los valores a la cantidad de decimales pasada como parámetro, el default es 0 https://docs.scipy.org/doc/numpy/reference/generated/numpy.around.html



Ahora vamos a calcular la media de cada una de las poblaciones usando la matriz `poblaciones` y el método `mean` de Numpy, redondenado a dos decimales.

¿Qué valor de `axis` debemos usar? ¿Por qué?

Respuesta: Cada población está representada por una columna en la matriz poblaciones, por lo tanto para calcular la media por población debemos colapsar las filas, y para eso el valor de axis debe ser 0


```python
print ("        Conejos, Linces, Zanahorias")
print ("Mean:", np.around(poblaciones.mean(axis=0), decimals=2))
print ("Std:", np.around(poblaciones.std(axis=0), decimals=2))
```

A continuación, calculamos para cada especie el año en el que tuvieron máxima población. 

Para eso vamos a usar el método `argmax` de Numpy que devuelve el índice en el array del valor máximo https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Igual que en el punto anterior, las poblaciones están representadas por columnas, entonces debemos colapsar filas y así axis debe tener valor 0. 

`indice_max_poblacion` tendrá tantos elementos como poblaciones considero (3 en este caso: conejos, linces, zanahorias) y cada elemento será **el índice de la fila** donde esa población tuvo la máxima cantidad de individuos.


```python
indice_max_poblacion = np.argmax(poblaciones, axis=0)
indice_max_poblacion
```

Por lo tanto, la población de conejos fue máxima en la cuarta fila, la de linces en la quinta fila, la de zanahorias en la primer fila.

Veamos a que años corresponden esas filas, usando Fancy indexing (si no lo recuerdan, por favor revisen la guía de numpy1!)


```python
annos_con_maximos = anno[indice_max_poblacion]
annos_con_maximos
```

Entonces la máxima población de conejos fue en 1903, la de linces fue en 1904, y la de zanahorias fue en 1900


```python
# Fancy Indexing
print ("                          Conejos, Linces, Zanahorias")
print ("Años de máxima población:", anno[indice_max_poblacion])
```

Como adicional, vamos a graficar estas tres poblaciones para ver si los resultados que obtuvimos se corresponden con los graficados. 

En unos días vamos a tener una clase de visualización y veremos en detalle bibliotecas como `matplotlib` que usamos ahora de forma muy básica.


```python
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(anno, conejos, anno, linces, anno, zanahorias) 
plt.legend(('Conejos (hares)', 'Linces (lynxes)', 'Zanahorias (carrots)'), loc=(1.05, 0.5)) 
plt.show()
```

<div id="ejercicio1" style="float:left;width: 100%;">
  <div style="float:left;width: 15%;"> </div>
    <div style="float:left;width: 85%;"><label>
<b>Ejercicio</b>:
    
¿En qué años alguna de las poblaciones se encuentra por encima de 50000?
    
Ayuda: boolean indexing
    
Ayuda 2: podemos resolverlo usando la matriz poblaciones o usando los array de poblaciones por separado
    
Podemos autocorregir los ejercicios mirando el gráfico</label></div>
</div>
    


<div id="ejercicio2" style="float:left;width: 100%;">
  <div style="float:left;width: 15%;"> </div>
    <div style="float:left;width: 85%;"><label>
<b>Ejercicio</b>:
    
¿En qué dos años, cada especie tuvo sus niveles más bajos de población?

Ayuda: pueden buscar la documentación de `argsort` de Numpy
    
Ayuda 2: podemos resolverlo usando la matriz poblaciones o usando los array de poblaciones por separado
    
Podemos autocorregir los ejercicios mirando el gráfico</label></div>
</div>
    

#### Covarianza

La covarianza es un valor que indica el grado de variación conjunta de dos variables aleatorias respecto a sus medias. 

Es el dato básico para determinar si existe una dependencia entre ambas variables 

El método que calcula la covarianza en Numpy es `cov`
https://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html


```python
np.cov([conejos, linces, zanahorias])
```

<div id="caja1" style="float:left;width: 100%;">
  <div style="float:left;width: 15%;"> </div>
  <div style="float:left;width: 85%;"><label>Ahora intentemos responder estas preguntas:

      
* **¿Puedo comparar las distintas varianzas? ¿Por qué?**

Si las variables se miden en las misma unidades y sus valores son de magnitudes parecidas, puedo comparar sus varianzas. Pero sólo en ese caso y no en general.

* **¿Qué variable tiene la mayor varianza? ¿Cómo se ve esto en el gráfico?**

Podemos mirar los valores de la diagonal de la matriz de covarianzas para obtener los valores de las varianzas de esas variables. 

La variable de mayor varianza es el conejo, su valor está en el elemento (0,0) de la matriz de varianzas y covarianzas. 

En el gráfico podemos ver que la dispersión de la serie de los conejos es parecida a la serie de los linces, pero la serie de conejos tiene mayor rango (diferencia entre los valores máximo y mínimo) por lo tanto aporta más en la suma de distancias a la media.

* **¿Qué significa una covarianza positiva? ¿Y una negativa?**

Dos variables X e Y, tienen covarianza positiva cuando tienden a encontrarse por encima de su media al mismo tiempo y tienen covarianza negativa cuando al mismo tiempo, tienden a encontrarse una por debajo y otra por encima.

En cambio X e Y tienen covarianza cercana a cero cuando las variables pueden encontrarse por encima o por debajo de su media independientemente de lo que haga la otra.

La covarianza mide la relación lineal entre ambas variables, es decir, qué tanto se asemeja la relación con una función lineal.</label></div>
</div>    



#### Correlación

El coeficiente de correlación de Pearson es una medida lineal entre dos variables aleatorias cuantitativas. 

A diferencia de la covarianza, la correlación de Pearson es independiente de la escala de medida de las variables.

Podemos definir el coeficiente de correlación de Pearson como un índice que puede utilizarse para medir el grado de relación de dos variables siempre y cuando ambas sean cuantitativas.

El método que calcula la correlación de Pearson en Numpy es `corrcoef`. Los valores de los elementos de la matriz de correlación están entre -1 y 1 inclusive. Es equivalente a la matriz de covarianzas normalizada.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html




```python
np.corrcoef([conejos, linces, zanahorias])
```

dc69b35e70be577fb8edb013fd1f80f7ec8c5b52
ipynb
Jupyter Notebook
Code/3-numpy/3_estadistica.ipynb
Flor91/Data-Science
f67ec537341e8b2d8213a56ef8ee63028e46e1b2
MIT
2020-10-06T12:59:39.000Z
2021-11-08T10:58:14.000Z
Code/3-numpy/3_estadistica.ipynb
Flor91/Data-Science
f67ec537341e8b2d8213a56ef8ee63028e46e1b2
MIT
Code/3-numpy/3_estadistica.ipynb
Flor91/Data-Science
f67ec537341e8b2d8213a56ef8ee63028e46e1b2
MIT
Qwen/Qwen-72B
1. YES
2. YES