Foros del Web » Programando para Internet » ASP Clásico »

Estadistica: extraer la mediana

Estas en el tema de Estadistica: extraer la mediana en el foro de ASP Clásico en Foros del Web. Hola!! Estoy tratando de obtener la mediana de una serie de datos No encuentro ninguna funcion en SQL o ASp que pueda servirme , pero ...
  #1 (permalink)  
Antiguo 27/10/2004, 09:31
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 3 meses
Puntos: 0
Estadistica: extraer la mediana

Hola!!
Estoy tratando de obtener la mediana de una serie de datos
No encuentro ninguna funcion en SQL o ASp que pueda servirme , pero seguramente debe existir la forma.
Por favor si alguien sabe como hacerlo lo agradecer mucho
Aclaro que es la MEDIANA para ser mas explicativo de lo que necesito:

La mediana es el valor del elemento intermedio cuando todos los elementos se ordenan.
Fórmula de la mediana:

Mediana = X[n/2 +1/2] La parte de [n/2 + 1/2] representa la posición.

Donde X es la posición de los números y n es el número de elementos.

Ejemplo: Buscar la mediana de los siguientes números:

2 4 1 3 5 6 3

Primero, hay que ordenarlos:

1 2 3 3 4 5 6
X1 X2 X3 X4 X5 X6 X7 ( Las posiciones de los números)

Mediana = X[7/2 + ½]

X[3.5 + .5] < Se cambió el ½ a .5>

X4 < La mediana está en la posición 4>

Por lo tanto, la mediana es 3.

Ejemplo: Buscar la mediana del ejemplo anterior de la media.

Números del ejemplo anterior: 10,12,13,12,11

1. Hay que ordenarlos, en este caso de forma ascendente; aunque también puede ser descendente.

10 , 11 , 12 , 12 , 13

2. Buscar el elemento intermedio.

10 , 11 , 12 , 12 , 13

El elemento del medio es 12.

Por lo tanto, la mediana es 12.

Nota: Si el número de elementos es impar, la mediana es el número del elemento intermedio. Si el número de elementos es par, se hace el cómputo mostrado en el ejemplo siguiente:

Buscar la mediana de :

15 , 13 , 11 , 14 , 16 , 10 , 12 , 18

Como el número de elementos es par, hay que utilizar los dos números intermedios.

10 , 11 , 12 , 13 , 14 , 15 , 16, 18 ( ordenados)

13 y 14

Ahora, para buscar la mediana:

1. Sumar ambos números. <13 + 14 = 27>
2. Dividirlo entre 2. < 27/2 = 13.5>
3. El resultado es la mediana. < 13.5>

Gracias a todos
  #2 (permalink)  
Antiguo 27/10/2004, 10:00
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
Ufff.. no sé si SQL tendrá alguna funsión que la calcule, pero si estoy seguro que no existe nada para sacar la mediana en ASP(VBScript)... aunque por supesto se puede hacer, como prácticamente todo. Es más, seguro que ya alguien la hizo... habría que ver cuál es la palabra o término en inglés que identifique a la "función estadística mediana" para buscarlo (porque lamentablemente la mayoría de las cosas se encuentran en ese idioma).

Veo si encuentro algo por allí y te comento.
__________________
...___...
  #3 (permalink)  
Antiguo 27/10/2004, 11:28
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Bueno, no está totalmente probado, pero aqui te dejo este código, funciona a base de arreglos...

Código:
<%
'Función para ordenar un arreglo, método de la burbuja
Function OrdenaArreglo(arreglo)
	If isArray(arreglo) Then
		Dim temp
		For i = 0 to uBound(arreglo)
			For j = i + 1 to uBound(arreglo)		
				If arreglo(i) > arreglo(j) Then
					temp = arreglo(i)
					arreglo(i) = arreglo(j)
					arreglo(j) = temp
				End If
			Next
		Next
	Else
		OrdenaArreglo = Null
	End If
	OrdenaArreglo = arreglo
End Function

'Devuelve el número de indices + 1 en caso de que sea arreglo
Function cuentaArreglo(arreglo)
	If isArray(arreglo) Then
		cuentaArreglo = Ubound(arreglo) + 1
	Else
		cuentaArreglo = null
	End If
End Function

Function esPar(num)
	select Case abs(num) mod 2
		case 0: esPar = true
		case 1: esPar = false
	end select
End Function

Sub ImprimeArreglo(arreglo)
	For i = 0 to uBound(arreglo)
		Response.Write arreglo(i) & ","
	Next
End Sub

'serie de números, puede llegar por formulario, es importante separarlo por comas
serie = "10 , 11 , 12 , 12 , 13"
'quitamos cada espacio en la serie
serie = replace(serie, " ", "")
'Si no está vacia nuestra serie
If not serie = "" Then
	arrSerie = OrdenaArreglo(split(serie, ","))
	If not isNull(arrSerie) Then
		elementos = cuentaArreglo(arrSerie)
		If not IsNull(elemento) Then
			Par = esPar(elementos)
			If Par Then
				intermedio1 = cint(elementos/2) - 1
				intermedio2 = cint(elementos/2)
				mediana = cdbl(arrSerie(intermedio1)) + cdbl(arrSerie(intermedio2))
				mediana = mediana/2
			Else
				mediana = arrSerie(abs(elementos/2))
			End If
			Response.Write "Esta es la mediana para la serie["  
			ImprimeArreglo arrSerie
			Response.Write "]: " & mediana
		End If
	Else
		Response.Write "Ingresa una serie correcta, separada por ','"
	End If
Else
	Response.Write "Ingresa una serie correcta, separada por ','"
End If
%>
Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #4 (permalink)  
Antiguo 27/10/2004, 12:55
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535


Ouch, acabo de terminarlo yo también.
Bueno, te paso otra opción que debe ser muy similar a la de u_g

Hace uso de una función que encontré en 4GuysFromRolla.com y sirve para ordenar el array:

Código:
Sub QuickSort(vec,loBound,hiBound)
  Dim pivot,loSwap,hiSwap,temp

  '== This procedure is adapted from the algorithm given in:
  '==    Data Abstractions & Structures using C++ by
  '==    Mark Headington and David Riley, pg. 586
  '== Quicksort is the fastest array sorting routine for
  '== unordered arrays.  Its big O is  n log n


  '== Two items to sort
  if hiBound - loBound = 1 then
    if vec(loBound) > vec(hiBound) then
      temp=vec(loBound)
      vec(loBound) = vec(hiBound)
      vec(hiBound) = temp
    End If
  End If

  '== Three or more items to sort
  pivot = vec(int((loBound + hiBound) / 2))
  vec(int((loBound + hiBound) / 2)) = vec(loBound)
  vec(loBound) = pivot
  loSwap = loBound + 1
  hiSwap = hiBound
  
  do
    '== Find the right loSwap
    while loSwap < hiSwap and vec(loSwap) <= pivot
      loSwap = loSwap + 1
    wend
    '== Find the right hiSwap
    while vec(hiSwap) > pivot
      hiSwap = hiSwap - 1
    wend
    '== Swap values if loSwap is less then hiSwap
    if loSwap < hiSwap then
      temp = vec(loSwap)
      vec(loSwap) = vec(hiSwap)
      vec(hiSwap) = temp
    End If
  loop while loSwap < hiSwap
  
  vec(loBound) = vec(hiSwap)
  vec(hiSwap) = pivot
  
  '== Recursively call function .. the beauty of Quicksort
    '== 2 or more items in first section
    if loBound < (hiSwap - 1) then Call QuickSort(vec,loBound,hiSwap-1)
    '== 2 or more items in second section
    if hiSwap + 1 < hibound then Call QuickSort(vec,hiSwap+1,hiBound)

End Sub  'QuickSort

Luego está la función que hice para obtener la mediana:

Código:
Function Mediana(x)
	CantidadElementos = UBound(x) + 1
	If CantidadElementos mod 2 = 0 then
		Inferior = (CantidadElementos / 2 - 1)
		Superior = Inferior + 1
		ValorMediana = (CDbl(x(Inferior)) + CDbl(x(Superior))) / 2
		Mensaje = "El conjunto es par y cuenta de " & CantidadElementos & " elementos.<br>" _
			& " El 'mediano inferior' es el de índice " & Inferior & " dentro del array" _
			& " (con valor " & x(Inferior) & ") y el 'mediano superior' es el de índice " _
			& Superior & " dentro del array (con valor " & x(Superior) & ").<br>" _
			& " Por lo tanto la mediana es: "
		Mediana = Mensaje & ValorMediana
	Else
		Mensaje = "El conjunto es imparpar y cuenta de " & CantidadElementos & " elementos." _
			& "<br> Por lo tanto la mediana está en la posición "_
			& Int(CantidadElementos / 2) & " del array y es: "
		ValorMediana = x(Int(CantidadElementos / 2))
		Mediana = Mensaje & ValorMediana
		End if
End Function

Y la llamás así:

Código:
Valores = "15 , 13 , 11 , 14 , 16 , 10 , 12 , 18"
Valores = Replace(Valores, " ", "")
arrValores = Split(Valores, ",")

Call QuickSort(arrValores, LBound(arrValores), UBound(arrValores))
Response.Write Mediana(arrValores)
Saludos
__________________
...___...

Última edición por AlZuwaga; 27/10/2004 a las 13:02
  #5 (permalink)  
Antiguo 27/10/2004, 13:59
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 3 meses
Puntos: 0
Gracias a ambos

Estoy muy agradecido por sus prontas respuestas
Yo ahora estoy con la version de u_goldman ya que ademas debo adaptarla para que tome los datos de una base de datos, es decir, uno de los campos tiene los valores y de esa esos registros debo tomar la mediana
Estoy muy agradecido a ustedes
En que puedo colaborar para cerrar este tema?
Saludos
Shaka
  #6 (permalink)  
Antiguo 27/10/2004, 16:20
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Pos nomás invita las cervezas del viernes
Si puedes haz algo mas modular y cuélgalo en algún lado, a alguien más le debe servir.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #7 (permalink)  
Antiguo 27/10/2004, 16:38
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 3 meses
Puntos: 0
Hecho !!!!!!
Las cervezas corren por mi cuenta,
eso si, avisame cuando estes por Buenos Aires
Gracias
  #8 (permalink)  
Antiguo 27/10/2004, 16:50
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
no hubieras disho eso, AZ cobrará por todos los del foro..!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 27/10/2004, 17:15
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
¿cervezas y en BsAs? Seehhh!!!!

u_g, despreocupate que me voy a tomar unas cuantas a tu salud ;)
__________________
...___...
  #10 (permalink)  
Antiguo 27/10/2004, 18:15
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
je je je, me mandas aunque sea un Response.Write "Que buenas Quilmes!!"

Salúuuu!
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #11 (permalink)  
Antiguo 27/10/2004, 21:17
 
Fecha de Ingreso: febrero-2003
Mensajes: 141
Antigüedad: 21 años, 3 meses
Puntos: 0
<% Response.Write "Que buenas Schneider, quilmes , BRahma etc !!!!" %>
Cuando quieran !!!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:35.