ESTADISTISCA DESCRIPTIVA

ESTADISTICA DESCRIPTIVA CON R Y PYTHON PARTE 1

Autor/a
Afiliación

Jaime Isaac

UES

EJERCICIOS DISTRIBUCIONES DE PROBABILIDAD

Ejercicio 1.- El 30% de un determinado pueblo ve un concurso que hay en televisión. Desde el concurso se llama por teléfono a 10 personas del pueblo elegidas al azar. Calcular la probabilidad de que, entre las 10 personas, estuvieran viendo el programa: a) Más de ocho personas b) Algunas de las diez personas c) Calcular la media y desviación típica

# Parámetros
n <- 10   # número de ensayos
p <- 0.30 # probabilidad de éxito

# a) Probabilidad de que más de 8 personas estén viendo el programa
P_mas_de_ocho <- 1 - pbinom(8, size = n, prob = p)
P_mas_de_ocho
[1] 0.0001436859
# b) Probabilidad de que algunas de las diez personas estén viendo el programa
P_al_menos_una <- 1 - dbinom(0, size = n, prob = p)
P_al_menos_una
[1] 0.9717525
# c) Calcular la media y la desviación típica
media <- n * p
desviacion <- sqrt(n * p * (1 - p))

media
[1] 3
desviacion
[1] 1.449138
import scipy.stats as stats
import numpy as np

# Parámetros
n = 10    # número de ensayos
p = 0.30  # probabilidad de éxito

# a) Probabilidad de que más de 8 personas estén viendo el programa
P_mas_de_ocho = 1 - stats.binom.cdf(8, n, p)
print("Probabilidad de más de 8 personas:", P_mas_de_ocho)
Probabilidad de más de 8 personas: 0.00014368590000002346
# b) Probabilidad de que algunas de las diez personas estén viendo el programa
P_al_menos_una = 1 - stats.binom.pmf(0, n, p)
print("Probabilidad de al menos 1 persona:", P_al_menos_una)
Probabilidad de al menos 1 persona: 0.9717524751000001
# c) Calcular la media y la desviación típica
media = n * p
desviacion = np.sqrt(n * p * (1 - p))

print("Media:", media)
Media: 3.0
print("Desviación típica:", desviacion)
Desviación típica: 1.4491376746189437

Ejercicio 2.- El jefe de recursos humanos de una empresa realiza un test de diez ítems a los aspirantes a un puesto, teniendo en cada ítems cuatro posibles respuestas, de las que sólo una es correcta. Suponiendo que los aspirantes teniendo la misma probabilidad de responder. Se pide hallar las probabilidades para el aspirante: a) Conteste todos los ítems mal b) Conteste al menos cuatro ítems bien c) Conteste entre cuatro y seis ítems bien d) Conteste todos los ítems bien e) Conteste menos de tres ítems bien.

estadistica descriptiva en R y Python.

ESTADISTICA

Ejercicio. Se dispone de una muestra de 10 personas para las que se han medido las variables: - EDAD (en años) - SEXO (codificada como 0: “Hombre”; 1:“Mujer”) - NIVEL DE ESTUDIOS ( 0:“Sin estudios”; 1: “Estudios Primarios”; 2: “Estudios Secundarios”; 3:“Estudios Superiores”)

Los datos se muestran en la tabla siguiente:

\[ \begin{aligned} &\text { edad sexo estudios }\\ &\begin{array}{|r|r|r|} \hline \text{edad} & \text{sexo} & \text{estudios} \\ \hline 18 & 0 & 1 \\ \hline 19 & 1 & 2 \\ \hline & 0 & 0 \\ \hline 18 & 0 & 1 \\ \hline 24 & 1 & 3 \\ \hline 17 & 0 & 2 \\ \hline 22 & 0 & 3 \\ \hline 15 & 1 & 1 \\ \hline 22 & 1 & 2 \\ \hline 25 & 0 & 3 \\ \hline \end{array} \end{aligned} \]

Con estos datos se desea:

  1. Construir tablas de frecuencias unidimensionales para las tres variables.

  2. Construir una tabla de frecuencias cruzadas con las variables ‘sexo’y ’nivel de estudios’.

  3. Construir una tabla de frecuencias de la variable edad agrupada en intervalos.

  4. Calcular media y desviación típica de la variable ‘edad’.

  5. Calcular media y desviación típica de la variable ’edad’según sexo.

  6. Representar gráficamente: el nivel de estudios en un diagrama de sectores, el sexo en un diagrama de barras y la edad en un histograma. Construir también un boxplot de la edad en función del sexo.

# Cargar datos
datos <- data.frame(
  edad = c(18, 19, NA, 18, 24, 17, 22, 15, 22, 25),
  sexo = c(0, 1, 0, 0, 1, 0, 0, 1, 1, 0),
  estudios = c(1, 2, 0, 1, 3, 2, 3, 1, 2, 3)
)
print(datos)
   edad sexo estudios
1    18    0        1
2    19    1        2
3    NA    0        0
4    18    0        1
5    24    1        3
6    17    0        2
7    22    0        3
8    15    1        1
9    22    1        2
10   25    0        3
library(knitr)
Warning: package 'knitr' was built under R version 4.3.3
# 1. Tablas de frecuencias unidimensionales
tabla_edad <- table(datos$edad, useNA = "ifany")
tabla_sexo <- table(datos$sexo)
tabla_estudios <- table(datos$estudios)
kable(tabla_edad)
Var1 Freq
15 1
17 1
18 2
19 1
22 2
24 1
25 1
NA 1
datos[c(1,2),c(1,3)]
  edad estudios
1   18        1
2   19        2
library(knitr)
kable(tabla_edad)
Var1 Freq
15 1
17 1
18 2
19 1
22 2
24 1
25 1
NA 1
kable(tabla_sexo)
Var1 Freq
0 6
1 4
kable(tabla_estudios)
Var1 Freq
0 1
1 3
2 3
3 3
# 2. Tabla de frecuencias cruzadas entre 'sexo' y 'nivel de estudios'
tabla_cruzada <- table(datos$sexo, datos$estudios)
tabla_cruzada
   
    0 1 2 3
  0 1 2 1 2
  1 0 1 2 1
# 3. Tabla de frecuencias de la variable edad agrupada en intervalos
intervalos_edad <- cut(datos$edad, breaks = c(15, 18, 21, 24, 27), right = FALSE)
tabla_intervalos_edad <- table(intervalos_edad)
tabla_intervalos_edad
intervalos_edad
[15,18) [18,21) [21,24) [24,27) 
      2       3       2       2 
# 4. Media y desviación típica de la variable 'edad'
media_edad <- mean(datos$edad, na.rm = TRUE)
desviacion_edad <- sd(datos$edad, na.rm = TRUE)

media_edad
[1] 20
desviacion_edad
[1] 3.391165
# 5. Media y desviación típica de la variable 'edad' según sexo
media_edad_sexo <- tapply(datos$edad, datos$sexo, mean, na.rm = TRUE)
desviacion_edad_sexo <- tapply(datos$edad, datos$sexo, sd, na.rm = TRUE)

media_edad_sexo
 0  1 
20 20 
desviacion_edad_sexo
       0        1 
3.391165 3.915780 
# 6. Gráficos
# a) Diagrama de sectores del nivel de estudios
pie(table(datos$estudios), main = "Nivel de estudios")

# b) Diagrama de barras del sexo
barplot(table(datos$sexo), main = "Sexo", col = "lightblue", names.arg = c("Hombre", "Mujer"))

# Crear el diagrama de barras
frecuencias_sexo <- table(datos$sexo)
barplot_sexo <- barplot(frecuencias_sexo, main = "Sexo", col = "lightblue", names.arg = c("Hombre", "Mujer"))

# Añadir las frecuencias encima de cada barra
text(barplot_sexo, frecuencias_sexo-1, labels = frecuencias_sexo, cex = 1)

# c) Histograma de la edad
hist(datos$edad, main = "Histograma de la edad", col = "lightgreen", xlab = "Edad", breaks = 5)

# d) Boxplot de la edad en función del sexo
boxplot(edad ~ sexo, data = datos, main = "Boxplot de la edad según el sexo", names = c("Hombres", "Mujeres"), col = "lightcoral")

OTRA SOLUCION EN R

edad=c(18,19,NA,18,24,17,22,15,22,25)
sexo=c(0,1,0,0,1,0,0,1,1,0)
estudios=c(1,2,0,1,3,2,3,1,2,3)
sexo=factor(sexo, levels=c(0,1),labels=c("Hombre","Mujer"))
estudios=factor(estudios, levels=c(0,1,2,3),labels=c("Sin estudios","Estudios Primarios",
                               "Estudios Secundarios","Estudios Superiores"))
table(edad)
edad
15 17 18 19 22 24 25 
 1  1  2  1  2  1  1 
prop.table(table(edad))
edad
       15        17        18        19        22        24        25 
0.1111111 0.1111111 0.2222222 0.1111111 0.2222222 0.1111111 0.1111111 
table(edad,useNA="ifany")
edad
  15   17   18   19   22   24   25 <NA> 
   1    1    2    1    2    1    1    1 
# Tabla de frecuencias para la variable "sexo"
tabla_sexo <- table(sexo)
print(tabla_sexo)
sexo
Hombre  Mujer 
     6      4 
# Tabla de frecuencias para la variable "nivel de estudios"
tabla_estudios <- table(estudios)
print(kable(tabla_estudios))


|estudios             | Freq|
|:--------------------|----:|
|Sin estudios         |    1|
|Estudios Primarios   |    3|
|Estudios Secundarios |    3|
|Estudios Superiores  |    3|
# Tabla cruzada de frecuencias entre "sexo" y "nivel de estudios"
tabla_cruzada <- table(sexo, estudios)
print(kable(tabla_cruzada))


|       | Sin estudios| Estudios Primarios| Estudios Secundarios| Estudios Superiores|
|:------|------------:|------------------:|--------------------:|-------------------:|
|Hombre |            1|                  2|                    1|                   2|
|Mujer  |            0|                  1|                    2|                   1|
  1. Construir una tabla de frecuencias cruzadas con las variables anteriores. Las tablas de frecuencias cruzadas se construyen también con las funciones table() y prop.table(table()), especificando ahora las dos variables a cruzar. Para las frecuencias relativas, en prop.table() incluimos un 1 si las queremos por filas, un 2 si por columnas, o nada si queremos las frecuencias relativas globales:
table(estudios,sexo)
                      sexo
estudios               Hombre Mujer
  Sin estudios              1     0
  Estudios Primarios        2     1
  Estudios Secundarios      1     2
  Estudios Superiores       2     1
prop.table(table(estudios,sexo))
                      sexo
estudios               Hombre Mujer
  Sin estudios            0.1   0.0
  Estudios Primarios      0.2   0.1
  Estudios Secundarios    0.1   0.2
  Estudios Superiores     0.2   0.1
prop.table(table(estudios,sexo),1)
                      sexo
estudios                  Hombre     Mujer
  Sin estudios         1.0000000 0.0000000
  Estudios Primarios   0.6666667 0.3333333
  Estudios Secundarios 0.3333333 0.6666667
  Estudios Superiores  0.6666667 0.3333333
prop.table(table(estudios,sexo),2)
                      sexo
estudios                  Hombre     Mujer
  Sin estudios         0.1666667 0.0000000
  Estudios Primarios   0.3333333 0.2500000
  Estudios Secundarios 0.1666667 0.5000000
  Estudios Superiores  0.3333333 0.2500000

Tabla de frecuencias de una variable continua agrupada en intervalos.

range(edad,na.rm=TRUE)  # incluimos na.rm=TRUE para que ignore la presencia de valores perdidos
[1] 15 25

nos indica que los valores de edad se sitúan en el rango de 15 a 25 años. Para construir los intervalos de edad podemos utilizar la regla de Sturges, que nos proporciona un número adecuado de intervalos en función del rango de los datos (ver help(nclass.Sturges); de modo alternativo podría utilizarse la regla de Scott o la de Freedman-Diaconis). Una vez que hemos decidido el número de intervalos, generamos una secuencia de valores con los límites de cada intervalo y utilizamos la función cut() para que nos construya una nueva variable que recodifica la edad en dichos intervalos:

nclass.Sturges(edad)  # Número de intervalos
[1] 5
seq(15,25,length=nclass.Sturges(edad))  # Límites de los intervalos
[1] 15.0 17.5 20.0 22.5 25.0
# Construcción de los intervalos mediante la función cut():
intervalosEdad=cut(edad,breaks=seq(15,25,length=nclass.Sturges(edad)),include.lowest=TRUE)
intervalosEdad # Se muestran los intervalos de edad, uno correspondiente a cada edad observada
 [1] (17.5,20] (17.5,20] <NA>      (17.5,20] (22.5,25] [15,17.5] (20,22.5]
 [8] [15,17.5] (20,22.5] (22.5,25]
Levels: [15,17.5] (17.5,20] (20,22.5] (22.5,25]
table(intervalosEdad)
intervalosEdad
[15,17.5] (17.5,20] (20,22.5] (22.5,25] 
        2         3         2         2 
library(agricolae)
Warning: package 'agricolae' was built under R version 4.3.3
tbFreqEdad=table.freq(hist(edad,plot=FALSE))
tbFreqEdad
  Lower Upper Main Frequency Percentage CF   CPF
1    14    16   15         1       11.1  1  11.1
2    16    18   17         3       33.3  4  44.4
3    18    20   19         1       11.1  5  55.6
4    20    22   21         2       22.2  7  77.8
5    22    24   23         1       11.1  8  88.9
6    24    26   25         1       11.1  9 100.0

Estadísticos descriptivos

4. Calcular media y desviación típica de la variable ‘edad’.

Las funciones disponibles en R para calcular estos estadísticos descriptivos son, respectivamente, mean(nombre_de_variable) y sd(nombre_de_variable):

mean(edad,na.rm = TRUE)
[1] 20
sd(edad,na.rm = TRUE)
[1] 3.391165
summary(edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
     15      18      19      20      22      25       1 
summary(estudios)
        Sin estudios   Estudios Primarios Estudios Secundarios 
                   1                    3                    3 
 Estudios Superiores 
                   3 
summary(sexo)
Hombre  Mujer 
     6      4 
misDatos=data.frame(edad,estudios,sexo)
summary(misDatos)
      edad                    estudios     sexo  
 Min.   :15   Sin estudios        :1   Hombre:6  
 1st Qu.:18   Estudios Primarios  :3   Mujer :4  
 Median :19   Estudios Secundarios:3             
 Mean   :20   Estudios Superiores :3             
 3rd Qu.:22                                      
 Max.   :25                                      
 NA's   :1                                       
aggregate(edad,by=list(sexo),mean,na.rm=TRUE)
  Group.1  x
1  Hombre 20
2   Mujer 20
pie(table(estudios))

barplot(table(sexo))

hist(edad)

boxplot(edad~sexo)

AHORA EN PYTHON

import pandas as pd

# Definir los datos
edad = [18, 19, None, 18, 24, 17, 22, 15, 22, 25]
sexo = [0, 1, 0, 0, 1, 0, 0, 1, 1, 0]
estudios = [1, 2, 0, 1, 3, 2, 3, 1, 2, 3]

# Crear un DataFrame con los datos
datos = pd.DataFrame({
    'edad': edad,
    'sexo': sexo,
    'estudios': estudios
})

# Mostrar el DataFrame
print(datos)
   edad  sexo  estudios
0  18.0     0         1
1  19.0     1         2
2   NaN     0         0
3  18.0     0         1
4  24.0     1         3
5  17.0     0         2
6  22.0     0         3
7  15.0     1         1
8  22.0     1         2
9  25.0     0         3
# Convertir 'sexo' en categórico con etiquetas
datos['sexo'] = pd.Categorical(datos['sexo'], categories=[0, 1], ordered=False)
datos['sexo'].cat.categories = ["Hombre", "Mujer"]

# Convertir 'estudios' en categórico con etiquetas
datos['estudios'] = pd.Categorical(datos['estudios'], categories=[0, 1, 2, 3], ordered=False)
datos['estudios'].cat.categories = ["Sin estudios", "Estudios Primarios", "Estudios Secundarios", "Estudios Superiores"]

# Mostrar el DataFrame con las etiquetas
print(datos)
   edad    sexo              estudios
0  18.0  Hombre    Estudios Primarios
1  19.0   Mujer  Estudios Secundarios
2   NaN  Hombre          Sin estudios
3  18.0  Hombre    Estudios Primarios
4  24.0   Mujer   Estudios Superiores
5  17.0  Hombre  Estudios Secundarios
6  22.0  Hombre   Estudios Superiores
7  15.0   Mujer    Estudios Primarios
8  22.0   Mujer  Estudios Secundarios
9  25.0  Hombre   Estudios Superiores

Tablas de frecuencias unidimensionales

1. Construir una tablas de frecuencias unidimensionales para las variables ‘sexo’ y ‘nivel de estudios’.

# Generar la tabla de frecuencias
tabla_edad = datos['edad'].value_counts(dropna=False)

# Mostrar la tabla de frecuencias
print(tabla_edad)
18.0    2
22.0    2
19.0    1
NaN     1
24.0    1
17.0    1
15.0    1
25.0    1
Name: edad, dtype: int64
# Generar la tabla de frecuencias relativas
tabla_edad_relativa = datos['edad'].value_counts(normalize=True, dropna=False)

# Mostrar la tabla de frecuencias relativas
print(tabla_edad_relativa)
18.0    0.2
22.0    0.2
19.0    0.1
NaN     0.1
24.0    0.1
17.0    0.1
15.0    0.1
25.0    0.1
Name: edad, dtype: float64
# Generar la tabla de frecuencias relativas y convertir a DataFrame
tabla_edad_relativa = datos['edad'].value_counts(normalize=True, dropna=False).reset_index()

# Renombrar las columnas
tabla_edad_relativa.columns = ['edad', 'frecuencia relativa']

# Mostrar la tabla con los encabezados
print(tabla_edad_relativa)
   edad  frecuencia relativa
0  18.0                  0.2
1  22.0                  0.2
2  19.0                  0.1
3   NaN                  0.1
4  24.0                  0.1
5  17.0                  0.1
6  15.0                  0.1
7  25.0                  0.1
import pandas as pd
# Generar la tabla cruzada entre 'estudios' y 'sexo'
tabla_cruzada = pd.crosstab(datos['estudios'], datos['sexo'])

# Mostrar la tabla cruzada
print(tabla_cruzada)
sexo                  Hombre  Mujer
estudios                           
Sin estudios               1      0
Estudios Primarios         2      1
Estudios Secundarios       1      2
Estudios Superiores        2      1
# Generar la tabla cruzada de frecuencias relativas
tabla_cruzada_relativa = pd.crosstab(datos['estudios'], datos['sexo'], normalize=True)

# Mostrar la tabla cruzada de proporciones
print(tabla_cruzada_relativa)
sexo                  Hombre  Mujer
estudios                           
Sin estudios             0.1    0.0
Estudios Primarios       0.2    0.1
Estudios Secundarios     0.1    0.2
Estudios Superiores      0.2    0.1
# Generar la tabla cruzada de frecuencias relativas por filas (proporciones por fila)
tabla_cruzada_relativa_filas = pd.crosstab(datos['estudios'], datos['sexo'], normalize='index')

# Mostrar la tabla cruzada de proporciones por filas
print(tabla_cruzada_relativa_filas)
sexo                    Hombre     Mujer
estudios                                
Sin estudios          1.000000  0.000000
Estudios Primarios    0.666667  0.333333
Estudios Secundarios  0.333333  0.666667
Estudios Superiores   0.666667  0.333333
# Generar la tabla cruzada de frecuencias relativas por columnas (proporciones por columna)
tabla_cruzada_relativa_columnas = pd.crosstab(datos['estudios'], datos['sexo'], normalize='columns')

# Mostrar la tabla cruzada de proporciones por columnas
print(tabla_cruzada_relativa_columnas)
sexo                    Hombre  Mujer
estudios                             
Sin estudios          0.166667   0.00
Estudios Primarios    0.333333   0.25
Estudios Secundarios  0.166667   0.50
Estudios Superiores   0.333333   0.25
# Calcular el rango ignorando los valores NaN
rango = datos['edad'].max() - datos['edad'].min()

# Mostrar el rango
print("Rango de la variable edad (ignorando NaN):", rango)
Rango de la variable edad (ignorando NaN): 10.0
import math
# Calcular el número de intervalos utilizando la regla de Sturges
n = datos['edad'].count()  # Contar solo los valores no nulos (ignora NaN)
num_intervalos = math.ceil(1 + math.log2(n))

# Mostrar el número de intervalos
print("Número de intervalos según la regla de Sturges:", num_intervalos)
Número de intervalos según la regla de Sturges: 5
# Generar los límites de los intervalos entre 15 y 25
limites_intervalos = np.linspace(15, 25, num=num_intervalos)

# Mostrar los límites de los intervalos
print("Límites de los intervalos:", limites_intervalos)
Límites de los intervalos: [15.  17.5 20.  22.5 25. ]
import pandas as pd
import numpy as np
# Clasificar la variable 'edad' en intervalos utilizando pd.cut()
intervalos_edad = pd.cut(datos['edad'], bins=limites_intervalos, include_lowest=True)

# Mostrar los intervalos de edad correspondientes a cada observación
print(intervalos_edad)
0      (17.5, 20.0]
1      (17.5, 20.0]
2               NaN
3      (17.5, 20.0]
4      (22.5, 25.0]
5    (14.999, 17.5]
6      (20.0, 22.5]
7    (14.999, 17.5]
8      (20.0, 22.5]
9      (22.5, 25.0]
Name: edad, dtype: category
Categories (4, interval[float64, right]): [(14.999, 17.5] < (17.5, 20.0] < (20.0, 22.5] <
                                           (22.5, 25.0]]
# Generar la tabla de frecuencias de los intervalos
tabla_frecuencias = intervalos_edad.value_counts(sort=False)

# Mostrar la tabla de frecuencias
print(tabla_frecuencias)
(14.999, 17.5]    2
(17.5, 20.0]      3
(20.0, 22.5]      2
(22.5, 25.0]      2
Name: edad, dtype: int64
# Generar la tabla de frecuencias de los intervalos y convertirla en un DataFrame
tabla_frecuencias = intervalos_edad.value_counts(sort=False).reset_index()

# Renombrar las columnas
tabla_frecuencias.columns = ['intervalos', 'frecuencia']

# Mostrar la tabla con encabezados
print(tabla_frecuencias)
       intervalos  frecuencia
0  (14.999, 17.5]           2
1    (17.5, 20.0]           3
2    (20.0, 22.5]           2
3    (22.5, 25.0]           2
# Eliminar los valores NaN para el histograma
edad_limpia = [e for e in datos['edad'] if not np.isnan(e)]

# Crear el histograma (sin graficarlo)
conteo, bins = np.histogram(edad_limpia)

# Crear un DataFrame con los límites de los intervalos y las frecuencias
tb_freq_edad = pd.DataFrame({
    'intervalo': pd.IntervalIndex.from_breaks(bins),
    'frecuencia': conteo
})

# Mostrar la tabla de frecuencias
print(tb_freq_edad)
      intervalo  frecuencia
0  (15.0, 16.0]           1
1  (16.0, 17.0]           0
2  (17.0, 18.0]           1
3  (18.0, 19.0]           2
4  (19.0, 20.0]           1
5  (20.0, 21.0]           0
6  (21.0, 22.0]           0
7  (22.0, 23.0]           2
8  (23.0, 24.0]           0
9  (24.0, 25.0]           2
# Eliminar los valores NaN para el histograma
edad_limpia = [e for e in datos['edad'] if not np.isnan(e)]

# Crear el histograma (sin graficarlo)
conteo, bins = np.histogram(edad_limpia)

# Calcular los puntos medios de los intervalos
puntos_medios = [(bins[i] + bins[i+1]) / 2 for i in range(len(bins) - 1)]

# Calcular las frecuencias acumuladas
frecuencia_acumulada = np.cumsum(conteo)

# Calcular las frecuencias relativas
frecuencia_relativa = conteo / sum(conteo)

# Calcular las frecuencias porcentuales
frecuencia_porcentual = frecuencia_relativa * 100

# Crear un DataFrame con toda la información
tb_freq_edad = pd.DataFrame({
    'intervalo': pd.IntervalIndex.from_breaks(bins),
    'punto_medio': puntos_medios,
    'frecuencia': conteo,
    'frecuencia_acumulada': frecuencia_acumulada,
    'frecuencia_relativa': frecuencia_relativa,
    'frecuencia_porcentual': frecuencia_porcentual
})

# Mostrar la tabla
print(tb_freq_edad)
      intervalo  punto_medio  ...  frecuencia_relativa  frecuencia_porcentual
0  (15.0, 16.0]         15.5  ...             0.111111              11.111111
1  (16.0, 17.0]         16.5  ...             0.000000               0.000000
2  (17.0, 18.0]         17.5  ...             0.111111              11.111111
3  (18.0, 19.0]         18.5  ...             0.222222              22.222222
4  (19.0, 20.0]         19.5  ...             0.111111              11.111111
5  (20.0, 21.0]         20.5  ...             0.000000               0.000000
6  (21.0, 22.0]         21.5  ...             0.000000               0.000000
7  (22.0, 23.0]         22.5  ...             0.222222              22.222222
8  (23.0, 24.0]         23.5  ...             0.000000               0.000000
9  (24.0, 25.0]         24.5  ...             0.222222              22.222222

[10 rows x 6 columns]
import pandas as pd
import numpy as np

# Asegurarse de que todas las columnas y filas se impriman sin truncar
pd.set_option('display.max_columns', None)  # Mostrar todas las columnas
pd.set_option('display.max_rows', None)     # Mostrar todas las filas

# Eliminar los valores NaN para el histograma
edad_limpia = [e for e in datos['edad'] if not np.isnan(e)]

# Crear el histograma (sin graficarlo)
conteo, bins = np.histogram(edad_limpia)

# Calcular los puntos medios de los intervalos
puntos_medios = [(bins[i] + bins[i+1]) / 2 for i in range(len(bins) - 1)]

# Calcular las frecuencias acumuladas
frecuencia_acumulada = np.cumsum(conteo)

# Calcular las frecuencias relativas
frecuencia_relativa = conteo / sum(conteo)

# Calcular las frecuencias porcentuales
frecuencia_porcentual = frecuencia_relativa * 100

# Crear un DataFrame con toda la información
tb_freq_edad = pd.DataFrame({
    'intervalo': pd.IntervalIndex.from_breaks(bins),
    'punto_medio': puntos_medios,
    'frecuencia': conteo,
    'frecuencia_acumulada': frecuencia_acumulada,
    'frecuencia_relativa': frecuencia_relativa,
    'frecuencia_porcentual': frecuencia_porcentual
})

# Mostrar la tabla
print(tb_freq_edad)
      intervalo  punto_medio  frecuencia  frecuencia_acumulada  \
0  (15.0, 16.0]         15.5           1                     1   
1  (16.0, 17.0]         16.5           0                     1   
2  (17.0, 18.0]         17.5           1                     2   
3  (18.0, 19.0]         18.5           2                     4   
4  (19.0, 20.0]         19.5           1                     5   
5  (20.0, 21.0]         20.5           0                     5   
6  (21.0, 22.0]         21.5           0                     5   
7  (22.0, 23.0]         22.5           2                     7   
8  (23.0, 24.0]         23.5           0                     7   
9  (24.0, 25.0]         24.5           2                     9   

   frecuencia_relativa  frecuencia_porcentual  
0             0.111111              11.111111  
1             0.000000               0.000000  
2             0.111111              11.111111  
3             0.222222              22.222222  
4             0.111111              11.111111  
5             0.000000               0.000000  
6             0.000000               0.000000  
7             0.222222              22.222222  
8             0.000000               0.000000  
9             0.222222              22.222222  
media=datos['edad'].mean()
media
20.0
datos['edad'].std()
3.391164991562634
datos['edad'].var()
11.5
datos['edad'].describe()
count     9.000000
mean     20.000000
std       3.391165
min      15.000000
25%      18.000000
50%      19.000000
75%      22.000000
max      25.000000
Name: edad, dtype: float64
datos['estudios'].value_counts()
Estudios Primarios      3
Estudios Secundarios    3
Estudios Superiores     3
Sin estudios            1
Name: estudios, dtype: int64
datos['sexo'].value_counts()
Hombre    6
Mujer     4
Name: sexo, dtype: int64
# Calcular la media de la variable 'edad' agrupada por 'sexo'
media_edad_por_sexo = datos.groupby('sexo')['edad'].mean()

# Mostrar el resultado
print(media_edad_por_sexo)
sexo
Hombre    20.0
Mujer     20.0
Name: edad, dtype: float64
import matplotlib.pyplot as plt
# Generar la tabla de frecuencias
frecuencias_estudios = datos['estudios'].value_counts()

# Crear el gráfico de sectores
plt.pie(frecuencias_estudios, labels=frecuencias_estudios.index, autopct='%1.1f%%', startangle=90)
([<matplotlib.patches.Wedge object at 0x0000013C0EEA6CD0>, <matplotlib.patches.Wedge object at 0x0000013C0EEBC430>, <matplotlib.patches.Wedge object at 0x0000013C0EEBCB50>, <matplotlib.patches.Wedge object at 0x0000013C0EECA2B0>], [Text(-0.8899187180267095, 0.6465637441936395, 'Estudios Primarios'), Text(-0.3399185762739153, -1.046162206115244, 'Estudios Secundarios'), Text(1.0999999999999808, 2.0597886516129914e-07, 'Estudios Superiores'), Text(0.33991845383794406, 1.0461622458970796, 'Sin estudios')], [Text(-0.48541020983275057, 0.3526711331965306, '30.0%'), Text(-0.1854101325130447, -0.5706339306083149, '30.0%'), Text(0.5999999999999894, 1.1235210826979952e-07, '30.0%'), Text(0.18541006572978763, 0.5706339523074979, '10.0%')])
# Título del gráfico
plt.title('Distribución de Estudios')
plt.show()

# Generar la tabla de frecuencias
frecuencias_sexo = datos['sexo'].value_counts()

# Crear el diagrama de barras
plt.bar(frecuencias_sexo.index, frecuencias_sexo, tick_label=['Hombre', 'Mujer'], color='lightblue')

# Título del gráfico
plt.title('Distribución por Sexo')

# Etiquetas de los ejes
plt.xlabel('Sexo')
plt.ylabel('Frecuencia')

# Mostrar el gráfico
plt.show()

# Crear el histograma
plt.hist(datos['edad'], bins='auto', color='lightblue', edgecolor='black')

# Título del gráfico
plt.title('Histograma de la variable Edad')

# Etiquetas de los ejes
plt.xlabel('Edad')
plt.ylabel('Frecuencia')

# Mostrar el gráfico
plt.show()

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

# Definir los datos de las variables edad y sexo
datos = pd.DataFrame({
    'edad': [18, 19, None, 18, 24, 17, 22, 15, 22, 25],
    'sexo': [0, 1, 0, 0, 1, 0, 0, 1, 1, 0]
})

# Crear el diagrama de caja (boxplot) de edad agrupado por sexo
sns.boxplot(x='sexo', y='edad', data=datos)

# Añadir etiquetas a los ejes y un título
plt.xticks([0, 1], ['Hombre', 'Mujer'])
([<matplotlib.axis.XTick object at 0x0000013C0F114A90>, <matplotlib.axis.XTick object at 0x0000013C0F114B50>], [Text(0, 0, 'Hombre'), Text(1, 0, 'Mujer')])
plt.xlabel('Sexo')
plt.ylabel('Edad')
plt.title('Boxplot de Edad según Sexo')

# Mostrar el gráfico
plt.show()

# Crear el diagrama de caja (boxplot) de edad agrupado por sexo
sns.boxplot(x='sexo', y='edad', data=datos)

# Añadir etiquetas a los ejes y un título
plt.xticks([0, 1], ['Hombre', 'Mujer'])
([<matplotlib.axis.XTick object at 0x0000013C101D99A0>, <matplotlib.axis.XTick object at 0x0000013C101D9970>], [Text(0, 0, 'Hombre'), Text(1, 0, 'Mujer')])
plt.xlabel('Sexo')
plt.ylabel('Edad')
plt.title('Boxplot de Edad según Sexo')

# Mostrar el gráfico
plt.show()