7 2021-05-26
Examen de Inteligencia de los Negocios
Grado: Inteligencia de los Negocios
Fecha: 26 de mayo de 2021
Ejercicio 7.1 Dadas dos listas de números del mismo tamaño x e y, construir las siguientes funciones:
- Una función para calcular la media de una lista de números.
- Una función para calcular la varianza de una lista de números.
- Una función para calcular la covarianza de dos listas de números.
- Una función para calcular los coeficientes de la recta de regresión de
ysobrex. - Una función que devuelva el diagrama de dispersión y la recta de regresión como la que se muestra en el siguiente ejemplo:
x = [1, 2, 3, 4, 5, 6]
y = [20, 18, 12, 10, 9, 9]

Usar las siguientes fórmulas para el cálculo de los estadísticos: \(\bar x = \frac{\sum x_i}{n}\), \(s^2 = \frac{\sum x_i^2}{n}-\bar{x}^2\), \(s_{xy} = \frac{\sum x_iy_j}{n} - \bar{x}\bar{y}\), \(b = \frac{s_{xy}}{s_x^2}\) y \(a = \bar{y} - b * \bar{x}\).
import matplotlib.pyplot as plt
def media(x):
'''Función que calcula la media de una lista de números.
Parámetros:
- x: Es una lista de números.
Salida:
La media de los números de la lista dada.
'''
return sum(x) / len(x)
def varianza(x):
'''Función que calcula la varianza de una lista de números.
Parámetros:
- x: Es una lista de números.
Salida:
La varianza de los números de la lista dada.
'''
# Inicializamos una variable para calcular la suma de los números.
suma = 0
# Bucle para recorrer los números de la lista.
for i in x:
# Añadimos el número a la suma parcial.
suma += i ** 2
return suma / len(x) - media(x) ** 2
def covarianza(x, y):
'''Función que calcula la covarianza de dos listas de números.
Parámetros:
- x: Es una lista de números.
- y: Es una lista de números del mismo tamaño que x.
Salida:
La covarianza de las listas dadas.
'''
suma = 0
# Bucle iterativo para recorrer los números de las listas x e y.
# i toma como valores los enteros de 0 al tamaño de las listas menos 1.
for i in range(len(x)):
suma += x[i] * y[i]
return suma / len(x) - media(x) * media(y)
def recta_regresion(x, y):
'''Función que calcula los coeficientes de la recta de regresión de dos listas de números.
Parámetros:
- x: Es una lista de números.
- y: Es una lista de números del mismo tamaño que x.
Salida:
Una tupla con el término independiente y la pendiente de la recta de regresión de las listas dadas.
'''
b = covarianza(x, y) / varianza(x)
a = media(y) - b * media(x)
return a, b
def dibuja_recta_regresion(x, y):
# Inicializamos la figura y un par de ejes.
fig, ax = plt.subplots()
# Dibujamos el diagrama de dispersión.
ax.scatter(x, y)
# Calculamos los coeficientes de la recta de regresión de y sobre x.
a, b = recta_regresion(x, y)
# Dibujamos la recta de regresión a partir de dos puntos (el mínimo y el máximo de x)
ax.plot([min(x), max(x)], [a + b * min(x), a + b * max(x)], color = 'red')
return ax
x = [1, 2, 3, 4, 5, 6]
y = [20, 18, 12, 10, 9, 9]
dibuja_recta_regresion(x, y)
plt.savefig('recta-regresion.png')<Figure size 432x288 with 1 Axes>
Ejercicio 7.2 Escribir una función que, dado un número x, genere una matriz cuadrada (x*x elementos) con el resultado de sus tablas de multiplicar desde 0 hasta x. El resultado debe guardarse en un fichero llamado tabla-X.txt donde X es el número introducido por el usuario.
Escribir otra función que, dado un número x, acceda al fichero de la tabla correspondiente y muestre la tabla por pantalla. En caso de que la tabla no exista deberá controlar la excepción para mostrar un mensaje de aviso al usuario.
Ejemplo:
>>> Introduce un número entre 1 y 10: 5
>>> Contenido del fichero matriz-5.txt
0 0 0 0 0 0
0 1 2 3 4 5
0 2 4 6 8 10
0 3 6 9 12 15
0 4 8 12 16 20
0 5 10 15 20 25def generar_tabla(n):
'''Función que crea un fichero con la tabla de multiplicar cuadrada de un número dado.
Parámetros:
- n: Es un número entero entre 1 y 10.
'''
# Creamos el nombre del fichero.
nombre_fichero = "tabla-" + str(n) + ".txt"
# Abrimos el fichero en modo escritura.
f = open(nombre_fichero, 'w')
# Bucle iterativo para recorrer las filas de la tabla.
# i toma como valores los enteros de 0 a n.
for i in range(n+1):
# Bucle anidado iterativo para recorrer las columnas de la tabla.
# j toma como valores los enteros de 0 a n.
for j in range(n+1):
# Escribimos en el fichero el producto de i por j y añadimos un espacio o tabulador.
f.write(str(i*j) + "\t")
# Una vez recorridas todas las columnas escribimos en el fichero un cambio de línea para pasar a la siguiente línea.
f.write("\n")
# Cerramos el fichero
f.close()
return
def leer_tabla(n):
'''Función que lee un fichero con una tabla de multiplicar cuadrada de un número dado y la muestra por pantalla.
Parámetros:
- n: Es un número entero entre 1 y 10.
'''
# Creamos el nombre del fichero.
nombre_fichero = "tabla-" + str(n) + ".txt"
print("Contenido del fichero " + nombre_fichero + ":")
try:
# Intentamos abrir el fichero en modo lectura.
fichero = open(nombre_fichero, 'r')
except FileNotFoundError:
# Si el fichero no existe mostramos por pantalla un mensaje de aviso.
print("El fichero no existe")
else:
# Leemos el contenido del fichero y lo mostramos por pantalla.
print(fichero.read())
# Cerramos el fichero.
fichero.close()
n = int(input("Introduce un número entero entre 1 y 10: "))
generar_tabla(n)
leer_tabla(n)Contenido del fichero tabla-5.txt:
0 0 0 0 0 0
0 1 2 3 4 5
0 2 4 6 8 10
0 3 6 9 12 15
0 4 8 12 16 20
0 5 10 15 20 25
Ejercicio 7.3 Crear un programa utilizando la librería Pandas y Matplotlib que realice lo siguiente:
- Crear el siguiente DataFrame indexado:
sh calorias tiempo L 420 60 M 380 40 X 390 75 J 490 55 V 300 45 - Calcular la media, mediana y desviación típica de ambas columnas.
- Añadir otra columna booleana al DataFrame para ver si se ha cumplido el reto de quemar más de 400 calorías por hora. La nueva columna debe generarse aplicando una fórmula a las otras columnas. El DataFrame resultante debe ser el siguiente:
sh calorias tiempo reto L 420 60 True M 380 40 True X 390 75 False J 490 55 True V 300 45 False - Filtrar el DataFrame y devolver otro DataFrame con las filas pares que cumplan que el número de calorías es mayor de 400.
- Crear a partir del DataFrame una serie con los porcentajes de días que se ha conseguido el reto y los que no.
- Crear un gráfico como el de más abajo que muestre la progresión de las calorías y tiempo durante la semana.

import pandas as pd
import matplotlib.pyplot as plt
# Creamos un diccionario con claves los nombres de las columnas y valores las listas con los elementos de las columnas.
datos = {
"Calorias": [420, 380, 390, 490, 300],
"Tiempo": [60, 40, 75, 55, 45]
}
# Creamos una lista con los días de la semana para utilizarla como índice
semana = ["L", "M", "X", "J", "V"]
# Creamos el DataFrame
df = pd.DataFrame(datos, semana)
print(df) Calorias Tiempo
L 420 60
M 380 40
X 390 75
J 490 55
V 300 45
# Calculamos la media.
print('Medias:')
print(df.mean())
# Calculamos la mediana.
print('Medianas:')
print(df.median())
# Calculamos la desviación típica.
print('Desviaciones típicas:')
print(df.std())Medias:
Calorias 396.0
Tiempo 55.0
dtype: float64
Medianas:
Calorias 390.0
Tiempo 55.0
dtype: float64
Desviaciones típicas:
Calorias 68.774995
Tiempo 13.693064
dtype: float64
# Añadimos una nueva columna comparando las calorisas consumidas por hora con 400 calorias por 60 minutos.
df["eto"] = df.Calorias / df.Tiempo > 400 / 60
print(df) Calorias Tiempo reto Reto
L 420 60 True True
M 380 40 True True
X 390 75 False False
J 490 55 True True
V 300 45 False False
# Obtenemos la filas pares.
df_filtrado = df.iloc[range(0, df.shape[0], 2)]
# Obtenemos las filas con un número de calorías mayor de 400.
df_filtrado = df_filtrado[df_filtrado.Calorias > 400]
print(df_filtrado) Calorias Tiempo reto
L 420 60 True
# Calculamos los porcentajes de días en los que se ha cumplido el reto y los que no.
print(df.Reto.value_counts(normalize = True) * 100)True 60.0
False 40.0
Name: Reto, dtype: float64
fig, ax = plt.subplots()
df.plot(y = 'Calorias', marker = "+", ax = ax)
df.plot(y = 'Tiempo', marker = "o", ax = ax)
plt.title('Evolución diaria')
plt.show()<Figure size 432x288 with 1 Axes>