0JHK001107 UA3 AA1 Resuleto

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 62

Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

Unidad 3

Subir de forma grupal el documento a la actividad en el


Entrega
campus virtual.

1. Enunciado
La actividad está organizada en ejercicios y se evalúa sobre un máximo de 10
puntos. Todos los ejercicios tienen el mismo peso en la evaluación de la actividad.
Un ejercicio puede contener varias preguntas o apartados, en cuyo caso la
puntuación del ejercicio se repartirá de forma equitativa entre las preguntas o
apartados que lo componen.

1. Utiliza el siguiente enlace para descargar el Census Income Dataset, junto


con su fichero de nombres. Utiliza un Jupyter Notebook y el paquete Pandas
para abrir el archivo y presentarlo en formato DataFrame, donde el nombre
de las columnas debe corresponder con el nombre real de las variables.
<https://archive.ics.uci.edu/ml/datasets/Census+Income>

a. Como se ha visto en actividades anteriores, los valores de las variables en


este DataFrame tienen un espacio vacío al comienzo del string que define
la variable. La presencia de este espacio vacío dificulta el trabajo de
análisis y puede crear confusiones en el futuro. Utiliza el método apply de
Python para limpiar los valores de cada una de las variables que tengan
formato string, eliminando el espacio vacío que aparece al comienzo del
string. Renombra las variables nuevas para que tengan el mismo nombre
que las variables originales.

import pandas as pd

# URL del dataset


url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/ad
ult.data"

# Nombres de las columnas según el fichero de nombres


column_names = [
"age", "workclass", "fnlwgt", "education", "education-num",
"marital-status", "occupation", "relationship", "race", "sex",
"capital-gain", "capital-loss", "hours-per-week", "native-
country", "income"
]

# Descarga y carga del dataset en un DataFrame


df = pd.read_csv(url, header=None, names=column_names)

# Función para mostrar valores con corchetes

1 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
def show_with_brackets(df):
return df.applymap(lambda x: f'[{x}]' if isinstance(x, str)
else x)

# Mostrar las primeras filas antes de la limpieza


print("Antes de la limpieza:")
print(show_with_brackets(df).head())

# Limpieza de los espacios en blanco al inicio y final de cada


string usando `apply`
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

# Mostrar las primeras filas después de la limpieza


print("\nDespués de la limpieza:")
print(show_with_brackets(df).head())

# Verificación programática
espacios_blanco = (df.apply(lambda col: col.map(lambda x:
isinstance(x, str) and x.startswith(' ')) if col.dtype == 'object'
else False).sum().sum() == 0)
if espacios_blanco:
print("\nTodos los espacios en blanco al inicio han sido
eliminados.")
else:
print("\nTodavía hay espacios en blanco al inicio en algunos
strings.")

1. Importar la Biblioteca Pandas


python
import pandas as pd

Este comando importa la biblioteca Pandas, que es una herramienta poderosa para la
manipulación y análisis de datos en Python.

2. Definir la URL del Dataset


python
url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult
.data"

2 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

Aquí defines la URL donde se encuentra el archivo de datos que deseas cargar. Este es
el enlace directo al archivo adult.data del conjunto de datos de ingresos del censo.

3. Definir los Nombres de las Columnas


python
column_names = [
"age", "workclass", "fnlwgt", "education", "education-num",
"marital-status", "occupation", "relationship", "race", "sex",
"capital-gain", "capital-loss", "hours-per-week", "native-
country", "income"
]

Esta lista contiene los nombres de las columnas del DataFrame. Estos nombres
corresponden a las variables en el conjunto de datos y se utilizarán para etiquetar las
columnas al cargar los datos.

4. Cargar el Dataset en un DataFrame


python
df = pd.read_csv(url, header=None, names=column_names)

Aquí estás utilizando la función read_csv de Pandas para leer el archivo CSV desde la
URL. Vamos a desglosar los parámetros utilizados:

 url: La URL del archivo de datos.


 header=None: Esto indica que el archivo CSV no contiene una fila de
encabezado con los nombres de las columnas.
 names=column_names: Utiliza la lista column_names para asignar los nombres
de las columnas al DataFrame.

5. Limpieza de los Espacios en Blanco


Python.

def show_with_brackets(df):

return df.applymap(lambda x: f'[{x}]' if isinstance(x, str) else x)

Función show_with_brackets: Esta función se utiliza para mostrar los valores de


las celdas entre corchetes, haciendo visible cualquier espacio en blanco al inicio
y al final.
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

Este paso utiliza el método apply de Pandas para limpiar los espacios en blanco al
inicio y al final de cada cadena de texto en las columnas del DataFrame. Vamos a
desglosarlo:

3 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
Contexto

Este código se usa para limpiar un DataFrame de Pandas df eliminando los espacios en
blanco al principio y al final de cada cadena de texto en todas las columnas que
contengan strings (object).

Desglose del Código

1. df.apply(...):
o df es tu DataFrame.
o El método apply de Pandas aplica una función a lo largo de un eje del
DataFrame (ya sea a nivel de filas o columnas). En este caso, se aplica a
cada columna.
2. lambda col: ...:
o lambda es una palabra clave en Python que crea una función anónima, es
decir, una función sin nombre que se define en una sola línea.
o col es el nombre del argumento que se pasará a esta función lambda. En
este contexto, representa una columna del DataFrame.
3. col.str.strip():
o col es una columna del DataFrame.
o str es un accesorio de las series de Pandas que contiene métodos de
cadena de texto.
o strip() es un método de cadena de texto que elimina los espacios en
blanco al principio y al final de cada string en la columna.
4. if col.dtype == 'object':
o col.dtype obtiene el tipo de datos de la columna.
o object es el tipo de datos que Pandas usa para representar cadenas de
texto.
o Este condicional verifica si la columna es de tipo object, es decir, si la
columna contiene cadenas de texto.
5. else col:
o Si la columna no es de tipo object, esta parte de la función lambda
devuelve la columna tal cual, sin hacerle ninguna modificación.

Flujo de Ejecución

1. Aplicación de la Función:
o df.apply(...) aplica la función lambda a cada columna del
DataFrame.
2. Verificación del Tipo de Datos:
o Para cada columna, col.dtype == 'object' verifica si la columna es
de tipo object (cadenas de texto).
3. Limpieza de Cadenas de Texto:
o Si la columna es de tipo object, col.str.strip() elimina los espacios
en blanco al principio y al final de cada cadena en esa columna.
4. Retorno de la Columna:

4 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o Si la columna no es de tipo object, se devuelve la columna sin cambios


(else col).

6. Mostrar las Primeras Filas del DataFrame


python
print(df.head())

Finalmente, utilizas print(df.head()) para mostrar las primeras 5 filas del


DataFrame. El método head() de Pandas, por defecto, muestra las primeras 5 filas de
un DataFrame, lo cual es útil para inspeccionar los datos y verificar que se han cargado
y limpiado correctamente.

Antes de la limpieza:

age workclass fnlwgt education education-num ... income

0 39 [ State-gov] 77516 [ Bachelors] 13 ...

1 50 [ Self-emp-not-inc] 83311 [ Bachelors] 13 ...

2 38 [ Private] 215646 [ HS-grad] 9 ...

3 53 [ Private] 234721 [ 11th] 7 ...

4 28 [ Private] 338409 [ Bachelors] 13 ...

Después de la limpieza:

age workclass fnlwgt education education-num ... income

0 39 [State-gov] 77516 [Bachelors] 13 ...

1 50 [Self-emp-not-inc] 83311 [Bachelors] 13 ...

2 38 [Private] 215646 [HS-grad] 9 ...

3 53 [Private] 234721 [11th] 7 ...

4 28 [Private] 338409 [Bachelors] 13 ...

b. Crea un DataFrame llamado df_less con los registros del DataFrame


original que cobren menos de 50 mil dólares. Crea un DataFrame llamado
df_more con los registros del DataFrame original que cobren más de 50
mil dólares.

import pandas as pd

# URL del dataset

5 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"

# Nombres de las columnas según el fichero de nombres

column_names = [

"age", "workclass", "fnlwgt", "education", "education-num",

"marital-status", "occupation", "relationship", "race", "sex",

"capital-gain", "capital-loss", "hours-per-week", "native-country", "income"

# Descarga y carga del dataset en un DataFrame

df = pd.read_csv(url, header=None, names=column_names)

# Limpieza de los espacios en blanco al inicio y final de cada string usando `apply`

df = df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col)

# Crear DataFrame con registros que tienen ingresos menores o iguales a 50 mil
dólares

df_less = df[df['income'] == '<=50K']

# Crear DataFrame con registros que tienen ingresos mayores a 50 mil dólares

df_more = df[df['income'] == '>50K']

# Muestra las primeras filas de ambos DataFrames

print("DataFrame con ingresos <=50K:")

print(df_less.head())

print("\nDataFrame con ingresos >50K:")

print(df_more.head())

Explicación Detallada:

1. Importación de Bibliotecas:

python

6 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
import pandas as pd

Importamos la biblioteca Pandas para la manipulación y análisis de datos.

2. Definición del URL del Dataset:

python

url = "https://archive.ics.uci.edu/ml/machine-learning-
databases/adult/adult.data"

Definimos la URL desde donde descargaremos el dataset.

3. Definición de los Nombres de las Columnas:

python

column_names = [
"age", "workclass", "fnlwgt", "education", "education-num",
"marital-status", "occupation", "relationship", "race",
"sex",
"capital-gain", "capital-loss", "hours-per-week", "native-
country", "income"
]

Esta lista contiene los nombres de las columnas que utilizaremos para etiquetar
las columnas del DataFrame.

4. Carga del Dataset en un DataFrame:

python

df = pd.read_csv(url, header=None, names=column_names)

Utilizamos la función read_csv de Pandas para leer el archivo CSV desde la


URL y cargarlo en un DataFrame. header=None indica que el archivo no tiene
una fila de encabezado, y names=column_names asigna los nombres de las
columnas.

5. Limpieza de Espacios en Blanco:

python

df = df.apply(lambda col: col.str.strip() if col.dtype ==


'object' else col)

Aplicamos una función lambda a cada columna del DataFrame para eliminar los
espacios en blanco al inicio y al final de cada string. Esto se hace solo para las
columnas de tipo object (cadenas de texto).

7 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

6. Crear DataFrame con Ingresos <= 50K:

python

df_less = df[df['income'] == '<=50K']

Creamos un nuevo DataFrame df_less que contiene solo los registros donde la
columna income es igual a "<=50K".

7. Crear DataFrame con Ingresos > 50K:

python

df_more = df[df['income'] == '>50K']

Creamos un nuevo DataFrame df_more que contiene solo los registros donde la
columna income es igual a ">50K".

8. Mostrar las Primeras Filas de Ambos DataFrames:

python

print("DataFrame con ingresos <=50K:")


print(df_less.head())
print("\nDataFrame con ingresos >50K:")
print(df_more.head())

Utilizamos print y head() para mostrar las primeras 5 filas de ambos


DataFrames (df_less y df_more). Esto nos permite verificar que los
DataFrames se han creado correctamente y contienen los registros esperados.

c. Utiliza el método groupby de Pandas sobre df_less para obtener el número


de registros que cobran menos de 50 mil dólares agrupados por nivel
educativo. Ordena estos resultados de mayor a menor, señalando qué
grupos tienen más incidencia y cuáles menos. Repite las mismas
operaciones sobre el DataFrame df_more. Explica los resultados y
comenta si crees que tienen sentido.

import pandas as pd

# URL del dataset


url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/ad
ult.data"

8 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

# Nombres de las columnas según el fichero de nombres


column_names = [
"age", "workclass", "fnlwgt", "education", "education-num",
"marital-status", "occupation", "relationship", "race", "sex",
"capital-gain", "capital-loss", "hours-per-week", "native-
country", "income"
]

# Descarga y carga del dataset en un DataFrame


df = pd.read_csv(url, header=None, names=column_names)

# Agrupar y contar registros por nivel educativo para df_less


education_counts_less =
df_less.groupby('education').size().sort_values(ascending=False)
print("Registros que cobran menos de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_less)

# Agrupar y contar registros por nivel educativo para df_more


education_counts_more =
df_more.groupby('education').size().sort_values(ascending=False)
print("\nRegistros que cobran más de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_more)

Código
python
# Agrupar y contar registros por nivel educativo para df_less
education_counts_less =
df_less.groupby('education').size().sort_values(ascending=False)
print("Registros que cobran menos de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_less)

# Agrupar y contar registros por nivel educativo para df_more


education_counts_more =
df_more.groupby('education').size().sort_values(ascending=False)
print("\nRegistros que cobran más de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_more)
Explicación del Código

1. Agrupar y Contar Registros por Nivel Educativo para df_less:

9 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
python

education_counts_less =
df_less.groupby('education').size().sort_values(ascending=False)

o df_less.groupby('education'): Agrupa los registros en df_less por


la columna education.
o .size(): Cuenta el número de registros en cada grupo.
o .sort_values(ascending=False): Ordena los conteos de mayor a
menor.
2. Mostrar los Resultados para df_less:

python

print("Registros que cobran menos de 50 mil dólares agrupados


por nivel educativo:")
print(education_counts_less)

3. Agrupar y Contar Registros por Nivel Educativo para df_more:

python

education_counts_more =
df_more.groupby('education').size().sort_values(ascending=False)

El proceso es el mismo que para df_less, pero aplicado a df_more.


o
4. Mostrar los Resultados para df_more:

python

print("\nRegistros que cobran más de 50 mil dólares agrupados


por nivel educativo:")
print(education_counts_more)

 df_less:

 Los grupos educativos con más registros que ganan menos de 50K son "HS-
grad" (graduados de secundaria), "Some-college" (algunos estudios
universitarios) y "Bachelors" (licenciatura).
 Estos resultados tienen sentido ya que la mayoría de la población suele tener
estos niveles educativos y es razonable que muchos no alcancen ingresos
mayores a 50K, especialmente sin experiencia significativa o educación superior
adicional.

 df_more:

 Los grupos educativos con más registros que ganan más de 50K son "Bachelors"
(licenciatura), "HS-grad" (graduados de secundaria) y "Some-college" (algunos

10 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

estudios universitarios), pero con un notable aumento de "Masters" (maestría) y


"Prof-school" (escuela profesional).
 Esto también tiene sentido ya que niveles educativos más altos suelen
correlacionar con mayores ingresos, debido a una combinación de habilidades
especializadas y oportunidades laborales mejor remuneradas.

d. Partiendo del DataFrame original y utilizando el método groupby de


Pandas, obtén el número total de registros del dataset por nivel educativo.
Utiliza este resultado para normalizar los resultados obtenidos en los
apartados b y c.

import pandas as pd

# URL del dataset

url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"

# Nombres de las columnas según el fichero de nombres

column_names = [

"age", "workclass", "fnlwgt", "education", "education-num",

"marital-status", "occupation", "relationship", "race", "sex",

"capital-gain", "capital-loss", "hours-per-week", "native-country", "income"

# Descarga y carga del dataset en un DataFrame

df = pd.read_csv(url, header=None, names=column_names)

# Función para mostrar valores con corchetes (para visualizar espacios)

def show_with_brackets(df):

return df.applymap(lambda x: f'[{x}]' if isinstance(x, str) else x)

# Mostrar las primeras filas antes de la limpieza

print("Antes de la limpieza:")

print(show_with_brackets(df).head())

11 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
# Limpieza de los espacios en blanco al inicio y final de cada string usando
`apply`

df = df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col)

# Mostrar las primeras filas después de la limpieza

print("\nDespués de la limpieza:")

print(show_with_brackets(df).head())

# Verificación programática usando `map` en lugar de `applymap`

espacios_blanco = (df.apply(lambda col: col.map(lambda x: isinstance(x, str)


and x.startswith(' ')) if col.dtype == 'object' else False).sum().sum() == 0)

if espacios_blanco:

print("\nTodos los espacios en blanco al inicio han sido eliminados.")

else:

print("\nTodavía hay espacios en blanco al inicio en algunos strings.")

# Crear DataFrame con registros que tienen ingresos menores o iguales a 50


mil dólares

df_less = df[df['income'] == '<=50K']

# Crear DataFrame con registros que tienen ingresos mayores a 50 mil


dólares

df_more = df[df['income'] == '>50K']

# Agrupar y contar registros por nivel educativo para df_less

education_counts_less =
df_less.groupby('education').size().sort_values(ascending=False)

print("\nRegistros que cobran menos de 50 mil dólares agrupados por nivel


educativo:")

print(education_counts_less)

# Agrupar y contar registros por nivel educativo para df_more

education_counts_more =
df_more.groupby('education').size().sort_values(ascending=False)

12 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
print("\nRegistros que cobran más de 50 mil dólares agrupados por nivel
educativo:")

print(education_counts_more)

# Número total de registros por nivel educativo en el dataset original

total_counts = df.groupby('education').size()

print("\nNúmero total de registros por nivel educativo:")

print(total_counts)

# Normalización para df_less

normalized_less = (education_counts_less /
total_counts).sort_values(ascending=False)

print("\nProporción de registros que cobran menos de 50 mil dólares por


nivel educativo:")

print(normalized_less)

# Normalización para df_more

normalized_more = (education_counts_more /
total_counts).sort_values(ascending=False)

print("\nProporción de registros que cobran más de 50 mil dólares por nivel


educativo:")

print(normalized_more)

 Función para Mostrar Valores con Corchetes:

python
def show_with_brackets(df):
return df.applymap(lambda x: f'[{x}]' if isinstance(x, str) else
x)

Esta función toma un DataFrame y devuelve uno nuevo donde cada valor de tipo string
está rodeado de corchetes [ ], ayudando a visualizar claramente los espacios en blanco.

 Mostrar las Primeras Filas Antes de la Limpieza:

python
print("Antes de la limpieza:")
print(show_with_brackets(df).head())

13 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

Aquí, el código muestra las primeras 5 filas del DataFrame antes de aplicar la limpieza,
permitiendo ver los espacios en blanco iniciales.

 Limpieza de los Espacios en Blanco con apply:

python
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

En esta parte, se utiliza el método apply para aplicar una función lambda a cada
columna del DataFrame:

 col.str.strip(): Elimina los espacios en blanco al inicio y al final de cada


string en la columna.
 if col.dtype == 'object': Verifica si la columna es de tipo string.
 else col: Deja la columna sin cambios si no es de tipo string.

 Mostrar las Primeras Filas Después de la Limpieza:

python
print("\nDespués de la limpieza:")
print(show_with_brackets(df).head())

Aquí, se muestran nuevamente las primeras 5 filas del DataFrame después de aplicar la
limpieza, permitiendo comparar visualmente los cambios.

 Verificación Programática:

python
espacios_blanco = (df.apply(lambda col: col.map(lambda x:
isinstance(x, str) and x.startswith(' ')) if col.dtype == 'object'
else False).sum().sum() == 0)
if espacios_blanco:
print("\nTodos los espacios en blanco al inicio han sido
eliminados.")
else:
print("\nTodavía hay espacios en blanco al inicio en algunos
strings.")

Este bloque verifica programáticamente si aún quedan espacios en blanco al inicio de


algún string en el DataFrame.

 apply aplica la función lambda a cada columna del DataFrame.


 map aplica una función lambda a cada elemento de la columna.
 isinstance(x, str) and x.startswith(' '): La función lambda devuelve
True si el elemento es un string que comienza con un espacio en blanco.
 .sum().sum() == 0: Verifica que la suma total de elementos que comienzan
con un espacio sea cero.

14 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 Crear DataFrames df_less y df_more:

python
df_less = df[df['income'] == '<=50K']
df_more = df[df['income'] == '>50K']

Estos comandos filtran los registros para crear dos nuevos DataFrames:

 df_less: Contiene solo los registros donde income es "<=50K".


 df_more: Contiene solo los registros donde income es ">50K".

 Agrupar y Contar Registros por Nivel Educativo:

python
education_counts_less =
df_less.groupby('education').size().sort_values(ascending=False)
print("\nRegistros que cobran menos de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_less)

education_counts_more =
df_more.groupby('education').size().sort_values(ascending=False)
print("\nRegistros que cobran más de 50 mil dólares agrupados por
nivel educativo:")
print(education_counts_more)

Aquí se agrupan los registros por la columna education y se cuenta el número de


registros en cada grupo para df_less y df_more, luego se ordenan estos conteos de
mayor a menor.

 Número Total de Registros por Nivel Educativo en el Dataset Original:

python
total_counts = df.groupby('education').size()
print("\nNúmero total de registros por nivel educativo:")
print(total_counts)

Se cuenta el número total de registros en el dataset original df agrupados por nivel


educativo.

e. Los resultados normalizados no representan ahora el número de registros


por nivel educativo en cada caso (menos de 50 mil dólares y más de 50
mil dólares), sino la probabilidad de que un determinado nivel educativo
se encuentre en cada grupo de salario. Ordena las probabilidades de
mayor a menor para cada grupo de salario, señalando la probabilidad
asociada a cada nivel educativo. Explica los resultados y comenta si crees
que tienen sentido.

Para calcular las probabilidades de que un determinado nivel educativo se


encuentre en cada grupo de salario (<=50K y >50K), se usaron las

15 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
proporciones normalizadas obtenidas en la parte anterior. Estas
proporciones representan la probabilidad de que alguien con un nivel
educativo específico se encuentre en uno de los grupos de ingresos. Vamos
a ordenar estas probabilidades de mayor a menor y analizarlas.

import pandas as pd

# URL del dataset

url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"

# Nombres de las columnas según el fichero de nombres

column_names = [

"age", "workclass", "fnlwgt", "education", "education-num",

"marital-status", "occupation", "relationship", "race", "sex",

"capital-gain", "capital-loss", "hours-per-week", "native-country", "income"

# Descarga y carga del dataset en un DataFrame

df = pd.read_csv(url, header=None, names=column_names)

# Limpieza de los espacios en blanco al inicio y final de cada string usando


`apply`

df = df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col)

# Crear DataFrame con registros que tienen ingresos menores o iguales a 50


mil dólares

df_less = df[df['income'] == '<=50K']

# Crear DataFrame con registros que tienen ingresos mayores a 50 mil


dólares

df_more = df[df['income'] == '>50K']

# Agrupar y contar registros por nivel educativo para df_less

16 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
education_counts_less = df_less.groupby('education').size()

# Agrupar y contar registros por nivel educativo para df_more

education_counts_more = df_more.groupby('education').size()

# Número total de registros por nivel educativo en el dataset original

total_counts = df.groupby('education').size()

# Normalización para df_less

normalized_less = (education_counts_less /
total_counts).sort_values(ascending=False)

print("\nProporción de registros que cobran menos de 50 mil dólares por


nivel educativo:")

print(normalized_less)

# Normalización para df_more

normalized_more = (education_counts_more /
total_counts).sort_values(ascending=False)

print("\nProporción de registros que cobran más de 50 mil dólares por nivel


educativo:")

print(normalized_more)

 Limpieza de los Espacios en Blanco:

python
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

 df.apply(lambda col: col.str.strip() if col.dtype == 'object'


else col): Aplica una función lambda a cada columna del DataFrame para
eliminar los espacios en blanco al inicio y al final de cada string.
 col.str.strip(): Método que elimina los espacios en blanco al inicio y al
final de cada string en la columna.
 if col.dtype == 'object': Verifica si la columna es de tipo string.
 else col: Deja la columna sin cambios si no es de tipo string.

 Crear DataFrames df_less y df_more:

17 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

python
df_less = df[df['income'] == '<=50K']
df_more = df[df['income'] == '>50K']

 df_less = df[df['income'] == '<=50K']: Filtra los registros para crear un


DataFrame df_less que contiene solo los registros donde income es "<=50K".
 df_more = df[df['income'] == '>50K']: Filtra los registros para crear un
DataFrame df_more que contiene solo los registros donde income es ">50K".

 Agrupar y Contar Registros por Nivel Educativo para df_less:

python
education_counts_less = df_less.groupby('education').size()

 df_less.groupby('education'): Agrupa los registros por la columna


education.
 .size(): Cuenta el número de registros en cada grupo.

 Agrupar y Contar Registros por Nivel Educativo para df_more:

python
education_counts_more = df_more.groupby('education').size()

 df_more.groupby('education'): Agrupa los registros por la columna


education.
 .size(): Cuenta el número de registros en cada grupo.

 Número Total de Registros por Nivel Educativo en el Dataset Original:

python
total_counts = df.groupby('education').size()

 df.groupby('education'): Agrupa los registros del dataset original por la


columna education.
 .size(): Cuenta el número total de registros en cada grupo.

 Normalización para df_less:

python
normalized_less = (education_counts_less /
total_counts).sort_values(ascending=False)
print("\nProporción de registros que cobran menos de 50 mil dólares
por nivel educativo:")
print(normalized_less)

 education_counts_less / total_counts: Calcula la proporción de registros


en df_less respecto al total de registros en cada nivel educativo.

18 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 .sort_values(ascending=False): Ordena las proporciones de mayor a


menor.
 print(normalized_less): Muestra las proporciones calculadas.

 Normalización para df_more:

python
normalized_more = (education_counts_more /
total_counts).sort_values(ascending=False)
print("\nProporción de registros que cobran más de 50 mil dólares por
nivel educativo:")
print(normalized_more)

 education_counts_more / total_counts: Calcula la proporción de registros


en df_more respecto al total de registros en cada nivel educativo.
 .sort_values(ascending=False): Ordena las proporciones de mayor a
menor.
 print(normalized_more): Muestra las proporciones calculadas.

Análisis y Comentarios

1. Probabilidades de Ganar Menos de 50 Mil Dólares:


o Preschool (1.000000): Todas las personas con nivel educativo
"Preschool" ganan menos de 50K.
o 1st-4th (0.970060), 5th-6th (0.925000), 11th (0.911650): La mayoría de
las personas con estos niveles educativos también ganan menos de 50K.
Es razonable ya que niveles educativos bajos usualmente están asociados
con ingresos más bajos.
o Masters (0.642467), Bachelors (0.707396): Aunque una porción
significativa de personas con educación superior también ganan menos
de 50K, es notablemente menor en comparación con los niveles
educativos más bajos.
2. Probabilidades de Ganar Más de 50 Mil Dólares:
o Doctorate (0.434932), Prof-school (0.560102), Masters (0.357533):
Las personas con niveles educativos más altos tienen mayores
probabilidades de ganar más de 50K, lo cual es consistente con la
correlación entre educación superior e ingresos más altos.
o Bachelors (0.292604), Assoc-voc (0.206431): También hay
probabilidades considerables de ganar más de 50K en estos niveles,
aunque menor en comparación con niveles educativos más altos.

19 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
f. Representa en una gráfica de barras los resultados obtenidos en los
apartados c y e, con los valores ordenados de mayor a menor. Recuerda
añadir los títulos de los ejes, el título del gráfico, la leyenda y todas las
opciones de visualización que consideres relevantes para comunicar mejor
los resultados.

import pandas as pd

import matplotlib.pyplot as plt

# URL del dataset

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"

# Nombres de las columnas según el fichero de nombres

column_names = [

"age", "workclass", "fnlwgt", "education", "education-num",

"marital-status", "occupation", "relationship", "race", "sex",

"capital-gain", "capital-loss", "hours-per-week", "native-country", "income"

# Descarga y carga del dataset en un DataFrame

df = pd.read_csv(url, header=None, names=column_names)

# Limpieza de los espacios en blanco al inicio y final de cada string usando `apply`

df = df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col)

# Crear DataFrame con registros que tienen ingresos menores o iguales a 50 mil
dólares

df_less = df[df['income'] == '<=50K']

# Crear DataFrame con registros que tienen ingresos mayores a 50 mil dólares

df_more = df[df['income'] == '>50K']

# Agrupar y contar registros por nivel educativo para df_less

20 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
education_counts_less = df_less.groupby('education').size()

# Agrupar y contar registros por nivel educativo para df_more

education_counts_more = df_more.groupby('education').size()

# Número total de registros por nivel educativo en el dataset original

total_counts = df.groupby('education').size()

# Normalización para df_less

normalized_less = (education_counts_less /
total_counts).sort_values(ascending=False)

# Normalización para df_more

normalized_more = (education_counts_more /
total_counts).sort_values(ascending=False)

# Crear la figura y los ejes para la gráfica de barras

fig, ax = plt.subplots(2, 1, figsize=(12, 10))

# Gráfica de barras para los ingresos <= 50K

ax[0].bar(normalized_less.index, normalized_less, color='skyblue')

ax[0].set_title('Proporción de Registros con Ingresos <= 50K por Nivel Educativo')

ax[0].set_xlabel('Nivel Educativo')

ax[0].set_ylabel('Proporción')

ax[0].tick_params(axis='x', rotation=90) # Rotar etiquetas en el eje x

# Gráfica de barras para los ingresos > 50K

ax[1].bar(normalized_more.index, normalized_more, color='salmon')

ax[1].set_title('Proporción de Registros con Ingresos > 50K por Nivel Educativo')

ax[1].set_xlabel('Nivel Educativo')

ax[1].set_ylabel('Proporción')

ax[1].tick_params(axis='x', rotation=90) # Rotar etiquetas en el eje x

21 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

# Ajustar el layout para evitar superposiciones

plt.tight_layout()

# Mostrar las gráficas

plt.show()

Carga del Dataset en un DataFrame

El código descarga y carga el archivo CSV en un DataFrame de Pandas.

python
df = pd.read_csv(url, header=None, names=column_names)

 pd.read_csv(url, header=None, names=column_names):


o url: Especifica la URL del dataset.
o header=None: Indica que el archivo CSV no contiene una fila de
encabezado con los nombres de las columnas.
o names=column_names: Utiliza la lista column_names para etiquetar las
columnas del DataFrame.

Limpieza de los Espacios en Blanco

El código utiliza el método apply de Pandas para limpiar los espacios en blanco al
inicio y al final de cada cadena de texto en el DataFrame.

python
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

 df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col):


o lambda col: ...: Define una función anónima que se aplica a cada
columna.
o col.str.strip(): Elimina los espacios en blanco al inicio y al final de cada
string en la columna.
o if col.dtype == 'object': Verifica si la columna es de tipo object
(string).
o else col: Deja la columna sin cambios si no es de tipo string.

22 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
Creación de DataFrames df_less y df_more

El código crea dos nuevos DataFrames basados en la columna income, separando los
registros en dos grupos: aquellos que ganan menos o iguales a 50K y aquellos que
ganan más de 50K.

python
df_less = df[df['income'] == '<=50K']
df_more = df[df['income'] == '>50K']

 df[df['income'] == '<=50K']: Filtra los registros donde income es "<=50K"


para crear df_less.
 df[df['income'] == '>50K']: Filtra los registros donde income es ">50K" para
crear df_more.

Agrupación y Conteo de Registros por Nivel Educativo

El código agrupa los registros por nivel educativo y cuenta el número de registros en
cada grupo, tanto para df_less como para df_more. También cuenta el número total de
registros por nivel educativo en el DataFrame original.

python
education_counts_less = df_less.groupby('education').size()
education_counts_more = df_more.groupby('education').size()
total_counts = df.groupby('education').size()

 df_less.groupby('education').size(): Agrupa los registros en df_less por la


columna education y cuenta el número de registros en cada grupo.
 df_more.groupby('education').size(): Agrupa los registros en df_more por la
columna education y cuenta el número de registros en cada grupo.
 df.groupby('education').size(): Agrupa todos los registros en el DataFrame
original df por la columna education y cuenta el número total de registros en
cada grupo.

Normalización de los Resultados

El código calcula la proporción de registros en df_less y df_more respecto al total de


registros en cada nivel educativo, y ordena estas proporciones de mayor a menor.

python
normalized_less = (education_counts_less /
total_counts).sort_values(ascending=False)
normalized_more = (education_counts_more /
total_counts).sort_values(ascending=False)

23 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 education_counts_less / total_counts: Calcula la proporción de registros en


df_less respecto al total de registros en cada nivel educativo.
 .sort_values(ascending=False): Ordena las proporciones de mayor a menor.

Creación de la Figura y los Ejes para la Gráfica de Barras

El código crea una figura con dos subgráficas para las proporciones normalizadas de
ingresos menos o iguales a 50K y mayores a 50K.

python
fig, ax = plt.subplots(2, 1, figsize=(12, 10))

 plt.subplots(2, 1, figsize=(12, 10)): Crea una figura con dos subgráficas (una
fila, dos columnas) y establece el tamaño de la figura.

Gráfica de Barras para los Ingresos <= 50K

El código genera una gráfica de barras para mostrar las proporciones de registros con
ingresos menores o iguales a 50K, por nivel educativo.

python
ax[0].bar(normalized_less.index, normalized_less, color='skyblue')
ax[0].set_title('Proporción de Registros con Ingresos <= 50K por Nivel
Educativo')
ax[0].set_xlabel('Nivel Educativo')
ax[0].set_ylabel('Proporción')
ax[0].tick_params(axis='x', rotation=90)

 ax[0].bar(normalized_less.index, normalized_less, color='skyblue'): Crea


una gráfica de barras utilizando los índices y valores de normalized_less, con
barras de color azul claro.
 ax[0].set_title('Proporción de Registros con Ingresos <= 50K por Nivel
Educativo'): Establece el título de la gráfica.
 ax[0].set_xlabel('Nivel Educativo'): Establece el título del eje X.
 ax[0].set_ylabel('Proporción'): Establece el título del eje Y.
 ax[0].tick_params(axis='x', rotation=90): Rota las etiquetas del eje X 90
grados para mejorar la legibilidad.

Gráfica de Barras para los Ingresos > 50K

El código genera una gráfica de barras para mostrar las proporciones de registros con
ingresos mayores a 50K, por nivel educativo.

python
ax[1].bar(normalized_more.index, normalized_more, color='salmon')
ax[1].set_title('Proporción de Registros con Ingresos > 50K por Nivel
Educativo')

24 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
ax[1].set_xlabel('Nivel Educativo')
ax[1].set_ylabel('Proporción')
ax[1].tick_params(axis='x', rotation=90)

 ax[1].bar(normalized_more.index, normalized_more, color='salmon'): Crea


una gráfica de barras utilizando los índices y valores de normalized_more, con
barras de color salmón.
 ax[1].set_title('Proporción de Registros con Ingresos > 50K por Nivel
Educativo'): Establece el título de la gráfica.
 ax[1].set_xlabel('Nivel Educativo'): Establece el título del eje X.
 ax[1].set_ylabel('Proporción'): Establece el título del eje Y.
 ax[1].tick_params(axis='x', rotation=90): Rota las etiquetas del eje X 90
grados para mejorar la legibilidad.

Ajuste del Layout para Evitar Superposiciones

El código ajusta el diseño de las subgráficas para evitar que se superpongan.

python
plt.tight_layout()

 plt.tight_layout(): Ajusta automáticamente el diseño de las subgráficas para


evitar superposiciones y mejorar la legibilidad.

Mostrar las Gráficas

Finalmente, el código muestra las gráficas generadas.

python
plt.show()

 plt.show(): Muestra las gráficas en pantalla.

g. Representa, en el tipo de gráfica que consideres más conveniente, la


manera en la que afecta la edad y el género al hecho de que una persona
se encuentre en el grupo de < 50 mil dólares o de > 50 mil dólares.
Añade a la gráfica todas las opciones de visualización que consideres
relevantes para comunicar los resultados.

Importación de Bibliotecas

Primero, el código importa las bibliotecas necesarias para el análisis y la visualización


de datos.

25 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


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

 Pandas: Esta biblioteca se utiliza para la manipulación y análisis de datos.


Proporciona estructuras de datos y herramientas que facilitan el trabajo con
datos tabulares y series temporales.
 Seaborn: Seaborn se utiliza para la visualización de datos. Se basa en Matplotlib
y proporciona una interfaz de alto nivel para dibujar gráficos estadísticos
atractivos y informativos.
 Matplotlib: Esta biblioteca se emplea para crear visualizaciones gráficas, como
las gráficas de barras, líneas, etc. Es particularmente útil para personalizar y
ajustar detalles en los gráficos.

Definición del URL del Dataset y Nombres de las Columnas

A continuación, el código define la URL desde donde se descarga el dataset y los


nombres de las columnas que se utilizarán para etiquetar los datos.

python
# URL del dataset
url =
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult
.data"

# Nombres de las columnas según el fichero de nombres


column_names = [
"age", "workclass", "fnlwgt", "education", "education-num",
"marital-status", "occupation", "relationship", "race", "sex",
"capital-gain", "capital-loss", "hours-per-week", "native-
country", "income"
]

 url: Especifica la dirección web desde donde se descargará el archivo de datos.


 column_names: Una lista que contiene los nombres de las columnas para
etiquetar adecuadamente los datos en el DataFrame.

Carga del Dataset en un DataFrame

El código descarga y carga el archivo CSV en un DataFrame de Pandas.

python
df = pd.read_csv(url, header=None, names=column_names)

 pd.read_csv(url, header=None, names=column_names):


o url: Utiliza la URL definida anteriormente para localizar el archivo de
datos.

26 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o header=None: Indica que el archivo CSV no contiene una fila de


encabezado, por lo que Pandas no tratará la primera fila del archivo
como nombres de las columnas.
o names=column_names: Asigna los nombres de las columnas al
DataFrame utilizando la lista column_names.

Limpieza de los Espacios en Blanco

El código utiliza el método apply de Pandas para limpiar los espacios en blanco al
inicio y al final de cada cadena de texto en el DataFrame.

python
df = df.apply(lambda col: col.str.strip() if col.dtype == 'object'
else col)

 df.apply(lambda col: col.str.strip() if col.dtype == 'object' else col):


o lambda col: ...: Define una función anónima (lambda) que se aplica a
cada columna del DataFrame.
o col.str.strip(): Aplica el método strip() a cada string en la columna,
eliminando los espacios en blanco al inicio y al final.
o if col.dtype == 'object': Verifica si la columna es de tipo object, que en
Pandas generalmente representa datos de texto.
o else col: Deja la columna sin cambios si no es de tipo string.

Creación de una Nueva Columna Categórica para los Ingresos

El código crea una nueva columna categórica (income_cat) que clasifica los ingresos
en dos categorías: <=50K y >50K.

python
df['income_cat'] = df['income'].apply(lambda x: '<=50K' if x ==
'<=50K' else '>50K')

 df['income'].apply(lambda x: '<=50K' if x == '<=50K' else '>50K'):


o Aplica una función lambda a cada elemento de la columna income.
o Si el valor de income es <=50K, retorna <=50K.
o Si el valor de income es distinto de <=50K, retorna >50K.

Configuración del Gráfico

El código configura el tamaño de la figura para la visualización.

python
plt.figure(figsize=(14, 10))

27 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 plt.figure(figsize=(14, 10)):
o Crea una nueva figura de Matplotlib con un tamaño específico (14
unidades de ancho por 10 de alto), lo que facilita la visualización de los
datos sin superposiciones y con detalles claros.

Crear el Gráfico de Violín

El código crea un gráfico de violín para visualizar la distribución de la edad según los
ingresos y el género.

python
sns.violinplot(x="income_cat", y="age", hue="sex", data=df,
split=True, inner="quartile", palette="muted")

 sns.violinplot(...):
o x="income_cat": Establece el eje X como la columna income_cat, que
contiene las categorías de ingresos (<=50K y >50K).
o y="age": Establece el eje Y como la columna age, representando la
edad de las personas.
o hue="sex": Usa la columna sex para colorear los datos, distinguiendo
entre hombres y mujeres.
o data=df: Utiliza el DataFrame df como fuente de datos.
o split=True: Divide los datos en cada grupo de ingresos según el género,
mostrando dos distribuciones superpuestas.
o inner="quartile": Incluye los cuartiles internos en el gráfico, lo que
proporciona información adicional sobre la mediana y los rangos
intercuartílicos.
o palette="muted": Usa una paleta de colores atenuados para una
visualización más clara y profesional.

Títulos y Etiquetas

El código añade títulos y etiquetas a la gráfica para facilitar la interpretación de los


resultados.

python
plt.title('Distribución de la Edad según Ingresos y Género')
plt.xlabel('Ingresos')
plt.ylabel('Edad')
plt.legend(title='Género')

 plt.title(...): Establece el título del gráfico para indicar claramente lo que se está
visualizando.
 plt.xlabel(...): Añade una etiqueta al eje X, describiendo que representa las
categorías de ingresos.

28 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 plt.ylabel(...): Añade una etiqueta al eje Y, describiendo que representa las


edades.
 plt.legend(...): Configura la leyenda del gráfico con el título 'Género', facilitando
la distinción entre los datos para hombres y mujeres.

Mostrar la Gráfica

Finalmente, el código muestra la gráfica generada en pantalla.

python
plt.show()

 plt.show(): Muestra la gráfica en la ventana de visualización, permitiendo al


usuario interpretar los datos visualmente.

Análisis del Gráfico

El gráfico de violín muestra cómo la edad y el género afectan a los ingresos de una
persona de la siguiente manera:

 División por Género: Las partes del violín separadas por el color muestran las
distribuciones de edad para hombres y mujeres en ambos grupos de ingresos.
Esto permite comparar cómo varía la distribución de la edad entre géneros y
grupos de ingresos.
 Densidad de la Edad: El ancho de los "violines" representa la densidad de la
edad, indicando las edades más comunes en cada grupo de ingresos y género.
Las áreas más anchas representan una mayor concentración de individuos en ese
rango de edad.
 Cuartiles Internos: Las líneas dentro del gráfico de violín indican los cuartiles,
ofreciendo una visión detallada de la mediana y los rangos intercuartílicos, lo
cual es útil para entender la dispersión y la tendencia central de los datos.

Este tipo de visualización es conveniente porque permite ver la distribución de los datos
y la densidad, facilitando la comparación entre grupos de ingresos, edades y géneros.
Además, ofrece una visualización clara y detallada de cómo la edad y el género pueden
influir en los ingresos de las personas.

2. Utiliza el siguiente enlace para descargar el OkCupid Dataset. Utiliza un


Jupyter Notebook y el paquete Pandas para abrir el archivo y presentarlo en
formato DataFrame, donde el nombre de las columnas debe corresponder
con el nombre real de las variables.
<https://www.kaggle.com/andrewmvd/okcupid-profiles>

29 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
a. Crea un DataFrame reducido, llamado df_red, a partir del DataFrame
original en el que sólo se consideren las variables “age”, “status”, “sex”,
“orientation”, “body_type”, “diet”, “drinks”, “height”, “income” y “job”.

import pandas as pd
file_path = '/content/okcupid_profiles.csv'

df = pd.read_csv('okcupid_profiles.csv')
df.head()
df_red = df[['age', 'status', 'sex', 'orientation',
'body_type', 'diet', 'drinks', 'height', 'income', 'job']]
df_red.head()

Explicación:

 df[['age', 'status', 'sex', 'orientation', 'body_type', 'diet', 'drinks', 'height',


'income', 'job']]: Selecciona las columnas especificadas y crea un nuevo
DataFrame df_red.
 df_red.head(): Muestra las primeras cinco filas del DataFrame reducido para
verificar que contiene las columnas deseadas.

b. Vamos a transformar este dataset en un dataset de clasificación. El


objetivo de esta clasificación será predecir si cada una de las personas
que aparecen en el dataset trabajan en el ámbito STEM o si no lo hacen.
Recuerda que STEM es el acrónimo de Science, Technology, Engineering
and Mathematics. Para crear el problema de clasificación definiremos una
variable nueva en el DataFrame df_red llamada “is_stem”. Utiliza el
método apply de Python, combinado con una función lambda, para crear
la variable “is_stem” de forma que esta variable valga 1 si la persona
trabaja en estos ámbitos y valga 0 si no trabaja en estos ámbitos.
Considerar como valor 0 los valores faltantes o los casos en los que no se
han aportado respuesta. Eliminar la variable “job” una vez se haya creado
la variable “is_stem”.

import pandas as pd

# Cargar el dataset

file_path = "/content/okcupid_profiles.csv"

df = pd.read_csv(file_path)

# Mostrar las primeras filas del DataFrame

30 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
print(df.head())

# Seleccionar las columnas específicas

columns_to_select = ['age', 'status', 'sex', 'orientation', 'body_type', 'diet', 'drinks',


'height', 'income', 'job']

df_red = df.loc[:, columns_to_select]

# Mostrar las primeras filas del DataFrame reducido

print(df_red.head())

# Crear la columna 'is_stem' utilizando .loc para evitar SettingWithCopyWarning

df_red = df_red.copy()

df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x, str) and any(stem


in x.lower() for stem in ['science', 'technology', 'engineering', 'math']) else 0)

# Mostrar las primeras filas del DataFrame actualizado

print(df_red.head())

# Eliminar la columna 'job'

df_red = df_red.drop(columns=['job'])

# Mostrar las primeras filas del DataFrame actualizado

print(df_red.head())

 Importar la Biblioteca Pandas:


o python
o import pandas as pd
o Este paso importa la biblioteca Pandas, una herramienta esencial para la
manipulación y análisis de datos en Python. Pandas proporciona
estructuras de datos eficientes y herramientas para trabajar con grandes
volúmenes de datos tabulares.
 Cargar el Dataset:
o python
o file_path = "/content/okcupid_profiles.csv"
o df = pd.read_csv(file_path)
o file_path = "/content/okcupid_profiles.csv": Define la ruta del
archivo CSV que contiene el dataset de OkCupid.

31 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o df = pd.read_csv(file_path): Utiliza la función read_csv de


Pandas para cargar el archivo CSV en un DataFrame llamado df. Esta
función lee el contenido del archivo y lo almacena en una estructura de
datos tabular.
 Mostrar las Primeras Filas del DataFrame:
o python
o print(df.head())
o df.head(): Muestra las primeras cinco filas del DataFrame df para
proporcionar una vista preliminar de los datos y verificar que se han
cargado correctamente. Este comando ayuda a identificar las columnas
disponibles y los tipos de datos presentes.
 Seleccionar Columnas Específicas:
o python
o columns_to_select = ['age', 'status', 'sex',
'orientation', 'body_type', 'diet', 'drinks', 'height',
'income', 'job']
o df_red = df.loc[:, columns_to_select]
o columns_to_select: Lista que contiene los nombres de las columnas
que se quieren seleccionar.
o df.loc[:, columns_to_select]: Selecciona un subconjunto de
columnas del DataFrame original df utilizando .loc y crea un nuevo
DataFrame llamado df_red. Estas columnas se consideran relevantes
para el análisis.
 Mostrar las Primeras Filas del DataFrame Reducido:
o python
o print(df_red.head())
o df_red.head(): Muestra las primeras cinco filas del DataFrame
reducido df_red para verificar que solo las columnas especificadas están
presentes en el nuevo DataFrame.
 Crear la Columna is_stem Utilizando .copy():
o python
o df_red = df_red.copy()
o df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if
isinstance(x, str) and any(stem in x.lower() for stem in
['science', 'technology', 'engineering', 'math']) else 0)
o df_red = df_red.copy(): Crea una copia del DataFrame df_red para
asegurar que las operaciones subsiguientes no afecten accidentalmente el
DataFrame original, eliminando así la advertencia
SettingWithCopyWarning.
o df_red['job'].apply(...): Aplica una función lambda a cada valor
en la columna job para crear una nueva columna is_stem.
o La función lambda lambda x: 1 if isinstance(x, str) and
any(stem in x.lower() for stem in ['science',
'technology', 'engineering', 'math']) else 0 verifica si el
valor en la columna job es una cadena de texto (str). Si es una cadena,
convierte el texto a minúsculas y verifica si contiene alguna de las
palabras clave relacionadas con los campos STEM (science, technology,

32 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

engineering, math). Si se encuentra alguna de estas palabras, se asigna el


valor 1; de lo contrario, se asigna 0.
 Mostrar las Primeras Filas del DataFrame Actualizado:
o python
o print(df_red.head())
o df_red.head(): Muestra las primeras cinco filas del DataFrame
actualizado df_red para verificar que la nueva columna is_stem se ha
creado correctamente y contiene los valores esperados.
 Eliminar la Columna job:
o python
o df_red = df_red.drop(columns=['job'])
o df_red.drop(columns=['job']): Elimina la columna job del
DataFrame df_red. Este paso es necesario porque la información
relevante de la columna job ya se ha convertido en la nueva variable
is_stem.
 Mostrar las Primeras Filas del DataFrame Actualizado:
o python
o print(df_red.head())
o df_red.head(): Muestra las primeras cinco filas del DataFrame
actualizado para confirmar que la columna job se ha eliminado y la
estructura del DataFrame es la esperada.
 Siguiendo estos pasos, se transforma el dataset original en un dataset de
clasificación, donde la nueva variable is_stem indica si una persona trabaja en
un campo STEM o no. Cada paso se explica con detalle para asegurar una
comprensión clara del proceso, utilizando métodos seguros para evitar
advertencias y errores comunes en Pandas. Si necesitas más información o tienes
alguna pregunta adicional, ¡no dudes en preguntar! Estoy aquí para ayudarte en
tu aprendizaje de Python.

c. Una vez obtenido el DataFrame anterior, calcular el porcentaje de


instancias que trabajan en el ámbito STEM. Crear un DataFrame llamado X
en el que se consideren todas las variables de df_red excepto “is_stem”. A
partir de df_red, crear un Pandas Series llamado Y que contenga los
valores de la variable “is_stem”.

import pandas as pd

# Cargar el dataset

file_path = "/content/okcupid_profiles.csv"

df = pd.read_csv(file_path)

# Seleccionar las columnas específicas

33 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
columns_to_select = ['age', 'status', 'sex', 'orientation', 'body_type', 'diet',
'drinks', 'height', 'income', 'job']

df_red = df.loc[:, columns_to_select]

# Crear la columna 'is_stem' utilizando .copy() para evitar


SettingWithCopyWarning

df_red = df_red.copy()

df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x, str) and


any(stem in x.lower() for stem in ['science', 'technology', 'engineering',
'math']) else 0)

# Eliminar la columna 'job'

df_red = df_red.drop(columns=['job'])

# Calcular el porcentaje de instancias que trabajan en el ámbito STEM

percentage_stem = df_red['is_stem'].mean() * 100

print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}%')

# Crear el DataFrame X y la Serie Y

X = df_red.drop(columns=['is_stem'])

Y = df_red['is_stem']

# Mostrar las primeras filas de X y Y

print(X.head())

print(Y.head())

1. Importar la Biblioteca Pandas:

python

import pandas as pd

En este paso, la biblioteca Pandas es importada. Pandas es fundamental para la


manipulación y análisis de datos en Python, proporcionando estructuras de datos
eficientes y herramientas para trabajar con grandes volúmenes de datos
tabulares.

34 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

2. Cargar el Dataset:

python

file_path = "/content/okcupid_profiles.csv"
df = pd.read_csv(file_path)

o file_path = "/content/okcupid_profiles.csv": Define la ruta del


archivo CSV que contiene el dataset de OkCupid.
o df = pd.read_csv(file_path): Utiliza la función read_csv de
Pandas para cargar el archivo CSV en un DataFrame llamado df. Esta
función lee el contenido del archivo y lo almacena en una estructura de
datos tabular.
3. Seleccionar Columnas Específicas:

python

columns_to_select = ['age', 'status', 'sex', 'orientation',


'body_type', 'diet', 'drinks', 'height', 'income', 'job']
df_red = df.loc[:, columns_to_select]

o columns_to_select: Contiene los nombres de las columnas que se


desean seleccionar.
o df.loc[:, columns_to_select]: Selecciona un subconjunto de
columnas del DataFrame original df utilizando .loc y crea un nuevo
DataFrame llamado df_red. Estas columnas se consideran relevantes
para el análisis, reduciendo la complejidad del DataFrame.
4. Crear la Columna is_stem Utilizando .copy():

python

df_red = df_red.copy()
df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if
isinstance(x, str) and any(stem in x.lower() for stem in
['science', 'technology', 'engineering', 'math']) else 0)

o df_red = df_red.copy(): Crea una copia del DataFrame df_red para


asegurar que las operaciones subsiguientes no afecten accidentalmente el
DataFrame original, eliminando así la advertencia
SettingWithCopyWarning.
o df_red['job'].apply(...): Aplica una función lambda a cada valor
en la columna job para crear una nueva columna is_stem.
o La función lambda lambda x: 1 if isinstance(x, str) and
any(stem in x.lower() for stem in ['science',
'technology', 'engineering', 'math']) else 0 verifica si el
valor en la columna job es una cadena de texto (str). Si es una cadena,
convierte el texto a minúsculas y verifica si contiene alguna de las
palabras clave relacionadas con los campos STEM (science, technology,

35 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

engineering, math). Si se encuentra alguna de estas palabras, se asigna el


valor 1; de lo contrario, se asigna 0.
5. Eliminar la Columna job:

python

df_red = df_red.drop(columns=['job'])

o df_red.drop(columns=['job']): Elimina la columna job del


DataFrame df_red. Este paso es necesario porque la información
relevante de la columna job ya se ha convertido en la nueva variable
is_stem.
6. Calcular el Porcentaje de Instancias que Trabajan en el Ámbito STEM:

python

percentage_stem = df_red['is_stem'].mean() * 100


print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}
%')

o df_red['is_stem'].mean() * 100: Calcula el porcentaje de personas


que trabajan en el ámbito STEM multiplicando el promedio de is_stem
por 100.
o print(f'Porcentaje de instancias en STEM:
{percentage_stem:.2f}%'): Muestra el porcentaje calculado en un
formato de dos decimales.
7. Crear el DataFrame X y la Serie Y:

python

X = df_red.drop(columns=['is_stem'])
Y = df_red['is_stem']

o df_red.drop(columns=['is_stem']): Crea el DataFrame X


eliminando la columna is_stem.
o df_red['is_stem']: Crea la Serie Y a partir de la columna is_stem.
8. Mostrar las Primeras Filas de X y Y:

python

print(X.head())
print(Y.head())

o X.head(): Muestra las primeras cinco filas del DataFrame X para


verificar que contiene todas las columnas originales excepto is_stem.
o Y.head(): Muestra las primeras cinco filas de la Serie Y para verificar
que contiene los valores de la columna is_stem.

36 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

Este procedimiento transforma el dataset original en un formato adecuado para la


clasificación, donde la variable is_stem indica si una persona trabaja en un campo
STEM. El código incluye la creación de un DataFrame X con todas las variables excepto
is_stem y una Serie Y con los valores de is_stem. Cada paso se explica detalladamente
para asegurar una comprensión clara del proceso. Si necesitas más información o tienes
alguna pregunta adicional, ¡no dudes en preguntar! Estoy aquí para ayudarte en tu
aprendizaje de Python.

d. Utilizar el método de scikit_learn llamado train_test_split para crear dos


DataFrames X_train y X_test y dos Series Y_train e Y_test. El tamaño del
conjunto de test deberá ser el 30% del tamaño del dataset original. La
semilla de números aleatorios deberá ser igual a 42. La división en
conjunto de train y conjunto de test se deberá hacer de manera
estratificada, para asegurar que la proporción entre clases del problema
de clasificación es similar en ambos subconjuntos.

import pandas as pd

from sklearn.model_selection import train_test_split

# Cargar el dataset

file_path = "/content/okcupid_profiles.csv"

df = pd.read_csv(file_path)

# Seleccionar las columnas específicas

columns_to_select = ['age', 'status', 'sex', 'orientation', 'body_type', 'diet', 'drinks',


'height', 'income', 'job']

df_red = df.loc[:, columns_to_select]

# Crear la columna 'is_stem' utilizando .copy() para evitar SettingWithCopyWarning

df_red = df_red.copy()

df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x, str) and any(stem


in x.lower() for stem in ['science', 'technology', 'engineering', 'math']) else 0)

# Eliminar la columna 'job'

df_red = df_red.drop(columns=['job'])

# Calcular el porcentaje de instancias que trabajan en el ámbito STEM

37 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
percentage_stem = df_red['is_stem'].mean() * 100

print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}%')

# Crear el DataFrame X y la Serie Y

X = df_red.drop(columns=['is_stem'])

Y = df_red['is_stem']

# Mostrar las primeras filas de X y Y

print(X.head())

print(Y.head())

# Dividir los datos en conjuntos de entrenamiento y prueba

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3,


random_state=42, stratify=Y)

# Mostrar las proporciones de entrenamiento y prueba

train_stem_proportion = Y_train.mean() * 100

test_stem_proportion = Y_test.mean() * 100

print(f'Proporción de instancias en STEM en el conjunto de entrenamiento:


{train_stem_proportion:.2f}%')

print(f'Proporción de instancias en STEM en el conjunto de prueba:


{test_stem_proportion:.2f}%')

1. mportar la Biblioteca Pandas y Scikit-Learn:

python

import pandas as pd
from sklearn.model_selection import train_test_split

oPandas: Importa la biblioteca Pandas para la manipulación y análisis de


datos.
o Scikit-Learn: Importa la función train_test_split de Scikit-Learn,
que se utilizará para dividir los datos en conjuntos de entrenamiento y
prueba.
2. Cargar el Dataset:

38 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

python

file_path = "/content/okcupid_profiles.csv"
df = pd.read_csv(file_path)

o file_path = "/content/okcupid_profiles.csv": Define la ruta del


archivo CSV que contiene el dataset de OkCupid.
o df = pd.read_csv(file_path): Utiliza la función read_csv de
Pandas para cargar el archivo CSV en un DataFrame llamado df.
3. Seleccionar Columnas Específicas:

python

columns_to_select = ['age', 'status', 'sex', 'orientation',


'body_type', 'diet', 'drinks', 'height', 'income', 'job']
df_red = df.loc[:, columns_to_select]

o columns_to_select: Lista que contiene los nombres de las columnas


que se desean seleccionar.
o df.loc[:, columns_to_select]: Selecciona un subconjunto de
columnas del DataFrame original df utilizando .loc y crea un nuevo
DataFrame llamado df_red.
4. Crear la Columna is_stem Utilizando .copy():

python

df_red = df_red.copy()
df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if
isinstance(x, str) and any(stem in x.lower() for stem in
['science', 'technology', 'engineering', 'math']) else 0)

o df_red = df_red.copy(): Crea una copia del DataFrame df_red para


evitar la advertencia SettingWithCopyWarning.
o df_red['job'].apply(...): Aplica una función lambda a cada valor
en la columna job para crear una nueva columna is_stem.
o La función lambda lambda x: 1 if isinstance(x, str) and
any(stem in x.lower() for stem in ['science',
'technology', 'engineering', 'math']) else 0 verifica si el
valor en la columna job es una cadena de texto (str). Si es una cadena,
convierte el texto a minúsculas y verifica si contiene alguna de las
palabras clave relacionadas con los campos STEM. Si se encuentra
alguna de estas palabras, se asigna el valor 1; de lo contrario, se asigna 0.
5. Eliminar la Columna job:

python

df_red = df_red.drop(columns=['job'])

39 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o df_red.drop(columns=['job']): Elimina la columna job del


DataFrame df_red. Este paso es necesario porque la información
relevante de la columna job ya se ha convertido en la nueva variable
is_stem.
6. Calcular el Porcentaje de Instancias que Trabajan en el Ámbito STEM:

python

percentage_stem = df_red['is_stem'].mean() * 100


print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}
%')

o df_red['is_stem'].mean() * 100: Calcula el porcentaje de personas


que trabajan en el ámbito STEM multiplicando el promedio de is_stem
por 100.
o print(f'Porcentaje de instancias en STEM:
{percentage_stem:.2f}%'): Muestra el porcentaje calculado en un
formato de dos decimales.
7. Crear el DataFrame X y la Serie Y:

python

X = df_red.drop(columns=['is_stem'])
Y = df_red['is_stem']

o df_red.drop(columns=['is_stem']): Crea el DataFrame X


eliminando la columna is_stem.
o df_red['is_stem']: Crea la Serie Y a partir de la columna is_stem.
8. Mostrar las Primeras Filas de X y Y:

python

print(X.head())
print(Y.head())

o X.head():
Muestra las primeras cinco filas del DataFrame X para
verificar que contiene todas las columnas originales excepto is_stem.
o Y.head(): Muestra las primeras cinco filas de la Serie Y para verificar
que contiene los valores de la columna is_stem.
9. Dividir los Datos en Conjuntos de Entrenamiento y Prueba:

python

X_train, X_test, Y_train, Y_test = train_test_split(X, Y,


test_size=0.3, random_state=42, stratify=Y)

o train_test_split(X, Y, test_size=0.3, random_state=42,


stratify=Y): Divide los datos en conjuntos de entrenamiento y prueba.

40 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 test_size=0.3: El 30% de los datos se utilizarán para el


conjunto de prueba.
 random_state=42: Establece una semilla de aleatoriedad para
asegurar que los resultados sean reproducibles.
 stratify=Y: Asegura que la proporción entre las clases de Y sea
similar en ambos subconjuntos (entrenamiento y prueba).
10. Mostrar las Proporciones de Entrenamiento y Prueba:

python

train_stem_proportion = Y_train.mean() * 100


test_stem_proportion = Y_test.mean() * 100
print(f'Proporción de instancias en STEM en el conjunto de
entrenamiento: {train_stem_proportion:.2f}%')
print(f'Proporción de instancias en STEM en el conjunto de
prueba: {test_stem_proportion:.2f}%')

o Y_train.mean() * 100 y Y_test.mean() * 100: Calcula las


proporciones de instancias en STEM en los conjuntos de entrenamiento y
prueba.
o print(f'Proporción de instancias en STEM en el conjunto de
entrenamiento: {train_stem_proportion:.2f}%') y
print(f'Proporción de instancias en STEM en el conjunto de
prueba: {test_stem_proportion:.2f}%'): Muestran las
proporciones calculadas en un formato de dos decimales.

Este procedimiento divide los datos en conjuntos de entrenamiento y prueba de manera


estratificada, asegurando que la proporción entre clases sea similar en ambos
subconjuntos. La semilla de aleatoriedad se establece en 42 para asegurar la
reproducibilidad

e. Comprobar que las proporciones de instancias que trabajan en el ámbito


STEM en el subconjunto de entrenamiento y en el subconjunto de test son
similares.

import pandas as pd

from sklearn.model_selection import train_test_split

# Cargar el dataset

file_path = "/content/okcupid_profiles.csv"

df = pd.read_csv(file_path)

# Seleccionar las columnas específicas

41 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
columns_to_select = ['age', 'status', 'sex', 'orientation', 'body_type', 'diet', 'drinks',
'height', 'income', 'job']

df_red = df.loc[:, columns_to_select]

# Crear la columna 'is_stem' utilizando .copy() para evitar SettingWithCopyWarning

df_red = df_red.copy()

df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x, str) and any(stem


in x.lower() for stem in ['science', 'technology', 'engineering', 'math']) else 0)

# Eliminar la columna 'job'

df_red = df_red.drop(columns=['job'])

# Calcular el porcentaje de instancias que trabajan en el ámbito STEM

percentage_stem = df_red['is_stem'].mean() * 100

print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}%')

# Crear el DataFrame X y la Serie Y

X = df_red.drop(columns=['is_stem'])

Y = df_red['is_stem']

# Dividir los datos en conjuntos de entrenamiento y prueba

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3,


random_state=42, stratify=Y)

# Comprobar las proporciones de instancias en STEM en los subconjuntos de


entrenamiento y prueba

train_stem_proportion = Y_train.mean() * 100

test_stem_proportion = Y_test.mean() * 100

print(f'Proporción de instancias en STEM en el conjunto de entrenamiento:


{train_stem_proportion:.2f}%')

print(f'Proporción de instancias en STEM en el conjunto de prueba:


{test_stem_proportion:.2f}%')

42 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

1. Importar las Bibliotecas Necesarias:

python

import pandas as pd
from sklearn.model_selection import train_test_split

o Pandas: Se utiliza para la manipulación y análisis de datos. Proporciona


estructuras de datos eficientes para trabajar con grandes volúmenes de
datos tabulares.
o Scikit-learn: Es una biblioteca de aprendizaje automático que incluye
herramientas para dividir los datos en conjuntos de entrenamiento y
prueba, entre otras cosas.
2. Cargar el Dataset:

python

file_path = "/content/okcupid_profiles.csv"
df = pd.read_csv(file_path)

o file_path = "/content/okcupid_profiles.csv": Define la ruta del


archivo CSV que contiene el dataset de OkCupid.
o df = pd.read_csv(file_path): Utiliza la función read_csv de
Pandas para cargar el archivo CSV en un DataFrame llamado df. Esta
función lee el contenido del archivo y lo almacena en una estructura de
datos tabular.
3. Seleccionar Columnas Específicas:

python

columns_to_select = ['age', 'status', 'sex', 'orientation',


'body_type', 'diet', 'drinks', 'height', 'income', 'job']
df_red = df.loc[:, columns_to_select]

o columns_to_select: Contiene los nombres de las columnas que se


desean seleccionar.
o df.loc[:, columns_to_select]: Selecciona un subconjunto de
columnas del DataFrame original df utilizando .loc y crea un nuevo
DataFrame llamado df_red. Estas columnas se consideran relevantes
para el análisis, reduciendo la complejidad del DataFrame.
4. Crear la Columna is_stem Utilizando .copy():

python

df_red = df_red.copy()
df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if
isinstance(x, str) and any(stem in x.lower() for stem in
['science', 'technology', 'engineering', 'math']) else 0)

43 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o df_red = df_red.copy(): Crea una copia del DataFrame df_red para


asegurar que las operaciones subsiguientes no afecten accidentalmente el
DataFrame original, eliminando así la advertencia
SettingWithCopyWarning.
o df_red['job'].apply(...): Aplica una función lambda a cada valor
en la columna job para crear una nueva columna is_stem.
o La función lambda lambda x: 1 if isinstance(x, str) and
any(stem in x.lower() for stem in ['science',
'technology', 'engineering', 'math']) else 0 verifica si el
valor en la columna job es una cadena de texto (str). Si es una cadena,
convierte el texto a minúsculas y verifica si contiene alguna de las
palabras clave relacionadas con los campos STEM (science, technology,
engineering, math). Si se encuentra alguna de estas palabras, se asigna el
valor 1; de lo contrario, se asigna 0.
5. Eliminar la Columna job:

python

df_red = df_red.drop(columns=['job'])

o df_red.drop(columns=['job']): Elimina la columna job del


DataFrame df_red. Este paso es necesario porque la información
relevante de la columna job ya se ha convertido en la nueva variable
is_stem.
6. Calcular el Porcentaje de Instancias que Trabajan en el Ámbito STEM:

python

percentage_stem = df_red['is_stem'].mean() * 100


print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}
%')

o df_red['is_stem'].mean() * 100: Calcula el porcentaje de personas


que trabajan en el ámbito STEM multiplicando el promedio de is_stem
por 100.
o print(f'Porcentaje de instancias en STEM:
{percentage_stem:.2f}%'): Muestra el porcentaje calculado en un
formato de dos decimales.
7. Crear el DataFrame X y la Serie Y:

python

X = df_red.drop(columns=['is_stem'])
Y = df_red['is_stem']

o df_red.drop(columns=['is_stem']): Crea el DataFrame X


eliminando la columna is_stem.
o df_red['is_stem']: Crea la Serie Y a partir de la columna is_stem.

44 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

8. Dividir los Datos en Conjuntos de Entrenamiento y Prueba:

python

X_train, X_test, Y_train, Y_test = train_test_split(X, Y,


test_size=0.3, random_state=42, stratify=Y)

o train_test_split(...): Utiliza la función train_test_split de


scikit-learn para dividir los datos en conjuntos de entrenamiento y
prueba.
o test_size=0.3: Especifica que el 30% de los datos se utilizarán para el
conjunto de prueba.
o random_state=42: Establece una semilla de números aleatorios para
asegurar que los resultados sean reproducibles.
o stratify=Y: Asegura que la proporción entre clases en Y sea similar en
los subconjuntos de entrenamiento y prueba.
9. Comprobar las Proporciones de Instancias en STEM en los Subconjuntos
de Entrenamiento y Prueba:

python

train_stem_proportion = Y_train.mean() * 100


test_stem_proportion = Y_test.mean() * 100
print(f'Proporción de instancias en STEM en el conjunto de
entrenamiento: {train_stem_proportion:.2f}%')
print(f'Proporción de instancias en STEM en el conjunto de
prueba: {test_stem_proportion:.2f}%')

o Y_train.mean() * 100 y Y_test.mean() * 100: Calculan las


proporciones de instancias en STEM en los subconjuntos de
entrenamiento y prueba, respectivamente.
o print(f'Proporción de instancias en STEM en el conjunto de
entrenamiento: {train_stem_proportion:.2f}%') y
print(f'Proporción de instancias en STEM en el conjunto de
prueba: {test_stem_proportion:.2f}%'): Muestran las
proporciones calculadas en un formato de dos decimales.

Siguiendo estos pasos, se puede dividir el dataset original en conjuntos de


entrenamiento y prueba de manera estratificada, asegurando que las proporciones de
instancias en el ámbito STEM sean similares en ambos subconjuntos. Cada paso se
explica detalladamente para asegurar una comprensión clara del proceso. Si necesitas
más información o tienes alguna pregunta adicional, ¡no dudes en preguntar! Estoy aquí
para ayudarte en tu aprendizaje de Python.

f. Calcula, para el conjunto de entrenamiento y para el conjunto de test, las


distribuciones de las variables “age”, “orientation”, “body_type”, “height”
e “income”. ¿Son las distribuciones del conjunto de test iguales a las del

45 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
conjunto de entrenamiento en todos los casos? Representa las
distribuciones con histogramas. Cada histograma debe corresponder a
una variable, y se deben representar las distribuciones de test y de
entrenamiento. Para hacer más legible la representación, representa las
distribuciones con un valor de alpha (transparencia) de 0.7. ¿Hace falta
que las dos distribuciones sean iguales en todos los casos? ¿Qué
consideraciones deberemos tomar para no obtener métricas
distorsionadas respecto de la realidad?

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.model_selection import train_test_split

# Cargar el dataset

file_path = "/content/okcupid_profiles.csv"

df = pd.read_csv(file_path)

# Seleccionar las columnas específicas

columns_to_select = ['age', 'status', 'sex', 'orientation', 'body_type', 'diet',


'drinks', 'height', 'income', 'job']

df_red = df.loc[:, columns_to_select]

# Crear la columna 'is_stem' utilizando .copy() para evitar


SettingWithCopyWarning

df_red = df_red.copy()

df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x, str) and


any(stem in x.lower() for stem in ['science', 'technology', 'engineering',
'math']) else 0)

# Eliminar la columna 'job'

df_red = df_red.drop(columns=['job'])

# Calcular el porcentaje de instancias que trabajan en el ámbito STEM

46 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
percentage_stem = df_red['is_stem'].mean() * 100

print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}%')

# Crear el DataFrame X y la Serie Y

X = df_red.drop(columns=['is_stem'])

Y = df_red['is_stem']

# Dividir los datos en conjuntos de entrenamiento y prueba

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3,


random_state=42, stratify=Y)

# Calcular y representar las distribuciones para las variables especificadas

variables = ['age', 'orientation', 'body_type', 'height', 'income']

for var in variables:

plt.figure(figsize=(10, 6))

sns.histplot(X_train[var], color='blue', alpha=0.7, kde=False, label='Train')

sns.histplot(X_test[var], color='red', alpha=0.7, kde=False, label='Test')

plt.title(f'Distribución de {var.capitalize()} en Conjuntos de Entrenamiento


y Prueba')

plt.xlabel(var.capitalize())

plt.ylabel('Frecuencia')

plt.legend()

plt.show()

 mportar las Bibliotecas Necesarias:

python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

47 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 Pandas: Se utiliza para la manipulación y análisis de datos. Proporciona


estructuras de datos eficientes para trabajar con grandes volúmenes de datos
tabulares.
 Matplotlib: Es una biblioteca de visualización que permite crear gráficos
estáticos, animados e interactivos.
 Seaborn: Se basa en Matplotlib y proporciona una interfaz de alto nivel para
dibujar gráficos estadísticos atractivos e informativos.
 Scikit-learn: Incluye herramientas para dividir los datos en conjuntos de
entrenamiento y prueba, entre otras cosas.

 Cargar el Dataset:

python
file_path = "/content/okcupid_profiles.csv"
df = pd.read_csv(file_path)

 file_path = "/content/okcupid_profiles.csv": Define la ruta del archivo


CSV que contiene el dataset de OkCupid.
 df = pd.read_csv(file_path): Utiliza la función read_csv de Pandas para
cargar el archivo CSV en un DataFrame llamado df. Esta función lee el
contenido del archivo y lo almacena en una estructura de datos tabular.

 Seleccionar Columnas Específicas:

python
columns_to_select = ['age', 'status', 'sex', 'orientation',
'body_type', 'diet', 'drinks', 'height', 'income', 'job']
df_red = df.loc[:, columns_to_select]

 columns_to_select: Contiene los nombres de las columnas que se desean


seleccionar.
 df.loc[:, columns_to_select]: Selecciona un subconjunto de columnas del
DataFrame original df utilizando .loc y crea un nuevo DataFrame llamado
df_red. Estas columnas se consideran relevantes para el análisis, reduciendo la
complejidad del DataFrame.

 Crear la Columna is_stem Utilizando .copy():

python
df_red = df_red.copy()
df_red['is_stem'] = df_red['job'].apply(lambda x: 1 if isinstance(x,
str) and any(stem in x.lower() for stem in ['science', 'technology',
'engineering', 'math']) else 0)

 df_red = df_red.copy(): Crea una copia del DataFrame df_red para


asegurar que las operaciones subsiguientes no afecten accidentalmente el
DataFrame original, eliminando así la advertencia SettingWithCopyWarning.

48 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 df_red['job'].apply(...): Aplica una función lambda a cada valor en la


columna job para crear una nueva columna is_stem.
 La función lambda lambda x: 1 if isinstance(x, str) and any(stem in
x.lower() for stem in ['science', 'technology', 'engineering',
'math']) else 0 verifica si el valor en la columna job es una cadena de texto
(str). Si es una cadena, convierte el texto a minúsculas y verifica si contiene
alguna de las palabras clave relacionadas con los campos STEM (science,
technology, engineering, math). Si se encuentra alguna de estas palabras, se
asigna el valor 1; de lo contrario, se asigna 0.

 Eliminar la Columna job:

python
df_red = df_red.drop(columns=['job'])

 df_red.drop(columns=['job']): Elimina la columna job del DataFrame


df_red. Este paso es necesario porque la información relevante de la columna
job ya se ha convertido en la nueva variable is_stem.

 Calcular el Porcentaje de Instancias que Trabajan en el Ámbito STEM:

python
percentage_stem = df_red['is_stem'].mean() * 100
print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}%')

 df_red['is_stem'].mean() * 100: Calcula el porcentaje de personas que


trabajan en el ámbito STEM multiplicando el promedio de is_stem por 100.
 print(f'Porcentaje de instancias en STEM: {percentage_stem:.2f}
%'): Muestra el porcentaje calculado en un formato de dos decimales.

 Crear el DataFrame X y la Serie Y:

python
X = df_red.drop(columns=['is_stem'])
Y = df_red['is_stem']

 df_red.drop(columns=['is_stem']): Crea el DataFrame X eliminando la


columna is_stem.
 df_red['is_stem']: Crea la Serie Y a partir de la columna is_stem.

 Dividir los Datos en Conjuntos de Entrenamiento y Prueba:

python
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
test_size=0.3, random_state=42, stratify=Y)

 train_test_split(...): Utiliza la función train_test_split de scikit-learn


para dividir los datos en conjuntos de entrenamiento y prueba.

49 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

 test_size=0.3: Especifica que el 30% de los datos se utilizarán para el


conjunto de prueba.
 random_state=42: Establece una semilla de números aleatorios para asegurar
que los resultados sean reproducibles.
 stratify=Y: Asegura que la proporción entre clases en Y sea similar en los
subconjuntos de entrenamiento y prueba.

 Calcular y Representar las Distribuciones para las Variables Especificadas:

python
variables = ['age', 'orientation', 'body_type', 'height', 'income']

for var in variables:


plt.figure(figsize=(10, 6))
sns.histplot(X_train[var], color='blue', alpha=0.7, kde=False,
label='Train')
sns.histplot(X_test[var], color='red', alpha=0.7, kde=False,
label='Test')
plt.title(f'Distribución de {var.capitalize()} en Conjuntos de
Entrenamiento y Prueba')
plt.xlabel(var.capitalize())
plt.ylabel('Frecuencia')
plt.legend()
plt.show()

 Variables a Evaluar: Se seleccionan las variables age, orientation,


body_type, height, e income.
 Iterar sobre cada Variable: Para cada variable, se crea una figura de tamaño
10x6, y se generan histogramas para los conjuntos de entrenamiento y prueba.
 sns.histplot(...): Utiliza Seaborn para crear histogramas.
o color='blue' y color='red': Colorean los histogramas de
entrenamiento y prueba en azul y rojo, respectivamente.
o alpha=0.7: Establece la transparencia de los histogramas para facilitar la
visualización de

3. Utiliza el siguiente enlace para descargar el conjunto de datos del Portal de


Datos Abiertos del Ayuntamiento de Madrid sobre accidentes de bicicletas
correspondiente al año 2019. Utiliza un Jupyter Notebook y el paquete
Pandas para abrir el archivo y presentarlo en formato DataFrame, donde el
nombre de las columnas debe corresponder con el nombre real de las
variables.
<https://datos.madrid.es/portal/site/egob/menuitem.c05c1f754a33a9fbe4b2e4
b284f1a5a0/?
vgnextoid=20f4a87ebb65b510VgnVCM1000001d4a900aRCRD&vg
nextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt=d
ef ault>

50 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
a. Utilizando el método apply de Python, junto con una función lambda, crea
una nueva variable en el DatafFrame llamada “hora_int”, de forma que
esa variable represente la hora, sin considerar minutos, en la que cada
accidente se ha producido. Por ejemplo, si un accidente se produce a las
19:43, la variable “hora_int” debe valer 19.

import pandas as pd

# Cargar el dataset desde el archivo CSV

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"

df = pd.read_csv(file_path, sep=';') # Ajustar el delimitador si es


necesario

# Mostrar las primeras filas del DataFrame para verificar la carga correcta

print(df.head())

# Crear la variable 'hora_int' que representa la hora sin considerar


minutos

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')[0]))

# Mostrar las primeras filas del DataFrame actualizado

print(df.head())

1. Importar la Biblioteca Pandas:

python

import pandas as pd

Este paso importa la biblioteca Pandas, que es fundamental para la


manipulación y análisis de datos en Python. Pandas proporciona estructuras de
datos eficientes y herramientas para trabajar con grandes volúmenes de datos
tabulares.

2. Cargar el Dataset:

python

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"
df = pd.read_csv(file_path, sep=';')

51 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
o file_path =
"/path/al/archivo/accidentes_bicicletas_2019.csv": Define la
ruta del archivo CSV que contiene el dataset de accidentes de bicicletas
correspondiente al año 2019.
o df = pd.read_csv(file_path, sep=';'): Utiliza la función
read_csv de Pandas para cargar el archivo CSV en un DataFrame
llamado df. Especifica el separador (sep=';') si el archivo CSV utiliza
un delimitador diferente al estándar (coma). Esta función lee el contenido
del archivo y lo almacena en una estructura de datos tabular.
3. Mostrar las Primeras Filas del DataFrame:

python

print(df.head())

o df.head():
Muestra las primeras cinco filas del DataFrame df para
proporcionar una vista preliminar de los datos y verificar que se han
cargado correctamente. Este comando ayuda a identificar las columnas
disponibles y los tipos de datos presentes.
4. Crear la Variable hora_int Utilizando el Método apply:

python

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')


[0]))

o df['hora'].apply(...): Aplica una función lambda a cada valor en la


columna hora para crear una nueva columna hora_int.
o La función lambda lambda x: int(x.split(':')[0]) toma cada valor
de la columna hora y:
 x.split(':')[0]: Divide el texto en partes utilizando el carácter
: como separador y selecciona la primera parte (la hora).
 int(...): Convierte la parte seleccionada en un número entero,
representando la hora sin considerar los minutos.
5. Mostrar las Primeras Filas del DataFrame Actualizado:

python

print(df.head())

o df.head(): Muestra las primeras cinco filas del DataFrame df para


verificar que la nueva columna hora_int se ha creado correctamente y
contiene los valores esperados.

Siguiendo estos pasos, se puede cargar el dataset de accidentes de bicicletas, crear una
nueva columna hora_int que represente la hora del accidente sin considerar los
minutos, y verificar que los datos se han procesado correctamente. Cada paso se explica

52 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

detalladamente para asegurar una comprensión clara del proceso. Si necesitas más
información o tienes alguna pregunta adicional, ¡no dudes en preguntar! Estoy aquí para
ayudarte en tu aprendizaje de Python.

b. Calcula el número de accidentes que se ha producido en cada hora del


día, sin considerar los minutos. Represéntalos en una Series de Pandas de
forma que las horas estén ordenadas de menor a mayor. Representa esa
Series de Pandas en un gráfico de barras. ¿A qué hora se produce la
mayor cantidad de accidentes? ¿Qué hora suele ser la más tranquila?

import pandas as pd

import matplotlib.pyplot as plt

# Cargar el dataset desde el archivo CSV

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"

df = pd.read_csv(file_path, sep=';') # Ajustar el delimitador si es


necesario

# Crear la variable 'hora_int' que representa la hora sin considerar


minutos

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')[0]))

# Calcular el número de accidentes por cada hora del día

accidentes_por_hora = df['hora_int'].value_counts().sort_index()

# Mostrar la Series de Pandas

print(accidentes_por_hora)

# Representar los datos en un gráfico de barras

plt.figure(figsize=(10, 6))

accidentes_por_hora.plot(kind='bar', color='skyblue')

plt.title('Número de Accidentes por Hora del Día')

plt.xlabel('Hora del Día')

plt.ylabel('Número de Accidentes')

53 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
plt.xticks(rotation=0)

plt.show()

1. Importar las Bibliotecas Necesarias:

python

import pandas as pd
import matplotlib.pyplot as plt

o Pandas: Se utiliza para la manipulación y análisis de datos. Proporciona


estructuras de datos eficientes para trabajar con grandes volúmenes de
datos tabulares.
o Matplotlib: Es una biblioteca de visualización que permite crear gráficos
estáticos, animados e interactivos.
2. Cargar el Dataset:

python

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"
df = pd.read_csv(file_path, sep=';')

o file_path =
"/path/al/archivo/accidentes_bicicletas_2019.csv": Define la
ruta del archivo CSV que contiene el dataset de accidentes de bicicletas
correspondiente al año 2019.
o df = pd.read_csv(file_path, sep=';'): Utiliza la función
read_csv de Pandas para cargar el archivo CSV en un DataFrame
llamado df. Especifica el separador (sep=';') si el archivo CSV utiliza
un delimitador diferente al estándar (coma). Esta función lee el contenido
del archivo y lo almacena en una estructura de datos tabular.
3. Crear la Variable hora_int Utilizando el Método apply:

python

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')


[0]))

o df['hora'].apply(...): Aplica una función lambda a cada valor en la


columna hora para crear una nueva columna hora_int.
o La función lambda lambda x: int(x.split(':')[0]) toma cada valor
de la columna hora y:
 x.split(':')[0]: Divide el texto en partes utilizando el carácter
: como separador y selecciona la primera parte (la hora).
 int(...): Convierte la parte seleccionada en un número entero,
representando la hora sin considerar los minutos.

54 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

4. Calcular el Número de Accidentes por Cada Hora del Día:

python

accidentes_por_hora = df['hora_int'].value_counts().sort_index()

o df['hora_int'].value_counts(): Cuenta el número de ocurrencias de


cada valor en la columna hora_int, que representa la hora del accidente
sin considerar los minutos.
o sort_index(): Ordena los resultados por la hora en orden ascendente.
5. Mostrar la Series de Pandas:

python

print(accidentes_por_hora)

o accidentes_por_hora:
Imprime la Series de Pandas que muestra el
número de accidentes por cada hora del día, ordenados de menor a
mayor.
6. Representar los Datos en un Gráfico de Barras:

python

plt.figure(figsize=(10, 6))
accidentes_por_hora.plot(kind='bar', color='skyblue')
plt.title('Número de Accidentes por Hora del Día')
plt.xlabel('Hora del Día')
plt.ylabel('Número de Accidentes')
plt.xticks(rotation=0)
plt.show()

o plt.figure(figsize=(10, 6)): Crea una nueva figura de tamaño


10x6 para el gráfico.
o accidentes_por_hora.plot(kind='bar', color='skyblue'):
Utiliza Pandas para crear un gráfico de barras a partir de la Series
accidentes_por_hora, coloreando las barras de azul claro.
o plt.title('Número de Accidentes por Hora del Día'): Establece
el título del gráfico.
o plt.xlabel('Hora del Día'): Establece la etiqueta del eje X.
o plt.ylabel('Número de Accidentes'): Establece la etiqueta del eje
Y.
o plt.xticks(rotation=0): Ajusta la rotación de las etiquetas del eje X
para que estén horizontales.
o plt.show(): Muestra el gráfico en pantalla.

Siguiendo estos pasos, se puede cargar el dataset de accidentes de bicicletas, crear una
nueva columna hora_int que represente la hora del accidente sin considerar los
minutos, calcular el número de accidentes por cada hora del día y representarlos en un

55 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

gráfico de barras. Cada paso se explica detalladamente para asegurar una comprensión
clara del proceso.

c. Utiliza el método groupby de Pandas para calcular el número de


accidentes por estado meteorológico. ¿A qué estado meteorológico
corresponde la mayor cantidad de accidentes?

import pandas as pd

# Cargar el dataset desde el archivo CSV

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"

df = pd.read_csv(file_path, sep=';') # Ajustar el delimitador si es necesario

# Crear la variable 'hora_int' que representa la hora sin considerar minutos

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')[0]))

# Calcular el número de accidentes por estado meteorológico

accidentes_por_estado_meteorologico =
df.groupby('estado_meteorologico').size().sort_values(ascending=False)

# Mostrar el número de accidentes por estado meteorológico

print(accidentes_por_estado_meteorologico)

# Representar los datos en un gráfico de barras

accidentes_por_estado_meteorologico.plot(kind='bar', color='skyblue',
figsize=(10, 6))

plt.title('Número de Accidentes por Estado Meteorológico')

plt.xlabel('Estado Meteorológico')

plt.ylabel('Número de Accidentes')

plt.xticks(rotation=45)

plt.show()

56 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

1. Importar la Biblioteca Pandas:

python

import pandas as pd

Este paso importa la biblioteca Pandas, fundamental para la manipulación y


análisis de datos en Python. Pandas proporciona estructuras de datos eficientes y
herramientas para trabajar con grandes volúmenes de datos tabulares.

2. Cargar el Dataset:

python

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"
df = pd.read_csv(file_path, sep=';')

o file_path =
"/path/al/archivo/accidentes_bicicletas_2019.csv": Define la
ruta del archivo CSV que contiene el dataset de accidentes de bicicletas
correspondiente al año 2019.
o df = pd.read_csv(file_path, sep=';'): Utiliza la función
read_csv de Pandas para cargar el archivo CSV en un DataFrame
llamado df. Especifica el separador (sep=';') si el archivo CSV utiliza
un delimitador diferente al estándar (coma). Esta función lee el contenido
del archivo y lo almacena en una estructura de datos tabular.
3. Crear la Variable hora_int Utilizando el Método apply:

python

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')


[0]))

o df['hora'].apply(...): Aplica una función lambda a cada valor en la


columna hora para crear una nueva columna hora_int.
o La función lambda lambda x: int(x.split(':')[0]) toma cada valor
de la columna hora y:
 x.split(':')[0]: Divide el texto en partes utilizando el carácter
: como separador y selecciona la primera parte (la hora).
 int(...): Convierte la parte seleccionada en un número entero,
representando la hora sin considerar los minutos.
4. Calcular el Número de Accidentes por Estado Meteorológico:

python

accidentes_por_estado_meteorologico =
df.groupby('estado_meteorologico').size().sort_values(ascending=
False)

57 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o df.groupby('estado_meteorologico'): Agrupa los datos por la


columna estado_meteorologico.
o .size(): Cuenta el número de ocurrencias en cada grupo.
o .sort_values(ascending=False): Ordena los resultados de mayor a
menor cantidad de accidentes.
5. Mostrar el Número de Accidentes por Estado Meteorológico:

python

print(accidentes_por_estado_meteorologico)

o accidentes_por_estado_meteorologico: Imprime el número de


accidentes por estado meteorológico, ordenados de mayor a menor.
6. Representar los Datos en un Gráfico de Barras:

python

accidentes_por_estado_meteorologico.plot(kind='bar',
color='skyblue', figsize=(10, 6))
plt.title('Número de Accidentes por Estado Meteorológico')
plt.xlabel('Estado Meteorológico')
plt.ylabel('Número de Accidentes')
plt.xticks(rotation=45)
plt.show()

o accidentes_por_estado_meteorologico.plot(kind='bar',
color='skyblue', figsize=(10, 6)): Utiliza Pandas para crear un
gráfico de barras a partir de la Series
accidentes_por_estado_meteorologico, coloreando las barras de
azul claro y estableciendo el tamaño de la figura.
o plt.title('Número de Accidentes por Estado Meteorológico'):
Establece el título del gráfico.
o plt.xlabel('Estado Meteorológico'): Establece la etiqueta del eje
X.
o plt.ylabel('Número de Accidentes'): Establece la etiqueta del eje
Y.
o plt.xticks(rotation=45): Ajusta la rotación de las etiquetas del eje X
para que sean legibles.
o plt.show(): Muestra el gráfico en pantalla.

Siguiendo estos pasos, se puede cargar el dataset de accidentes de bicicletas, agrupar el


número de accidentes por estado meteorológico y determinar a qué estado
meteorológico corresponde la mayor cantidad de accidentes. Cada paso se explica
detalladamente para asegurar una comprensión clara del proceso.

1. Importar la Biblioteca Pandas:

python

58 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
import pandas as pd

Este paso importa la biblioteca Pandas, fundamental para la manipulación y


análisis de datos en Python. Pandas proporciona estructuras de datos eficientes y
herramientas para trabajar con grandes volúmenes de datos tabulares.

2. Cargar el Dataset:

python

file_path = "/path/al/archivo/accidentes_bicicletas_2019.csv"
df = pd.read_csv(file_path, sep=';')

o file_path =
"/path/al/archivo/accidentes_bicicletas_2019.csv": Define la
ruta del archivo CSV que contiene el dataset de accidentes de bicicletas
correspondiente al año 2019.
o df = pd.read_csv(file_path, sep=';'): Utiliza la función
read_csv de Pandas para cargar el archivo CSV en un DataFrame
llamado df. Especifica el separador (sep=';') si el archivo CSV utiliza
un delimitador diferente al estándar (coma). Esta función lee el contenido
del archivo y lo almacena en una estructura de datos tabular.
3. Crear la Variable hora_int Utilizando el Método apply:

python

df['hora_int'] = df['hora'].apply(lambda x: int(x.split(':')


[0]))

o df['hora'].apply(...): Aplica una función lambda a cada valor en la


columna hora para crear una nueva columna hora_int.
o La función lambda lambda x: int(x.split(':')[0]) toma cada valor
de la columna hora y:
 x.split(':')[0]: Divide el texto en partes utilizando el carácter
: como separador y selecciona la primera parte (la hora).
 int(...): Convierte la parte seleccionada en un número entero,
representando la hora sin considerar los minutos.
4. Calcular el Número de Accidentes por Estado Meteorológico:

python

accidentes_por_estado_meteorologico =
df.groupby('estado_meteorologico').size().sort_values(ascending=
False)

o df.groupby('estado_meteorologico'): Agrupa los datos por la


columna estado_meteorologico.
o .size(): Cuenta el número de ocurrencias en cada grupo.

59 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos

o .sort_values(ascending=False): Ordena los resultados de mayor a


menor cantidad de accidentes.
5. Mostrar el Número de Accidentes por Estado Meteorológico:

python

print(accidentes_por_estado_meteorologico)

o accidentes_por_estado_meteorologico: Imprime el número de


accidentes por estado meteorológico, ordenados de mayor a menor.
6. Representar los Datos en un Gráfico de Barras:

python

accidentes_por_estado_meteorologico.plot(kind='bar',
color='skyblue', figsize=(10, 6))
plt.title('Número de Accidentes por Estado Meteorológico')
plt.xlabel('Estado Meteorológico')
plt.ylabel('Número de Accidentes')
plt.xticks(rotation=45)
plt.show()

o accidentes_por_estado_meteorologico.plot(kind='bar',
color='skyblue', figsize=(10, 6)): Utiliza Pandas para crear un
gráfico de barras a partir de la Series
accidentes_por_estado_meteorologico, coloreando las barras de
azul claro y estableciendo el tamaño de la figura.
o plt.title('Número de Accidentes por Estado Meteorológico'):
Establece el título del gráfico.
o plt.xlabel('Estado Meteorológico'): Establece la etiqueta del eje
X.
o plt.ylabel('Número de Accidentes'): Establece la etiqueta del eje
Y.
o plt.xticks(rotation=45): Ajusta la rotación de las etiquetas del eje X
para que sean legibles.
o plt.show(): Muestra el gráfico en pantalla.

Siguiendo estos pasos, se puede cargar el dataset de accidentes de bicicletas, agrupar el


número de accidentes por estado meteorológico y determinar a qué estado
meteorológico corresponde la mayor cantidad de accidentes. Cada paso se explica
detalladamente para asegurar una comprensión clara del proceso.

4. Utiliza el siguiente enlace para descargar el conjunto de datos del Portal de


Datos Abiertos del Ayuntamiento de Madrid sobre calidad del aire
correspondiente al año 2019. Utiliza un Jupyter Notebook y el paquete
Pandas para abrir el archivo y presentarlo en formato DataFrame, donde el

60 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
nombre de las columnas debe corresponder con el nombre real de las
variables.
<https://datos.madrid.es/portal/site/egob/menuitem.c05c1f754a33a9fbe4b2e4
b284f1a5a0/?
vgnextoid=aecb88a7e2b73410VgnVCM2000000c205a0aRCRD&v
gnextchannel=374512b9ace9f310VgnVCM100000171f5a0aRCRD&vgnextfmt
=d efault>

a. Crea un DataFrame df_no_e4 en el que se tengan en cuenta únicamente


las medidas de óxido de nitrógeno medidas en la estación 4. Si es
necesario, consulta el documento de descripción de los datos, aportado en
el mismo enlace que aparece en el enunciado, para saber cómo filtrar las
columnas.

b. Utiliza el método stack de Pandas para transformar el DataFrame de


forma que contenga el índice y una única columna, llamada ‘est_4’. Los
valores del índice deben ser, en formato datetime, todos los días del año
2019. Los valores de la única columna deben ser los valores medidos de
óxido de nitrógeno en la estación 4 en cada uno de los días de 2019.

c. Representa los valores medidos de óxido de nitrógeno en la estación 4 en


una gráfica de líneas, de forma que se pueda apreciar la serie temporal.
¿En qué fechas se aprecia mayor contaminación por óxido de nitrógeno?

d. Repite los pasos de los apartados a y b utilizando los valores de óxido de


nitrógeno medidos en las estaciones 8, 11 y 16, creando los DataFrames
df_no_e8, df_no_e11, df_no_e16. Une todas las series temporales que has
obtenido en un único DataFrame llamado df_no_total. Este DataFrame
debe tener por índice todos los días del año 2019, en formato datetime, y
debe tener cuatro columnas, representando los valores de óxido de
nitrógeno medidos en las estaciones 4, 8, 11 y 16.

e. Representa gráficamente el contenido del DataFrame df_no_total. Utiliza


todas las opciones de representación (leyenda, títulos de eje, grid...), que
consideres necesarias para comunicar adecuadamente el contenido de la
gráfica.

f. ¿Están correlacionados los valores de la contaminación por óxido de


nitrógeno medidos en las diferentes estaciones? Basa tu respuesta en las
conclusiones que saques de la gráfica que has representado en el
apartado anterior. También, calcula la correlación numérica utilizando el
método corr de Pandas. ¿Confirman los valores numéricos la conclusión
que has sacado a partir de las gráficas?

2. Detalles de la entrega

▪ Las respuestas de la actividad se deberán entregar en un Jupyter Notebook en


el que se haya respondido a cada apartado en una celda independiente, en el
orden de las preguntas de este documento. El código de cada celda se debe

61 © Copyright Universidad Europea. Todos los derechos reservados


Procesamiento de datos

Actividad. Valores faltantes y análisis preliminar de los


datos
poder ejecutar para comprobar las respuestas aportadas. Las preguntas
teóricas se deben responder en una celda de formato texto.

▪ Subir de forma grupal el documento a la actividad en el campus virtual.

62 © Copyright Universidad Europea. Todos los derechos reservados

También podría gustarte