Análisis de los 25 retailers más grandes de Estados Unidos
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('largest_us_retailers.csv')
df.head()
I. Preguntas del negocio
df_sorted = df.sort_values('Sales', ascending=0)
df_sorted_no_main = df_sorted[1:]
main_company = df_sorted['Company'][0]
main_sales = df_sorted['Sales'][0]
average_no_main = df_sorted_no_main['Sales'].mean()
print("Compañía dominante: " + main_company)
print("Ventas compañía dominante: " + str(main_sales))
print("Promedio de ventas sin compañía dominante: " + str(average_no_main))
print("Factor compañía dominante sobre promedio: " + str(main_sales / average_no_main))
primary_color = '#f95d6a'
secondary_color = '#003f5c'
accent_color = '#ffa600'
sns.set_theme()
f1, ax = plt.subplots(figsize=(12, 7))
sales_plot = sns.barplot(y='Company', x='Sales', data=df_sorted_no_main, color=primary_color)
plt.xlabel('Ventas (millones de dólares)')
plt.ylabel('Compañía')
plt.title('Ventas (se excluye a compañía dominante)')
sales_plot.axvline(average_no_main, color=secondary_color, linewidth=2)
f2, ax = plt.subplots(figsize=(12, 7))
sales_plot_with_main = sns.barplot(y='Company', x='Sales', data=df_sorted, color=primary_color)
plt.xlabel('Ventas (millones de dólares)')
plt.ylabel('Compañía')
plt.title('Ventas (incluye compañía dominante)')
sales_plot_with_main.axvline(average_no_main, color=secondary_color, linewidth=2)
plt.figure(figsize=(14,7))
sns.histplot(x='Sales', data=df, bins=12, color=primary_color)
plt.xlabel('Ventas (millones de dólares)')
plt.ylabel('Frecuencia')
plt.title('Histograma de ventas de compañías')
most_companies_by_sales = df[df['Sales'] < 125000]
range_min = most_companies_by_sales['Sales'].min()
range_max = most_companies_by_sales['Sales'].max()
percentage_in_range = len(most_companies_by_sales) / len(df)
print(f"Rango: {str(range_min)} - {str(range_max)}")
print(f"Porcentaje compañías: {percentage_in_range}")
plt.figure(figsize=(14,7))
sns.histplot(x='Sales', data=df, bins=36, color=primary_color)
plt.xlabel('Ventas (millones de dólares)')
plt.ylabel('Frecuencia')
plt.title('Histograma de ventas de compañías')
most_companies_by_sales = df[df['Sales'] < 50000]
range_min = most_companies_by_sales['Sales'].min()
range_max = most_companies_by_sales['Sales'].max()
percentage_in_range = len(most_companies_by_sales) / len(df)
print(f"Rango: {str(range_min)} - {str(range_max)}")
print(f"Porcentaje compañías: {percentage_in_range}")
df_valid_stores = df.dropna(subset=['Stores'])
percentage_unknown_stores = (len(df) - len(df_valid_stores)) / len(df)
print(f"Porcentaje compañías sin tiendas físicas: {percentage_unknown_stores}")
plt.figure(figsize=(14,7))
sns.histplot(x='Stores', data=df_valid_stores, bins=12, color=primary_color)
plt.xlabel('Tiendas físicas')
plt.ylabel('Frecuencia')
plt.title('Histograma de tiendas físicas de compañías')
most_companies_by_stores = df_valid_stores[df_valid_stores['Stores'] < 5000]
range_min = most_companies_by_stores['Stores'].min()
range_max = most_companies_by_stores['Stores'].max()
percentage_in_range = len(most_companies_by_stores) / len(df)
print(f"Rango: {str(range_min)} - {str(range_max)}")
print(f"Porcentaje compañías: {percentage_in_range}")
plt.figure(figsize=(14,7))
sns.histplot(x='Stores', data=df_valid_stores, bins=36, color=primary_color)
plt.xlabel('Tiendas físicas')
plt.ylabel('Frecuencia')
plt.title('Histograma de tiendas físicas de compañías')
most_companies_by_stores = df_valid_stores[df_valid_stores['Stores'] < 2500]
range_min = most_companies_by_stores['Stores'].min()
range_max = most_companies_by_stores['Stores'].max()
percentage_in_range = len(most_companies_by_stores) / len(df)
print(f"Rango: {str(range_min)} - {str(range_max)}")
print(f"Porcentaje compañías: {percentage_in_range}")
df_clean = df.dropna(subset=['Sales', 'Stores'])
f, ax = plt.subplots(figsize=(7, 7))
sns.scatterplot(x='Stores', y='Sales', data=df_clean, color=secondary_color)
plt.xlabel('Tiendas físicas')
plt.ylabel('Ventas (millones de dólares)')
plt.title('Ventas vs Tiendas físicas')
correlation = df_clean.corr()['Stores']['Sales']
print(f"Correlación: {correlation}")
import itertools
def highest_corr(df, max_num_of_hidden_outliers):
max_corr = 0
df_max_corr = df
min_corr = 0
df_min_corr = df
for num_of_hidden_outliers in range(max_num_of_hidden_outliers + 1):
num_of_rows = len(df) - num_of_hidden_outliers
initial_indices = range(len(df))
index_combinations = itertools.combinations(initial_indices, num_of_rows)
for index_combination in index_combinations:
df_hidden_outliers = df.iloc[list(index_combination), :]
corr = df_hidden_outliers.corr()['Stores']['Sales']
if corr > max_corr:
max_corr = corr
df_max_corr = df_hidden_outliers
if corr < min_corr:
min_corr = corr
df_min_corr = df_hidden_outliers
return df_max_corr, max_corr, df_min_corr, min_corr
df_max_corr, max_corr, df_min_corr, min_corr = highest_corr(df_clean, 3)
hidden_data_max = len(df_clean) - len(df_max_corr)
hidden_data_min = len(df_clean) - len(df_min_corr)
print(f"Eliminando {hidden_data_max} se obtiene correlación máxima {max_corr}")
print(f"Eliminando {hidden_data_min} se obtiene correlación mínima {min_corr}")
f, ax = plt.subplots(figsize=(7, 7))
sns.scatterplot(x='Stores', y='Sales', data=df_max_corr, color=secondary_color)
plt.xlabel('Tiendas físicas')
plt.ylabel('Ventas (millones de dólares)')
plt.title('Ventas vs Tiendas físicas')
correlation = df_max_corr.corr()['Stores']['Sales']
print(f"Correlación: {correlation}")
hidden_data = pd.concat([df_clean, df_max_corr, df_max_corr]).drop_duplicates(keep=False)
hidden_data
min_sales = df['Sales'].min()
max_sales = df['Sales'].max()
print(f"Rango: {min_sales} - {max_sales}")
df_sorted_by_stores = df.sort_values('Stores', ascending=0)
f1, ax = plt.subplots(figsize=(12, 7))
colors = [accent_color for _ in range(5)] + [primary_color for _ in range(len(df)-5)]
sns.barplot(y='Company', x='Stores', data=df_sorted_by_stores, palette=colors)
plt.xlabel('Tiendas físicas')
plt.ylabel('Compañía')
plt.title('Compañías con más tiendas físicas')
df_sorted_by_sales = df.sort_values('Sales', ascending=0)
top5_companies_by_stores = df_sorted_by_stores[:5]
print("Compañías con más tiendas físicas: ")
for company in top5_companies_by_stores['Company']:
print("* " + company)
df_sorted_by_sales = df.sort_values('Sales', ascending=0)
top5_companies_by_sales = df_sorted_by_sales[:5]
companies_in_both_top5 = pd.merge(top5_companies_by_sales, top5_companies_by_stores, how='inner')
print("Compañías en top5 de ventas y top5 de tiendas: ")
for company in companies_in_both_top5['Company']:
print("* " + company)
df_total_sales_by_category = df.groupby(['Category']).sum().sort_values('Sales', ascending=0)
f1, ax = plt.subplots(figsize=(12, 7))
colors = [accent_color] + [primary_color for _ in range(len(df_total_sales_by_category)-1)]
sns.barplot(y=df_total_sales_by_category.index, x='Sales', data=df_total_sales_by_category, palette=colors)
plt.xlabel('Ventas Totales (millones de dólares)')
plt.ylabel('Categoría de compañía')
plt.title('Ventas totales por categoría')
df_average_sales_by_category = df.groupby(['Category']).mean().sort_values('Sales', ascending=0)
f1, ax = plt.subplots(figsize=(12, 7))
colors = [accent_color] + [primary_color for _ in range(len(df_average_sales_by_category)-1)]
sns.barplot(y=df_average_sales_by_category.index, x='Sales', data=df_average_sales_by_category, palette=colors)
plt.xlabel('Ventas Promedio (millones de dólares)')
plt.ylabel('Categoría de compañía')
plt.title('Ventas promedio por categoría')
print("-- Ventas totales --")
print(df_total_sales_by_category[df_total_sales_by_category.index == 'Supercenters']['Sales'])
print("-- Ventas promedio --")
print(df_average_sales_by_category[df_average_sales_by_category.index == 'Supercenters']['Sales'])
df_sorted_by_sales_stores = df.dropna(subset=(['Sales/Avg. Store'])).sort_values('Sales/Avg. Store', ascending=0)
f1, ax = plt.subplots(figsize=(12, 7))
colors = [accent_color] + [primary_color for _ in range(len(df_sorted_by_sales)-1)]
sns.barplot(y='Company', x='Sales/Avg. Store', data=df_sorted_by_sales_stores, palette=colors)
plt.xlabel('Ventas (millones de dólares) / Cantidad de tiendas físicas')
plt.ylabel('Compañía')
plt.title('Ventas en relación a cantidad de tiendas físicas')
print("Mayor venta en relación a cantidad de tiendas físicas: "
+ str(df_sorted_by_sales_stores['Sales/Avg. Store'].iloc[0])
+ " (" + str(df_sorted_by_sales_stores['Company'].iloc[0]) + ")")
df_online = df[np.isnan(df['Stores'])]
df_online
df_group_by_online = df.groupby(np.isnan(df['Stores'])).mean().sort_values('Sales', ascending=0)
df_group_by_online['online'] = np.where(df_group_by_online.index, "Solo online", "Incluye tiendas físicas")
f1, ax = plt.subplots(figsize=(12, 2))
sns.barplot(y='online', x='Sales', data=df_group_by_online, color=primary_color)
plt.xlabel('Ventas Promedio (millones de dólares)')
plt.ylabel('¿Sólo online?')
plt.title('Ventas promedio según tipo de tiendas')
df_sorted = df.sort_values('Sales', ascending=0)
df_sorted_no_main = df_sorted[1:]
df_group_by_online = df_sorted_no_main.groupby(np.isnan(df['Stores'])).mean().sort_values('Sales', ascending=0)
df_group_by_online['online'] = np.where(df_group_by_online.index, "Solo online", "Incluye tiendas físicas")
f1, ax = plt.subplots(figsize=(12, 2))
sns.barplot(y='online', x='Sales', data=df_group_by_online, color=primary_color)
plt.xlabel('Ventas Promedio (millones de dólares)')
plt.ylabel('¿Sólo online?')
plt.title('Ventas promedio según tipo de tiendas')
df_count_by_category = df.groupby('Category').size().sort_values(ascending=False)
f1, ax = plt.subplots(figsize=(12, 5))
sns.barplot(y=df_count_by_category.index, x=df_count_by_category.values, color=primary_color)
plt.xlabel('Cantidad de compañías')
plt.ylabel('Categoría')
plt.title('Compañías por categoría')
grocery_data = df[df['Category'] == 'Grocery']
f, ax = plt.subplots(figsize=(7, 7))
sns.scatterplot(x='Stores', y='Sales', data=grocery_data, color=secondary_color)
plt.xlabel('Tiendas físicas')
plt.ylabel('Ventas (millones de dólares)')
plt.title('Compañías de comestibles: Ventas vs Tiendas físicas')
correlation = df_max_corr.corr()['Stores']['Sales']
print(f"Correlación: {correlation}")