import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
# Todos los datos
data = pd.read_excel('./answers/cleaned.xlsx')
# Evaluación de RelintBot1
rb1_data = data[data['prototype']=='RelintBot1']
# Evaluación de RelintBot2
rb2_data = data[data['prototype']=='RelintBot2']
data.head(5)
# Extraer variable
age = rb1_data['age']
# Diagrama de Cajas y bigotes
fig1, ax1 = plt.subplots(figsize=(6,5))
ax1.boxplot(age, vert=False, labels=['Edad'])
plt.show()
print("Media = {:.2f}".format(np.average(np.array(list(age)))))
print("Mediana = {:.0f}".format(np.median(np.array(list(age)))))
print("Mínimo = {:.0f}".format(min(list(age))))
print("Máximo = {:.0f}".format(max(list(age))))
# Extraer valores
sex = rb1_data['sex']
male = len(list(filter(lambda s: s == 'Hombre', sex)))
female = len(sex) - male
# Diagrama de sectores
labels = ['Hombre', 'Mujer']
colors = ['C0', 'red']
sizes = [male, female]
explode = (0, 0.1)
fig1, ax1 = plt.subplots(figsize=(6,6))
#ax1.set_title('Sexo')
ax1.pie(sizes, labels=labels, autopct='%2.2f%%', colors=colors, explode=explode, startangle=90)
ax1.axis('equal')
plt.show()
# Extraer variable
mother_tongue = list(rb1_data['mother_tongue'])
all_languages = ['Español', 'Inglés', 'Francés', 'Alemán', 'Italiano', 'Otra']
count = list(map(lambda lang: mother_tongue.count(lang), all_languages))
# Diagrama de Pareto
fig1, ax1 = plt.subplots(figsize=(6,6))
#ax1.set_title('Lengua materna')
xx = range(len(count))
ax1.bar(xx, count, width=0.8, align='center')
ax1.set_xticks(xx)
ax1.set_xticklabels(all_languages)
plt.show()
# Extrear variable
rb1_correct_answers = list(rb1_data['t1_correct_answers'])
# Obtener frecuencias
values = [0, 1, 2, 3, 4, 5]
rb1_ni = list(map(lambda i: rb1_correct_answers.count(i), values))
rb1_fi = list(map(lambda i: i / sum(rb1_ni) * 100, rb1_ni))
d = {'F. absoluta': rb1_ni, 'F. relativa': rb1_fi }
print("\n -- RelintBot1 - Respuestas correctas en la Tarea 1 --")
pd.DataFrame(data=d)
print("Número de respuestas correctas")
print("Media = {:.4f}".format(sum(rb1_correct_answers)/len(rb1_correct_answers)))
print("Mediana = {}".format(np.median(np.array(rb1_correct_answers))))
# Extrear variable
rb2_correct_answers = list(rb2_data['t1_correct_answers'])
# Obtener frecuencias
values = [0, 1, 2, 3, 4, 5]
rb2_ni = list(map(lambda i: rb2_correct_answers.count(i), values))
rb2_fi = list(map(lambda i: i / sum(rb2_ni) * 100, rb2_ni))
d = {'F. absoluta': rb2_ni, 'F. relativa': rb2_fi }
print("\n -- RelintBot2 - Respuestas correctas en la Tarea 1 --")
pd.DataFrame(data=d)
print("Número de respuestas correctas")
print("Media = {:.4f}".format(sum(rb2_correct_answers)/len(rb2_correct_answers)))
print("Mediana = {}".format(np.median(np.array(rb2_correct_answers))))
# Extraer variables de la tarea 2
rb1_t2_completed = list(rb1_data['t2_completed'])
rb1_t2_msgs = list(rb1_data['t2_messages'])
rb1_t2_chars = list(rb1_data['t2_chars'])
# Determinar el número medio de mensajes cuando la tarea fue completada
rb1_t2_avg_msgs = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb1_t2_msgs))))
# Determinar el número medio de carácteres por mensaje cuando la tarea fue completada
rb1_t2_avg_chars = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb1_t2_chars))))
print("Usuarios que completaron la tarea = {:.2f}%".format(rb1_t2_completed.count("Sí") / len(rb1_t2_completed)* 100))
print("Número medio de mensajes = {:.2f}".format(rb1_t2_avg_msgs))
print("Número medio de carácteres por mensaje = {:.2f}".format(rb1_t2_avg_chars))
# Extraer variables de la tarea 2
rb2_t2_completed = list(rb2_data['t2_completed'])
rb2_t2_msgs = list(rb2_data['t2_messages'])
rb2_t2_chars = list(rb2_data['t2_chars'])
# Determinar el número medio de mensajes cuando la tarea fue completada
rb2_t2_avg_msgs = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb2_t2_msgs))))
# Determinar el número medio de carácteres por mensaje cuando la tarea fue completada
rb2_t2_avg_chars = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb2_t2_chars))))
print("Usuarios que completaron la tarea = {:.2f}%".format(rb2_t2_completed.count("Sí") / len(rb2_t2_completed)* 100))
print("Número medio de mensajes = {:.2f}".format(rb2_t2_avg_msgs))
print("Número medio de carácteres por mensaje = {:.2f}".format(rb2_t2_avg_chars))
# Extraer variables de la tarea 3
rb1_t3_completed = list(rb1_data['t3_completed'])
rb1_t3_msgs = list(rb1_data['t3_messages'])
rb1_t3_chars = list(rb1_data['t3_chars'])
# Determinar el número medio de mensajes cuando la tarea fue completada
rb1_t3_avg_msgs = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb1_t3_msgs))))
# Determinar el número medio de carácteres por mensaje cuando la tarea fue completada
rb1_t3_avg_chars = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb1_t3_chars))))
print("Usuarios que completaron la tarea = {:.2f}%".format(rb1_t3_completed.count("Sí") / len(rb1_t3_completed)* 100))
print("Número medio de mensajes = {:.2f}".format(rb1_t3_avg_msgs))
print("Número medio de carácteres por mensaje = {:.2f}".format(rb1_t3_avg_chars))
# Extraer variables de la tarea 3
rb2_t3_completed = list(rb2_data['t3_completed'])
rb2_t3_msgs = list(rb2_data['t3_messages'])
rb2_t3_chars = list(rb2_data['t3_chars'])
# Determinar el número medio de mensajes cuando la tarea fue completada
rb2_t3_avg_msgs = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb2_t3_msgs))))
# Determinar el número medio de carácteres por mensaje cuando la tarea fue completada
rb2_t3_avg_chars = np.average(np.array(list(filter(lambda m: str(m) != 'nan', rb2_t3_chars))))
print("Usuarios que completaron la tarea = {:.2f}%".format(rb2_t3_completed.count("Sí") / len(rb2_t3_completed)* 100))
print("Número medio de mensajes = {:.2f}".format(rb2_t3_avg_msgs))
print("Número medio de carácteres por mensaje = {:.2f}".format(rb2_t3_avg_chars))
Para obtener la puntuación SUS es necesario:
Esto hace que todos los valores estén entre 0 y 4 (siendo 4 el mejor valor, el valor que indica una mayor usabilidad). Una vez transformadas, se deben sumar las respuestas de cada usuario y multiplicarlas por 2.5 para que los valores finales estén entre 0 y 100.
sus_raw = data.filter(regex='sus_\d{1,2}', axis=1)
sus_raw
# Escalar las respuestas al intervalo [0, 4]
sus_14 = np.array(sus_raw)
for i in range(sus_14.shape[0]):
for j in range(sus_14.shape[1]):
if (j+1) % 2 == 0:
sus_14[i][j] = 5 - sus_14[i][j]
else:
sus_14[i][j] -= 1
# Sumar las puntuaciones de cada usuario y multiplicarlas por 2.5
sus_scores = np.sum(sus_14, axis=1)
sus_scores = 2.5 * sus_scores
data['sus_score'] = sus_scores
sus_scores
rb1_data = data[data['prototype']=='RelintBot1']
rb1_sus_scores = rb1_data['sus_score']
print("Media SUS = {:.2f}".format(np.average(rb1_sus_scores)))
rb2_data = data[data['prototype']=='RelintBot2']
rb2_sus_scores = rb2_data['sus_score']
print("Media SUS = {:.2f}".format(np.average(rb2_sus_scores)))