Descripción:
Se tiene datos de una compañia Ecommerce que vende ropa online. Esta empresa también tiene un servicio de consejería o personal Stylist. Se puede ordenar las ropas que se deseen, a través de App o Web.
La empresa quiere decidir si enfocarse en la experiencia de la APP o en la web, en base a los datos de clientes. La variable a predecir es Yearly Amount Spent.
Importar pandas, numpy, matplotlib, y seaborn. Colocar %matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
Se trabajará con el archivo de clientes de la compañia. La información que se tiene es de Email, Dirección, etc. Pero también tiene variables numéricas:
Lee el archivo csv (Ecommerce_Customers.csv) de clientes en un Dataframe llamado clientes.
url = "https://raw.githubusercontent.com/eduardool/MaestriaCienciaDatos/main/datasets/Ecommerce_Customers.csv"
clientes = pd.read_csv(url)
Mostrar el encabezado de clientes, verificar sus métodos info() y describe().
clientes.head()
Address | Avatar | Avg. Session Length | Time on App | Time on Website | Length of Membership | Yearly Amount Spent | ||
---|---|---|---|---|---|---|---|---|
0 | mstephenson@fernandez.com | 835 Frank Tunnel\nWrightmouth, MI 82180-9605 | Violet | 34.497268 | 12.655651 | 39.577668 | 4.082621 | 587.951054 |
1 | hduke@hotmail.com | 4547 Archer Common\nDiazchester, CA 06566-8576 | DarkGreen | 31.926272 | 11.109461 | 37.268959 | 2.664034 | 392.204933 |
2 | pallen@yahoo.com | 24645 Valerie Unions Suite 582\nCobbborough, D... | Bisque | 33.000915 | 11.330278 | 37.110597 | 4.104543 | 487.547505 |
3 | riverarebecca@gmail.com | 1414 David Throughway\nPort Jason, OH 22070-1220 | SaddleBrown | 34.305557 | 13.717514 | 36.721283 | 3.120179 | 581.852344 |
4 | mstephens@davidson-herman.com | 14023 Rodriguez Passage\nPort Jacobville, PR 3... | MediumAquaMarine | 33.330673 | 12.795189 | 37.536653 | 4.446308 | 599.406092 |
clientes.describe()
Avg. Session Length | Time on App | Time on Website | Length of Membership | Yearly Amount Spent | |
---|---|---|---|---|---|
count | 500.000000 | 500.000000 | 500.000000 | 500.000000 | 500.000000 |
mean | 33.053194 | 12.052488 | 37.060445 | 3.533462 | 499.314038 |
std | 0.992563 | 0.994216 | 1.010489 | 0.999278 | 79.314782 |
min | 29.532429 | 8.508152 | 33.913847 | 0.269901 | 256.670582 |
25% | 32.341822 | 11.388153 | 36.349257 | 2.930450 | 445.038277 |
50% | 33.082008 | 11.983231 | 37.069367 | 3.533975 | 498.887875 |
75% | 33.711985 | 12.753850 | 37.716432 | 4.126502 | 549.313828 |
max | 36.139662 | 15.126994 | 40.005182 | 6.922689 | 765.518462 |
clientes.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 500 entries, 0 to 499 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Email 500 non-null object 1 Address 500 non-null object 2 Avatar 500 non-null object 3 Avg. Session Length 500 non-null float64 4 Time on App 500 non-null float64 5 Time on Website 500 non-null float64 6 Length of Membership 500 non-null float64 7 Yearly Amount Spent 500 non-null float64 dtypes: float64(5), object(3) memory usage: 31.4+ KB
Para el resto del ejercicio solo usar los datos numéricos del archivo CSV.
Usar seaborn para crear un jointplot que compare las columnas Time on Website y Yearly Amount Spent. La correlación tiene sentido?
sns.set_palette("GnBu_d")
sns.set_style('whitegrid')
# Más tiempo en el site, más dinero gastado.
sns.jointplot(x='Time on Website',y='Yearly Amount Spent',data=clientes)
<seaborn.axisgrid.JointGrid at 0x79b733dee9e0>
Hacer lo mismo pero con la columna Time on App.
sns.jointplot(x='Time on App',y='Yearly Amount Spent',data=clientes)
<seaborn.axisgrid.JointGrid at 0x79b733a94af0>
Explora estos tipos de relaciones sobre el conjunto de datos entero. Usar pairplot para recrear el gráfico abajo.
sns.pairplot(clientes)
<seaborn.axisgrid.PairGrid at 0x79b7335ac6d0>
Basado en el gráfico cual sería la características más correlacionada con Yearly Amount Spent?
# Rpta: Length of Membership
Crear un grafo de modelo lineal (usando lmplot de seaborn) de Yearly Amount Spent vs. Length of Membership.
sns.lmplot(x='Length of Membership',y='Yearly Amount Spent',data=clientes)
<seaborn.axisgrid.FacetGrid at 0x79b73204c8b0>
Define la variable X como las características numéricas de clientes, la variable $y$ igual a la columna "Yearly Amount Spent" column.
clientes.columns
Index(['Email', 'Address', 'Avatar', 'Avg. Session Length', 'Time on App', 'Time on Website', 'Length of Membership', 'Yearly Amount Spent'], dtype='object')
y = clientes['Yearly Amount Spent']
X = clientes[['Avg. Session Length', 'Time on App','Time on Website', 'Length of Membership']]
Usar model_selection.train_test_split de sklearn para dividir los datos en conjuntos de entrenamiento y prueba. Definir el test_size=0.3 y random_state=101
from sklearn.model_selection import train_test_split
X_entrenamiento, X_prueba, y_entrenamiento, y_prueba = train_test_split(X, y, test_size=0.3, random_state=101)
Usando datos de entrenamiento
Importar LinearRegression de sklearn.linear_model
from sklearn.linear_model import LinearRegression
Crear una instancia de un modelo LinearRegression() llamado lm.
lm = LinearRegression()
Entrenar(fit) lm usando los datos de entrenamiento.
lm.fit(X_entrenamiento,y_entrenamiento)
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LinearRegression()
Imprimir los coeficientes (parámetros del modelo)
# Parámetros
print('Parámetros: \n', lm.coef_)
Parámetros: [25.98154972 38.59015875 0.19040528 61.27909654]
Dado el modelo entrenado, evaluar su desempeño en el conjunto de prueba.
Usar lm.predict() para predecir el conjunto X_prueba.
predicciones = lm.predict(X_prueba)
Crear un scatterplot de los valores de prueba reales versus valores predichos.
plt.scatter(y_prueba,predicciones)
plt.xlabel('Y prueba (real)')
plt.ylabel('Y predicho')
Text(0, 0.5, 'Y predicho')
Calcula las métricas MAE, MSE, y RMSE.
from sklearn import metrics
print('MAE:', metrics.mean_absolute_error(y_prueba, predicciones))
print('MSE:', metrics.mean_squared_error(y_prueba, predicciones))
print('RMSE:', np.sqrt(metrics.mean_squared_error(y_prueba, predicciones)))
MAE: 7.228148653430826 MSE: 79.81305165097427 RMSE: 8.933815066978624
Graficar un histograma de los residuos para tener la seguridad que están normalmente distribuidos. Usar distplot de seaborn, o plt.hist().
sns.distplot((y_prueba-predicciones),bins=50);
<ipython-input-27-6e4c8cab2e38>:1: UserWarning: `distplot` is a deprecated function and will be removed in seaborn v0.14.0. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). For a guide to updating your code to use the new functions, please see https://gist.github.com/mwaskom/de44147ed2974457ad6372750bbe5751 sns.distplot((y_prueba-predicciones),bins=50);
Se enfocará en el app o en el website? o eso no importa y Membership Time es lo relevante?
Producir el dataframe:
parametros = pd.DataFrame(lm.coef_,X.columns)
parametros.columns = ['Parámetro']
parametros
Parámetro | |
---|---|
Avg. Session Length | 25.981550 |
Time on App | 38.590159 |
Time on Website | 0.190405 |
Length of Membership | 61.279097 |
Cómo se interpretan estos parámetros / coeficientes?
Debe enfocarse más en la APP o en el website?
Hay dos opciones: mejora el website para igualar el desempeño de APP, o mejora la APP dado que es la que está funcionando mejor.
Depende de otros factores de la compañia, tal vez sea necesario explorar la relación entre Length of Membership y el APP o website antes de concluir algo.