Table of contents
Open Table of contents
Manejo de software
Representación de datos en tablas de Python
(Aquí seguimos la información de: https://lectures.scientific-python.org/packages/statistics/index.html#data-representation-and-interaction)
La información rectangular se suele representar archivos separados por comas:
"";"Gender";"FSIQ";"VIQ";"PIQ";"Weight";"Height";"MRI_Count"
"1";"Female";133;132;124;"118";"64.5";816932
"2";"Male";140;150;124;".";"72.5";1001121
"3";"Male";139;123;150;"143";"73.3";1038437
"4";"Male";133;129;128;"172";"68.8";965353
"5";"Female";137;132;134;"147";"65.0";951545
Estos datos están en https://lectures.scientific-python.org/_downloads/cc48b617db83afe66c7e4e955ea3f3bd/brain_size.csv
Como vimos anteriormente, se puede leer la información usando la función read_csv de pandas:
import pandas
data = pandas.read_csv('examples/brain_size.csv', sep=';', na_values=".")
data.head()
Un dato interesante es el . que aparece relacionado como ‘Weight’ del segundo registro. Se interpreta como el caracter que se usó para identificar los datos faltantes. Por eso en éste caso se indica el uso de la opción
na_values="."
Tablas Pivote, agrupamientos
Son las tablas para la cual los valores se calculan agregando grupos de valores individuales de una tabla más extensa.
En Pandas se construye primero una función agrupamientoy, mediante
la función groupby; y luego se construyen las tablas pivote. Por
ejemplo, para agrupar por género en el ejemplo que acabamos de ver:
groupby_gender = data.groupby('Gender')
Y se pueden calcular promedios de todas las demás variables con:
groupby_gender.mean()
O para una única variable como:
for gender,value in groupby_gender['VIQ']:
print(gender,value.mean())
Ejercicio
Fracción de nacimientos por talla
Cargue los datos de Nacimientos de 1998, de la carpeta de Datos. Encuentre cuál es la fracción de nacimientos en las diferentes categorías de tallas. Revise el diccionario de datos e interprete sus resultados.
n_hijosv por n_emb
Calcule el valor del promedio de la variable n_hijosv para cada categoría de n_emb. Hay alguna tendencia? A que podría deberse?
Prueba de Hipótesis para el Promedio
Como habíamos visto antes, la prueba de hipótesis para el promedio consiste en comparar el valor del punto crítico de una distribución t-student con n-1 grados de libertad con el estadístico de prueba.
Otra interpretación es la de “calcular la probabilidad de observar valores más extremos que el obtenido con la estadística de prueba bajo la distribución de muestreo considerada” (Contento, pg310). Esta probabilidad se denomina el valor-p. Se rechaza la hipótesis nula si el valor-p es menor a un valor pre-establecido.
Ejemplo
Recordemos la base de datos del DANE con los datos de estadísticas vitales para 1998 que hemos venido trabajando.
https://microdatos.dane.gov.co/index.php/catalog/366/data-dictionary/F1?file_name=Nacimientos_1998
Una de las variables que tiene los datos sin codificar por intervalos es la variable n_hijosv.
Cuál será el promedio de ésta variable? Para hacerlo seguimos el siguiente esquema:
-
Limpiar los datos: Es el proceso por el que determinamos si los datos “brutos” cumplen con condiciones de interpretabilidad y calidad, o si hay que llevar a cabo modificaciones. Qué procedimientos se le ocurre que puede llevar a cabo para identificar la calidad de éstos datos? Si hay que filtrar, qué filtraría y cómo?[^1]
-
Tomar una muestra: Dado que en este caso estamos trabajando con todos los datos de la base del dane para el 98, tiene sentido que para calcular un estadístico tomemos una muestra. Cómo lo haría?
R: Como estamos aprendiendo, lo mejor es que la muestra parezca aleatoria, pero que en sucesivas repeticiones del código siempre tome la misma muestra. Entonces usamos la semilla del generador aleatorio:
import random as ran ran.seed(8)Luego procedemos a tomar la muestra. Si el vector limpio se llamaba
nhijos, entonces una muestra de tamaño 20 se toma así:muestra = ran.sample(nhijos,20) -
Promedio de la muestra: Calcule el promedio de la muestra.
-
Prueba de hipótesis: Suponga la siguiente hipótesis nula: el promedio de la variable
valorpes de 2; y la respectiva hipótesis alternativa: este promedio no es 2. Lleve a cabo una prueba de hipótesis estadística para determinar si se cumple o no la prueba de hipótesis para éste caso.[^3]
Interpretación Valor-p
La alternativa de calcular la probabilidad de obtener valores más extremos. En R se calcularía con la función pdf. Para este caso:
sp.stats.t.pdf(tc,20)
Se obtiene 0.38. Se interpreta como “la probabilidad de obtener valores más extremos es de 0.38. Dado que para rechazar la hipótesis nula, la probabilidad de los valores extremos debe ser pequeña, en este caso no rechazamos la hipótesis nula. Es coherente con que el promedio sea 2, dentro del margen de error.
Función ttest_1sample
Una forma de calcularlo la prueba de hipótesis es es usar la función ttest_1sample de scipy.stats. Esta función devuelve el valor de la estadística de prueba para una prueba del promedio y el valor-p.
Visualización
Python tiene diferentes librerías que pueden usarse para crear visualizaciones de sus datos. Entre las más conocidas:
-
matplotlib.pyplot: Es una librería muy estable y rápida para crear gráficas. Sigue la notación de Matlab. -
Seaborn: Una librería más moderna, usada en modelos estadísticos. -
Otras, como: Plotly, HoloViews, etc.
Matplotlib
Una buena guía para aprender a usar ésta librería es el libro Python for Data Analysis de McKinney, disponible en línea en https://wesmckinney.com/book/plotting-and-visualization
La librería se llama con:
import matplotlib.pyplot as plt
import numpy as np
plt.ion() # Para uso en línea de comandos, interactivo
plt.show() # Para recargar la vista
Graficación básica en matplotlib
En Matplotlib la estructura básica es la figura, se crea con:
fig1 = plt.figure()
Por qué cree que es una asignación?
Si se quieren generar varias sub-gráficas (llamadas ejes), se usa el
comando add_sublplot del objeto fig1:
ax1 = fig.add_subplot(2, 2, 1)
O se puede crear un eje por defecto con gca:
ax = fig.gca()
Algunas características de la gráfica corresponderán a fig1 y otras a ax1.
El texto se puede ingresar en , usando el comando r'''. Por ejemplo:
np.plt(x,np.cos(x),'--',label='b')
ax.set_title(r'''$cos \theta$''')
ax.set_xlabel(r'''$\theta$''')
Se incluye la etiqueta de la figura con la opción label en la función
plot y la función legend:
theta = np.linspace(0,10,100)
plt.plot(theta, np.cos(theta), '--', label='coseno')
plt.legend()
Experimente con las opciones para cambiar la posición de los
marcadores (ticks) y su texto, con las funciones: set_xticks y
set_xticklabels del objeto ax.
Experimente con las opciones para anotar las gráficas, siguiendo el ejemplo “Annotations and Drawing”, de ‘Python for Data Analysis de McKinney’, en https://wesmckinney.com/book/plotting-and-visualization.
Guardar (exportar) las gráficas
La función es savefig, esta vez de la figura (en nuestro ejemplo
fig1). El tipo de gráfico se determina automáticamente por la
extensión. En el caso del formato png, la opción dpi da la
resolución en “puntos por pulgada”.
Pandas
Esta librería tiene funciones que permiten generar rápidamente gráficas de los conjuntos de datos (dataframes). En “Python for Data Analysis” hay diferentes ejemplos.
En el primer ejemplo generan un conjunto de datos y luego hacen una suma. Sin leer la domucmentación intente explicar qué creería que hacen los siguientes comandos:
datos0 = np.random.standard_normal((10,4))
datos1 = datos0.cumsum(1)
df = pd.DataFrame(datos1, columns=["A","B","C","D"])
[^2]
Ahora imprima el arreglo.
La siguiente instrucción genera una representación de cada una de las variables como una serie, en escala de grises.
plt.style.use('grayscale')
df.plot()
Aquí se usa el índice cómo variable independiente.
Ejercicio: Uniendo conceptos
Construya un diagrama de barras que tenga los conteos de la variable
n_hijosv, para los diferentes valores de la variable n_emb, para
el conjunto de datos de Nacimientos de 1998.[^4]