{"id":4881,"date":"2015-04-27T22:09:11","date_gmt":"2015-04-27T20:09:11","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4881"},"modified":"2015-05-15T12:35:58","modified_gmt":"2015-05-15T10:35:58","slug":"i1m2014-estadistica-descriptiva-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2014-estadistica-descriptiva-en-haskell\/","title":{"rendered":"I1M2014: Estad\u00edstica descriptiva en Haskell"},"content":{"rendered":"<p>En la segunda parte de la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-14\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones a los ejercicios de la relaci\u00f3n 33 sobre estad\u00edstica descriptiva.<\/p>\n<p>Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- Introducci\u00f3n                                                       --\n-- ---------------------------------------------------------------------\n\n-- El objetivo de esta relaci\u00f3n es definir las principales medidas\n-- estad\u00edsticas de centralizaci\u00f3n (medias, mediana y modas) y de\n-- dispersi\u00f3n (rango, desviaci\u00f3n media, varianza y desviaci\u00f3n t\u00edpica)\n-- que se estudian en 3\u00ba de ESO (como en http:\/\/bit.ly\/1yXc7mv ).\n\n-- ---------------------------------------------------------------------\n-- Librer\u00edas auxiliares                                               --\n-- ---------------------------------------------------------------------\n\nimport Data.List\nimport Data.Map (Map)\nimport qualified Data.Map as M\nimport Test.QuickCheck\n\n-- ---------------------------------------------------------------------\n-- Medidas de centralizaci\u00f3n                                          --\n-- ---------------------------------------------------------------------\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n\n--    media :: Floating a => [a] -> a\n-- tal que (media xs) es la media aritm\u00e9tica de los n\u00fameros de la lista\n-- xs. Por ejemplo,\n--    media [4,8,4,5,9]  ==  6.0\n-- ---------------------------------------------------------------------\n\nmedia :: Floating a => [a] -> a\nmedia xs = sum xs \/ genericLength xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. La mediana de una lista de valores es el valor de \n-- la lista que ocupa el lugar central de los valores ordenados de menor\n-- a mayor. Si el n\u00famero de datos es impar se toma como valor de la\n-- mediana el valor central. Si el n\u00famero de datos es par se toma como\n-- valor de la mediana la media aritm\u00e9tica de los dos valores\n-- centrales.\n-- \n-- Definir la funci\u00f3n \n--    mediana :: (Floating a, Ord a) => [a] -> a\n-- tal que (mediana xs) es la mediana de la lista xs. Por ejemplo, \n--    mediana [2,3,6,8,9]    ==  6.0\n--    mediana [2,3,4,6,8,9]  ==  5.0\n--    mediana [9,6,8,4,3,2]  ==  5.0\n-- ---------------------------------------------------------------------\n\nmediana :: (Floating a, Ord a) => [a] -> a\nmediana xs | odd n  = head $ drop (n `div` 2) ys\n           | even n = media $ take 2 $ drop i ys\n    where ys = sort xs\n          n  = length xs\n          i  = (n `div` 2) - 1\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3. Comprobar con QuickCheck que para cualquier lista no\n-- vac\u00eda xs el n\u00famero de elementos de xs menores que su median es menor\n-- o igual que la mitad de los elementos de xs y lo mismo pasa con los\n-- mayores o iguales que la mediana.\n-- --------------------------------------------------------------------- \n\n-- La propiedad es\nprop_mediana :: (Floating a, Ord a) => [a] -> Property\nprop_mediana xs =\n    not (null xs) ==> \n    genericLength [x | x <- xs, x < m] <= n\/2 &#038;&#038;\n    genericLength [x | x <- xs, x > m] <= n\/2\n    where m = mediana xs\n          n = genericLength xs\n\n-- La comprobaci\u00f3n es\n--    ghci> quickCheck prop_mediana\n--    +++ OK, passed 100 tests.\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Definir la funci\u00f3n\n--    frecuenciasD :: Ord a => [a] -> Map a Int\n-- tal que (frecuenciasD xs) es el diccionario formado por los elementos\n-- de xs junto con el n\u00famero de veces que aparecen en xs. Por ejemplo, \n--    frecuenciasD \"sosos\"          ==  M.fromList [('o',2),('s',3)]\n--    frecuenciasD (show (10^100))  ==  M.fromList [('0',100),('1',1)]\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n (por recursi\u00f3n):\nfrecuenciasD1 :: Ord a => [a] -> Map a Int\nfrecuenciasD1 []     = M.empty\nfrecuenciasD1 (x:xs) = M.insertWith (+) x 1 (frecuenciasD1 xs)\n\n-- 2\u00aa definici\u00f3n (por plegado)\nfrecuenciasD2 :: Ord a => [a] -> Map a Int\nfrecuenciasD2 = foldl' (\\d x-> M.insertWith' (+) x 1 d) M.empty\n\n-- Comparaci\u00f3n de eficiencia\n--    ghci> frecuenciasD1 (take (10^6) (cycle \"abc\"))\n--    fromList [('a',333334),('b',333333),('c',333333)]\n--    (3.85 secs, 479811608 bytes)\n--    ghci> frecuenciasD2 (take (10^6) (cycle \"abc\"))\n--    fromList [('a',333334),('b',333333),('c',333333)]\n--    (0.72 secs, 218612192 bytes)\n--     \n--    ghci> size (frecuenciasD1 (take (10^6) (cycle [1..10^6])))\n--    1000000\n--    (11.35 secs, 2435622280 bytes)\n--    ghci> size (frecuenciasD2 (take (10^6) (cycle [1..10^6])))\n--    1000000\n--    (2.83 secs, 1621887768 bytes)\n\n-- En lo sucesivo, usaremos la 2\u00aa definici\u00f3n:\nfrecuenciasD :: Ord a => [a] -> Map a Int\nfrecuenciasD = frecuenciasD2\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 5. Definir la funci\u00f3n\n--    frecuencias :: Ord a => [a] -> [(a,Int)]\n-- tal que (frecuencias xs) es la lista formada por los elementos de xs\n-- junto con el n\u00famero de veces que aparecen en xs. Por ejemplo,  \n--    frecuencias \"sosos\"          ==  [('o',2),('s',3)]\n--    frecuencias (show (10^100))  ==  [('0',100),('1',1)]\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n (usando frecuenciasD):\nfrecuencias1 :: Ord a => [a] -> [(a,Int)]\nfrecuencias1 = M.toList . frecuenciasD\n\n-- 2\u00aa definici\u00f3n (sin usar frecuenciasD):\nfrecuencias2 :: Ord a => [a] -> [(a,Int)]\nfrecuencias2 xs = [(x,1 + length xs) | (x:xs) <- group (sort xs)]\n\n-- En lo sucesivo usaremos la 1\u00aa definici\u00f3n\nfrecuencias :: Ord a => [a] -> [(a,Int)]\nfrecuencias = frecuencias1\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 6. Las modas de una lista son los elementos de la lista\n-- que m\u00e1s se repiten. \n--\n-- Definir la funci\u00f3n\n--    modas :: Ord a => [a] -> [a]\n-- tal que (modas xs) es la lista ordenada de las modas de xs. Por\n-- ejemplo \n--    modas [7,3,7,5,3,1,6,9,6]  ==  [3,6,7]\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n (con frecuenciasD):\nmodas1 :: Ord a => [a] -> [a]\nmodas1 xs = M.keys (M.filter (==m) d)\n    where d = frecuenciasD xs\n          m = maximum (M.elems d)\n\n-- 2\u00aa definici\u00f3n (con frecuencias):\nmodas2 :: Ord a => [a] -> [a]\nmodas2 xs = [y | (y,n) <- ys, n == m]\n    where ys = frecuencias xs\n          m  = maximum (map snd ys)\n\n-- Comparaci\u00f3n de eficiencia:\n--    ghci> modas1 (1:[1..10^6])\n--    [1]\n--    (3.83 secs, 1638455984 bytes)\n--    ghci> modas2 (1:[1..10^6])\n--    [1]\n--    (4.72 secs, 1798442320 bytes)\n\n-- En lo que sigue usaremos la 1\u00aa definici\u00f3n\nmodas :: Ord a => [a] -> [a]\nmodas = modas1\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 7. La media geom\u00e9trica de una lista de n n\u00fameros es la\n-- ra\u00edz n-\u00e9sima del producto de todos los n\u00fameros.\n-- \n-- Definir la funci\u00f3n\n--    mediaGeometrica :: Floating a => [a] -> a\n-- tal que (mediaGeometrica xs) es la media geom\u00e9trica de xs. Por\n-- ejemplo, \n--    mediaGeometrica [2,18]   ==  6.0\n--    mediaGeometrica [3,1,9]  ==  3.0\n-- ---------------------------------------------------------------------\n\nmediaGeometrica :: Floating a => [a] -> a\nmediaGeometrica xs = (product xs)**(1 \/ genericLength xs)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 8. Comprobar con QuickCheck que la media geom\u00e9trica de\n-- cualquier lista no vac\u00eda de n\u00fameros no negativos es siempre menor o\n-- igual que la media aritm\u00e9tica. \n-- ---------------------------------------------------------------------\n\n-- La propiedad es\nprop_mediaGeometrica :: (Floating a, Ord a) => [a] -> Property\nprop_mediaGeometrica xs = \n    not (null xs) ==>\n    mediaGeometrica ys <= media ys\n    where ys = map abs xs        \n\n-- La comprobaci\u00f3n es\n--    ghci> quickCheck prop_mediaGeometrica\n--    +++ OK, passed 100 tests.\n\n-- ---------------------------------------------------------------------\n-- Medidas de dispersi\u00f3n                                              --\n-- ---------------------------------------------------------------------\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9. El recorrido (o rango) de una lista de valores es la\n-- diferencia entre el mayor y el menor.\n-- \n-- Definir la funci\u00f3n \n--    rango :: (Num a, Ord a) => [a] -> a\n-- tal que (rango xs) es el rango de xs. Por ejemplo,\n--    rango [4,2,4,7,3]  ==  5\n-- ---------------------------------------------------------------------\n\nrango :: (Num a, Ord a) => [a] -> a\nrango xs = maximum xs - minimum xs\n \n-- ---------------------------------------------------------------------\n-- Ejercicio 10. La desviaci\u00f3n media de una lista de datos xs es la\n-- media de las distancias de los datos a la media xs, donde la\n-- distancia entre dos elementos es el valor absoluto de su\n-- diferencia. Por ejemplo, la desviaci\u00f3n media de [4,8,4,5,9] es 2 ya\n-- que la media de [4,8,4,5,9] es 6 y\n--      (|4-6| + |8-6| + |4-6| + |5-6| + |9-6|) \/ 5\n--    = (2 + 2 + 2 + 1 + 3) \/ 5\n--    = 2\n-- \n-- Definir la funci\u00f3n\n--    desviacionMedia :: Floating a => [a] -> a\n-- tal que (desviacionMedia xs) es la desviaci\u00f3n media de xs. Por\n-- ejemplo, \n--    desviacionMedia [4,8,4,5,9]       ==  2.0\n--    desviacionMedia (replicate 10 3)  ==  0.0\n-- ---------------------------------------------------------------------\n\ndesviacionMedia :: Floating a => [a] -> a\ndesviacionMedia xs = media $ map (\\x -> abs(x - m)) xs\n    where m = media xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 11. La varianza de una lista datos es la media de los\n-- cuadrados de las distancias de los datos a la media. Por ejemplo, la\n-- varianza de [4,8,4,5,9] es 4.4 ya que la media de [4,8,4,5,9] es 6 y\n--      ((4-6)^2 + (8-6)^2 + (4-6)^2 + (5-6)^2 + (9-6)^2) \/ 5\n--    = (4 + 4 + 4 + 1 + 9) \/ 5\n--    = 4.4\n-- \n-- Definir la funci\u00f3n\n--    varianza :: Floating a => [a] -> a\n-- tal que (desviacionMedia xs) es la varianza de xs. Por ejemplo, \n--    varianza [4,8,4,5,9]       ==  4.4\n--    varianza (replicate 10 3)  ==  0.0\n-- ---------------------------------------------------------------------\n\nvarianza :: Floating a => [a] -> a\nvarianza xs = media $ map (\\x -> (x - m)^2) xs\n    where m = media xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 12. La desviaci\u00f3n t\u00edpica de una lista de datos es la ra\u00edz\n-- cuadrada de su varianza.  \n-- \n-- Definir la funci\u00f3n \n--    desviacionTipica :: Floating a => [a] -> a\n-- tal que (desviacionTipica xs) es la desviaci\u00f3n t\u00edpica de xs. Por\n-- ejemplo, \n--    desviacionTipica [4,8,4,5,9]       ==  2.0976176963403033\n--    desviacionTipica (replicate 10 3)  ==  0.0\n-- ---------------------------------------------------------------------\n\ndesviacionTipica :: Floating a => [a] -> a\ndesviacionTipica = sqrt . varianza\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la segunda parte de la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado las soluciones a los ejercicios de la relaci\u00f3n 33 sobre estad\u00edstica descriptiva. Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[238],"tags":[270,305],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4881"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=4881"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4881\/revisions"}],"predecessor-version":[{"id":4893,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4881\/revisions\/4893"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}