8 votos

Cómo averiguar qué números aparecen juntos a menudo en un conjunto de datos?

Tengo una lotería estilo de conjunto de datos que producimos internamente (ejemplo abajo). Estoy tratando de averiguar qué números aparecen con mayor frecuencia juntos. Ejemplo de preguntas: ¿Cuáles son los top 10 pares de números que aparecen con mayor frecuencia? ¿Cuáles son los top 10 de los tres números que aparecen con mayor frecuencia?

¿Qué métodos/técnicas puedo utilizar para responder a estas preguntas?

Yo estaba pensando en clústeres en primera, pero de una ejecución de prueba (ward) he realizado, no devolver los resultados que yo esperaba.

enter image description here

4voto

jldugger Puntos 7490

Esta pregunta pide una modificación de la solución a una secuencia de conteo problema: como se señaló en los comentarios, se solicita una tabulación cruzada de co-ocurrencias de valores.

Voy a ilustrar un ingenuo, pero eficaz, de modificación de la con R código. En primer lugar, vamos a introducir un pequeño conjunto de datos de ejemplo para trabajar con. Es habitual en el formato de matriz, de un caso por cada fila.

x <- matrix(c(3,5,7,10,13,
              3,5,8,10,15,
              2,5,10,11,18,
              1,3,4,6,8,
              2,4,6,12,14,
              3,5,8,10,15),
            ncol=5, byrow=TRUE)

Esta solución genera todas las combinaciones posibles de $m$ artículos (por fila) en un momento y tabula ellos:

m <- 3
x <- t(apply(x, 1, sort))
x0 <- apply(x, 1, combn, m=m)
y <- array(x0, c(m, length(x0)/(m*dim(x)[1]), dim(x)[1]))
ngrams <- apply(y, c(2,3), function(s) paste("(", paste(s, collapse=","), ")", sep=""))
z <- sort(table(as.factor(ngrams)), decreasing=TRUE)

La tabulación se en z, ordenados en forma descendente de frecuencia. Es útil por sí mismo o fácilmente post-procesado. Aquí están las primeras entradas del ejemplo:

> head(z, 10)
 (3,5,10) (3,10,15)  (3,5,15)   (3,5,8) ... (8,10,15) 
        3         2         2         2 ...         2

Qué tan eficiente es este? Para $p$ columnas hay $\binom{p}{m}$ combinaciones para trabajar, que crece como $O(p^m)$ fijos $m$: eso es bastante malo, por lo que estamos limitados a un número relativamente pequeño de columnas. Para tener una idea de la cronología, repita lo anterior con una pequeña matriz aleatoria y tiempo. Sigamos con valores entre el $1$ $20,$ decir:

n.col <- 8       # Number of columns
n.cases <- 10^3  # Number of rows
x <- matrix(sample.int(20, size=n.col*n.cases, replace=TRUE), ncol=n.col)

La operación duró dos segundos para tabular todas las $m=3$-combinaciones de $1000$ filas y $8$ columnas. (Se puede ir en un orden de magnitud más rápido mediante la codificación de las combinaciones numéricamente en lugar de cadenas; esto se limita a los casos en que $\binom{p}{m}$ es lo suficientemente pequeño como para ser representados exactamente como un integer o float, limitada a aproximadamente $10^{16}$.) Se escala linealmente con el número de filas. (Aumentando el número de posibles valores de $20$ $20,000$sólo ligeramente alargado el tiempo.) Si que sugiere excesivamente largos tiempos de proceso de un determinado conjunto de datos, a continuación, un método más sofisticado será necesario, tal vez la utilización de los resultados por muy pequeño $m$ a limitar el mayor orden de las combinaciones que se calculan y se cuentan.

2voto

Amadiere Puntos 5606

No se busca la agrupación.

En su lugar, usted está buscando para el conjunto de elementos frecuentes de minería de datos. Hay docenas de algoritmos para este, el más conocido probablemente son APRIORI, FP-Crecimiento y Eclat.

0voto

Daniel Holm Puntos 253

Yo uso una simple hoja de cálculo de Excel y carga todos los dibujos y, a continuación, hacer una ordenación de datos. Cuando usted hace una ordenación de datos usted puede aprender rápidamente que los números nunca y nunca han jugado juntos. También he escrito Macros que se pueden ejecutar pares y 3 pares.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X