{"id":2177,"date":"2020-06-30T20:06:25","date_gmt":"2020-07-01T01:06:25","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=2177"},"modified":"2020-07-01T16:41:37","modified_gmt":"2020-07-01T21:41:37","slug":"coeficiente-de-jaccard-en-python-conjuntos","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/coeficiente-de-jaccard-en-python-conjuntos\/","title":{"rendered":"Coeficiente de Jaccard en Python: Conjuntos en Python"},"content":{"rendered":"<p>Realizaremos una funci\u00f3n que calcula el Coeficiente de Jaccard en Python, \u00e9sto nos servir\u00e1 como un ejemplo del manejo de Conjuntos en Python.<\/p>\n<p><!--more--><\/p>\n<p>\u00c9ste art\u00edculo tambi\u00e9n est\u00e1 disponible explicado en video, cons\u00faltalo aqu\u00ed:\u00a0<a href=\"https:\/\/youtu.be\/oq7JWE04r4E\" target=\"_blank\" rel=\"noopener\">https:\/\/youtu.be\/oq7JWE04r4E<\/a><\/p>\n<h2>Conjuntos en Python<\/h2>\n<p>Los conjuntos son colecciones de elementos no ordenados\u00a0ni indexados. Se identifican por utilizar llaves { }.\u00a0Una vez creados los \u00edtems, \u00e9stos no pueden ser modificados. Un conjunto no presenta elementos duplicados. (<a href=\"https:\/\/books.google.com.mx\/books?id=Jng5DwAAQBAJ&amp;lpg=PA29&amp;dq=sets%20in%20python&amp;pg=PA29#v=onepage&amp;q=sets%20in%20python&amp;f=false\" target=\"_blank\" rel=\"noopener\">Chou, 2017<\/a>)<\/p>\n<p>Vamos a crear dos conjuntos:<\/p>\n<pre class=\"lang:python decode:true\">grupo1 = {\"john\", \"paul\", \"ringo\", \"george\"}\r\ngrupo2 = {\"john\", \"yoko\", \"eric\", \"ringo\"}\r\n<\/pre>\n<h2>Operaciones con conjuntos en Python<\/h2>\n<p>Considerando los conjuntos anteriores realizaremos las siguientes operaciones con conjuntos: pertenencia, uni\u00f3n, intersecci\u00f3n, diferencia, diferencia sim\u00e9trica e igualdad.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Uni\u00f3n-diferencia-intersecci\u00f3n-de-conjuntos.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2181\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Uni\u00f3n-diferencia-intersecci\u00f3n-de-conjuntos.png\" alt=\"Uni\u00f3n, diferencia, intersecci\u00f3n de conjuntos\" width=\"494\" height=\"279\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Uni\u00f3n-diferencia-intersecci\u00f3n-de-conjuntos.png 676w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Uni\u00f3n-diferencia-intersecci\u00f3n-de-conjuntos-300x170.png 300w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/a><\/p>\n<pre class=\"lang:python decode:true\">#Pertenencia\r\nprint (\"ken\" in grupo1)\r\n\r\n#Uni\u00f3n\r\nunidos = grupo1.union(grupo2)\r\nprint(\"Uni\u00f3n: \", unidos)\r\n\r\n#Intersecci\u00f3n\r\ncomunes = grupo1.intersection(grupo2)\r\nprint(\"Intersecci\u00f3n: \" , comunes)\r\n\r\n#Diferencia\r\nresta = grupo1 - grupo2\r\nprint(\"Diferencia: \" , resta)\r\n\r\n#Diferencia sim\u00e9trica\r\ndifsim = grupo1.symmetric_difference(grupo2)\r\nprint(\"Dif. sim\u00e9trica: \" , difsim)\r\n\r\n#Igualdad\r\ngrupo4 = {\"juan\", \"miguel\", \"josefa\"}\r\nprint (\"Son iguales: \" , grupo2 == grupo4)<\/pre>\n<p>La diferencia sim\u00e9trica mostrar\u00e1 los elementos que est\u00e1n en un conjunto o en el otro, pero no en ambos.<\/p>\n<p>Para que se considere a dos conjuntos iguales, \u00e9stos deben contener los mismos elementos.<\/p>\n<h2>Agregar y eliminar elementos de un conjunto<\/h2>\n<p>Para agregar un solo elemento se puede utilizar el m\u00e9todo <em>add<\/em>. Si se desean agregar varios, debemos utilizar el m\u00e9todo <em>update<\/em>. Para eliminar elementos podemos utilizar el m\u00e9todo <em>remove<\/em>.<\/p>\n<pre class=\"lang:python decode:true\">#Agregar un elemento\r\ngrupo2.add(\"billy\")\r\n\r\n#Remover un elemento\r\ngrupo2.remove(\"eric\")\r\nprint(\"Agregar y remover: \", grupo2)\r\n\r\n#Agregar varios elementos\r\ngrupo1.update(grupo2)\r\nprint (\"Grupo1 nuevo: \", grupo1)<\/pre>\n<h2>Ejemplo: Conjunto de letras en una palabra<\/h2>\n<p>Vamos a convertir una cadena a conjunto para analizar las letras que la conforman. Luego usaremos un for para recorrer el conjunto, mostrando elemento por elemento. Por ejemplo, la palabra &#8216;manzana&#8217; tiene las letras &#8216;m&#8217;, &#8216;a&#8217;, &#8216;n&#8217;, y &#8216;z&#8217;, pues al momento de convertirla a conjunto eliminar\u00e1 los elementos repetidos.<\/p>\n<pre class=\"lang:python decode:true\">#Que letras forman la palabra \"manzana\"\r\npalabra = set(\"manzana\")\r\nfor letra in palabra:\r\n\tprint(letra)<\/pre>\n<p>Si ejecutas \u00e9ste c\u00f3digo varias veces observar\u00e1s que en cada ejecuci\u00f3n podr\u00eda mostrarte un orden distinto. Esto es normal porque un conjunto es una colecci\u00f3n de elementos no ordenados, \u00a0por lo que no se &#8216;garantiza&#8217; que siempre aparezcan en el mismo orden.<\/p>\n<h2>Eliminar elementos repetidos en una lista usando conjuntos<\/h2>\n<p>Un conjunto no puede tener repetidos. Es posible escribir \u00e9sta l\u00ednea en Python:<\/p>\n<p><em>grupo3 = {\u00abjuan\u00bb, \u00abjuan\u00bb}<\/em><\/p>\n<p>Pero al momento de imprimir el conjunto solo veremos un elemento &#8216;juan&#8217;.<\/p>\n<p>Una <a href=\"https:\/\/naps.com.mx\/blog\/listas-en-python\/\">lista<\/a> s\u00ed puede tener repetidos. Y si por alguna raz\u00f3n deseamos eliminar esos elementos repetidos, podemos utilizar los conjuntos: convertir la lista a conjunto y, si se requiere, volver a convertir a lista.<\/p>\n<pre class=\"lang:python decode:true\">#un set no puede tener repetidos \r\ngrupo3 = {\"juan\", \"juan\"}\r\nprint (\"Grupo 3: \" ,grupo3)\r\n\r\n#una lista si puede tener repetidos\r\ngrupo3 = [\"juan\", \"juan\", \"maria\"]\r\nprint (\"Grupo 3 como lista: \" , grupo3)\r\n\r\n#es posible eliminar los repetidos de una lista convirtiendola a un set\r\nprint (\"Eliminar repetidos: \" , list(set(grupo3)))<\/pre>\n<p>&nbsp;<\/p>\n<h2>Coeficiente de Jaccard en Python<\/h2>\n<p>El coeficiente de Jaccard es\u00a0una medida de similitud entre dos grupos y se define como\u00a0<em>la cardinalidad de la intersecci\u00f3n de ambos conjuntos dividida por la cardinalidad de su uni\u00f3n<\/em>. Es muy usada para realizar sistemas de recomendaci\u00f3n. \u00a0Por ejemplo, si dos usuarios tienen una lista de nombres de pel\u00edculas muy similar, pero no id\u00e9ntica, podemos recomendarle a un usuario pel\u00edculas que no haya visto que est\u00e9n en la lista del otro usuario.<\/p>\n<pre class=\"lang:python decode:true\">def jaccard(grupo1, grupo2):\r\n\tinterseccion = len(set(grupo1).intersection(set(grupo2)))\r\n\tunion = len (set(grupo1).union(set(grupo2)))\r\n\treturn interseccion \/ union\r\n\r\ngrupo_amigos1 = [\"Manuel\", \"Rodrigo\", \"Miguel\", \"Jesus\", \"Irving\"]\r\ngrupo_amigos2 = [\"Manuel\", \"Alejandro\", \"Fernando\", \"Antonio\", \"Jesus\", \"Pablo\"]\r\n\r\njacard_amigos = jaccard(grupo_amigos1, grupo_amigos2)\r\nprint (\"Porcentaje de similitud: {:.2f}\".format(jacard_amigos))<\/pre>\n<p>Los nombres est\u00e1n almacenados en listas, por lo que la funci\u00f3n convertir\u00e1 de listas a conjuntos. Se realiza la operaci\u00f3n (ya sea intersecci\u00f3n o uni\u00f3n) y se calcula la &#8216;cardinalidad&#8217;, es decir, cu\u00e1ntos elementos contiene el conjunto.<\/p>\n<p>El resultado nos mostrar\u00e1 lo siguiente:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Coeficiente-de-jaccard-en-python.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2183\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Coeficiente-de-jaccard-en-python.png\" alt=\"Coeficiente de jaccard en python\" width=\"260\" height=\"45\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Coeficiente-de-jaccard-en-python.png 772w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Coeficiente-de-jaccard-en-python-300x52.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Coeficiente-de-jaccard-en-python-768x133.png 768w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/><\/a><\/p>\n<p>Mira \u00e9ste art\u00edculo explicado en video:<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/oq7JWE04r4E\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Realizaremos una funci\u00f3n que calcula el Coeficiente de Jaccard en Python, \u00e9sto nos servir\u00e1 como un ejemplo del manejo de Conjuntos en Python.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[301],"tags":[303,302,287],"class_list":["post-2177","post","type-post","status-publish","format-standard","hentry","category-curso-python-analisis-datos","tag-coeficiente-jaccard","tag-conjuntos-en-python","tag-curso-python"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=2177"}],"version-history":[{"count":7,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2177\/revisions"}],"predecessor-version":[{"id":2187,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2177\/revisions\/2187"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=2177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=2177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=2177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}