{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Acerca del caso de estudio: QuickCall" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "QuickCall es un CallCenter cuya estrategia de negocios se enfoca en proveer un servicio al cliente de primera clase mediante respuestas en poco tiempo (rápidas) y altas tasas de resolución de problemas. QuickCall esta preocupado porque ha notado que en algunas semanas el tiempo de servicio ha aumentado considerablemente (ya no son tán rápidos). En una reciente reunión, el jefe de Operaciones, Rich Mantle describió lo siguiente:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Tenemos un serio problema con el servicio al cliente entregado por algunos de nuestros agentes. Observamos que la primera semana después de sus vacaciones, se demoran mucho más en proveer el servicio como si estuviesen extendiendo sus vacaciones!. Mi impresión es que durante la semana post-vacaciones la duración de las llamadas atendidas por estos agentes aumenta entre un 10% y 30%. Tenemos que hacer algo para que ellos vuelvan a su ritmo regular más rápido\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El CEO de la compañia les da la tarea de realizar un análisis para corroborar los dichos de Rich Mantle. Para esto, el departamento de TI recopiló datos del proceso de control de calidad que QuickCall periodicamente realiza para evaluar el servicio que proveen los agentes. El archivo \"QuickCall.xls\" contiene data que tipicamente es registrada durante el proceso de control de calidad. Cada fila corresponde a una llamada específica de un cliente. Con respecto a este dataset, la muestra fue obtenida a partir de 5 agentes, considerando una llamada por hora en un periodo de 28 semanas. Todos los agentes realizan el turno de 9am a 5pm. Cada llamada registra el agente que la recibió, la fecha, hora/minuto, la semana del año, la duración de la llamada y un indicador que indica si se solucionó el problema que tenía el cliente." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from scipy import stats\n", "from scipy.stats import norm\n", "from statsmodels.stats.weightstats import ttest_ind\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exploración de datos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importemos el dataset mencionado. Recuerde que: es más fácil si deja los datos en la misma carpeta que el código, de lo contrario debe indicar la ruta completa de donde se ubica localmente el archivo. Veamos las primeras filas de este dataset." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1400, 9)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefdateweekdayofweekhourmindurationfailureholiday_week
0Marta2014-04-2317310313.384666027
1Marta2014-04-2417410314.247913027
2Marta2014-04-2517510313.427917027
3Marta2014-04-2817110312.858705027
4Marta2014-04-2917210313.293070027
\n", "
" ], "text/plain": [ " name fdate week dayofweek hour min duration failure \\\n", "0 Marta 2014-04-23 17 3 10 31 3.384666 0 \n", "1 Marta 2014-04-24 17 4 10 31 4.247913 0 \n", "2 Marta 2014-04-25 17 5 10 31 3.427917 0 \n", "3 Marta 2014-04-28 17 1 10 31 2.858705 0 \n", "4 Marta 2014-04-29 17 2 10 31 3.293070 0 \n", "\n", " holiday_week \n", "0 27 \n", "1 27 \n", "2 27 \n", "3 27 \n", "4 27 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#importamos los datos del excel, asegurarse que estan en la misma carpeta, de lo contrario agregar la dirección del archivo\n", "df = pd.read_excel(\"QuickCall.xls\") \n", "print(df.shape)\n", "df.head() #para explorar los datos, mostramos los primeros registros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tenemos el nombre de los agentes (name), la fecha de la llamada (fdate), a qué semana pertenece (week), a qué día de la semana (dayofweek), la hora, el minuto, la duración de la llamada, la tasa de fallo (failure: si se resolvió el requerimiento por el cual llamaron o no) y holiday_week indica la semana en la cual el agente estuvo de vacaciones.\n", "\n", "Para obtener una idea de como se comportan los datos, podemos obtener estadística descriptiva con la función describe:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
weekdayofweekhourmindurationfailureholiday_week
count1400.0000001400.0000001400.0000001400.0000001400.0000001400.0000001400.000000
mean24.0000003.00000011.50000039.2500003.5420440.07500024.000000
std4.3275471.4147191.11843415.7119011.4108600.2634854.244157
min17.0000001.00000010.00000018.0000000.0000000.00000018.000000
25%20.0000002.00000010.75000027.7500002.5777980.00000020.000000
50%24.0000003.00000011.50000040.5000003.3891690.00000026.000000
75%28.0000004.00000012.25000052.0000004.2886760.00000027.000000
max31.0000005.00000013.00000058.00000010.0327231.00000029.000000
\n", "
" ], "text/plain": [ " week dayofweek hour min duration \\\n", "count 1400.000000 1400.000000 1400.000000 1400.000000 1400.000000 \n", "mean 24.000000 3.000000 11.500000 39.250000 3.542044 \n", "std 4.327547 1.414719 1.118434 15.711901 1.410860 \n", "min 17.000000 1.000000 10.000000 18.000000 0.000000 \n", "25% 20.000000 2.000000 10.750000 27.750000 2.577798 \n", "50% 24.000000 3.000000 11.500000 40.500000 3.389169 \n", "75% 28.000000 4.000000 12.250000 52.000000 4.288676 \n", "max 31.000000 5.000000 13.000000 58.000000 10.032723 \n", "\n", " failure holiday_week \n", "count 1400.000000 1400.000000 \n", "mean 0.075000 24.000000 \n", "std 0.263485 4.244157 \n", "min 0.000000 18.000000 \n", "25% 0.000000 20.000000 \n", "50% 0.000000 26.000000 \n", "75% 0.000000 27.000000 \n", "max 1.000000 29.000000 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe() #solo aparece para las variables numéricas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Observemos que la media de duración de las llamadas esta en 3.542 y la tasa de fallas tiene una media de 0.075.\n", "\n", "Veamos el comportamiento desagregado por Agente:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
durationfailure
countmeanstdmin50%maxcountmeanstdmin50%max
name
Felipe280.02.4974030.7133500.5199872.4493314.522921280.00.0607140.2392330.00.01.0
Francisca280.03.5281080.5030982.2015523.5243185.266583280.00.0750000.2638630.00.01.0
Javier280.04.0590541.5071880.0000004.0950117.906882280.00.0750000.2638630.00.01.0
Marta280.03.1061121.0506670.2858983.1006016.098752280.00.0750000.2638630.00.01.0
Tomas280.04.5195421.8249370.0000004.58701510.032723280.00.0892860.2856660.00.01.0
\n", "
" ], "text/plain": [ " duration failure \\\n", " count mean std min 50% max count \n", "name \n", "Felipe 280.0 2.497403 0.713350 0.519987 2.449331 4.522921 280.0 \n", "Francisca 280.0 3.528108 0.503098 2.201552 3.524318 5.266583 280.0 \n", "Javier 280.0 4.059054 1.507188 0.000000 4.095011 7.906882 280.0 \n", "Marta 280.0 3.106112 1.050667 0.285898 3.100601 6.098752 280.0 \n", "Tomas 280.0 4.519542 1.824937 0.000000 4.587015 10.032723 280.0 \n", "\n", " \n", " mean std min 50% max \n", "name \n", "Felipe 0.060714 0.239233 0.0 0.0 1.0 \n", "Francisca 0.075000 0.263863 0.0 0.0 1.0 \n", "Javier 0.075000 0.263863 0.0 0.0 1.0 \n", "Marta 0.075000 0.263863 0.0 0.0 1.0 \n", "Tomas 0.089286 0.285666 0.0 0.0 1.0 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('name').describe(percentiles=[])[['duration', 'failure']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De los datos observamos que existen diferencias en las medias de duración de las llamadas atendidas por los agentes. Esto podemos observalo gráficamente también realizando un gráfico llamado “Boxplot”." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Boxplot llamadas por agente')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sns.boxplot(x='name', y='duration', data=df)\n", "plt.title(\"Boxplot llamadas por agente\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este tipo de gráfico se despliega la misma información que con la función summary(), es decir, estadística descriptiva de los datos: la linea gruesa del centro representa la mediana (50% de los datos). La Caja que se forma marcan el primer (linea inferior de la caja) y tercer (linea superior de la caja) cuartil (es decir, el 25% y el 75% de los datos). Luego, la línea punteada muestra hasta donde se extienden los valores de esa variable (mínimo y máximo). Finalmente, los círculos que aparecen fuera de los mínimos y máximos son valores considerados “outliers”. Es decir, valores extremos que no parecieran ser parte del grupo de datos." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test de Diferencia de medias" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos a partir realizando un test de diferencia de medias. Para esto, tomaremos de ejemplo a Javier y Marta, y realizaremos un test de hipótesis para ver si existe diferencia estadísticamente significativa entre la duración de las llamadas atendidas por estos dos agentes.\n", "\n", "Entonces, el test que realizaremos es el siguiente:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$H_{0}: \\bar{X}_{Marta} = \\bar{X}_{Javier}\\\\\n", " H_{A}: \\bar{X}_{Marta} \\neq \\bar{X}_{Javier}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para esto necesitamos las medias muestrales de Marta y Javier, sus desviaciones estándar muestrales y con esto podemos calcular el error estándar y el estadístico para el test." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Promedio duración llamadas Marta: 3.106111888481038 , std: 1.0506669108350197\n", "Promedio duración llamadas Javier: 4.059054038035018 ,std: 1.5071879103823365\n", "Registros de Marta: 280\n", "Registros de Javier: 280\n" ] } ], "source": [ "df_marta = df[(df.name=='Marta')]\n", "df_javier = df[df.name=='Javier']\n", "\n", "x_marta = np.mean(df_marta.duration) \n", "std_marta = np.std(df_marta.duration, ddof=1)\n", "\n", "x_javier = np.mean(df_javier.duration) \n", "std_javier = np.std(df_javier.duration, ddof=1)\n", "\n", "n_marta = df_marta.count()[0] \n", "m_javier = df_javier.count()[0] \n", "\n", "print(\"Promedio duración llamadas Marta: \", x_marta, \" , std:\", std_marta)\n", "print(\"Promedio duración llamadas Javier: \", x_javier, \" ,std:\", std_javier)\n", "print(\"Registros de Marta: \", n_marta)\n", "print(\"Registros de Javier: \", m_javier)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Luego, recordemos que \n", "$$ S^{2} = \\frac{(n-1)S^{2}_{x} + (m-1)S^{2}_{y}}{n+m-2}$$\n", "Que en nuestro caso será:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error estándar estimado: 0.10979715639575484\n" ] } ], "source": [ "#estimamos la varianza de las dos muestras conjuntas: usamos las duraciones de Marta y \n", "#de Javier en conjunto\n", "#pues estamos asumiendo que sus varianzas son iguales.\n", "Sp_2 = ((std_javier **2)*(m_javier-1) + (std_marta **2)*(n_marta-1))/(n_marta + m_javier - 2)\n", "#calculamos en base a la varianza, el error estándar para la muestra conjunta.\n", "SE = np.sqrt(Sp_2*((1/n_marta) + (1/m_javier)))\n", "print(\"Error estándar estimado: \", SE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obteniendo ya el error estándar, podemos calcular el valor del estadístico. Recordemos que:\n", "$$ t = \\frac{\\bar{X}_{Marta} - \\bar{X}_{Javier}}{\\sqrt{S^{2}(\\frac{1}{n_{marta}} + \\frac{1}{n_{javier}})}}$$" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El valor del estadístico es: 8.679115022971803\n" ] } ], "source": [ "alpha = 0.05 #fijamos el nivel de significancia estadística\n", "t=np.abs(x_marta-x_javier)/SE #calculamos el estadístico\n", "print(\"El valor del estadístico es: \", t)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Veamos cuantos datos tenemos:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "n+m-2: 558\n" ] } ], "source": [ "print(\"n+m-2: \",n_marta + m_javier - 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como tenemos un n grande podemos contrastar nuestro estadístico contra el valor de una $\\mathcal{N}(0,1)$. Para un $\\alpha = 0.05$, tenemos que:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El valor de tabla de nuestra distribución es: 1.959963984540054\n" ] } ], "source": [ "z_alpha = norm.ppf(1 - alpha/2) #calculamos el z sobre una normal(0,1) a nivel alpha/2.\n", "print(\"El valor de tabla de nuestra distribución es: \", z_alpha)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Luego, observamos que $t > t_{0.975}$, es decir, $8.6791 > 1.96$. Por lo cual, rechazamos la hipótesis nula de que la media de la duración de llamadas atendidas por Marta es igual a la media de la duración de llamadas atendidas por Javier. \n", "\n", "Aprovechemos y calculemos las otras dos formas de realizar la conclusión del test de hipótesis: El intervalo de confianza y el p-valor.\n", "\n", "Para el intervalo de confianza tenemos que:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Intervalo de confianza para la diferencia de medias: [0.7377436774133894, 1.1681406216945716]\n" ] } ], "source": [ "IC = [np.abs(x_marta-x_javier)-z_alpha*SE, np.abs(x_marta-x_javier) + z_alpha*SE]\n", "print(\"Intervalo de confianza para la diferencia de medias: \", IC)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es decir, con un 95% de confianza podemos decir que la diferencia en la media de la duración de las llamadas entre Marta y Javier se mueve en el rango de [0.74, 1.17]. Como este intervalo NO contiene al 0, entonces podemos afirmar que se rechaza la hipótesis nula.\n", "\n", "Con respecto al p-valor, necesitamos mirar el valor en la distribución normal para el valor de nuestro estadístico, es decir:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p-value: 0.0\n" ] } ], "source": [ "p_valor = 2*(1-norm.cdf(t)) #calculamos el p valor\n", "print(\"p-value:\", p_valor)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como $p-valor < \\alpha$ entonces podemos rechazar la hipótesis nula. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Utilizando librerías de Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python cuenta con librerías para realizar test de hipótesis y varios de los análisis que realizaremos en el curso (modelos). Es por esto que podemos ahorrarnos todos los cálculos usando las funciones de estas librerías. En el caso del test de diferencia de medias utilizamos la siguiente función" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-8.679115022971803, 4.3845138378302855e-17, 558.0)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ttest_ind(df_marta.duration, df_javier.duration)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo que nos entrega esta función de Python es el valor del estadístico, el p-valor para un test de 2 colas y el \"n\". La librerías en R para estos casos son más completas por la naturaleza de R. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Propuesto" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bueno, pero lo que le interesaba al CEO cuando introdujimos este caso es verificar si los agentes cuando vuelven de sus vacaciones se demoran más en las llamadas o no. Para comprobar esto, realice un test de hipótesis de diferencia de medias para uno de los agentes. La hipótesis nula que debe testear es la siguiente:\n", "\n", "$$ H_{0}: \\bar{X}_{preHoliday} = \\bar{X}_{weekPostHoliday}\\\\\n", " H_{A}: \\bar{X}_{preHoliday} < \\bar{X}_{weekPostHoliday}$$\n", "\n", "Para esto debe seleccionar un agente, y para ese agente calcular la media de duración de llamadas en todas las semanas pre-vacaciones y la media de duración de llamadas justo la semana post-vacaciones. Y realizar un test de una cola. Puede realizar todos los cálculos como lo hicimos en este tutorial o utilizar alguna función en Python para realizar el test.\n", "\n", "Luego, el CEO indica que \"la duración de las llamadas atendidas por estos agentes aumenta entre un 10% y 30%\". ¿Esto es cierto para el agente que usted acaba de analizar?\n", "\n", "Entregue sus resultados en la sección de Tareas habilitada para este tutorial." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.10" } }, "nbformat": 4, "nbformat_minor": 2 }