katex -> mathjax
[exercicis-automatics-matematiques.git] / biblioteca.rb
blob52188be415e5a2b6bcc4d6734ce1b77420953c83
1 # SPDX-FileCopyrightText: 2023 Xavier Bordoy
3 # SPDX-License-Identifier: MIT
5 # Biblioteca per a tenir diverses funcions amb ruby
7 module Estadistica
8 # Mòdul per als exercicis d'Estadística
10   ## Retorna la llista de freqüències absolutes de la llista passada com a paràmetre
11   def self.taula_frequencies(llista)
12         taulafreq = Hash.new
14         llista.uniq.each do |valor|
15           taulafreq[valor] = llista.select {|i| i == valor }.length
16         end
18         return taulafreq.sort.to_h
19         # Format {valor => freq, ...}
20   end
21   
22   ## Retorna la llista de freqüències relatives de la llista passada com a paràmetre
23   def self.taula_frequencies_relatives(llista)
25         # Calculem la taula de freqüències absolutes
26         taulafreq = taula_frequencies(llista)
27         total = llista.length
28         # I ara la taula de freqüències relatives
29         taulafreqrel = Hash.new
31         taulafreq.each do |valor, freq|
32            taulafreqrel[valor] = (freq/total.to_f).round(3)
33         end
35         return taulafreqrel
36         # Format {valor => freqrel, ...}
38   end
39   
40   ## Retorna la moda de la llista passada com a paràmetre
41   def self.moda(llista, cadenaformat=", ")
42         # Seleccion les freqüències
43         frequencies = taula_frequencies(llista).values
44         return frequencies.each_index.select {|index| frequencies[index] == frequencies.max}.map {|i| taula_frequencies(llista).keys[i] }.join(cadenaformat)
45         # Format Moda_1 <cadenaformat> Moda_2 <cadenaformat> etc.
46   end
48   ## Retorna la mediana de la llista passada com a paràmetre
49   def self.mediana(llista)
50         if llista.length.odd?
51                 return llista.sort[llista.length/2]
52         else
53                 return ((llista.sort[llista.length/2-1]+llista.sort[llista.length/2])/2.0)
54         end
55   end
56   
57   ## Retorna la mitjana aritmètica de la llista passada com a paràmetre
58   def self.mitjana(llista)
59         return llista.sum.fdiv(llista.size).round(3)
60   end
61   
62   ## Retorna la desviació mitjana de la llista passada com a paràmetre
63   def self.desviacio_mitjana(llista)
64         m = mitjana(llista)
65         auxiliar = Array.new()
66         llista.each do |p|
67           auxiliar.push((p - m).abs)
68         end
69         
70         return mitjana(auxiliar)
71   end
73 end