Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCTION TO NUMPY
Chapter 1: Undertanding NumPy Arrays
np.array((x,y)) --> Crear un ndarray de x filas e y columnas indicado por el tuple (x,y)
np.zeros((x,y))
np.random.random((x,y))
np.arange(start, stop) --> Ojo que aquí no es un tuple sino parámetros el start y el stop
np.arange(start, stop, step) --> Ojo que aquí no es un tuple sino parámetros el start y el stop y el step
.dtype() --> Atributo para saber el tipo de dato que tiene el array
np.array(list_of_float_values, dtype=np.float32) --> Puede forzarse el tipo de dato del array indicándolo como parámetro
array.astype(np.int32) --> Este método cambia el tipo de dato del array al indicado
INTRODUCTION TO NUMPY
Chapter 2: Selecting and Updating Data
arrary[index] --> Acceder a parte del array usando un índice (si hay varias dimensiones, separadas por "," pero no dentro de un
tuple). Dependiendo del índice se devolverá el subconjunto del array indicado.
np.sort(array) --> Ordena el array según el último eje si no le pasa indicación contraria. Si es un 2D array, se ordenará por columnas.
No se puede elegir ascendente o descente el orden.
np.sort(array, axis=0) --> En este caso se ordena por el primer eje, las filas.
Fancy indexing --> Filtrar y devolver los elementos del array usando una máscara (matriz que devuelve True/False según se cumpla la
condición)
np.where(condition) --> Devuelve un array con el listado de índices que cumplen la condición
np.where(condition, si_true, si_false) --> Devuelve un array con los valores si_true o si_false dependiendo de si se cumple o no la
condición
np.concatenate((array1, array2)) --> Concatenate por defecto en el primer eje. Ambos arrays deben tener la misma dimensión
np.delete(array, index_to_delete, axis=x)
INTRODUCTION TO NUMPY
Chapter 3: Array Mathematics!
.sum(axis=…, keepdims=True or False) --> Indicar el eje sobre el que se hace la operación (axis=0 --> devuelve la suma las filas para
cada "columna" // axis=1 --> devuelve la suma de las columnas para cada "fila"
.max() .min() .mean() .cusum()
broadcasting --> Leer las dimensiones (shape) de derecha a izquierda y comparar entre arrays por parejas. Si la dimensión de la
pareja es igual o alguna es 1, es compatible. Si algún array tiene menos dimensiones, se compara igual con las existentes.
INTRODUCTION TO NUMPY
Chapter 4: Array Transformations
Abrir archivo y cargarlo en un array
with open('archivo_a_abrir.ext', 'rb' as file:
archivo_cargado=np.load(file)
plt.imshow(pixel_array) --> Para plotear una imagen a partir de un arrary con los pixels RGB
np.flip(array, axis=int or tuple) --> Se puede indicar sólo un eje o una conjunto de ellos con la tupla
np.transpose(array, axes=tuple) --> Siempre todos los ejes especificados en la tupla
np.split(array, number_of_registers_in_new_dimension,axis=axis_to_split)
np.stack(list_of_arrays_to_stack, axis=new_dimension_position)
statsmodels.formula.api.ols --> Ordinary Least Squared --> Para calcular las regresiones
modelo = ols("response_variable_name ~ explanatory_variable1_name + explanatory_variable2_name… ", data=dataframe) --> Hay que crear el
modelo primero. Si se pone "+0" se fuerza a que la constante sea 0. Útil si tenemos variable explanatory categórica en vez de numérica
modelo=modelo.fit() --> Lanzar el ajuste del modelo
modelo.params --> Una vez ajustado, para conocer los parámetros del ajuste realizado
model.fittedvalues --> atributo del modelo que devuelve los valores predichos por el modelo para el conjunto de entreno
model.resid --> atributo del modelo que devuelve los residuales de valores reales - predichos por el modelo para el conjunto de entreno
model.summary() --> método del modelo que da un resumen de los parámetros estadísticos
plt.axis('equal') --> Sirve para que eje x y eje y tengan el mismo espaciado entre valores
GENERAL página 1
plt.axis('equal') --> Sirve para que eje x y eje y tengan el mismo espaciado entre valores
plt.axline(xy1 = (150,150), slope=1) --> Crea una línea que pasa por el 150 con una inclinación de 1
model.rsquared --> Para calcular el coeficiente de determinación o R2 (en minúscula a veces si el modelo tiene sólo 1 variable indpendiente)
variable1.corr(variable2)**2 --> Coeficiente de determinación cuando es una regresión con 1 variable independiente,
RSE --> np.sqrt(model.mse_resid) --> Medida de los residuales. Para calcular los grados de libertad resta las variables utilizadas
RMSE --> Otra medida de los residuales. No resta las variables utilizadas
Residuos
Sns.residplot(x=x_series, y=y_series, data=dataframe, lowess=True) --> Dibuja los residuales y añade la tendencia lowess
La tendencía lowess debería ajustarse a línea horizontal en 0 si los residuales fueran una distribución normal
Q-Q plot
statsmodels.api.qqplot(data=model.resid, fit=True, line='45') --> El parámetro line dibuja una línea a 45º para ayudar a interpretar.
Scale-location ó raiz de los residuos estandarizados
np.sqrt(np.abs(model.get.influence().resid_studentized_internal)) --> Residual normalizado absoluto y se calcula su raíz
leverage --> Medida de lo lejos que se encuentra un punto/registro según el valor de sus variables independientes respecto al resto de p untos
model.get_influence().summary_frame()['hat_diag']
influence --> Medida de cuánto modifica al modelo quitar un punto/registro determinado del conjunto de datos.
model.get_influence().summary_frame()['cooks_d']
SAMPLING IN PYTHON
Chapter 1: Bias any stretch of the imagination
dataframe.sample(n=numer_of_samples) --> Devuelve un número de registros de manera aleatoria entre todos los registros
SAMPLING IN PYTHON
Chapter 2: Don't get theory eyed
dataframe.sample(n=size, random_state=int) --> Se escoge una muestra random de n registros y se fija una semilla determinada para reproducibilidad
dataframe.iloc[::interval] --> Se extraen los registros del dataframe según interval del índice
dataframe.sample(frac=1) --> Mezcla aleatoriamente todos los registros. Ojo, reiniciar índice si se quiere utilizar una extracción sistemática que pueda considerarse aleatoria. Si
dejamos el índice previo, seguiremos el mismo orden previo.
dataframe['column_name`].value_counts(normalize=True) --> Contar los registros según una columna y normalizar sobre 1
dataframe.groupby('column_name').sample(frac=0.4, random_state=int) --> Sacamos una muestra del 40% de cada grupo existente en column_name para mantener su proporción en
población también en la muestra final.
GENERAL página 2
población también en la muestra final.
dataframe.groupby('column_name').sample(n=number, random_state=int) --> Sacamos una muestra de number registros de cada grupo existente en column_name para conseguir
que la proporción en la muestra sea igual para cada subgrupo de column_name. NO se mantiene la proporción de la población org inal.
dataframe.sample(n=size, weights=column_name) --> Extrae una muestra de n registros pero con un peso relativo indicado en column_name para cada registro
Cluster sampling
random.sample(list, k=4) --> Extraer 4 registro de list de manera pseudo-aleatoria
dataframeseries.isin(list) --> Devuelve una máscara con True/False según se cumple o no que coincide con algún valor de list
dataframeseries = dataframeseries.cat.remove_unused_categories() --> Al ser tipo de datos "category", se quitan las categorias no usadas en la nueva serie filtrada para evitar errores
SAMPLING IN PYTHON
Chapter 3: The n's justify the means
Función para sacar todas las combinaciones:
def expand_grid(data_dict):
rows = itertools.product(*data_dict.values())
return pd.DataFrame.from_records(rows,columns=data_dict.keys())
Desde <https://pandas.pydata.org/docs/user_guide/cookbook.html>
np.random.choice(list, size=n, replace=True) --> Se saca aleatoriamente una muestra de n registro de list, considerándose que se repone el valor sacado (se puede repetir)
np.std(ddof=0 or 1) --> Se usa 0 para el cálculo de población y se usa 1 si es una muestra de la población
SAMPLING IN PYTHON
Chapter 4: Pull Your Data Up By Its Bootstraps
Simple Random Sampling without replacement --> Sample
Simple Random Sampling without replacement --> Resample
Bootstrapping --> Opposite of sampling
Sampling: going from a population to a smaller sample
Bootstrapping: building up a theoretical population from the sample
Standard error
series.sample(frac=1, replace=True) --> Crear un bootstrap
Standard error --> El cálculo de la desviación estándar de un bootstrap (np.std(bootstrap, ddof=1)) no devuelve un valor equivalente a la desviación estándar de la población, por
eso se le llama error estándar. Si multiplicamos el error estándar por la raíz del número de muestras del bootstrap sí obtenemos un valor equivalente a la desviación estándar de
la población: Population std.dev ≈ std.error_bootstrap x sqrt(sample_size)
Confidence intervals (quantile method and standard error method)
Quantile method
lower= np.quantile(data, 0.025)
upper = np.quantile(data, 0.975)
Standard error method
point_estimate = np.mean(data)
std_error= np.std(data, ddof=0 or 1)
from scipy.stats import norm
lower = norm.ppf(0.025, loc=point_estimate, scale=std_error)
upper = norm.ppf(0.975, loc=point_estimate, scale=std_error)
null hypothesis (H_0) --> La idea existente que en principio se asume como cierta
alternative hypothesis (H_A) --> La propuesta que se va comprobar
Si se tienen evidencias de que con la muestra la H_A es verdadera, se cancela la hipóstesis nula, si no, se asume la hipótesi s nula como verdadera
GENERAL página 3
Recorte de pantalla realizado: 13/08/2022 14:51
p-values (0-1) --> Probabilidad de obtener un resultado asumiendo que la hipótesis nula es verdadera
Valores altos de p-value soportan que la hipótesis nula es cierta, valores bajo dan evidencia de que la hipótesis nula no sea verdadera
Se calcula el p-value con:
scipy.stats.norm.cdf(z_score, loc=0, scale=1)
left-tailed --> norm.cdf(…)
right-tailed --> 1 - norm.cdf(…)
significance level of hypothesis test (alpha) --> Es el umbral para decir que no hay duda. Debe establecerse previo a realizar el análisis.
Si p<=alpha, se descarta la hipótesis nula si no, se acepta la hipótesis nula.
Confidence intervals --> Normalmente se coge el complementario a 1 de alpha (1-alpha). Una muestra con alpha=0.05 --> ci = 0.95 --> se cogen los cuantiles alpha/2 y (1-alpha/2)
Types of error
Type I --> Falso positivo (aceptar hipótesis alternativa cuando realmente la nula es la correcta)
Type II --> Falso negativo (aceptar hipótesis nula como verdadera cuando la alternativa es la correcta)
Degrees of freedom = total number of samples used - statistics used --> máximo número de variables independientes in la muestra de datos
Si utilizamos la aproximación para el error estándar en vez de calcularlo a través del uso de bootstraps, se utiliza la distr ibución t y no la distribución normal para el cálculo de p -value
scipy.stats.t.cdf(t_stat, df=degrees_of_freedom)
Paired data --> datos independientes de la muestra que provienen de otra muestra independiente del mismo grupo observado. Mismo individuo, misma localización, marido/mujer, hermanos…
Cálculo del p-value con paquete pingouin para simplificarlo
pingouin.ttest(x=variable_conjunta_muestra, y=0, alternartive= 'less' or 'equal' or 'greater')
Si queremos hacer el ttest para una variable de parejas (diferencia de medias) podemos incluir ambas variables (x,y) pero ind icando con el parámetro paired=True sino los valores de p-value obtenidos podrían
ser algo superiores y dar opción a falsos negativos (no rechazar hipótesis nula)
pingouin.ttest(x=variable1_muestra, y=variable2_muestra, paired=True, alternartive= 'less' or 'equal' or 'greater')
Análisis ANOVA
pingouin.anova(data=dataframe, dv="dependant_variable", between="independant_variable", padjust=…) --> Análisis de media de cada grupo para saber si son significamente distintas entre ellas. Hipótesis nula
es que son iguales entre ellas. padjust es un parámetro para ajustar el valor de p -value para ser más o menos restrictivo en el análisis
GENERAL página 4
Comparing two proportions
Existe una función en statsmodels.stats.proportion (proportions_ztest) para hacer más rápido el cálculo de z -score y el p-value:
Chi-square test --> Test para ver si dos variables categóricas son independientes. Dentro del paquete de pingouin hay una función para realizar el cálculo
pingouin.chi2_independence(data=dataframe, x ='series1', y='series2')
GENERAL página 5
Recorte de pantalla realizado: 15/08/2022 17:21
GENERAL página 6
Recorte de pantalla realizado: 15/08/2022 17:22
GENERAL página 7
Recorte de pantalla realizado: 15/08/2022 17:23
GENERAL página 8
Recorte de pantalla realizado: 15/08/2022 17:24
GENERAL página 9
Recorte de pantalla realizado: 15/08/2022 17:46
GENERAL página 10