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ámetrosn <-10# número de ensayosp <-0.30# probabilidad de éxito# a) Probabilidad de que más de 8 personas estén viendo el programaP_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 programaP_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ípicamedia <- n * pdesviacion <-sqrt(n * p * (1- p))media
[1] 3
desviacion
[1] 1.449138
import scipy.stats as statsimport numpy as np# Parámetrosn =10# número de ensayosp =0.30# probabilidad de éxito# a) Probabilidad de que más de 8 personas estén viendo el programaP_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 programaP_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ípicamedia = n * pdesviacion = 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”)
Construir tablas de frecuencias unidimensionales para las tres variables.
Construir una tabla de frecuencias cruzadas con las variables ‘sexo’y ’nivel de estudios’.
Construir una tabla de frecuencias de la variable edad agrupada en intervalos.
Calcular media y desviación típica de la variable ‘edad’.
Calcular media y desviación típica de la variable ’edad’según sexo.
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.
# 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 intervalosintervalos_edad <-cut(datos$edad, breaks =c(15, 18, 21, 24, 27), right =FALSE)tabla_intervalos_edad <-table(intervalos_edad)tabla_intervalos_edad
# 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 sexomedia_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 estudiospie(table(datos$estudios), main ="Nivel de estudios")
# b) Diagrama de barras del sexobarplot(table(datos$sexo), main ="Sexo", col ="lightblue", names.arg =c("Hombre", "Mujer"))
# Crear el diagrama de barrasfrecuencias_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 barratext(barplot_sexo, frecuencias_sexo-1, labels = frecuencias_sexo, cex =1)
# c) Histograma de la edadhist(datos$edad, main ="Histograma de la edad", col ="lightgreen", xlab ="Edad", breaks =5)
# d) Boxplot de la edad en función del sexoboxplot(edad ~ sexo, data = datos, main ="Boxplot de la edad según el sexo", names =c("Hombres", "Mujeres"), col ="lightcoral")
# 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|
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
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 datosedad = [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 datosdatos = pd.DataFrame({'edad': edad,'sexo': sexo,'estudios': estudios})# Mostrar el DataFrameprint(datos)
# Convertir 'sexo' en categórico con etiquetasdatos['sexo'] = pd.Categorical(datos['sexo'], categories=[0, 1], ordered=False)datos['sexo'].cat.categories = ["Hombre", "Mujer"]# Convertir 'estudios' en categórico con etiquetasdatos['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 etiquetasprint(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 frecuenciastabla_edad = datos['edad'].value_counts(dropna=False)# Mostrar la tabla de frecuenciasprint(tabla_edad)
# Generar la tabla de frecuencias relativastabla_edad_relativa = datos['edad'].value_counts(normalize=True, dropna=False)# Mostrar la tabla de frecuencias relativasprint(tabla_edad_relativa)
# Generar la tabla de frecuencias relativas y convertir a DataFrametabla_edad_relativa = datos['edad'].value_counts(normalize=True, dropna=False).reset_index()# Renombrar las columnastabla_edad_relativa.columns = ['edad', 'frecuencia relativa']# Mostrar la tabla con los encabezadosprint(tabla_edad_relativa)
import pandas as pd# Generar la tabla cruzada entre 'estudios' y 'sexo'tabla_cruzada = pd.crosstab(datos['estudios'], datos['sexo'])# Mostrar la tabla cruzadaprint(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 relativastabla_cruzada_relativa = pd.crosstab(datos['estudios'], datos['sexo'], normalize=True)# Mostrar la tabla cruzada de proporcionesprint(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 filasprint(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 columnasprint(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 NaNrango = datos['edad'].max() - datos['edad'].min()# Mostrar el rangoprint("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 Sturgesn = datos['edad'].count() # Contar solo los valores no nulos (ignora NaN)num_intervalos = math.ceil(1+ math.log2(n))# Mostrar el número de intervalosprint("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 25limites_intervalos = np.linspace(15, 25, num=num_intervalos)# Mostrar los límites de los intervalosprint("Límites de los intervalos:", limites_intervalos)
Límites de los intervalos: [15. 17.5 20. 22.5 25. ]
import pandas as pdimport 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ónprint(intervalos_edad)
# Generar la tabla de frecuencias de los intervalostabla_frecuencias = intervalos_edad.value_counts(sort=False)# Mostrar la tabla de frecuenciasprint(tabla_frecuencias)
# Generar la tabla de frecuencias de los intervalos y convertirla en un DataFrametabla_frecuencias = intervalos_edad.value_counts(sort=False).reset_index()# Renombrar las columnastabla_frecuencias.columns = ['intervalos', 'frecuencia']# Mostrar la tabla con encabezadosprint(tabla_frecuencias)
# Eliminar los valores NaN para el histogramaedad_limpia = [e for e in datos['edad'] ifnot 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 frecuenciastb_freq_edad = pd.DataFrame({'intervalo': pd.IntervalIndex.from_breaks(bins),'frecuencia': conteo})# Mostrar la tabla de frecuenciasprint(tb_freq_edad)
# Eliminar los valores NaN para el histogramaedad_limpia = [e for e in datos['edad'] ifnot np.isnan(e)]# Crear el histograma (sin graficarlo)conteo, bins = np.histogram(edad_limpia)# Calcular los puntos medios de los intervalospuntos_medios = [(bins[i] + bins[i+1]) /2for i inrange(len(bins) -1)]# Calcular las frecuencias acumuladasfrecuencia_acumulada = np.cumsum(conteo)# Calcular las frecuencias relativasfrecuencia_relativa = conteo /sum(conteo)# Calcular las frecuencias porcentualesfrecuencia_porcentual = frecuencia_relativa *100# Crear un DataFrame con toda la informacióntb_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 tablaprint(tb_freq_edad)
import pandas as pdimport numpy as np# Asegurarse de que todas las columnas y filas se impriman sin truncarpd.set_option('display.max_columns', None) # Mostrar todas las columnaspd.set_option('display.max_rows', None) # Mostrar todas las filas# Eliminar los valores NaN para el histogramaedad_limpia = [e for e in datos['edad'] ifnot np.isnan(e)]# Crear el histograma (sin graficarlo)conteo, bins = np.histogram(edad_limpia)# Calcular los puntos medios de los intervalospuntos_medios = [(bins[i] + bins[i+1]) /2for i inrange(len(bins) -1)]# Calcular las frecuencias acumuladasfrecuencia_acumulada = np.cumsum(conteo)# Calcular las frecuencias relativasfrecuencia_relativa = conteo /sum(conteo)# Calcular las frecuencias porcentualesfrecuencia_porcentual = frecuencia_relativa *100# Crear un DataFrame con toda la informacióntb_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 tablaprint(tb_freq_edad)
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 resultadoprint(media_edad_por_sexo)
sexo
Hombre 20.0
Mujer 20.0
Name: edad, dtype: float64
import matplotlib.pyplot as plt# Generar la tabla de frecuenciasfrecuencias_estudios = datos['estudios'].value_counts()# Crear el gráfico de sectoresplt.pie(frecuencias_estudios, labels=frecuencias_estudios.index, autopct='%1.1f%%', startangle=90)
# Título del gráficoplt.title('Distribución de Estudios')plt.show()
# Generar la tabla de frecuenciasfrecuencias_sexo = datos['sexo'].value_counts()# Crear el diagrama de barrasplt.bar(frecuencias_sexo.index, frecuencias_sexo, tick_label=['Hombre', 'Mujer'], color='lightblue')# Título del gráficoplt.title('Distribución por Sexo')# Etiquetas de los ejesplt.xlabel('Sexo')plt.ylabel('Frecuencia')# Mostrar el gráficoplt.show()
# Crear el histogramaplt.hist(datos['edad'], bins='auto', color='lightblue', edgecolor='black')# Título del gráficoplt.title('Histograma de la variable Edad')# Etiquetas de los ejesplt.xlabel('Edad')plt.ylabel('Frecuencia')# Mostrar el gráficoplt.show()
import seaborn as snsimport pandas as pdimport matplotlib.pyplot as plt# Definir los datos de las variables edad y sexodatos = 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 sexosns.boxplot(x='sexo', y='edad', data=datos)# Añadir etiquetas a los ejes y un títuloplt.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áficoplt.show()
# Crear el diagrama de caja (boxplot) de edad agrupado por sexosns.boxplot(x='sexo', y='edad', data=datos)# Añadir etiquetas a los ejes y un títuloplt.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áficoplt.show()