{"id":5709,"date":"2017-02-17T12:47:07","date_gmt":"2017-02-17T11:47:07","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5709"},"modified":"2017-02-23T12:48:01","modified_gmt":"2017-02-23T11:48:01","slug":"i1m2016-estadistica-descriptiva-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2016-estadistica-descriptiva-en-haskell\/","title":{"rendered":"I1M2016: 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-15\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones a los ejercicios de la relaci\u00f3n 19 sobre estad\u00edstica descriptiva. Adem\u00e1s, se ha comentado la librer\u00eda  <a href=\"https:\/\/hackage.haskell.org\/package\/statistics-0.13.3.0\/docs\/Statistics-Sample.html\">Statistics.Sample<\/a> que contiene las funciones definidas en la relaci\u00f3n.<\/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-- En las soluciones de los ejercicios se pueden usar las siguientes\n-- funciones de la librer\u00eda Data.List fromIntegral, genericLength, sort,\n-- y group (cuya descripci\u00f3n se puede consultar en el \"Manual de\n-- funciones b\u00e1sicas de Haskell\" http:\/\/bit.ly\/1PqHagT ).\n\n-- ---------------------------------------------------------------------\n-- Librer\u00edas auxiliares                                               --\n-- ---------------------------------------------------------------------\n\nimport Data.List\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  = ys !! i\n           | even n = media [ys !! (i-1), ys !! i]\n    where ys = sort xs\n          n  = length xs\n          i  = n `div` 2\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--    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--\n-- Nota: El orden de los pares no importa\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa soluci\u00f3n\nfrecuencias :: Ord a => [a] -> [(a,Int)]\nfrecuencias xs = [(y,ocurrencias y xs) | y <- sort (nub xs)]\n    where ocurrencias y xs = length [1 | x <- xs, x == y]\n\n-- 2\u00aa soluci\u00f3n\nfrecuencias2 :: Ord a => [a] -> [(a,Int)]\nfrecuencias2 xs = [(x,1 + length xs) | (x:xs) <- group (sort xs)]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 5. 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\nmodas :: Ord a => [a] -> [a]\nmodas xs = [y | (y,n) <- ys, n == m]\n    where ys = frecuencias xs\n          m  = maximum (map snd ys)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 6. 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 7. 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 8. 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 9. 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 [abs(x - m) | x <- xs]\n    where m = media xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 10. 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 [(x-m)^2 | x <- xs]\n    where m = media xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 11. 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 xs = sqrt (varianza xs)\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 19 sobre estad\u00edstica descriptiva. Adem\u00e1s, se ha comentado la librer\u00eda Statistics.Sample que contiene las funciones definidas en la relaci\u00f3n. Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[260],"tags":[270,313],"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\/5709"}],"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=5709"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5709\/revisions"}],"predecessor-version":[{"id":5710,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5709\/revisions\/5710"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}