{"id":3283,"date":"2016-05-23T17:54:50","date_gmt":"2016-05-23T15:54:50","guid":{"rendered":"https:\/\/geekosas.com\/?p=3283"},"modified":"2026-05-23T17:55:19","modified_gmt":"2026-05-23T15:55:19","slug":"call-center-agent-assignment","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/call-center-agent-assignment\/","title":{"rendered":"Call Center Agent Assignment"},"content":{"rendered":"<p>Call Center Agent Assignment<\/p>\n<p>Call center agent assignment involves scheduling shifts to meet call demand. This problem consists of two parts: first, estimating the demand, and second, assigning agent shifts. In this article, we will focus on agent shift assignment, using R to generate solver data and GLPK to solve the problem programmed in AMPL.<\/p>\n<p><!--more--><\/p>\n<h3>The Problem<\/h3>\n<p>The difficulty in shift scheduling lies in the business rules associated with it, which directly affect the call center work environment.<\/p>\n<p>The business rules we will implement in this article come from a real case and are as follows:<\/p>\n<ol>\n<li>Each agent must have at least one 2\u2011consecutive\u2011day break per week.<\/li>\n<li>Agents can request days off.<\/li>\n<li>If an agent works on a Sunday, the following Sunday must be off.<\/li>\n<li>The agent can specify days they want to work; these can be used as initial conditions for the previous rule.<\/li>\n<\/ol>\n<p>The challenge is to plan this at least four weeks in advance (plus one week detailing the Sunday shifts).<\/p>\n<h3>Methodology<\/h3>\n<p>We will model the problem using linear programming in AMPL and solve it using SIMPLEX with the GLPK package. The model input will be generated in R, and the GLPK output will be read in R and displayed on screen.<\/p>\n<h4>Parameters:<\/h4>\n<ul>\n<li>Names of the executives.<\/li>\n<li>Daily call demand.<\/li>\n<li>Days off requested by agents.<\/li>\n<li>Days agents must work.<\/li>\n<\/ul>\n<h4>Output<\/h4>\n<p>Agent shifts and business rules that could not be met.<\/p>\n<h3>Implementation:<\/h3>\n<h4>Generate Model Parameters<\/h4>\n<p>First, we will generate the model input data in R. To do this, we will read the parameters from an Excel database with the following format (only the first rows are shown).<\/p>\n<h5>Executive Names:<\/h5>\n<table>\n<thead>\n<tr>\n<th>name_executive<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Executive 1<\/td>\n<\/tr>\n<tr>\n<td>Executive 2<\/td>\n<\/tr>\n<tr>\n<td>Executive 3<\/td>\n<\/tr>\n<tr>\n<td>Executive 4<\/td>\n<\/tr>\n<tr>\n<td>Executive 5<\/td>\n<\/tr>\n<tr>\n<td>Executive 6<\/td>\n<\/tr>\n<tr>\n<td>Executive 7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>Daily Executive Demand:<\/h5>\n<table>\n<thead>\n<tr>\n<th>week<\/th>\n<th>day<\/th>\n<th>demand_executives<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>1<\/td>\n<td>16<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>2<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>3<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>4<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>5<\/td>\n<td>16<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>6<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>7<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>1<\/td>\n<td>16<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>Requested Days Off:<\/h5>\n<table>\n<thead>\n<tr>\n<th>name_executive<\/th>\n<th>week<\/th>\n<th>day<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Executive 1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Executive 1<\/td>\n<td>1<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Executive 1<\/td>\n<td>1<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>Executive 4<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Executive 5<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Executive 6<\/td>\n<td>2<\/td>\n<td>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>Mandatory Shifts:<\/h5>\n<table>\n<thead>\n<tr>\n<th>name_executive<\/th>\n<th>week<\/th>\n<th>day<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Executive 1<\/td>\n<td>2<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Executive 1<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>Executive 1<\/td>\n<td>2<\/td>\n<td>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>R Code to Read Excel and Generate Input for GLPK<\/h4>\n<pre><code class=\"language-r\">options(stringsAsFactors = FALSE)\nlibrary(reshape2)\nlibrary(&quot;xlsx&quot;)\n\n# Read parameters\nejecutivos = read.xlsx2(&quot;datos.xlsx&quot;, sheetName = &quot;ejecutivo&quot;)\nfechas = read.xlsx(&quot;datos.xlsx&quot;, sheetName = &quot;demanda&quot;)\ndias_libres = read.xlsx(&quot;datos.xlsx&quot;, sheetName = &quot;dias_libres&quot;)\ndias_libres$dias_libres = 1\nturno_obligado = read.xlsx(&quot;datos.xlsx&quot;, sheetName = &quot;turno_obligado&quot;)\nturno_obligado$turno_obligado = 1\n\n# Weeks\nsemana = data.frame(semana = unique(fechas$semana))\n\n# Table with daily parameters for executives\nfecha_ejecutivo = expand.grid(nombre_ejecutivo = ejecutivos$nombre_ejecutivo, \n                               semana = semana$semana, dia = 1:7)\nfecha_ejecutivo = merge(fecha_ejecutivo, dias_libres, \n                         by = c(&quot;nombre_ejecutivo&quot;, &quot;semana&quot;, &quot;dia&quot;), all.x = T)\nfecha_ejecutivo$dias_libres = as.numeric(!is.na(fecha_ejecutivo$dias_libres))\nfecha_ejecutivo = merge(fecha_ejecutivo, turno_obligado, \n                         by = c(&quot;nombre_ejecutivo&quot;, &quot;semana&quot;, &quot;dia&quot;), all.x = T)\nfecha_ejecutivo$turno_obligado = as.numeric(!is.na(fecha_ejecutivo$turno_obligado))\n\n# Auxiliary table with number of weeks\nparametros = data.frame(parametro = c(&quot;semanas&quot;),\n                        valor = max(semana$semana))\n\n# Write tables\nwrite.csv(fechas, &quot;fechas.csv&quot;, row.names = F)\nwrite.csv(ejecutivos, &quot;ejecutivos.csv&quot;, row.names = F)\nwrite.csv(fecha_ejecutivo, &quot;fecha_ejecutivo.csv&quot;, row.names = F)\nwrite.csv(semana, &quot;semana.csv&quot;, row.names = F)\nwrite.csv(parametros, &quot;parametros.csv&quot;, row.names = F)<\/code><\/pre>\n<h3>The Model<\/h3>\n<pre><code>\/*Indices*\/\nset E;  \/*Executives*\/\nset S;  \/*Weeks*\/\nset D := {1 .. 7};  \/*Day of the week*\/\nset DS, within D cross S;  \/*Week cross day, for demand*\/\nset EDS, within E cross D cross S;  \/*Executive day week*\/\nset P;\n\n\/*Declare Parameters*\/\nparam dias_libres{(e,d,s) in EDS} default 0, binary; \/*true if the executive requested that day off*\/\nparam turno_obligado{(e,d,s) in EDS} default 0, binary; \/*true if the executive must work that day*\/\nparam demanda_ejecutivos{(d,s) in DS} default 0, integer; \/*demand for executives on that day*\/\nparam parametros{p in P};\n\ntable csv_parametros IN &quot;CSV&quot; &quot;parametros.csv&quot;:\n  P &lt;- [parametro], parametros ~ valor;\n\ntable csv_fechas IN &quot;CSV&quot; &quot;ejecutivos.csv&quot;:\n  E &lt;- [nombre_ejecutivo];\n\ntable csv_semana IN &quot;CSV&quot; &quot;semana.csv&quot;:\n  S &lt;- [semana];\n\ntable csv_fechas IN &quot;CSV&quot; &quot;fechas.csv&quot;:\n  DS &lt;- [dia,semana], demanda_ejecutivos ~ demanda_ejecutivos;\n\ntable fecha_ejecutivo IN &quot;CSV&quot; &quot;fecha_ejecutivo.csv&quot;:\n  EDS &lt;- [nombre_ejecutivo,dia,semana], dias_libres ~ dias_libres, turno_obligado ~ turno_obligado;\n\n\/*Variables*\/\nvar W{(e,d,s) in EDS} binary; \/* 1 if executive e works on day d of week s*\/\nvar I{e in E, d in 1..6, s in S} binary; \/*1 if executive starts a double rest on day d, week s*\/\nvar error_DescDobleSem{e in E, s in S} &gt;= 0; \/*number of times a double rest is not assigned to an agent*\/\nvar error_DomingoAnterior{e in E, s in S} &gt;= 0; \/*number of times an agent must work two consecutive Sundays*\/\nvar error_DiaLibre{(e,d,s) in EDS} &gt;= 0; \/*number of times an agent requested a day off and it could not be assigned*\/\nvar error_DescansoDobleDia1{e in E, d in 1..6, s in S} &gt;= 0; \/*assigned a double rest but day 1 could not be given*\/\nvar error_DescansoDobleDia2{e in E, d in 1..6, s in S} &gt;= 0; \/*assigned a double rest but day 2 could not be given*\/\n\n\/*Objective function*\/\nminimize obj:\n  sum{e in E, s in S} error_DescDobleSem[e,s] +\n  sum{e in E, s in S} error_DomingoAnterior[e,s] +\n  sum{e in E, d in 1..6, s in S} error_DiaLibre[e,d,s] +\n  sum{e in E, d in 1..6, s in S} error_DescansoDobleDia1[e,d,s] +\n  sum{e in E, d in 1..6, s in S} error_DescansoDobleDia2[e,d,s];\n\n\/*Constraints*\/\n\/*R1 Satisfy demand*\/\ns.t. SatDem{(d,s) in DS}: sum{e in E} W[e,d,s] = demanda_ejecutivos[d,s];\n\n\/*R2 Each executive must have at least one double rest per week*\/\ns.t. DescDobleSem{e in E, s in S}: 1 - sum{d in 1..6} I[e,d,s] &lt;= error_DescDobleSem[e,s];\n\n\/*R3 If a double rest is assigned, the next day is also free (at least one 2\u2011day rest per week)*\/\ns.t. DescansoDobleDia1{e in E, d in 1..6, s in S}: W[e,d,s] - (1 - I[e,d,s]) &lt;= error_DescansoDobleDia1[e,d,s];\ns.t. DescansoDobleDia2{e in E, d in 1..6, s in S}: W[e,d+1,s] - (1 - I[e,d,s]) &lt;= error_DescansoDobleDia2[e,d,s];\n\n\/*R4 If an agent rested on Sunday of the previous week, the next Sunday must be off (this data must be filled)*\/\ns.t. DomingoAnterior{e in E, s in 2 .. parametros[&#039;semanas&#039;]}: W[e,7,s] - (1 - W[e,7,s-1]) &lt;= error_DomingoAnterior[e,s];\n\n\/*R5 If an executive requests a day off, they do not work*\/\ns.t. DiaLibre{(e,d,s) in EDS}: W[e,d,s] - (1- dias_libres[e,d,s]) &lt;= error_DiaLibre[e,d,s];\n\n\/*R6 If a day is mandatory, the executive must work*\/\ns.t. DiaObligado{(e,d,s) in EDS}: W[e,d,s] &gt;= turno_obligado[e,d,s];\n\nsolve;\n\ntable tout {(nombre_ejecutivo,dia,semana) in EDS} OUT &quot;CSV&quot; &quot;solucion.csv&quot;:\n  nombre_ejecutivo, dia, semana, W[nombre_ejecutivo,dia,semana];\n\ntable tout {(nombre_ejecutivo,dia,semana) in EDS} OUT &quot;CSV&quot; &quot;error_DiaLibre.csv&quot;:\n  nombre_ejecutivo, dia, semana, error_DiaLibre[nombre_ejecutivo,dia,semana];\n\ntable tout {nombre_ejecutivo in E, semana in S} OUT &quot;CSV&quot; &quot;error_DescDobleSem.csv&quot;:\n  nombre_ejecutivo, semana, error_DescDobleSem[nombre_ejecutivo,semana];\n\ntable tout {nombre_ejecutivo in E, semana in S} OUT &quot;CSV&quot; &quot;error_DomingoAnterior.csv&quot;:\n  nombre_ejecutivo, semana, error_DomingoAnterior[nombre_ejecutivo,semana];\n\ntable tout {nombre_ejecutivo in E, dia in 1..6, semana in S} OUT &quot;CSV&quot; &quot;error_DescansoDobleDia1.csv&quot;:\n  nombre_ejecutivo, dia, semana, error_DescansoDobleDia1[nombre_ejecutivo,dia,semana];\n\ntable tout {nombre_ejecutivo in E, dia in 1..6, semana in S} OUT &quot;CSV&quot; &quot;error_DescansoDobleDia2.csv&quot;:\n  nombre_ejecutivo, dia, semana, error_DescansoDobleDia2[nombre_ejecutivo,dia,semana];\n\ndisplay obj;<\/code><\/pre>\n<h3>Solve the Model<\/h3>\n<p>GLPK must be installed. Since the problem consists of finding a solution and we do not know in advance if one exists, we will run the solver with a time limit of 600 seconds.<\/p>\n<pre><code>glpsol --cuts --fpump --mipgap 0.001 --tmlim 7200 -m &quot;modelo.mod&quot;<\/code><\/pre>\n<h3>Retrieve the Output in R<\/h3>\n<pre><code class=\"language-r\"># Write tables\nwrite.csv(fechas, &quot;fechas.csv&quot;, row.names = F)\nwrite.csv(ejecutivos, &quot;ejecutivos.csv&quot;, row.names = F)\nwrite.csv(fecha_ejecutivo, &quot;fecha_ejecutivo.csv&quot;, row.names = F)\nwrite.csv(semana, &quot;semana.csv&quot;, row.names = F)\nwrite.csv(parametros, &quot;parametros.csv&quot;, row.names = F)\n\nsystem(&#039;glpsol --cuts --fpump --mipgap 0.001 --tmlim 7200 -m &quot;modelo2.mod&quot;&#039;)\n\nsolucion = read.csv(&quot;solucion.csv&quot;)\nsolucion$semana_dia = paste0(&quot;s&quot;, solucion$semana, &quot;-d&quot;, solucion$dia)\nprint(dcast(solucion, nombre_ejecutivo ~ semana_dia, value.var = &quot;W&quot;))\n\nprint(&quot;Errors&quot;)\nerror_DiaLibre = read.csv(&quot;error_DiaLibre.csv&quot;)\nprint(paste(&quot;error day off:&quot;, sum(error_DiaLibre$error_DiaLibre)))\nerror_DescDobleSem = read.csv(&quot;error_DescDobleSem.csv&quot;)\nprint(paste(&quot;error double rest:&quot;, sum(error_DescDobleSem$error_DescDobleSem)))\nerror_DescansoDobleDia1 = read.csv(&quot;error_DescansoDobleDia1.csv&quot;)\nprint(paste(&quot;error double rest day 1:&quot;, sum(error_DescansoDobleDia1$error_DescansoDobleDia1)))\nerror_DescansoDobleDia2 = read.csv(&quot;error_DescansoDobleDia2.csv&quot;)\nprint(paste(&quot;error double rest day 2:&quot;, sum(error_DescansoDobleDia2$error_DescansoDobleDia2)))\nerror_DomingoAnterior = read.csv(&quot;error_DomingoAnterior.csv&quot;)\nprint(paste(&quot;error previous Sunday:&quot;, sum(error_DomingoAnterior$error_DiaLibre)))\nprint(paste(&quot;objective function:&quot;, \n            sum(error_DiaLibre$error_DiaLibre,\n                error_DescDobleSem$error_DescDobleSem,\n                error_DescansoDobleDia1$error_DescansoDobleDia1,\n                error_DescansoDobleDia1$error_DescansoDobleDia2,\n                error_DomingoAnterior$error_DiaLibre)))<\/code><\/pre>\n<h4>Example Output<\/h4>\n<p>The output for the first week and the first five executives would look like this:<\/p>\n<table>\n<thead>\n<tr>\n<th>name_executive<\/th>\n<th>s1-d1<\/th>\n<th>s1-d2<\/th>\n<th>s1-d3<\/th>\n<th>s1-d4<\/th>\n<th>s1-d5<\/th>\n<th>s1-d6<\/th>\n<th>s1-d7<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Executive 1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Executive 2<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Executive 3<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>Executive 4<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>Executive 5<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>0<\/td>\n<td>0<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>I hope this tutorial was helpful. If you have any questions, feel free to contact me via LinkedIn at <a href=\"https:\/\/cl.linkedin.com\/in\/danielfischerm\" target=\"_blank\" rel=\"noopener noreferrer\"><a href=\"https:\/\/cl.linkedin.com\/in\/danielfischerm\">https:\/\/cl.linkedin.com\/in\/danielfischerm<\/a><\/a>, my email dfischer@ug.uchile.cl, or any of my contact channels.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Call Center Agent Assignment Call center agent assignment involves scheduling shifts to meet call demand. This problem consists of two parts: first, estimating the demand, <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/2016\/05\/23\/call-center-agent-assignment\/\" title=\"Call Center Agent Assignment\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2140,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-3283","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/11\/Call-Centers.jpg?fit=400%2C267&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-QX","jetpack-related-posts":[{"id":3238,"url":"https:\/\/geekosas.com\/index.php\/2026\/05\/12\/back-to-office-post-covid19-2\/","url_meta":{"origin":3283,"position":0},"title":"Back to Office Post-Covid19","author":"Daniel Fischer","date":"2026-05-12","format":false,"excerpt":"Before starting this article I want to thank Tristan Riquelme for giving me the idea, he is someone who always has excellent ideas about where to apply mathematical tools to real problems. Now starting with the article: Although we find a definitive cure for COVID-19, it has already created cultural\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/dressed_0617-780x710-1.jpg?fit=780%2C710&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3216,"url":"https:\/\/geekosas.com\/index.php\/2026\/05\/16\/3216\/","url_meta":{"origin":3283,"position":1},"title":"Sudoku","author":"Daniel Fischer","date":"2026-05-16","format":false,"excerpt":"The first question on my first optimization exam was to formulate a mathematical model for solving a Sudoku puzzle. Well, at that moment I made a huge mistake: I included nonlinear constraints, which resulted in a score of 0. And since this was one of my favorite subjects, I\u2019ve always\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3252,"url":"https:\/\/geekosas.com\/index.php\/2015\/04\/23\/wireless-music-receiver\/","url_meta":{"origin":3283,"position":2},"title":"Wireless Music Receiver","author":"Daniel Fischer","date":"2015-04-23","format":false,"excerpt":"The purpose of this blog has always been to teach about my various geek inventions, gadgets I buy, tricks to get the most out of some technology, or simply to teach you about something few people know about, such as: how to choose a bicycle or how to read headphone\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"icon","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2015\/01\/descarga-300x298.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3291,"url":"https:\/\/geekosas.com\/index.php\/2017\/05\/23\/movies-2016\/","url_meta":{"origin":3283,"position":3},"title":"Movies 2016","author":"Daniel Fischer","date":"2017-05-23","format":false,"excerpt":"Movies make us laugh, cry, and some... sleep, so I decided to do a small analysis on 2016 movies. As with Video Games and Data Science, we did web scraping from www.metacritic.com to generate a database, in which, for each movie we obtained the following information: Country of Origin Genres\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=700%2C400 2x"},"classes":[]},{"id":3317,"url":"https:\/\/geekosas.com\/index.php\/2017\/05\/23\/who-voted-for-each-candidate-chilean-elections-2017\/","url_meta":{"origin":3283,"position":4},"title":"Who voted for each candidate? (Chilean Elections 2017)","author":"Daniel Fischer","date":"2017-05-23","format":false,"excerpt":"Last Sunday, the president of Chile was elected, so many pundits tried to explain how the votes from the first round were distributed to the second round. Since the vote is secret, no one can be wrong. That is why I decided to take a different approach from the standard\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/1511132848-untitled-collage-3.jpg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/1511132848-untitled-collage-3.jpg?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/1511132848-untitled-collage-3.jpg?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/1511132848-untitled-collage-3.jpg?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/1511132848-untitled-collage-3.jpg?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3319,"url":"https:\/\/geekosas.com\/index.php\/2018\/05\/23\/have-video-games-gotten-worse\/","url_meta":{"origin":3283,"position":5},"title":"Have video games gotten worse?","author":"Daniel Fischer","date":"2018-05-23","format":false,"excerpt":"Introduction \/ Abstract A data scientist is one who manages to make data speak to them; it is basically a conversation, where you ask questions and the data answers. In this notebook I want to share my latest conversation with this dataset of scores assigned to different video games. The\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/04\/consoles-800x491.jpg?fit=800%2C491&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/04\/consoles-800x491.jpg?fit=800%2C491&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/04\/consoles-800x491.jpg?fit=800%2C491&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/04\/consoles-800x491.jpg?fit=800%2C491&ssl=1&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3283","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=3283"}],"version-history":[{"count":1,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3283\/revisions"}],"predecessor-version":[{"id":3284,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3283\/revisions\/3284"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2140"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=3283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=3283"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=3283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}