Análisis de los 25 retailers más grandes de Estados Unidos
# Importar librerías a emplear
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import plotly.express as px
sns.set_theme(context='notebook',palette='magma')
# Cargar archivo como dataframe
retail = pd.read_csv('/work/retail/largest_us_retailers_9b00dc73-a938-46cd-af17-fcb2bd67301f.csv')
retail
Companyobject
Walmart US4%
Kroger4%
23 others92%
Salesint64
16592 - 658119
0
Walmart US
658119
1
Kroger
115037
2
Costco
90048
3
Home Depot
83976
4
Walgreen Boots
78924
5
CVS incl. Target
77792
6
Amazon
71687
7
Target
71208
8
Lowe's
60311
9
Albertsons
56829
retail.dtypes
retail.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 25 entries, 0 to 24
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Company 25 non-null object
1 Sales 25 non-null int64
2 Stores 23 non-null float64
3 Sales/Avg. Store 23 non-null float64
4 Store Count Growth 23 non-null float64
5 Category 24 non-null object
dtypes: float64(3), int64(1), object(2)
memory usage: 1.3+ KB
retail.describe()
Salesfloat64
Storesfloat64
count
25
23
mean
71063.08
3466.565217
std
125405.7276
4038.708714
min
16592
231
25%
24402
1029
50%
34980
1828
75%
71687
4242
max
658119
14250
I. Preguntas del negocio
sns.histplot(data = retail, x = 'Sales')
# Walmart es el atípico con mayores ingresos por Ventas del dataset con un valor de 658.119 dólares
retail.sort_values(by = ['Sales'], ascending = False)
Companyobject
Sam's Club4%
Costco4%
23 others92%
Salesint64
16592 - 658119
10
Sam's Club
56828
2
Costco
90048
0
Walmart US
658119
7
Target
71208
24
Meijer
16592
8
Lowe's
60311
3
Home Depot
83976
15
Ahold
26903
1
Kroger
115037
23
Delhaize
18201
# Calculo del promedio quitando dato atipico Walmart
print('Promedio de la distribución completa: {:.0f} millones de USD'.format(retail['Sales'].mean()))
print('Promedio quitando Walmart: {:.0f} millones de USD'.format(retail['Sales'].sort_values(ascending = False)[1:25].mean()))
Promedio de la distribución completa: 71063 millones de USD
Promedio quitando Walmart: 46602 millones de USD
# Otra forma de calcular el promedio usando numpy
np.sort(np.array(retail['Sales']))[0:24].mean()
# Eliminar Walmart, dato atípico en relación entre Tiendas y Ventas
retail_2 = retail.drop(index=0)
fig, ax = plt.subplots(2,1, figsize = (10,10))
sns.histplot(data = retail_2, x = 'Sales', ax=ax[0], kde=True)
sns.boxplot(data = retail_2, x = 'Sales', ax=ax[1], palette='viridis')
ax[0].set_title('Ventas en millones de dólares')
fig.suptitle('Distibución de ventas para los 25 retails más importantes de USA')
print(retail['Sales'].median())
print(retail_2['Sales'].median())
print(np.quantile(retail_2['Sales'],[0.25,0.75]))
34980.0
34694.0
[23860. 71327.75]
fig, ax = plt.subplots(2,1, figsize = (10,10))
sns.histplot(data = retail_2, x = 'Stores', ax=ax[0], kde=True)
sns.boxplot(data = retail_2, x = 'Stores', ax=ax[1], palette='viridis')
fig.suptitle('Distibución de cantidad de tiendas para los 25 retails más importantes de USA')
print(retail['Stores'].median())
print(retail_2['Stores'].median())
print(np.percentile(retail_2.dropna()['Stores'],[25,75]))
1828.0
1800.0
[ 959. 3640.75]
fig, ax = plt.subplots(1,2,figsize = (20,6))
sns.regplot(data = retail, x = 'Stores', y = 'Sales', ax = ax[0])
sns.regplot(data = retail_2, x = 'Stores', y = 'Sales',ax = ax[1])
fig.suptitle('Gráfico de dispersión entre la cantidad de tiendas y las Ventas en millones de dólares')
ax[0].set_title('Tendencia con Walmart')
ax[1].set_title('Tendencia sin Walmart')
fig2 = px.scatter(retail, x = 'Stores',y= 'Sales', hover_name='Company', trendline='ols')
fig2.show()
results = px.get_trendline_results(fig2)
print(results)
results.px_fit_results.iloc[0].summary()
px_fit_results
0 <statsmodels.regression.linear_model.Regressio...
print('Coeficiente de correlación de Pearson datos completos: {:.4f}'.format(retail['Sales'].corr(retail['Stores'], method='pearson')))
print('Coeficiente de correlación de Pearson quitando Walmart: {:.4f}'.format(retail_2['Sales'].corr(retail_2['Stores'], method='pearson')))
Coeficiente de correlación de Pearson datos completos: 0.0633
Coeficiente de correlación de Pearson quitando Walmart: 0.0229
rango_full = max(retail['Sales'])-min(retail['Sales'])
rango = max(retail_2['Sales'])-min(retail_2['Sales'])
print(rango_full)
print(rango)
641527
98445
# 5 compañias con mayor cantidad de tiendas
mas_tiendas = retail.nlargest(5,'Stores')
mas_tiendas
Companyobject
Salesint64
20
Dollar Tree
21464
19
Dollar General
22234
5
CVS incl. Target
77792
4
Walgreen Boots
78924
0
Walmart US
658119
# Compañías top 5 en cantidad de tiendas que pertenecen al top 5 en ventas
mas_tiendas = retail.nlargest(5,'Stores')
mas_ventas = retail.nlargest(5,'Sales')
interseccion = pd.merge(mas_tiendas, mas_ventas, how='inner', on= 'Company')
interseccion
Companyobject
Sales_xint64
0
Walgreen Boots
78924
1
Walmart US
658119
sns.barplot(data=retail_2, y='Category',x = 'Sales')
sns.boxplot(data = retail_2, x = 'Sales',y='Category')
tiendas_ordenadas = list(retail.set_index('Company').sort_values(by='Sales/Avg. Store', ascending=False).index)
fix, ax = plt.subplots(figsize = (8,6))
sns.barplot(data = retail, x = 'Sales/Avg. Store', y= 'Company', order = tiendas_ordenadas)
# Se aplica un mapeo a ambos dataframes dependiendo si en la columna Stores tienen
retail['Online_sales'] = retail['Stores'].isna().map({False:'No',True: 'Si'})
retail_2['Online_sales'] = retail['Stores'].isna().map({False:'No',True: 'Si'})
retail[retail['Online_sales'] == 'Si' ]
Companyobject
Salesint64
6
Amazon
71687
11
Apple incl. Online
37664
fig, ax = plt.subplots(1,3, figsize = (20,8))
sns.barplot(data = retail_2, x ='Online_sales',y='Sales', ax = ax[0])
sns.boxplot(data = retail_2, x = 'Online_sales', y = 'Sales', palette='viridis', ax= ax[1])
sns.histplot(data = retail_2, x = 'Sales', palette='viridis', ax= ax[2], hue= 'Online_sales',kde=True)