7  2021-05-26
Examen de Inteligencia de los Negocios

Fecha de publicación

26 de mayo de 2021

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:

  1. Una función para calcular la media de una lista de números.
  2. Una función para calcular la varianza de una lista de números.
  3. Una función para calcular la covarianza de dos listas de números.
  4. Una función para calcular los coeficientes de la recta de regresión de y sobre x.
  5. 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]

‘Recta de regresión’

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>

Ver notebook de la solución en Colab

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   25
def 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  

Ver notebook de la solución en Colab

Ejercicio 7.3 Crear un programa utilizando la librería Pandas y Matplotlib que realice lo siguiente:

  1. Crear el siguiente DataFrame indexado: sh calorias tiempo L 420 60 M 380 40 X 390 75 J 490 55 V 300 45
  2. Calcular la media, mediana y desviación típica de ambas columnas.
  3. 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
  4. Filtrar el DataFrame y devolver otro DataFrame con las filas pares que cumplan que el número de calorías es mayor de 400.
  5. Crear a partir del DataFrame una serie con los porcentajes de días que se ha conseguido el reto y los que no.
  6. Crear un gráfico como el de más abajo que muestre la progresión de las calorías y tiempo durante la semana.

Serie evolución calorias
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>

Ver notebook de la solución en Colab