Vamos por la mitad de este Nuevo Curso de Análisis Exploratorio de Datos, y hasta aquí realmente se nota la diferencia con el anterior, que bien que Platzi se renueva constantemente
Es correcto, temé el curso anterior y ahora me estoy actualizando con este.
Muy buen curso!
Aca podemos ver que hay cierto grado de sesgo en cada variable, pero hay que tener en cuenta que estamos analizando las 3 especies en un solo conjunto, es normal que haya este tipo de sesgo.
Pero si analizamos cada variable dividida por especie podemos ver que la distribución empírica se adapta mejor a la distribución teórica
compañero como pudiste hacer tantas graficas ?
psta me refiero a la imagen 2 la 1 la hice haci como la vez?
#como saber si las categorias se destribujen de manera normal
medida=df_penguis.select_dtypes('float64').columnsfig,ax=plt.subplots(1,4,figsize=(15,3))for i ,value inenumerate(medida): stats=df_penguis[value].describe() xs=np.linspace(stats['min'],stats['max']) ys=scipy.stats.norm(stats['mean'],stats['std']).pdf(xs) ax[i].plot(xs,ys,color='purple',linestyle='dashed') #value real
sns.kdeplot( ax=ax[i], data=df_penguis, x=value, color='black')fig.tight_layout()
for i, i_col inenumerate(specie):for j, j_col inenumerate(numeric_columns): stats = i_col[j_col].describe() xs = np.linspace(stats['min'],stats['max']) ys = scipy.stats.norm(stats['mean'], stats['std']).pdf(xs) ax[i][j].plot(xs,ys, color='black',linestyle='--') sns.kdeplot( ax = ax[i][j], data = i_col, x=j_col, hue='species', palette=penguin_color
)
Estadistica Descriptiva Aplicada: Funciones de Probabilidad (PDFs)
Nos ayudan a estimar la probabilidad para valores que no contiene el dataset, fomando una distribucion continua. Tambien son utiles para ver la forma de la distribucion a detalle y hacer comparaciones con la distribucion teorica.
Grafica de la Densidad de probabilidad. Varia el ancho de banda de los picos de la distribucion con el parametro bw_method para obtener mucha mas informacion. Utiliza este parametro para comparar distribuciones
sns.kdeplot( data=preprocessed_penguins_df, x='flipper_length_mm', bw_method=0.2#ancho de banda )
Comparando la distribución de los datos con la teórica utilizando la ECDFs
# Obtenemos los estadisticos de la variablestats = dataFrame.nombre_variable.describe()# generamos los valores aleatorios a partir de los estadisticos de los datos # utilizando el ECDFsxs = np.linspace(stats['min'], stats['max'])#array de valores aleatoriosys = scipy.stats.norm(stats['mean'], stats['std']).cdf(xs)#valores de probabilidad para cada valor# grafica de la distribucion de datos aleatoriosplt.plot(xs, ys, color='black', linestyle='dashed')# grafica de la distribucion de los datos realesempiricaldist.Cdf.from_seq( dataFrame.nombre_variable, normalize=True).plot()
Comparando la distribución de los datos con la teórica utilizando PDFs
# generar valores aleatorios a partir de los estadisticos de los datos# utilizando el PDFsxs = np.linspace(stats['min'], stats['max'])#array de valores aleatoriosys = scipy.stats.norm(stats['mean'], stats['std']).pdf(xs)#valores de probabilidad para cada valor# grafica de la distribucion de datos aleatoriosplt.plot(xs, ys, color='black', linestyle='dashed')# empiricaldist no incluye esta funcion por lo que utilizamos seabornsns.kdeplot( data=dataFrame, x='nombre_variable')
Muy buen apunte, tendrías que subirlo a un tutorial del curso; no hay ninguno.
Esta super bien el curso, solo tengo una corrección. En realidad al analizar la pdf la distribución esta sesgada a la derecha y no a la izquierda (si es izquierda o derecha depende de que lado la cola de la distribución es más pesada). Esta super bueno el curso de análisis exploratorio de datos 10/10.
Cuando se trabaja con distribuciones continuas (pdf) no tiene mucho sentido hablar de una moda, creo que a lo que te refieres es a la mediana. Completamente de acuerdo con lo demás de tu comentario.
Si hay interpretacion para la moda en datos continuos (de hecho la generalizacion de los estadisticos en datos continuos y tienen su caso particular en datos discretos), primero depende del tamaño de bins y luego hay formulas y lo demas si te interesa( tambien pandas te calcula esto como calcula los demas estadisticos), que te dice cual seria la moda y tu ya la colocas en el interbalo que corresponde.
Muy bueno este curso, facil de seguir y entender 💯
Que tus datos no sigan una distribución normal significa que no se distribuyen de la manera clásica en forma de campana (bell curve). Esto puede implicar que tus datos son asimétricos, tienen múltiples picos (multimodales) o presentan colas más largas (distribución leptocúrtica o platicúrtica). En el análisis exploratorio, es crucial identificar esto, ya que muchos métodos estadísticos, como la prueba t o ANOVA, asumen normalidad. Si los datos no son normales, podrías necesitar aplicar transformaciones o utilizar métodos estadísticos no paramétricos.
Excelente aporte!
este curso está tan denso como las funciones de densidad de probabilidad XD
14. Estadística descriptiva aplicada: funciones de densidad de probabilidad
Para el que le pueda servir
La función plot_kde_for_numeric_variables genera gráficos de densidad de probabilidad kernel (KDE) por especie para las columnas numéricas en un DataFrame. Itera sobre cada especie y columna para generar los gráficos correspondientes. También se traza una distribución normal con línea punteada para representar la distribución teórica basada en las estadísticas de cada columna y especie. Los gráficos se organizan en una o varias filas, y cada gráfico tiene etiquetas de ejes y títulos correspondientes. Finalmente, los gráficos se muestran mediante plt.show().
defplot_kde_for_numeric_variables(dataframe):# Funcion para graficar la funcion de densidad de probabilidad por especie numeric_columns = dataframe.select_dtypes(include=np.number).columns # Obtiene las columnas numéricas del DataFrame num_plots =len(numeric_columns)# Cantidad de gráficos a generar según las columnas numéricas species = dataframe['species'].unique()# Especies únicas presentes en la columna "species" num_species =len(species)# Cantidad de especies presentes fig, axes = plt.subplots(num_species, num_plots, figsize=(15,5*num_species))# Crea una figura y subfiguras para los gráficosfor i, specie inenumerate(species):# Itera sobre cada especie specie_data = dataframe[dataframe['species']== specie]# Filtra los datos para la especie actualfor j, column inenumerate(numeric_columns):# Itera sobre cada columna numérica ax = axes[i, j]if num_species >1else axes[j]# Obtiene los ejes correspondientes a la subfigura actual stats ={'min': specie_data[column].min(),# Mínimo de la columna actual y especie actual'max': specie_data[column].max(),# Máximo de la columna actual y especie actual'mean': specie_data[column].mean(),# Media de la columna actual y especie actual'std': specie_data[column].std()# Desviación estándar de la columna actual y especie actual} xs = np.linspace(stats['min'], stats['max'], num=100)# Valores para el eje x (espaciados uniformemente) ys = scipy.stats.norm(stats['mean'], stats['std']).pdf(xs)# Valores de densidad de probabilidad para el eje y ax.plot(xs, ys, color='gray', linestyle='dashed')# Traza la distribución normal en los ejes sns.kdeplot(data=specie_data, x=column, ax=ax)# Traza el gráfico de densidad de probabilidad kernel (KDE) ax.set_xlabel(column)# Etiqueta del eje x ax.set_ylabel('Density')# Etiqueta del eje y ax.set_title('KDE Plot for '+ column +' ('+ specie +')')# Título de la subfigura plt.tight_layout()# Ajusta los espacios entre subfiguras plt.show()# Muestra los gráficos
En 9:40, el profe menciona que la gráfica está sesgada a la izquierda, cuando el término correcto es que es asimétrico hacia la derecha, pues su lado derecho se extiende mucho más lejos que el izquierdo.
bw_method es el ancho de banda utilizado para el KDE, que controla la suavidad del gráfico. Un valor bajo indica una curva más suave, mientras que un valor alto indica una curva más irregular. En este caso, se utiliza un valor de 0.1.
mi aporte de la grafica de dispersión normal para las otras 3 variables
medida=df_penguis.select_dtypes('float64').columnsfig,ax=plt.subplots(1,4,figsize=(15,3))for i ,value inenumerate(medida): stats=df_penguis[value].describe() xs=np.linspace(stats['min'],stats['max']) ys=scipy.stats.norm(stats['mean'],stats['std']).pdf(xs) ax[i].plot(xs,ys,color='purple',linestyle='dashed') #value real
sns.kdeplot( ax=ax[i], data=df_penguis, x=value, color='black')fig.tight_layout()
El bill_length_mm tampoco sigue una distribución normal:
Aunque si agrupamos por especie de entonces sucede esto:
(para probar con diferentes especies solamente cambiar la variable ++specie ++, colocar la especie de interes: Adelie, Gentoo o Chinstrap.
Quizá el Gentoo es el que sigue una distribución mas normal.
Scipy es una libreria de python que incluye muchas herramientas cientificas, su nombre viene de science - python --> scipy
Dentro de la libreria scipy, hay libreria dedicada a herramientas estadisticas, la cual es stats
la función norm() nos crea una objeto que contiene la información y los datos de una distribución estandar, la forma en que esta puesto en el curso, es una distrubución estandar con promedio = stats['mean'] y con desviación estandar = stats['std].
Para mas información de esa función haz click aqui
# Filtrosadelie_df = dfnn.query("species == 'Adelie'")gentoo_df = dfnn.query("species == 'Gentoo'")chinstrap_df = dfnn.query("species == 'Chinstrap'")species =[adelie_df, gentoo_df, chinstrap_df]numeric_columns = dfnn.select_dtypes(include=np.number).columnsfig, ax = plt.subplots(3,4, figsize=(30,20))for i, species_df inenumerate(species):for j, numeric_column inenumerate(numeric_columns): # Calcula estadísticas descriptivas
stats = species_df[numeric_column].describe() # Genera datos para la distribución normal
xs = np.linspace(stats['min'], stats['max'],1000) ys = scipy.stats.norm(stats['mean'], stats['std']).cdf(xs) # Grafica la distribución normal
ax[i][j].plot(xs, ys, color='black', linestyle='--', label='Distribución Normal') # Grafica la distribución empírica
empiricaldist.Cdf.from_seq( dfnn[numeric_column], normalize=True).plot(ax=ax[i][j], label='Distribución Empírica') ax[i][j].set_title(f'{numeric_column} - {species_df["species"].iloc[0]}') ax[i][j].legend()plt.tight_layout()plt.show()
cuándo se tienen muchas columnas, ejemplo 60, ¿es recomendable hacer este análisis para todas (numéricas) o existe un método más eficiente?
Tengo una duda, si vemos que efectivamente la distribución no se ajusta a una normal, entonces no sería conveniente utilizar la función de probabilidad normal, cdf por ejemplo?
No es conveniente representarla con una distribución normal, en el curso de probabilidad anterior mostraron otros métodos para casos más irregulares. En este caso en especial se tiene que ser más profundo en notar que se deben separar por especies. El profesor esta exponiendo un experimento, ha comparado y ha llegado a la conclusión de que el pdf y cdf no se ajustan a su datos.
Hola tengo una pregunta,
En el momento que deseo calcular los estadísticos de una base de datos mías, me sale este error:
Mi base de datos es esta:
Alguien sabe ¿Cuál es el error?
En general, genial el curso!, de los mejores profesionales que eh visto.
En la seccion de distribuciones de probabilidad se usa una PMF para una variable continua ('pmf_flipper_length_mm'), no deberia utilizarse una variable discreta como 'species' o 'sex'??, hago esta pregunta porque flaqueo de estadistica y probabilidad y esto me genero dudas..