Está en la página 1de 12

UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO

FACULTAD DE CIENCIAS NATURALES E INGENIERÍA


ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Diego Ojeda

GUIA ANALISIS DE CANASTA / ANALISIS DE ASOCIACION

OBJETIVO

Realizar un proceso de análisis de reglas de asociación, con base en el conjunto de datos de


valoración de películas movielens ,a través de python notebook.

1. Instalación y Configuración

1.1. Prerrequisitos
Jupyter Notebook

Conexión a Internet.

1.2. Conjunto de Datos

Descripcion:
El conjunto de datos movielens es el resultado de la interaccion de los usuarios con el sitio online
movielens.org, lugar donde los usuarios registran sus valoraciones(ratings) únicamente a las
películas que aparecen en su pagina. Estos datos son utilzzados con fines de investigación en
minería de datos, en especial, análisis de market basket y recomendación de ítems.

Al no ser un sitio comercial, las valoraciones tienen un alto grado de veracidad

El conjunto de datos se compone de varios archivos:


UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

movies.csv :: Metadata de las peliculas: codificacion, nombre generos a los cuales pertenece.
ratings.csv :: Valoraciones de cada usuario a las distintas películas. Cada registro se corresponde
con una valoración.
tags.csv : etiquetas colocadas alas peliculas por los usuarios.
links.csv :: Enlace a otros sitios de valoracion como http://www.imdb.com y
https://www.themoviedb.org

Sin embargo, para este laboratorio, solo se utilizarán los dos primeros archivos de datos.

Mas información en https://old.datahub.io/es/dataset/movielens

2. Desarrollo

Leeremos el archivo de datos ratings.csv

El módulo os nos permite acceder a funcionalidades dependientes del Sistema Operativo. Sobre
todo, aquellas que nos refieren información sobre el entorno del mismo y nos permiten manipular
la estructura de directorios (para leer y escribir archivos)
Mayor detalle en http://docs.python.org/library/os.html

La función to_datetime de pandas, permite convertir un valor numérico a su equivalente en


formato fecha:

Respuesta: se puede visualizar el formato fecha y hora la columna timestamp, ya que en el archivo
se encuentra en formato Int.
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Algunas funciones de conversión en:


https://pandas.pydata.org/pandas-docs/stable/api.html#general-functions

Filtremos las valoraciones hechas por el usuario 189

Respuesta: el listado de cintas que tienen como Userid 189


UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Realicemos una transformación de las valoraciones superiores a 3, como positivas y las menores a
3 como negativas en una nueva variable llamada favorable

Respuesta: se permite observar 5 registros donde hay dos favorables y tres desfavorables ya que se
marcó con favorable lo que tienen un ranquin mayor a 3 y desfavorable el rating menor a 3.

Consultemos como fueron las valoraciones del usuario 1

Respuesta: Nos permite observar las valoraciones por el userid 1 sobre 5 registros teniendo como
base que favorable es mayor a 3 y desfavorable menor a 3

El tipo range es una lista de números enteros en forma de sucesión, el cual es inmutable(no se puede
modificar)
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Respuesta: permite listar todas las valoraciones con un rango de 200

Explique que hace el siguiente fragmento??

permite listar los 5 registros al azar en los cuales el ratings sea favorable mayor a 3

2.1. Sets y Frozensets

Un set en Python es una colección de elementos únicos , el cual no presenta un ordenamiento .


Podemos crear un set y agregarle elementos de la siguiente manera:

x = set(["Perl", "Python", "Java"])


x.add("SQL")

Por otra parte un frozenset por algo así como una coleccion congelada, término que muestra
claramente su carácter estático. Podemos pensar en un frozenset como en un set en el que no
podemos modificar su composición una vez creado.
x = set(["Perl", "Python", "Java"])
x.add("SQL")
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

2.2. Diccionarios

Otro tipo de dato útil incluído en Python es el diccionario. Los diccionarios se encuentran a
veces en otros lenguajes como “memorias asociativas” o “arreglos asociativos”. Se puede
pensar en un diccionario como un conjunto no ordenado de pares clave: valor, con el
requerimiento de que las claves sean únicas (dentro de un diccionario en particular). Un par
de llaves crean un diccionario vacío: {}. Colocar una lista de pares clave:valor separados
por comas entre las llaves añade pares clave:valor iniciales al diccionario; esta también es
la forma en que los diccionarios se presentan en la salida.

Las operaciones principales sobre un diccionario son guardar un valor con una clave y
extraer ese valor dada la clave. También es posible borrar un par clave:valor con del. Si
usa una clave que ya está en uso para guardar un valor, el valor que estaba asociado con esa
clave se pierde. Es un error extraer un valor usando una clave no existente.

El método keys() de un diccionario devuelve una lista de todas las claves en uso de ese
diccionario, en un orden arbitrario . Para verificar si una clave está en el diccionario,
utilizar la palabra clave in.

Pruebe:
favorable_reviews_by_users.keys()

Respuesta: vemos los primeros 5 movieId y la sumatoria por cada línea de las valoraciones que sean
favorables según lo marcado que es mayor a 3

En una nueva celda copie y pegue el siguiente fragmento:


#####################################
from collections import defaultdict

def find_frequent_itemsets(favorable_reviews_by_users, k_1_itemsets, min_support):


counts = defaultdict(int)
for user, reviews in favorable_reviews_by_users.items():
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

for itemset in k_1_itemsets:


if itemset.issubset(reviews):
for other_reviewed_movie in reviews - itemset:
current_superset = itemset | frozenset((other_reviewed_movie,))
counts[current_superset] += 1
return dict([(itemset, frequency) for itemset, frequency in counts.items() if frequency >=
min_support])

#######################################

2.3. Fragmentos def

En Python, la definición de funciones se realiza mediante la instrucción def más un nombre


de función descriptivo -para el cuál, aplican las mismas reglas que para el nombre de las
variables- seguido de paréntesis de apertura y cierre. Como toda estructura de control en
Python, la definición de la función finaliza con dos puntos (:) y el algoritmo que la
compone, irá identado con 4 espacios:

def mi_funcion():
# aquí el algoritmo

Una función, no es ejecutada hasta tanto no sea invocada. Para invocar una función,
simplemente se la llama por su nombre:

def mi_funcion():
print "Hola Mundo"

mi_funcion()

Ahora agregue una nueva celda y copie el siguiente fragment y ejecútelo..


########################################
import sys
frequent_itemsets = {} # itemsets are sorted by length
min_support = 50

# candidatos k=1 convaloraciones favorablea mayors a min_support


frequent_itemsets[1] = dict((frozenset((movie_id,)), row["favorable"])
for movie_id, row in num_favorable_by_movie.iterrows()
if row["favorable"] > min_support)

print("Existen {} peliculas con mas de {} favorable valoraciones".format(len(frequent_itemsets[1]),


min_support))
sys.stdout.flush()
for k in range(2, 5):
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

cur_frequent_itemsets = find_frequent_itemsets(favorable_reviews_by_users,
frequent_itemsets[k-1],
min_support)
if len(cur_frequent_itemsets) == 0:
print("No se encuentran conjuntos de elementos frecuentes de tamanio {}".format(k))
sys.stdout.flush()
break
else:
print("Se encontraron {} conjuntos de elementos frecuentes de tamanio
{}".format(len(cur_frequent_itemsets), k))
#print(cur_frequent_itemsets)
sys.stdout.flush()
frequent_itemsets[k] = cur_frequent_itemsets
# Como no estamos interesados en conjuntos de tamanio 1, los removemos
del frequent_itemsets[1]
########################################

Respuesta: se lista en detalle la información sobre los elementos frecuentes de las películas.

Existen 21 películas con mas de 50 favorables valoraciones


Se encontraron 157 conjuntos de elementos frecuentes de tamaño 2
Se encontraron 590 conjuntos de elementos frecuentes de tamaño 3
Se encontraron 1250 conjuntos de elementos frecuentes de tamaño 4

Respuesta: nos permite listar el total de conjuntos elementos frecuentes

Ahora creamos las reglas de asociacion. Todas son reglas candidatas, hasta que se verifica su
confiabilidad

Respuesta: Nos permite conocer que tenemos 7084 reglas candidatas para poder aplicar distintas
funciones.
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Cual es la salida para la siguiente instrucción??

Respuesta:

Que significa?

Respuesta: Nos permite listar 5 conjuntos congelados en los cuales se puede identificar que son de
carácter estático a los cuales no se les puede agregar o eliminar elementos una vez creados

Ahora copie el siguiente fragmento en la siguiente celda del cuaderno


###################################################
correct_counts = defaultdict(int)
incorrect_counts = defaultdict(int)
for user, reviews in favorable_reviews_by_users.items():
for candidate_rule in candidate_rules:
premise, conclusion = candidate_rule
if premise.issubset(reviews):
if conclusion in reviews:
correct_counts[candidate_rule] += 1
else:
incorrect_counts[candidate_rule] += 1
rule_confidence = {candidate_rule: correct_counts[candidate_rule] /
float(correct_counts[candidate_rule] + incorrect_counts[candidate_rule])
for candidate_rule in candidate_rules}
###################################################

Definimos el umbral minimo para la confiabilidad:

Respuesta: Nos permite observar que la primera regla de confiabilidad mayor a 0.9 es 407
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

Respuesta: Nos permite listar 5 reglas en las cuales nos muestra el conjunto congelado,
recomendación y la confiabilidad
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

2.4. Opcional::

Hasta aquí se tiene la implementación del algoritmo para la extracción de reglas de asociación
apartir de los elementos frecuentes. Sin embargo, Si se quiere tener información de las películas
asociadas a su identificador, para que las reglas sean un poco mas legibles, tendremos que leer el
archivo donde se encuentran los detalles de las películas:

movies_filename = "movies.csv"
movie_name_data = pd.read_csv(movies_filename, delimiter=",")
movie_name_data.head(5)

Podemos hacer una transformacion a variables dummy(binarias) apartir de los distintos generos de
la pelicula.

Ahora incluimos una function de busqueda, dado el id de la película (movieId).

Probamos una busqueda..

Y finalmente reescribimos la impression de las reglas de asociacion indicando el nombre de la


película, y no el id.
##########################################################
for index in range(5):
print("Regla #{0}".format(index + 1))
(premise, conclusion) = sorted_confidence[index][0]
premise_names = ", ".join(get_movie_name(idx) for idx in premise)
conclusion_name = get_movie_name(conclusion)
print("Regla: Si un usuario recomienda {0} , tambien recomendará {1}".format(premise_names,
conclusion_name))
print(" - Confiabilidad: {0:.3f}".format(rule_confidence[(premise, conclusion)]))
print("")

#############################################################
UNIVERSIDAD DE BOGOTÁ JORGE TADEO LOZANO
FACULTAD DE CIENCIAS NATURALES E INGENIERÍA
ESPECIALIZACIÓN EN DESARROLLO DE BASES DE DATOS
MINERIA DE DATOS

También podría gustarte