Revista Informática

Statistics v0.1 Beta

Publicado el 25 diciembre 2010 por Iyanmv @iyanmv

Os acodáis de aquel programa del que os hablé hace un tiempo que había hecho con Python. Pues bien después de dedicarle más tiempo lo he mejorado bastante. En primer lugar seguí los consejos Adri (ver comentario) para corregir algunas partes del código original. Luego seguí añadiéndole más funcionalidades y a la vez probándolas. Sigue leyendo para ver la lista de cambios y el código fuente.

import math

print(">> Statistics v0.1 Alpha")
print(">> Iyán Méndez Veiga")
print(">> [email protected]")
print("---------------------")

# Todos los datos estadísticos son almacenados en la lista 'datos'. Dentro de esta se almacenan el resto de información, introducida por el usuario o calculada, en otras listas y enteros.

def lineas(n):
  for i in range(n):
    print()

def introduce_valor(tipo,msg):
  valor = None
  while not valor:
    try:
      valor = tipo(input(msg))
    except ValueError:
      print("Dato erróneo. Inténtelo de nuevo...")
      lineas(1)
      continue
    else:
      return valor

datos = [
	 [],   #Intervalos (0)
         [],   #Valores (1)
         [],   #Frecuencias Absolutas (2)
         [],   #Frecuencias Relativas (3)
         [],   #Frecuencias Abs Acumuladas (4)
         [],   #Frecuencias Rel Acumuladas (5)
         0.0,  #Número total de datos (6)
         [],   #Xi x Ni (7)
         0.0,  #Suma de todos los productos de Xi x Ni (8)
         0.0,  #Media aritmética (9)
         0.0,  #Moda (10)
         0.0,  #Mediana (11)
         0.0,  #Rango (12)
         [],   #|xi - x| * ni (13)
         0.0,  #Suma de todas las desviaciones por la frecuencia (14)
         0.0,  #Desviación Media (15)
         [],   #xi^2 * ni (16)
         0.0,  #Suma de todos los productos de datos[16] (17)
         0.0,  #Varianza (18)
         0.0   #Desviación Típica (19)
        ]

def recopilacion_datos_cuant():
  print("Bienvenido a Statistics. Has seleccionado el modo variables cuantitativas. Sigue los pasos descritos para realizar un estudio estadístico")
  seguir = True
  # Proceso para añadir los valores y frecuencias que deseé el usuario
  while seguir:
    lineas(1)
    valor = introduce_valor(float,"Inserte valor de la variable: ")
    datos[1].append(valor)
    frecuencia = introduce_valor(float,"Inserte frecuencia absoluta: ")
    datos[2].append(frecuencia)
    lineas(1)
    if input("> ¿Añadir más valores? s/n ") == "n":
      seguir = False

def recopilacion_datos_cuant_intervalo():
  print("Bienvenido a Statistics. Has seleccionado el modo variables cuantitativas en forma de intervalo. Sigue los pasos descritos para realizar un estudio estadístico")
  seguir = True
  # Proceso para añadir los valores y frecuencias que deseé el usuario
  while seguir:
    lineas(1)
    intervalo = []
    intervalo.append(introduce_valor(float, "Inserte el inicio del intervalo: "))
    intervalo.append(introduce_valor(float, "Inserte el cierre del intervalo: "))
    marca_clase = 0
    for i in intervalo:
      marca_clase += i
    marca_clase = marca_clase / 2
    lineas(1)
    print("  > La marca de clase del intervalo es: ", marca_clase)
    lineas(1)
    datos[1].append(marca_clase)
    datos[0].append(intervalo)
    frecuencia = introduce_valor(float,"Inserte frecuencia absoluta: ")
    datos[2].append(frecuencia)
    lineas(1)
    if input("> ¿Añadir más valores? s/n ") == "n":
      seguir = False

def recopilacion_datos_cualit():
  print("Bienvenido a Statistics. Has seleccionado el modo variables cualitativas. Sigue los pasos descritos para realizar un estudio estadístico")
  seguir = True
  # Proceso para añadir los valores y frecuencias que deseé el usuario
  while seguir:
    lineas(1)
    valor = introduce_valor(str,"Inserte valor de la variable: ")
    datos[1].append(valor)
    frecuencia = introduce_valor(float,"Inserte frecuencia absoluta: ")
    datos[2].append(frecuencia)
    lineas(1)
    if input("> ¿Añadir más valores? s/n ") == "n":
      seguir = False

def analizando_datos_cuant():
  "Esta función calcula todo lo necesario para futuros estudios estadísticos"
  # En un mismo bucle se calcula el número total de datos y las frecuencias absolutas acumuladas.
  datos[6] = 0.0
  frec_abs_acu = 0.0
  for i in datos[2]:
    datos[6] += i
    frec_abs_acu += i
    datos[4].append(frec_abs_acu)

  # Aquí se calculan y guardan las frecuencias relativas.
  for i in datos[2]:
    frec_rel = i/datos[6]
    datos[3].append(frec_rel)

  # Aquí se calculan las frec. rel. acumuladas.
  frec_rel = 0
  for i in datos[3]:
    datos[5].append(frec_rel)
    frec_rel += i

  # Aquí se calculan los productos de Xi x Ni y el sumatorio de los mismos.
  count = 0
  while count < len(datos[1]):
    producto = float(datos[1][count]) * float(datos[2][count])
    datos[7].append(producto)
    datos[8] += float(producto)
    count += 1

def analizando_datos_cualit():
  "Esta función calcula todo lo necesario para futuros estudios estadísticos"
  # En un mismo bucle se calcula el número total de datos y las frecuencias absolutas acumuladas.
  datos[6] = 0.0
  frec_abs_acu = 0.0
  for i in datos[2]:
    datos[6] += i
    frec_abs_acu += i
    datos[4].append(frec_abs_acu)

  # Aquí se calculan y guardan las frecuencias relativas.
  for i in datos[2]:
    frec_rel = i/datos[6]
    datos[3].append(frec_rel)

  # Aquí se calculan las frec. rel. acumuladas.
  frec_rel = 0
  for i in datos[3]:
    datos[5].append(frec_rel)
    frec_rel += i

def parametros_centralizacion_cuant():
  "Cálculo de media aritmética, Moda y Mediana"
  # Calculando la media aritmética "datos[9]":
  datos[9] = datos[8] / datos[6]

  # Calculando la moda "datos[10]":
  frec_max = 0
  for i in range(len(datos[1])):
    if datos[2][i] > frec_max:
      frec_max = datos[2][i]
      datos[10] = datos[1][i]

  # Calculando la mediana "datos[11]":
  n_datos = datos[6] / 2.0
  n = 0
  for i in datos[4]:
    n += 1
    if i < n_datos:
      continue
    elif i == n_datos:
      datos[11] = (float(datos[1][n-1]) + float(datos[1][n])) / 2
      break
    else:
      datos[11] = datos[1][n-1]
      break

def parametros_centralizacion_cuant_intervalo():
  "Cálculo de media aritmética, Moda y Mediana"
  # Calculando la media aritmética "datos[9]":
  datos[9] = datos[8] / datos[6]

  # Calculando la moda "datos[10]"
  # En primer lugar se calcula la clase modal.
  clase_modal = []
  posicion_clase_modal = 0
  frec_max = 0
  for i in range(len(datos[1])):
    if datos[2][i] > frec_max:
      frec_max = datos[2][i]
      clase_modal = datos[0][i]
      posicion_clase_modal = i
  # Ahora se calcula el valor modal.
  li = clase_modal[0] # Li es es extremo inferior de la ClaseModal
  c = clase_modal[1] - clase_modal[0] # c es la amplitud del intervalo modal
  clase_modal_anterior = 0
  clase_modal_posterior = 0
  if posicion_clase_modal == 0:
    clase_modal_anterior = 0
  else:
    clase_modal_anterior = datos[2][posicion_clase_modal - 1]
  if posicion_clase_modal == len(datos[1]) - 1:
    clase_modal_posterior = 0
  else:
    clase_modal_posterior = datos[2][posicion_clase_modal + 1]
  d1 = abs(clase_modal_anterior - datos[2][posicion_clase_modal])
  d2 = abs(clase_modal_posterior - datos[2][posicion_clase_modal])
  datos[10] = li + c * (d1/(d1+d2))

  # Calculando la Mediana "datos[11]"
  # Lo primero es determinar la clase mediana.
  n_datos = datos[6] / 2.0
  clase_mediana = []
  posicion_clase_mediana = 0
  n = 0
  for i in datos[4]:
    if i < n_datos:
      n += 1
      continue
    elif i == n_datos:
      n += 1
      continue
    else:
      clase_mediana = datos[0][n]
      posicion_clase_mediana = n
  # Calculando el valor mediano
  li = clase_mediana[0]
  c = clase_mediana[1] - clase_mediana[0]
  ni = datos[2][posicion_clase_mediana]
  Ni_1 = datos[4][posicion_clase_mediana - 1]
  datos[11] = li + c * ((n_datos - Ni_1) / ni)

def parametros_centralizacion_cualit():
  "Cálculo de la Moda"
  # Calculando la moda "datos[10]":
  for i in range(len(datos[1])-1):
    maxima = 0
    if datos[2][i] > maxima:
      maxima += datos[2][i]
      datos[10] = datos[1][i]

def parametros_dispersion():
  "Cálculo de Rango, Desviación Media, Varianza y Desviación Típica"
  # Calculando el Rango "datos[12]"
  datos[12] = datos[1][len(datos[1])-1] - datos[1][0]

  # Calculando la Desviación Media
  for i in range(len(datos[1])):
    desv_media = abs(datos[1][i] - datos[9]) * datos[2][i]
    datos[13].append(desv_media)
  for i in datos[13]:
    datos[14] += i
  datos[15] = datos[14] / datos[6]

  # Calculando la Varianza "datos[18]"
  for i in range(len(datos[1])):
    producto = (datos[1][i]**2) * datos[2][i]
    datos[16].append(producto)
  for i in datos[16]:
    datos[17] += i
  datos[18] = datos[17] / datos[6] - datos[9]**2

  # Calculando la Desviación Típica "datos[19]"
  datos[19] = math.sqrt(datos[18])

def tabla_frecuencia_cuant():#Hay que mejorar esta sección MUCHO!!
  lineas(2)
  print("Valores: ", datos[1])
  print("Frecuencias Absolutas: ", datos[2])
  print("Frecuencias Relativas: ", datos[3])
  print("Frecuencias Abs. Acu.: ", datos[4])
  print("Frecuencias Rel. Acu.: ", datos[5])
  print("------------------------------------")
  print("Número total de datos: ", datos[6])
  print("La media aritmética es: ", datos[9])
  print("La moda es: ", datos[10])
  print("La mediana es: ", datos[11])
  print("------------------------------------")
  print("El rango de la distribución es: ", datos[12])
  print("La desviación media es: ", datos[15])
  print("La varianza es: ", datos[18])
  print("La desviación típica es: ", datos[19])
  print("------------------------------------")
  print(">> Statistics v0.1 Alpha")
  print(">> Iyán Méndez Veiga")
  print(">> [email protected]")

def tabla_frecuencia_cuant_intervalo():#Hay que mejorar esta sección MUCHO!!
  lineas(2)
  print("Intervalo: ", datos[0])
  print("Marca de clase: ", datos[1])
  print("Frecuencias Absolutas: ", datos[2])
  print("Frecuencias Relativas: ", datos[3])
  print("Frecuencias Abs. Acu.: ", datos[4])
  print("Frecuencias Rel. Acu.: ", datos[5])
  print("------------------------------------")
  print("Número total de datos: ", datos[6])
  print("La media aritmética es: ", datos[9])
  print("La moda es: ", datos[10])
  print("La mediana es: ", datos[11])
  print("------------------------------------")
  print("El rango de la distribución es: ", datos[12])
  print("La desviación media es: ", datos[15])
  print("La varianza es: ", datos[18])
  print("La desviación típica es: ", datos[19])
  print("------------------------------------")
  print(">> Statistics v0.1 Alpha")
  print(">> Iyán Méndez Veiga")
  print(">> [email protected]")

def tabla_frecuencia_cualit(): #Hay que mejorar esta sección MUCHO!!
  lineas(2)
  print("Valores: ", datos[1])
  print("Frecuencias Absolutas: ", datos[2])
  print("Frecuencias Relativas: ", datos[3])
  print("Frecuencias Abs. Acu.: ", datos[4])
  print("Frecuencias Rel. Acu.: ", datos[5])
  print("------------------------------------")
  print("Número total de datos: ", datos[6])
  print("La moda es: ", datos[10])
  print("------------------------------------")
  print(">> Statistics v0.1 Alpha")
  print(">> Iyán Méndez Veiga")
  print(">> [email protected]")

opcion_inicial = introduce_valor(int, "¿Va a trabajar con variables cuantitativas(1) o cualitativas(2)? ")
lineas(1)
if opcion_inicial == 1:
  intervalos = introduce_valor(str, "¿Los valores están en forma de intervalos? s/n ")
  if intervalos == "s":
    recopilacion_datos_cuant_intervalo()
    analizando_datos_cuant()
    parametros_centralizacion_cuant_intervalo()
    parametros_dispersion()
    tabla_frecuencia_cuant_intervalo()
  else:
    recopilacion_datos_cuant()
    analizando_datos_cuant()
    parametros_centralizacion_cuant()
    parametros_dispersion()
    tabla_frecuencia_cuant()
elif opcion_inicial == 2:
  recopilacion_datos_cualit()
  analizando_datos_cualit()
  parametros_centralizacion_cualit()
  tabla_frecuencia_cualit()
else:
  print("Opción no validad. Fin del programa.")
  print("------------------------------------")
  print(">> Statistics v0.1 Alpha")
  print(">> Iyán Méndez Veiga")
  print(">> [email protected]")
  lineas(2)

lineas(1)

Lista de cambios desde la v0.1 Alpha

  • Nombres de variables y funciones en minúsculas.
  • Añadida función para introducir valores y evitar excepciones
  • Soporte para intervalos y todos los parámetros asociados
  • Parámetros de dispersión
  • Algunos cambios menores

Planes para la Release Candidate

Sí, sé lo que estáis pensado: ¿alpha, beta, RC para este mini-programa? El problema es que no sabía cómo llamar a las versiones y esto de las versiones en desarrollo me gusta.

:)

Para la RC tengo pensado completar los parámetros de dispersión con el coeficiente de Pearson, la tipificación de variables (quizás) y si me da tiempo añadir las funciones para la estadística bidimensional y sus parámetros (covarianza,etc.). También tengo que mejorar como se muestran los datos. Ya para un futuro más lejano tengo pensado hacer una interfaz gráfica con PyQt4. Si conocéis algunos manuales buenos no dudéis en pasármelos.

:)

Como siempre os agradezco que echéis un ojo al programa y comentéis los fallos, formas de mejorarlo, consejos, etc. Recordad que estoy aprendiendo Python (y a programar) así que seguramente veáis muchos.


Filed under: GNU/Linux, Programación, Python, Software libre
Statistics v0.1 Beta
Statistics v0.1 Beta
Statistics v0.1 Beta

Volver a la Portada de Logo Paperblog

Dossier Paperblog