import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Ancho = 12 pulgadas
# Largo = 6 pulgadas
plt.rcParams['figure.figsize'] = (12, 6)
# Utilizar la función read_csv para cargar el archivo
df = pd.read_csv("computer_book.csv")
df.shape
# Ver las primeras 5 líneas del archivo
df.head(5)
# Ver las últimas 5 líneas del archivo
df.tail(5)
# Ver filas 0, 1, 260 y 270 del dataset.
df.iloc[[0, 1, 260, 270]]
# Descripción de las columnas numéricas del dataset
df.describe()
# Información más computacional del dataset
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 271 entries, 0 to 270
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Rating 271 non-null float64
1 Reviews 271 non-null int64
2 Book_title 271 non-null object
3 Description 271 non-null object
4 Number_Of_Pages 271 non-null int64
5 Type 271 non-null object
6 Price 271 non-null float64
dtypes: float64(2), int64(2), object(3)
memory usage: 14.9+ KB
df_copy = df.copy()
del df_copy["Description"]
del df_copy["Number_Of_Pages"]
del df_copy["Type"]
df_copy.head()
df_copy = df.copy()
columnas_que_queremos = ["Rating", "Reviews", "Book_title"]
df_copy = df_copy[columnas_que_queremos]
df_copy.head()
def CalificacionLibro(rating):
if rating >= 4.5:
return 'Muy buena'
if rating >= 4:
return 'Buena'
if rating >= 3.5:
return 'Normal'
return 'Mala'
print(CalificacionLibro(1))
print(CalificacionLibro(5))
Mala
Muy buena
df['Calificacion'] = df['Rating'].apply(CalificacionLibro)
df.head()
precio_por_calificacion = df.groupby('Calificacion')['Price'].mean()
print(precio_por_calificacion)
Calificacion
Buena 54.025343
Mala 50.960695
Muy buena 58.243873
Normal 55.544662
Name: Price, dtype: float64
precio_por_calificacion = df.groupby('Calificacion')['Price'].mean()
# Graficamos ahora el arreglo resultante
ax = precio_por_calificacion.plot.bar(
color = 'cyan',
title = 'Precio promedio por calificación'
)
ax.set_xlabel("Calificación")
ax.set_ylabel("Precio promedio")
plt.show()
numero_pagina_por_calificacion = df.groupby('Calificacion')['Number_Of_Pages'].mean()
# Si hacemos barh en vez de bar, tendremos el gráfico de forma horizontal.
ax = numero_pagina_por_calificacion.plot.barh(
color = 'magenta',
title = 'Número de páginas promedio por Calificación'
)
ax.set_xlabel("Calificación")
ax.set_ylabel("Número de páginas promedio")
plt.show()
numero_pagina_por_calificacion = df.groupby('Calificacion')['Number_Of_Pages'].mean()
# Nueva línea para ordenar
numero_pagina_por_calificacion = numero_pagina_por_calificacion.sort_values()
ax = numero_pagina_por_calificacion.plot.barh(
color = 'magenta',
title = 'Número de páginas promedio por Calificación'
)
ax.set_xlabel("Calificación")
ax.set_ylabel("Número de páginas promedio")
plt.show()
# Veremos la distribución de la variable Number_Of_Pages (número de páginas)
# con un histograma
ax = sns.distplot(df["Number_Of_Pages"])
/shared-libs/python3.7/py/lib/python3.7/site-packages/seaborn/distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
ax = sns.histplot(df["Number_Of_Pages"])
ax = sns.histplot(df["Number_Of_Pages"], kde=True)
# Ahora, por defecto ya no veremos la función de densidad de probabilidad.
# Si queremos agregarla, usamos el atributo kde = True.
sns.histplot(
df[df.Calificacion == "Buena"].Number_Of_Pages,
color="purple",
label="Número de páginas libros Buenos"
)
sns.histplot(
df[df.Calificacion == "Normal"].Number_Of_Pages,
color="orange",
label="Número de páginas libros Normales"
)
plt.legend()
plt.show()
# Veremos la distribución de la variable Price (precio en dolares) con un gráfico de caja.
ax = sns.boxplot(df.Price)
/shared-libs/python3.7/py/lib/python3.7/site-packages/seaborn/_decorators.py:43: FutureWarning: Pass the following variable as a keyword arg: x. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.
FutureWarning
ax = sns.boxplot(x=df.Price)
ax = sns.boxplot(
y=df.Price,
color="Cyan"
)
sns.boxplot(
x="Type",
y="Price",
data=df,
palette="Set2"
)
# Antes - sns.boxplot(x="Type", y="Price", data=df, palette="Set2")
sns.boxplot(
x="Price",
y="Type",
data=df,
palette="Set2"
)
plt.show()
sns.violinplot(
x="Price",
y="Type",
data=df,
palette="Set1"
)
sns.violinplot(
y=df.Price,
color="red"
)
plt.show()
fig, charts = plt.subplots(1,2, sharey=True)
sns.boxplot(y=df.Price, color="cyan", ax=charts[0])
sns.violinplot(y=df.Price, color="yellow", ax=charts[1])
fig.suptitle('Boxplot VS Violinplot')
# Agrupamos por el dato en común y contamos cuantas propinas hay por dato
calificacion_distribucion = df.groupby("Calificacion").size()
print(calificacion_distribucion)
print()
calificacion_distribucion = calificacion_distribucion / calificacion_distribucion.sum()
print(calificacion_distribucion)
Calificacion
Buena 167
Mala 11
Muy buena 12
Normal 81
dtype: int64
Calificacion
Buena 0.616236
Mala 0.040590
Muy buena 0.044280
Normal 0.298893
dtype: float64
pie_chart = plt.pie(calificacion_distribucion)
# Se agrega la leyenda en donde se le entrega la lista de cada segmento circular una lista de strings
# que será el nombre asignado a cada elemento y le damos un título a la leyenda
plt.legend(
pie_chart[0],
calificacion_distribucion.index,
title="Calificación",
loc='upper left',
bbox_to_anchor=(1, 1)
)
#Se asigna un título al gráfico
plt.title("Proporcion de propinas por sexo")
plt.show()
calificacion_distribucion = df.groupby("Calificacion").size()
tipo_distribucion = df.groupby("Type").size()
fig, charts = plt.subplots(2,1)
# Definimos cada gráfico
charts[0].pie(calificacion_distribucion)
charts[1].pie(tipo_distribucion)
# Se agrega la leyenda a cada gráfico.
charts[0].legend(
calificacion_distribucion.index,
title="Calificación",
loc='upper left',
bbox_to_anchor=(1, 1)
)
charts[1].legend(
tipo_distribucion.index,
title="Tipos",
loc='upper left',
bbox_to_anchor=(1, 1)
)
# Se asigna el título a cada sub-gráfico
charts[0].set_title("Clasificación del libro")
charts[1].set_title("Tipo de libro")
#Se asigna un título al gráfico
fig.suptitle("Proporcion de clasificación y tipo de libros")
plt.show()
def Comentado(reviews):
if reviews >= 600:
return "Demasiado"
if reviews >= 50:
return "Lo esperado"
return "Casi Nada"
df_2 = df.copy()
df_2["Comentado"] = df_2["Reviews"].apply(Comentado)
df_agrupado_2 = df_2.groupby(["Type", "Comentado"]).size()
df_agrupado_2
df_agrupado_2 = df_agrupado_2.reset_index()
print(df_agrupado_2.columns)
# Cambiar nombre
df_agrupado_2.columns = ["Type", "Comentado", "Cantidad"]
# Ver como queda ahora
df_agrupado_2
Index(['Type', 'Comentado', 0], dtype='object')
# Esta función solo genera los gráficos sin datos, ahora falta indicar con qué llenar cada gráfico
grid = sns.FacetGrid(
data=df_agrupado_2,
col="Comentado",
col_wrap=3
)
grid.map(plt.barh, "Type", "Cantidad")
# Agregamos el label a los ejes
grid.set_axis_labels("Cantidad", "Tipo")
# Visualizar el gráfico
plt.show()
# col_order Para indicar el orden
grid = sns.FacetGrid(
data=df_agrupado_2,
col="Comentado",
col_wrap=3,
col_order=["Demasiado", "Lo esperado", "Casi Nada"]
)
grid.map(plt.barh, "Type", "Cantidad")
grid.set_axis_labels("Cantidad", "Tipo")
plt.show()
df_agrupado = df.groupby(["Type", "Calificacion"])["Reviews"].mean()
df_agrupado
df_agrupado_sin_index = df_agrupado.reset_index()
df_agrupado_sin_index.head()
df_pivoteado = df_agrupado_sin_index.pivot(index="Type", columns="Calificacion", values="Reviews")
df_pivoteado
df_pivoteado.fillna(0, inplace=True)
df_pivoteado
Ahora usamos la función `heatmap` de seaborn para construir el gráfico.
# sns.heatmap recibe el dataset indexado y crea un mapa de calor
ax = sns.heatmap(df_pivoteado)
sns.heatmap(
df_pivoteado,
annot=True,
fmt="f",
annot_kws={'size': 10},
cmap='summer', # coolwarm
linewidths=.5,
center=200
)