{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Informatika - Programación \n", "# Examen extraordinario - Fecha 25-01-2020\n", "\n", "## Nombre y apellidos: \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tenemos datos de un sensor de contaminantes localizado en la UPNA. Mide 4 tipos diferentes de contaminantes (NO2, CO2, PM10 y PM2.5). Los datos están dispuestos en una tabla (matriz) con tantas columnas como contaminantes y tantas filas como lecturas de dicho contamintante tenemos (hacemos una lectura cada día). Un ejemplo de estos datos sería el siguiente:\n", "\n", " [[0, 8, 4, 9],\n", " [6, 8, 4, 3],\n", " [9, 5, 7, 9],\n", " [5, 5, 3, 7],\n", " [6, 1, 7, 4],\n", " [3, 9, 7, 5],\n", " [5, 9, 8, 1],\n", " [8, 3, 1, 6],\n", " [9, 8, 1, 4],\n", " [6, 2, 2, 8],\n", " [3, 4, 5, 9],\n", " [9, 6, 6, 7],\n", " [0, 8, 9, 4],\n", " [6, 4, 2, 0],\n", " [3, 8, 8, 5],\n", " [9, 0, 7, 6],\n", " [6, 2, 5, 6],\n", " [5, 2, 7, 9],\n", " [1, 8, 7, 7],\n", " [9, 1, 3, 8]]\n", "\n", "Con estos datos, queremos sacar una serie de estadísticas tanto por días como por contaminante. Para ello, vamos a implementar una serie de funciones." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import sqrt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "datos = [[0, 8, 4, 9],\n", " [6, 8, 4, 3],\n", " [9, 5, 7, 9],\n", " [5, 5, 3, 7],\n", " [6, 1, 7, 4],\n", " [3, 9, 7, 5],\n", " [5, 9, 8, 1],\n", " [8, 3, 1, 6],\n", " [9, 8, 1, 4],\n", " [6, 2, 2, 8],\n", " [3, 4, 5, 9],\n", " [9, 6, 6, 7],\n", " [0, 8, 9, 4],\n", " [6, 4, 2, 0],\n", " [3, 8, 8, 5],\n", " [9, 0, 7, 6],\n", " [6, 2, 5, 6],\n", " [5, 2, 7, 9],\n", " [1, 8, 7, 7],\n", " [9, 1, 3, 8]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `calcular_medias` (1.5 puntos)\n", "Esta función toma la matriz de datos y calcula para cada contaminante la media obtenida entre todas las mediciones (media por columnas). Devolverá un vector con un valor para la media de cada columna.\n", "\n", "**Ejemplo**\n", " \n", " Salida la matriz datos:\n", " [5.4, 5.05, 5.15, 5.85]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `calcular_desviaciones` (1.75 puntos)\n", "Esta función utiliza los datos y las medias para calcular las desviaciones estándar por columna. Es decir, recibe una matriz y un vector con las medias por columnas y calcula la desviación estándar de cada columna devolviendo estos valores en un nuevo vector. Recordemos la fórmula de la desviación estándar de un vector $x$ de dimensión $N$ cuya media viene dada por $\\mu$: \n", "\n", "$$ std(x) = \\sqrt{\\frac{1}{N}\\sum(x[i]-\\mu)^2} $$\n", "\n", "\n", "**Ejemplo** \n", "\n", " Salida para la matriz datos con medias = [5.4, 5.05, 5.15, 5.85]:\n", " [2.91, 2.97, 2.43, 2.55] (redondeado a dos decimales)\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `detectar_outliers` (2.5 puntos)\n", "Una vez tenemos la media y la desviación estándar las utilizaremos para detectar **outliers** (valores fuera de rango) en los datos. Para ello, esta función recibe la matriz de datos y las medias y las desviaciones por columnas ya calculadas y devuelve un vector y una matriz. El vector corresponde al conteo de outliers por columnas (en cada columna cuántos outliers hay), mientras que la matriz es una matriz de 1s y 0s del tamaño de los datos en la que en cada posición se especifica si el valor es un outlier o no lo es (1 o 0). Decimos que un valor es un outlier cuando difiere de la media de su columna más de la desviación estándar de la propia columna (para arriba o para abajo). Por ejemplo, si tenemos el valor 10 para una columna con media 5 y desviación estándar 2, este valor será un outlier ya que la diferencia entre 10 y 5 es mayor que 2. \n", "\n", "**Ejemplo**\n", "\n", " Utilizando la matriz datos con\n", " medias = [5.4, 5.05, 5.15, 5.85]\n", " desviaciones = [2.91, 2.97, 2.43, 2.55]\n", " \n", " Salida:\n", " outliers por columna: [8, 8, 7, 7],\n", " matriz indicando outliers\n", " [1, 0, 0, 1],\n", " [0, 0, 0, 1],\n", " [1, 0, 0, 1],\n", " [0, 0, 0, 0],\n", " [0, 1, 0, 0],\n", " [0, 1, 0, 0],\n", " [0, 1, 1, 1],\n", " [0, 0, 1, 0],\n", " [1, 0, 1, 0],\n", " [0, 1, 1, 0],\n", " [0, 0, 0, 1],\n", " [1, 0, 0, 0],\n", " [1, 0, 1, 0],\n", " [0, 0, 1, 1],\n", " [0, 0, 1, 0],\n", " [1, 1, 0, 0],\n", " [0, 1, 0, 0],\n", " [0, 1, 0, 1],\n", " [1, 0, 0, 0],\n", " [1, 1, 0, 0]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `cuenta_por_filas` (1.5 puntos)\n", "Esta función recibirá una matriz de 1s y 0s (la matriz que indica los outliers) y nos devolverá un vector con la cantidad de 1s que aparecen en cada fila.\n", "\n", " **Ejemplo** \n", " \n", " Salida para la matriz datos con los outliers detectados en la función anterior:\n", " Outliers por filas = [2, 1, 2, 0, 1, 1, 3, 1, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `combinar_en_filas` (0.75 puntos)\n", "Esta función recibirá tres vectores de números del mismo tamaño y devolverá una matriz de tres filas con los datos de los tres vectores (un vector en cada fila).\n", "\n", " **Ejemplo** \n", " \n", " Entradas a la función: \n", " v1 = [1, 2, 3]\n", " v2 = [2, 4, 5]\n", " v3 = [2, 8, 1]\n", " \n", " Salida de la función: \n", " [[1, 2, 3],\n", " [2, 4, 5],\n", " [2, 8, 1]]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "v1 = [1, 2, 3]\n", "v2 = [2, 4, 5]\n", "v3 = [2, 8, 1]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `imprime_matriz_outliers` (1 punto)\n", "Escribe una función que reciba una matriz y una máscara de 1s y 0s del mismo tamaño que la matriz. La función debe de imprimir por pantalla los valores de la primera matriz o un asterisco `'*'` dependiendo de si la máscara tiene un 0 o un 1 en la posición correspondiente (cuando la máscara tenga un 0, escribirá el valor de la matriz y cuando tenga un 1, escribirá el asterisco)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Función `imprime_matriz`\n", "Dispones también de la siguiente función para utilizar en tu programa principal." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def imprime_matriz(m):\n", " for i in range(len(m)):\n", " for j in range(len(m[0])):\n", " print('{:.2f}'.format(m[i][j]), end=' ')\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Programa principal (1 punto)\n", "\n", "Finalmente, escribe el programa principal que tendrá la matriz `datos` definida y deberá realizar los siguientes cálculos para poder mostrar la salida.\n", "1. Calcular las medias por contaminante.\n", "2. Calcular las desviaciones por contaminante.\n", "3. Detectar los outliers existentes en los datos.\n", "4. Imprime la matriz de datos marcando los outliers con asteriscos.\n", "6. Generar una matriz con los resultados para cada contaminante (tantas columnas como contaminantes) que contenga la media de cada contaminante, su desviación estándar y el conteo de outliers para dicho contaminante.\n", "7. Muestra la matriz de resultados por contaminantes por pantalla.\n", "8. Finalmente, calcula el número de outliers por día e imprímelos como aparece a continuación en el ejemplo.\n", "\n", "**Ejemplo**\n", "\n", " Entrada: Datos al inicio del enunciado\n", " Salida:\n", " \n", " Datos sin outliers: \n", " * 8.00 4.00 * \n", " 6.00 8.00 4.00 * \n", " * 5.00 7.00 * \n", " 5.00 5.00 3.00 7.00 \n", " 6.00 * 7.00 4.00 \n", " 3.00 * 7.00 5.00 \n", " 5.00 * * * \n", " 8.00 3.00 * 6.00 \n", " * 8.00 * 4.00 \n", " 6.00 * * 8.00 \n", " 3.00 4.00 5.00 * \n", " * 6.00 6.00 7.00 \n", " * 8.00 * 4.00 \n", " 6.00 4.00 * * \n", " 3.00 8.00 * 5.00 \n", " * * 7.00 6.00 \n", " 6.00 * 5.00 6.00 \n", " 5.00 * 7.00 * \n", " * 8.00 7.00 7.00 \n", " * * 3.00 8.00 \n", " \n", " \n", " Para cada contamintante (columna), media, desv y ouliers\n", " 5.40 5.05 5.15 5.85 \n", " 2.91 2.97 2.43 2.55 \n", " 8.00 8.00 7.00 7.00 \n", " \n", " \n", " Outliers por día: \n", " Día 0: 2 outliers\n", " Día 1: 1 outliers\n", " Día 2: 2 outliers\n", " Día 3: 0 outliers\n", " Día 4: 1 outliers\n", " Día 5: 1 outliers\n", " Día 6: 3 outliers\n", " Día 7: 1 outliers\n", " Día 8: 2 outliers\n", " Día 9: 2 outliers\n", " Día 10: 1 outliers\n", " Día 11: 1 outliers\n", " Día 12: 2 outliers\n", " Día 13: 2 outliers\n", " Día 14: 1 outliers\n", " Día 15: 2 outliers\n", " Día 16: 1 outliers\n", " Día 17: 2 outliers\n", " Día 18: 1 outliers\n", " Día 19: 2 outliers\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8.8" } }, "nbformat": 4, "nbformat_minor": 2 }