In [113]:
# Import module
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from datetime import datetime
In [162]:
train = pd.read_csv("../data/train.csv", parse_dates=['srch_ci', 'srch_co'], nrows=100000)
train['date_time'] = train['date_time'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
train.info()
In [156]:
# Usuarios únicos
users = train['user_id'].unique()
# Número de reservas
books = train[(train['is_booking']==1)]
# Usuarios que reservaron
users_b = books['user_id'].unique()
# Distribución de número de registros por usuarios
logs = train.groupby(['user_id']).count()
print("Número de usuarios únicos: {}".format(len(users)))
print("Número de usuarios con reservas: {}".format(len(users_b)))
print("Número de reservas: {}".format(len(books)))
print("Conversión: {}".format(len(books)/len(train)))
plt.figure(1)
sns.distplot(logs['is_booking'], kde=False)
plt.xlabel('Registros/User')
plt.ylabel('Apariciones')
plt.show()
In [157]:
# Número de clusters
clusters = train['hotel_cluster'].unique()
n_cluster = len(clusters)
print("Número de clusters distintos: {}".format(n_cluster))
# Cuantas veces aparece cada cluster
dist_cluster = train[['hotel_cluster', 'is_booking']].groupby('hotel_cluster').agg(['sum', 'count'])
dist_cluster['performance'] = dist_cluster['is_booking']['sum']/dist_cluster['is_booking']['count']
# Relación entre apariciones y reservas
dist_cluster_b = dist_cluster['is_booking']
# Distribución de apariciones de clusters
plt.figure(1)
sns.distplot(dist_cluster['is_booking']['count'], kde=False)
plt.xlabel('Cuantas veces aparece cada cluster')
plt.show()
# Performance de los clusters
plt.figure(2)
plt.plot(dist_cluster['performance'])
plt.xlabel('id_cluster')
plt.ylabel('Reservas/Apariciones')
plt.show()
plt.figure(3)
plt.plot(dist_cluster_b['count'], dist_cluster_b['sum'], 'ro')
plt.xlabel('Apariciones')
plt.ylabel('Reservas')
plt.show()
# Primera propuesta de modelo, recomendar los 10 clusters con mejor performance.
In [158]:
# Análisis por meses
train['mes'] = train['date_time'].apply(lambda x: x.month)
meses_group = train[['mes', 'is_booking']].groupby('mes').agg(['count', 'sum'])
meses_group['conversion'] = meses_group['is_booking']['sum']/meses_group['is_booking']['count']*100
plt.figure(1)
plt.plot(meses_group['is_booking']['count'])
plt.xlabel('Mes')
plt.ylabel('Número de apariciones')
plt.show()
plt.figure(2)
plt.plot(meses_group['conversion'])
plt.xlabel('Mes')
plt.ylabel('Conversiones')
plt.show()
# Análisis por hora
train['hora'] = train['date_time'].apply(lambda x: x.hour)
hora_group = train[['hora', 'is_booking']].groupby('hora').agg(['count', 'sum'])
hora_group['conversion'] = hora_group['is_booking']['sum']/hora_group['is_booking']['count']*100
plt.figure(1)
plt.plot(hora_group['is_booking']['count'])
plt.xlabel('Hora')
plt.ylabel('Número de apariciones')
plt.show()
plt.figure(2)
plt.plot(hora_group['conversion'])
plt.xlabel('Hora')
plt.ylabel('Conversiones')
plt.show()
In [165]:
# Análisis por fecha de check in
train['mes_ci'] = train['srch_ci'].apply(lambda x: x.month)
meses_group_ci = train[['mes_ci', 'is_booking']].groupby('mes_ci').agg(['count', 'sum'])
meses_group_ci['conversion'] = meses_group_ci['is_booking']['sum']/meses_group_ci['is_booking']['count']*100
plt.figure(1)
plt.plot(meses_group_ci['is_booking']['count'])
plt.xlabel('Mes del check in')
plt.ylabel('Número de apariciones')
plt.show()
plt.figure(2)
plt.plot(meses_group_ci['conversion'])
plt.xlabel('Mes del check in')
plt.ylabel('Conversiones')
plt.show()