Statistics v0.1 Beta

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(">> me@iyanmv.com")
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(">> me@iyanmv.com")

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(">> me@iyanmv.com")

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(">> me@iyanmv.com")

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(">> me@iyanmv.com")
  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.

Anuncios

3 Responses to “Statistics v0.1 Beta”


  1. 1 Enigma diciembre 25, 2010 en 6:39 pm

    Un buen tuto el cual pienso que te puede servir muchisimo en aprender a programar en PyQt4 es el siguiente:

    http://zetcode.com/

    Espero te sea de utilidad, saludos…

  2. 2 helq enero 2, 2011 en 6:14 pm

    Jajajaja, estoy estudiando tu código por que estoy aprendiendo python (sobre todo el 2 con eso aprendo luego el cambio a 3), y me he dado cuenta de un error menor, tienes en la portada el “Beta” pero el código del programa dice que es “Alpha” (linea 003), además me llevo el código que dejo @Adri, me parece interesante.
    Gracias por publicar este tipo de cosas Iyan, sobre todo para aquellos que estamos aprendiendo. 😉


  1. 1 Bitacoras.com Trackback en diciembre 25, 2010 en 6:07 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Fedora 14

Visitas al blog

  • 699,713 visitas

Bienvenido!!

Estimado lector, en primer lugar, gracias por seguir mi blog y ayudar a mejorarlo. En esta bitácora encontrarás noticias, tutoriales y muchas cosas más sobre GNU/Linux y el Software Libre, sobre todo de dos distribuciones, Fedora y Arch Linux. No dudes en preguntar tus dudas, comentar las entradas o proponerme ideas para el blog. Más información en Acerca de
Creative Commons License
Esta obra está bajo una licencia de Creative Commons.

Introduce tu correo para suscribirte a este blog y recibir las entradas en tu correo.

Únete a otros 72 seguidores

Comentarios recientes

Marcos en Post-Instalación de Arch …
Dasn en NTP en ArchLinux
Maria en Borrón y cuenta nueva
iyan gonzalez en Borrón y cuenta nueva
Spanish Red en Fedora o Archlinux

Guia de Usuario Fedora 14

Post-instalación de Arch Linux

Categorías

Fedora Blogger Network


A %d blogueros les gusta esto: