Taller Práctico¶
Descripción del proyecto¶
Introducción¶
Cada vez que realizamos un análisis, es fundamental formular hipótesis que podamos luego validar o refutar. A veces, las aceptamos; en otras ocasiones, las rechazamos. Para tomar decisiones acertadas, una empresa debe comprender si sus suposiciones son correctas.
En este proyecto, se compararán las preferencias musicales de las ciudades de Tangananica y Tangananá. Analizaremos los datos para poner a prueba las hipótesis planteadas y comparar el comportamiento de los usuarios en ambas ciudades.
Descripción de los datos¶
Los datos se almacenan en el archivo music_project.xlsx
, separado en las pestañas Monday
, Wednesday
y Friday
.
Cada pestaña, contiene las siguiente información:
Columna | Descripción | Tipo de Datos |
---|---|---|
userID |
Id. de usuario | object |
Track |
Título de la canción | object |
artist |
Nombre del cantante o grupo | object |
genre |
Género musical | object |
City |
Ciudad del usuario | object |
time |
Hora exacta en la que se escuchó la canción | object |
Day |
Día de la semana | object |
Ejercicios¶
Hipótesis a verificar¶
- La actividad de los usuarios difiere según el día de la semana y dependiendo de la ciudad.
- Los lunes por la mañana, los habitantes de Tangananica y Tangananá escuchan diferentes géneros. Lo mismo ocurre con los viernes por la noche.
- Los oyentes de Tangananica y Tangananá tienen preferencias distintas. En Tangananica prefieren el pop mientras que en Tangananá hay más aficionados al rap.
Solución del problema¶
A continuación se le presentan una series de paso a paso para resolver el caso de uso.
- Para ello tiene que agregar el correspondiente código en donde diga
#FIXME
. - Seguir las indicaciones que se les iran proporcionando.
Leer datos
- Imprimir por pantalla el nombre de cada una de las hojas del archivo
music_project.xlsx
. - Leer cada una de las hojas como un dataframe y juntarlos en un solo dataframe denominado
df
.
# librerias
import pandas as pd
# Especificar la ruta del archivo Excel
excel_file = 'https://raw.githubusercontent.com/fralfaro/MADS-Workshops/main/docs/TallerPandas/data/music_project_cl.xlsx'
# Lee los nombres de las hojas
nombres_hojas = #FIXME
# Imprimir la lista con el nombre de las hojas en excel
nombres_hojas
# Leer archivos
df_monday = #FIXME (usar 'pd.read_excel')
df_wednesday = #FIXME (usar 'pd.read_excel')
df_friday = #FIXME (usar 'pd.read_excel')
# Juntar los DataFrames en uno solo
df = pd.concat([df_monday, df_wednesday, df_friday], ignore_index=True)
# Renombrar Columnas
df.columns = df.columns.str.lower().str.strip()
df = df.rename(columns = {
'userid':'user_id',
})
# Mostrar las primeras filas del DataFrame
df.head(10)
# Obtener las dimensiones del DataFrame
print("Dimensiones del DataFrame:")
print(df.shape)
# Mostrar información del DataFrame
print("Información del DataFrame:")
df.info()
Podemos ver tres problemas con el estilo en los nombres de las columnas:
- Algunos nombres están en mayúsculas, otros en minúsculas.
- Hay espacios en algunos nombres.
Detecte usted mismo el tercer problema y descríbalo aquí
.
El número de valores de columna es diferente. Esto significa que los datos contienen valores faltantes.
Conclusiones: ...
Missing Values
Primero, encuentra el número de valores que faltan en la tabla. Para hacerlo, usa dos métodos pandas
:
> Ejercicio: Calcular valores faltantes por columna
#FIXME (usar '.isnull().sum()')
No todos los valores faltantes afectan la investigación. Por ejemplo, los valores que faltan en track
y artist
no son críticos. Simplemente puede reemplazarlos con clear markers.
Pero los valores faltantes en 'genre'
pueden afectar la comparación de las preferencias musicales en Tangananica y Tangananá. En la vida real, sería útil conocer las razones por las que faltan los datos e intentar compensarlos. Pero no tenemos esa oportunidad en este proyecto. Así que tendrás que:
- Complete estos valores faltantes con marcadores
- Evalúe cuánto pueden afectar los valores faltantes a sus cálculos
Reemplace los valores faltantes en 'track'
, 'artist'
y 'genre'
con la cadena 'unknown'
. Para hacer esto, cree la lista columns_to_replace
, recorra sobre ella con for
y reemplace los valores que faltan en cada una de las columnas:
# Recorrer los nombres de las columnas y reemplazar los valores faltantes con 'unknown'
columns_to_replace = ['track', 'artist', 'genre']
for col in columns_to_replace:
df[col] = #FIXME (usar '.fillna()')
> Ejercicio: Cuente los valores faltantes nuevamente
#FIXME (usar '.isnull().sum()')
Duplicates
Encuentra el número de duplicados obvios en la tabla usando un comando:
> Ejercicio: Contar duplicados.
#FIXME (usar '.duplicated().sum()')
Llame al método pandas
para deshacerse de los duplicados obvios:
> Ejercicio: Eliminar duplicados.
#FIXME (usar '.drop_duplicates().sum()')
> Ejercicio: Contar duplicados nuevamente.
#FIXME (usar '.duplicated().sum()')
Ahora deshazte de los duplicados implícitos en la columna genre
. Por ejemplo, el nombre de un género se puede escribir de diferentes formas. Dichos errores también afectarán el resultado.
Imprima una lista de nombres de género únicos, ordenados en orden alfabético. Para hacerlo:
- Recuperar la columna DataFrame deseada
- Aplicarle un método de clasificación
- Para la columna ordenada, llame al método que devolverá todos los valores de columna únicos
> Ejercicio: Mostrar y ordenar nombres de 'genre' únicos. (hint
: usar comando sorted()
y .unique()
)
#FIXME (usar 'sorted()' y '.unique()')
Mire a través de la lista para encontrar duplicados implícitos del género hiphop
. Estos pueden ser nombres escritos incorrectamente o nombres alternativos del mismo género.
Verá los siguientes duplicados implícitos:
hip
hop
hip-hop
Para deshacerte de ellos, declara la función replace_wrong_genres()
con dos parámetros:
wrong_genres=
— la lista de duplicadoscorrect_genre=
— la cadena con el valor correcto
La función debería corregir los nombres en la columna 'genre'
de la tabla df
, es decir, reemplazar cada valor de la lista wrong_genres
con el valor en correct_genre
.
# Funcion para reemplazar duplicados implicitos
def replace_wrong_genres(df,wrong_genres,correct_genre):
for string in wrong_genres:
df.loc[lambda x: x['genre']==string,'genre'] = correct_genre
return df
Llame a replace_wrong_genres()
y pásele argumentos para que borre los duplicados implícitos (hip
, hop
y hip-hop
) y los reemplace con hiphop
:
# Eliminar duplicados implicitos
wrong_genres = ['hip','hop','hip-hop']
correct_genre = 'hiphop'
df = #FIXME (aplicar la funcion 'replace_wrong_genres' a 'df')
> Ejercicio: Mostrar y ordenar nombres de 'genre' únicos. (hint
: usar comando sorted()
y .unique()
)
#FIXME (usar 'sorted()' y '.unique()')
Conclusiones: ...
Hipótesis¶
Hipótesis 1: comparar el comportamiento de los usuarios en dos ciudades
Según la primera hipótesis, los usuarios de Tangananica y Tangananá escuchan música de manera diferente. Pruebe esto usando los datos de tres días de la semana: lunes, miércoles y viernes.
- Divide a los usuarios en grupos por ciudad.
- Compara cuántas pistas reprodujo cada grupo el lunes, miércoles y viernes.
Por el bien de la práctica, realice cada cálculo por separado.
Evaluar la actividad de los usuarios en cada ciudad. Agrupe los datos por ciudad y encuentre la cantidad de canciones que se reproducen en cada grupo.
Contando las pistas reproducidas en cada ciudad
Tangananica tiene más pistas reproducidas que Tangananá. Pero eso no implica que los ciudadanos de Tangananica escuchen música con más frecuencia. Esta ciudad es simplemente más grande y hay más usuarios.
Ahora agrupe los datos por día de la semana y encuentre el número de pistas reproducidas los lunes, miércoles y viernes.
> Ejercicio: Calculo de pistas reproducidas en cada uno de los tres días. (hint
: usar comando groupby()
)
#FIXME (usar '.groupby()' sobre 'day' y aplicar a 'genre' )
El miércoles es el día más tranquilo en general. Pero si consideramos las dos ciudades por separado, podríamos llegar a una conclusión diferente.
Has visto cómo funciona la agrupación por ciudad o día. Ahora escribe una función que se agrupe por ambos.
Cree la función number_tracks()
para calcular la cantidad de canciones reproducidas en un día y una ciudad determinados. Requerirá dos parámetros:
- día de la semana
- nombre de la ciudad
En la función, use una variable para almacenar las filas de la tabla original, donde:
- El valor de la columna
'day'
es igual al parámetroday
- El valor de la columna
'city'
es igual al parámetrocity
Aplicar filtrado consecutivo con indexación lógica.
Luego calcule los valores de la columna 'user_id'
en la tabla resultante. Almacene el resultado en una nueva variable. Devuelve esta variable de la función.
# Agrupar los datos por 'city' y 'day', y contar el número de ocurrencias de 'genre' en cada grupo
df_city_day = df.groupby(['city', 'day'])['genre'].count().reset_index()
# Pivotar la tabla para tener 'city' como índice, 'day' como columnas, y la suma de 'genre' como valores
pivot_df = df_city_day.pivot_table(index='city', columns='day', values='genre', aggfunc='sum').reset_index()
# Reordenar las columnas según el orden especificado
pivot_df = pivot_df[['city', 'Monday', 'Wednesday', 'Friday']]
# Imprimir el DataFrame resultante
pivot_df
Conclusiones: ...
Hipótesis 2: música al principio y al final de la semana
Según la segunda hipótesis, el lunes por la mañana y el viernes por la noche, los ciudadanos de Tangananica escuchan géneros diferentes a los que disfrutan los usuarios de Tangananá.
Obtenga los dataframes (asegúrese de que el nombre de su tabla combinada coincida con el dataframe proporcionado en los dos bloques de código a continuación):
- Para Tangananica —
tangananica_general
- Para Tangananá —
tanganana_general
# Definir 'tangananica_general', filtrar por ciudad igual a Tangananica
tangananica_general = #FIXME (usar '.loc()' y filtrar por ciudad objetivo )
# Definir 'tanganana_general', filtrar por ciudad igual a Tanganana
tanganana_general = #FIXME (usar '.loc()' y filtrar por ciudad objetivo )
Escribe la función genre_weekday()
con cuatro parámetros:
- Una tabla para datos
- El día de la semana
- La primera marca de tiempo, en formato 'hh:mm'
- La última marca de tiempo, en formato 'hh:mm'
La función debe devolver información sobre los 15 géneros más populares en un día determinado dentro del período entre las dos marcas de tiempo.
# Declarar la funcion 'genero_weekday'
def genre_weekday(df, day, time1, time2):
genre_list = df[(df['day'] == day) & (df['time'] > time1) & (df['time'] < time2)]
genre_list_sorted = genre_list.groupby('genre')['genre'].count().sort_values(ascending=False).head(10)
return genre_list_sorted
> Ejercicio: Llamar a la funcion para el lunes por la mañana en Tangananica ('07:00:00', '11:00:00').
#FIXME (ejemplo directo: 'genre_weekday(tangananica_general, 'Monday', '07:00:00', '11:00:00')')
> Ejercicio: Llamar a la funcion para el lunes por la mañana en Tangananá ('07:00:00', '11:00:00').
#FIXME (aplicar lo mismo que el caso anterior)
> Ejercicio: Llamar a la funcion para el viernes por la noche en Tangananica ('17:00:00', '23:00:00')
#FIXME (aplicar lo mismo que el caso anterior)
> Ejercicio: Llamar a la funcion para el viernes por la noche en Tangananá ('17:00:00', '23:00:00')
#FIXME (aplicar lo mismo que el caso anterior)
Conclusiones: ...
Hipótesis 3: preferencias de género en Tangananica y Shelbyvill
Hipótesis: Tangananá ama la música rap. A los ciudadanos de Tangananica les gusta más el pop.
Agrupa la tabla tangananica_general
por género y encuentra el número de canciones reproducidas para cada género con el método count()
. Luego ordene el resultado en orden descendente y guárdelo en tangananica_genres
.
# Contar cuántas veces aparece cada género musical en el DataFrame 'tangananica_general'
# y ordenar los resultados de forma descendente.
tangananica_genres = tangananica_general.groupby('genre')['genre'].count().sort_values(ascending=False)
> Ejercicio: Mostrar las primeras 10 filas de 'tangananica_genres'
#FIXME (usar '.head(10)')
Ahora haz lo mismo con los datos de Tangananá.
Agrupa la tabla tanganana_general
por género y encuentra el número de canciones reproducidas para cada género. Luego ordene el resultado en orden descendente y guárdelo en la tabla tanganana_genres
:
# Contar cuántas veces aparece cada género musical en el DataFrame 'tanganana_general'
# y ordenar los resultados de forma descendente.
tanganana_genres = tanganana_general.groupby('genre')['genre'].count().sort_values(ascending=False)
> Ejercicio: Mostrar las primeras 10 filas de 'tanganana_genres'
#FIXME (usar '.head(10)')
Conclusiones: ...
Conclusiones Generales del caso de estudio¶
Conclusiones deben contener información desde la limpieza de datos hasta la validación o refutación de las tres hipótesis