# Importo librerías aquí
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#Venn
from matplotlib_venn import venn2, venn2_circles, venn2_unweighted
from matplotlib_venn import venn3, venn3_circles
from matplotlib import pyplot as plt
%matplotlib inline
# Importo datos aquí
df = pd.read_csv('largest_us_retailers.csv')
df
# Verifico tipos de datos para ver si hay que realizar algún cambio de tipo de dato
df.dtypes
# Analizo los datos faltantes que puedan afectar las métricas
df.info()
# Vista general de las principales medidas estadísticas
df.describe()
Una vez que se tiene una idea global de los datos y que no hay que hacer alguna transformación avanzamos con las preguntas de negocios.
I. Preguntas del negocio
# Organizo las ventas de manera descendente
df_sorted_sales = df.sort_values('Sales', ascending=False)
df_sorted_sales
# Tomo todas las filas a partir del 1 de la columna 1 (Sales) con indexlocation
no_dominant = df_sorted_sales.iloc[1:,:]
no_dominant
# Visualizo la distribución de los datos con la mediana y el promedio marcados
plt.subplots(figsize=(11,8))
box = sns.boxplot(x= "Sales", data=no_dominant)
plt.text(48000,0, "Promedio", color="white")
plt.text(25000,-.1, "Mediana", color="black")
plt.axvline(no_dominant["Sales"].mean(), color='w', linestyle=':', linewidth=2)
plt.title("Distribución de Sales")
plt.show()
no_dominant_prom = no_dominant["Sales"].mean()
no_dominant_med = no_dominant["Sales"].median()
diferencia = no_dominant_prom - no_dominant_med
print(f'El promedio de Sales es de ${round(no_dominant_prom,2):,} y la mediana es de ${round(no_dominant_med,2):,} teniendo una diferencia de ${round(diferencia, 2)}:,')
# Distribucion de las ventas coloreadas por categorías
plt.subplots(figsize=(11,8))
sns.histplot( data=no_dominant, x='Sales', hue="Category")
plt.title("Distribución de las ventas por categorías")
plt.show()
# Organnizo el dataset por numero de Stores y elimino los elementos vacíos
df_sorted_stores = df.sort_values("Stores", ascending=True).dropna()
df_sorted_stores
# Calculo la mediana de la cantidad de tiendas que tiene cada empresa
median_stores = df_sorted_stores["Stores"].median()
std_stores = df_sorted_stores["Stores"].std()
q1 = df_sorted_stores["Stores"].quantile(.25)
q2 = df_sorted_stores["Stores"].quantile(.75)
iqr = q2 - q1
print(median_stores, std_stores, iqr)
# Creo una barra horizontal para leer mejor el nombre de las tiendas
plt.subplots(figsize=(11,8))
plt.barh(df_sorted_stores["Company"], df_sorted_stores["Stores"])
plt.title("Número total de tiendas por empresa")
plt.xlabel("Número de Stores")
plt.text((median_stores+30),0, f"<--Mediana {median_stores}", color="black")
plt.axvline(median_stores, color='black', linestyle=':', linewidth=3)
plt.show()
# Creo histograma para ver la distribución del número de tiendas
plt.subplots(figsize=(11,8))
sns.histplot( data=df_sorted_stores, x='Stores', bins=5)
plt.title("Distribución del número de tiendas")
plt.show()
# Creo matriz para comparar todas las variables numéricas y ver si existe alguna relación
matrix = df_sorted_stores.corr()
matrix
plt.subplots(figsize=(11,8))
sns.scatterplot(data=df_sorted_stores, x="Stores", y="Sales", size="Category", hue="Category")
plt.title("Relación entre Store/Sales")
plt.show()
# Mediana de las ventas
median_sales = df["Sales"].median()
std_sales = df["Sales"].std()
q1_sales = df["Sales"].quantile(.25)
q2_sales = df["Sales"].quantile(.75)
iqr = q2_sales - q1_sales
print(median_sales, std_stores, q1_sales, q2_sales,iqr)
plt.subplots(figsize=(11,8))
sns.boxplot(data= no_dominant, x="Sales")
plt.title("Rango de ventas")
plt.show()
# Organizo por tiendas de mayor a menor y tomo las primeras 5 tiendas
top_5_stores = df_sorted_stores.sort_values("Stores", ascending=False)[:5]
top_5_stores
# Organizo las ventas de mayor a menor y tomo las primeras 5
top_5_sales = df.sort_values("Sales", ascending=False)[:5]
top_5_sales
# Convierto a sets y los comparo para ver las empresas que estan en los dos conjuntos
compare = set(top_5_stores["Company"]) & set(top_5_sales["Company"])
compare
# Grafico la interseócion entre los 2 grupos
plt.subplots(figsize=(11,8))
venn2(subsets = (5, 5, 2), set_labels = ('Top 5 Stores', 'Top 5 Sales'), set_colors=('b', 'g'), alpha = 0.5)
plt.text(-0.1,-0.1, f"-Walgreen Boots \n -Walmart US", color="black")
plt.show()
# Cuento la cantidad de registros que hay por cada categoría
df["Category"].value_counts(sort=True)
# Muestro la proporción de cada categoría
df["Category"].value_counts(sort=True, normalize=True)
# Muestro la venta total agrupada por categoria y compañia
category_grouped= df_sorted_stores.groupby(["Category","Company"])["Sales"].sum()
category_grouped
# Cambio los indeces agrupando por cateogria y ventas para ordenarlos por ventas
ind = df.set_index(["Category", "Sales"])
ind.sort_index(level="Sales", ascending=False)
# Creo una barra horizontal para leer mejor el nombre de las categorias
plt.subplots(figsize=(11,8))
plt.barh(df_sorted_sales["Category"][:3], df_sorted_sales["Sales"][:3])
plt.title("Número total de ventas por cateogría")
plt.xlabel("Ventas")
plt.show()
#Analizo el DF en base a ventas
df_sorted_sales
# Muestro un grafico de barras apiladas para comparar número de tiendas con ventas
labels = df_sorted_sales["Company"]
stores = df_sorted_sales["Stores"].fillna(1) #Hay valores nulos asi que los rellené con 1 para que se mostraran las ventas
sales = df_sorted_sales["Sales"]
width = 0.35
fig, ax = plt.subplots(figsize=(11,8))
ax.bar(labels, stores, width, label='Stores')
ax.bar(labels, sales, width, bottom=stores,
label='Sales')
ax.set_ylabel('Sales/Stores')
ax.set_title('Relación ventas/tiendas (con Walmart US dominante)')
plt.xticks(rotation=90)
ax.legend()
plt.show()
# Grafico las mismas barras pero sin el outlier de Walmart
labels = df_sorted_sales["Company"][1:]
stores = df_sorted_sales["Stores"][1:].fillna(1)
sales = df_sorted_sales["Sales"][1:]
width = 0.35
fig, ax = plt.subplots(figsize=(11,8))
ax.bar(labels, stores, width, label='Stores')
ax.bar(labels, sales, width, bottom=stores,
label='Sales')
ax.set_ylabel('Sales/Stores')
ax.set_title('Relación ventas/tiendas (sin Walmart US como outlier)')
plt.xticks(rotation=90)
ax.legend()
plt.show()
# Muestro registros sin Stores
df_no_stores = df[np.isnan(df_sorted_sales["Stores"])]
df_no_stores
# Sumo todos los valores de Sales
sum_total = df["Sales"].sum()
print(f'Las ventas generadas por todas las tiendas es de ${sum_total:,}')
# Organizo las los valores de Growth
df_growth_5 = df.sort_values("Store Count Growth", ascending=False)[:5]
df_growth_5
plt.subplots(figsize=(11,8))
plt.bar(df_growth_5["Company"], df_growth_5["Store Count Growth"])
plt.title("Empresas con mayor porcentaje de crecimiento en tiendas")
plt.ylabel("%")
plt.show()
# Organizo los valores de Sales/Avg
df_avg_5 = df.sort_values("Sales/Avg. Store", ascending=False)[:5]
df_avg_5
plt.subplots(figsize=(11,8))
plt.bar(df_avg_5["Company"], df_avg_5["Sales/Avg. Store"])
plt.title("Empresas con mayor promedio en ventas")
plt.ylabel("Sales/Avg")
plt.show()
plt.subplots(figsize=(11,8))
plt.bar(df_growth_5["Category"], df_growth_5["Store Count Growth"])
plt.title("Categoria de las tiendas con mayor porcentaje de crecimiento en tiendas")
plt.ylabel("%")
plt.show()
# Comparo la interección entre los dos grupos
compare_G_S = set(df_growth_5["Company"]) & set(df_avg_5["Company"])
compare_G_S
# Grafico la interseócion entrelos 2 grupos
plt.subplots(figsize=(11,8))
venn2(subsets = (5, 5, 1), set_labels = ('Top 5 Growth', 'Top 5 Sales/Avg'), set_colors=('b', 'g'), alpha = 0.5)
plt.text(-0.04,-0.1, f"Meijer", color="black")
plt.show()