Ayuda

28/10/2007 - 02:30 por Garabato | Informe spam
Ojalá me puedan ayudar, hasta ahora nadie puede con este problema:

Tengo 108 datos con valores entre 230 y 270, deseo dividirlos en cuatro
columnas de 27 datos cada una de tal manera que cada columna tenga el mismo
promedio o promedios casi iguales.

Saludos
Miguel

Preguntas similare

Leer las respuestas

#1 Ivan
28/10/2007 - 04:46 | Informe spam
hola Miguel

Tengo 108 datos con valores entre 230 y 270, deseo dividirlos en cuatro
columnas de 27 datos cada una de tal manera que cada columna tenga el mismo
promedio o promedios casi iguales.



no estoy seguro de si te refieres a algo asi, ni si es totalmente
efecivo (en mis pruebas si lo parece) pero si quieres haz una prueba
con esto, a ver que tal (es una chapuza y seguro que hay formas mas
directas de hacerlo, pero es lo que se me ha ocurrido)

.->>suponiendo que:

a) la lista la tienes en la columna A

b) quieres poner el resultado en las columnas de la C a la F,

c) los datos empiezan (y se pegan) a partir de la fila 2 incluida,

d) columna A esta ordenada en orden ascendente

e) no tienes datos en el rango IS1:IV1

._>>pega este codigo en un modulo normal y ejecutalo

Sub prueba_Promedios()
Dim fL As Integer, fP As Integer, c As Integer, cR As Integer
[c2] = [a2]: [d2] = [a3]: [e2] = [a4]: [f2] = [a5]
[is1:iv1].Clear
[is1] = [a2]: [it1] = [a3]: [iu1] = [a4]: [iv1] = [a5]
fL = 6: fP = 3
Do While fP < 29
Do
For cR = 253 To 256
If Cells(1, cR) = Application.Max([is1:iv1]) Then _
c = cR - 250: Cells(1, cR) = 0: Exit For
Next
Cells(fP, c) = Cells(fL, 1)
fL = fL + 1
Loop Until Application.Sum([is1:iv1]) = 0
For cR = 253 To 256
Cells(1, cR) = Application.Sum(Range(Cells(2, cR - 250),
Cells(fP, cR - 250)))
Next
fP = fP + 1
Loop
[is1:iv1].Clear
End Sub

ya te digo que no es muy cientifica, pero parece funcionar

espero te ayude y si quieres comentas

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Héctor Miguel
28/10/2007 - 05:39 | Informe spam
hola, chicos !

(Miguel) escribio en el mensaje ...
Ojala me puedan ayudar, hasta ahora nadie puede con este problema:
... 108 datos con valores entre 230 y 270... dividirlos en cuatro columnas de 27
... de tal manera que cada columna tenga el mismo promedio o promedios casi iguales.

Ivan escribio en el mensaje ...
no estoy seguro de si te refieres a algo asi, ni si es totalmente efecivo (en mis pruebas si lo parece) ...





Ivan: revisa lo siguiente de los resultados obtenidos:
a) la suma de los valores no es la misma (entre la matriz original -columna A- y las 4 columnas x 27 filas -C2:F28-)
b) la cuenta de numeros (las veces que se encuentran) tampoco es la misma entre las dos matrices (por obviedad)

Miguel: (creo que) en lugar de comentar que "... nadie puede con este problema..."
convendria que fueras mas "claro" en cuanto al objetivo que persigues con "tal procedimiento" (p.e.)
- si no es importante "donde quede" cada valor (de su matriz original en las cuatro nuevas matrices)
- por que es "importante" que los promedios en cada nueva matriz sean lo mas "equilibrados" posible
- cualquier otro "detalle" que permita lograr que "el problema"... DEJE DE SER "problema" :))

saludos,
hector.
Respuesta Responder a este mensaje
#3 Héctor Miguel
28/10/2007 - 06:18 | Informe spam
hola (de nuevo), chicos ! (fe de erratas) :-(

Ivan: revisa lo siguiente de los resultados obtenidos:
a) la suma de los valores no es la misma (entre la matriz original -columna A- y las 4 columnas x 27 filas -C2:F28-)
b) la cuenta de numeros (las veces que se encuentran) tampoco es la misma entre las dos matrices (por obviedad)



Ivan: olvida los comentarios anteriores (yo) perdi de vista dos "detalles":
a) confundi 108 con 180
b) omiti la condicion de que estuvieran ordenados (aunque parece no importar) -?-

(sorry)... saludos,
hector.
Respuesta Responder a este mensaje
#4 Ivan
30/10/2007 - 02:00 | Informe spam
hola Hector, (que curioso, acabo de pegar la respuesta en OE <la habia escrito en google> y me he encontrado con que el
tema cuelga de otro>)

(sorry)... saludos,







me quedo con los saludos, lo otro creo que sobra (aunque yo suela usarlo en exceso), aun mas cuando se trata de corregir
un error, y aunque la correccion sea o no correcta. Mejor eso que dejarlo como bueno pensando que no lo es.

bueno, ahora, a la espera de OP, y solo como curiosidad, aunque supongo que ya lo verias, comentarte que el
procedimiento no acaba de afinar el tema, auque a veces lo clave. Por ejemplo, y saliendome del caso concreto de OP, si
se trata de una serie, pej. de 1 a 108, la suma de cada una de las 4 columnas X 27 filas devolveria esto=>>

1470 1471 1472 1473

siendo la media de estos resultados 1471,50, para igualar al maximo los promedios, supongo que lo ideal seria que
hubiera devuelto pej. algo asi =>>

1471 1471 1472 1472

tambien sin ser series, es decir con repetidos a veces se desajusta y otras no. Evidentemente depende de los datos y del
numero de repeticiones de estos y su posicion.

he hecho otra prueba, aun mas enrevesada si cabe, que toma el valor del inicio (minimo) o del final (maximo) de la lista
en funcion de si la media de lo acumulado en cada columna es mayor o menor a la media total. Pero aunque en algunas
ocasiones se ajusta mas que el otro codigo, en general suele quedar peor.

en fin, todo esto es para preguntarte si existe alguna forma de hacerlo mas ajustado, con funciones estadisticas por
ejemplo (he estado tanteandolas, pero la estadistica nunca fue santo de mi devocion y no me aclaro con ellas).

en general las diferencias de ajuste suelen ser minimas, y supongo que buscando las diferencias/desviaciones respecto de
la media entre los resultados de cada columna e intercambiando algunos valores entre columnas podria arreglarse, pero no
acabo de ver una forma de generalizarlo

como ves es otra de mis dudas por curiosidad y para practicar, pero me ha resultado interesante. Cualquier comentario
sera bienvenido

un saludo
Ivan

PD: aqui va ell otro codigo por si ves donde meterle mano para ajustarlo

Sub Promedios()
Dim f_Min As Integer, f_Max As Integer, f_Res As Integer, _
c_Suma As Integer, n As Integer, Media As Long, Media_C
[c2:f29].Clear: [is1:iv1].Clear
For n = 3 To 6
Cells(2, n) = Cells(n - 1, 1)
Cells(3, 9 - n) = Cells(103 + n, 1)
Next
f_Min = 6: f_Max = 105: f_Res = 3: Media = Application.Sum([a2:a109]) / 108
Media_C = Array(0, 0, 0, 0)
Do While f_Min <= f_Max And f_Res < 29
For n = 253 To 256
Cells(1, n) = Application.Sum(Range(Cells(2, n - 250), Cells(f_Res, n - 250)))
Media_C(n - 253) = Cells(1, n) / (f_Res - 1)
Next
f_Res = f_Res + 1
Do
For n = 253 To 256
If Cells(1, n) = Application.Max([is1:iv1]) Then
If Media_C(n - 253) < Media Then
Cells(f_Res, n - 250) = Cells(f_Max, 1): f_Max = f_Max - 1
Else
Cells(f_Res, n - 250) = Cells(f_Min, 1): f_Min = f_Min + 1
End If
Cells(1, n) = 0: Exit For
End If
Next
Loop Until Application.Sum([is1:iv1]) = 0
Loop
[is1:iv1].Clear
End Sub




"Héctor Miguel" escribió en el mensaje news:
hola (de nuevo), chicos ! (fe de erratas) :-(

Ivan: revisa lo siguiente de los resultados obtenidos:
a) la suma de los valores no es la misma (entre la matriz original -columna A- y las 4 columnas x 27
filas -C2:F28-)
b) la cuenta de numeros (las veces que se encuentran) tampoco es la misma entre las dos matrices (por obviedad)



Ivan: olvida los comentarios anteriores (yo) perdi de vista dos "detalles":
a) confundi 108 con 180
b) omiti la condicion de que estuvieran ordenados (aunque parece no importar) -?-

(sorry)... saludos,
hector.

Respuesta Responder a este mensaje
#5 Héctor Miguel
30/10/2007 - 04:45 | Informe spam
hola, Ivan !

(dejo solo parte de las inquietudes para -solo- tratar de aplicar algunos principios matematicos basicos)

... si se trata de una serie, pej. de 1 a 108, la suma de cada una de las 4 columnas X 27 filas devolveria 1470 1471 1472 1473
... para igualar al maximo los promedios, supongo que lo ideal seria que hubiera devuelto pej. algo asi -> 1471 1471 1472 1472
... con repetidos a veces se desajusta y otras no. Evidentemente depende de los datos y del numero de repeticiones ...
... otra prueba... toma el valor... (minimo) o... (maximo) de la lista en funcion de si la media de lo acumulado en cada columna
es mayor o menor a la media total en algunas ocasiones se ajusta mas que el otro codigo, en general suele quedar peor.
... si existe alguna forma de hacerlo mas ajustado, con funciones estadisticas por ejemplo
(he estado tanteandolas, pero la estadistica nunca fue santo de mi devocion y no me aclaro con ellas)...



partiendo de que si la suma de varias columnas es igual, el promedio debera tambien ser igual...
1) una forma de "equilibrar" sumas de una serie de numeros "consecutivos" vertida en varias columnas es la distribucion inversa (p.e.)
a) los numeros non de izquierda a derecha y de arriba hacia abajo
los numeros par de derecha a izquierda y de abajo hacia arriba
b) la "igualdad" dependende directamente de que el numero de filas resultantes sea PAR (independiente de cuantas columnas)
c) la suma en cada columna de cada celda "espejo" es la misma (p.e.) fila1<->fila26 fila2<->fila25 fila3<->fila24 (etc.)

2) en cuanto el numero de filas resultantes es un numero IMPAR, la fila "del centro" es la que causa la discordia
(haz algunas pruebas y ya me diras cual pudiera resultar "la mejor forma" de mantener la "igualdad" para el resto de las columnas)

3) si a lo anterior le agregas numeros repetidos y faltantes... (como que la cosa se empieza a poner mas "simpatica") :))
(por esto es que le preguntaba a OP por algunos detalles mas... "relevantes") ;)

prueba lo anterior con una macro +/- como la siguiente (OJO que las celdas de la hoja se "limpan" y la suma la tienes que re/poner)
y... si cualquier duda... comentas ?
saludos,
hector.

Sub Sumas_iguales()
Application.ScreenUpdating = False
' Dim Inicio As Single: Inicio = Timer
Dim Max As Byte, Cols As Byte
Dim n As Integer, f As Byte, c As Byte
Max = 104 ' 108 ' 182
Cols = 4 ' 4 ' 7
Cells.Clear
With [b1]
For n = 1 To Max Step 2: If c = 0 Then f = f + 1
.Offset(f, c) = n: c = IIf(c < Cols - 1, c + 1, 0)
Next
For n = Max To 1 Step -2: If c = 0 Then f = f + 1
.Offset(f, c) = n: c = IIf(c < Cols - 1, c + 1, 0)
Next
End With
' [a1] = Timer - Inicio
End Sub

__ nueva propuesta de codigo __
PD: aqui va ell otro codigo por si ves donde meterle mano para ajustarlo
Sub Promedios()
Dim f_Min As Integer, f_Max As Integer, f_Res As Integer, _
c_Suma As Integer, n As Integer, Media As Long, Media_C
[c2:f29].Clear: [is1:iv1].Clear
For n = 3 To 6
Cells(2, n) = Cells(n - 1, 1)
Cells(3, 9 - n) = Cells(103 + n, 1)
Next
f_Min = 6: f_Max = 105: f_Res = 3: Media = Application.Sum([a2:a109]) / 108
Media_C = Array(0, 0, 0, 0)
Do While f_Min <= f_Max And f_Res < 29
For n = 253 To 256
Cells(1, n) = Application.Sum(Range(Cells(2, n - 250), Cells(f_Res, n - 250)))
Media_C(n - 253) = Cells(1, n) / (f_Res - 1)
Next
f_Res = f_Res + 1
Do
For n = 253 To 256
If Cells(1, n) = Application.Max([is1:iv1]) Then
If Media_C(n - 253) < Media Then
Cells(f_Res, n - 250) = Cells(f_Max, 1): f_Max = f_Max - 1
Else
Cells(f_Res, n - 250) = Cells(f_Min, 1): f_Min = f_Min + 1
End If
Cells(1, n) = 0: Exit For
End If
Next
Loop Until Application.Sum([is1:iv1]) = 0
Loop
[is1:iv1].Clear
End Sub
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida