<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Machine learning archivos &#187; Ingenieria Industrial Online</title>
	<atom:link href="https://ingenieriaindustrialonline.com/tag/machine-learning/feed/" rel="self" type="application/rss+xml" />
	<link>https://ingenieriaindustrialonline.com/tag/machine-learning/</link>
	<description>ingenieriaindustriaonline.com</description>
	<lastBuildDate>Fri, 15 Oct 2021 17:37:28 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://ingenieriaindustrialonline.com/wp-content/uploads/2019/06/cropped-faVicon-32x32.png</url>
	<title>Machine learning archivos &#187; Ingenieria Industrial Online</title>
	<link>https://ingenieriaindustrialonline.com/tag/machine-learning/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Localización de varios almacenes mediante agrupación geoespacial</title>
		<link>https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/localizacion-de-varios-almacenes-mediante-agrupacion-geoespacial/</link>
					<comments>https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/localizacion-de-varios-almacenes-mediante-agrupacion-geoespacial/#respond</comments>
		
		<dc:creator><![CDATA[Bryan Salazar López]]></dc:creator>
		<pubDate>Thu, 14 Oct 2021 19:54:29 +0000</pubDate>
				<category><![CDATA[Actualidad]]></category>
		<category><![CDATA[Análisis de datos]]></category>
		<category><![CDATA[Diseño y distribución en planta]]></category>
		<category><![CDATA[Gestión de almacenes]]></category>
		<category><![CDATA[Inteligencia artificial]]></category>
		<category><![CDATA[Localización de instalaciones]]></category>
		<category><![CDATA[Logística]]></category>
		<category><![CDATA[Agrupación geoespacial]]></category>
		<category><![CDATA[Centro de masa]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Localización]]></category>
		<category><![CDATA[Machine learning]]></category>
		<category><![CDATA[Mapa de calor]]></category>
		<category><![CDATA[Mapas de calor]]></category>
		<category><![CDATA[Método del Centro de gravedad]]></category>
		<category><![CDATA[Métodos de localización]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ingenieriaindustrialonline.com/?p=28444</guid>

					<description><![CDATA[<p>En un artículo anterior, desarrollamos un modelo capaz de determinar la localización de una instalación (almacén), de acuerdo a un conjunto de ubicaciones existentes (clientes); estas ubicaciones tenían una ponderación determinada (peso, por ejemplo demanda), y basamos nuestro desarrollo en el algoritmo de Centro de Gravedad. El valor agregado del modelo consistía en la integración &#8230;</p>
<p>La entrada <a href="https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/localizacion-de-varios-almacenes-mediante-agrupacion-geoespacial/">Localización de varios almacenes mediante agrupación geoespacial</a> se publicó primero en <a href="https://ingenieriaindustrialonline.com">Ingenieria Industrial Online</a>.</p>
]]></description>
										<content:encoded><![CDATA[
		<div id="introduccion" data-title="Introducción" class="index-title"></div>
	
<p>En un artículo anterior, desarrollamos un modelo capaz de determinar la localización de una instalación (almacén), de acuerdo a un conjunto de ubicaciones existentes (clientes); estas ubicaciones tenían una ponderación determinada (peso, por ejemplo demanda), y basamos nuestro desarrollo en el algoritmo de Centro de Gravedad.</p>
<p>El valor agregado del modelo consistía en la integración de una capa de mapa de calor (para graficar la densidad), un proceso de geocodificación y el uso de un entorno geográfico real. El alcance de este modelo se encuentra determinado por la localización de una sola instalación (depósito, almacén, etc.), y en los casos en los que se requiera determinar múltiples localizaciones, el modelo no aplica.</p>

		<div class="box info  ">
			<div class="box-inner-block">
				<span class="fa tie-shortcode-boxicon"></span>Para ver el artículo: <a href="https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/mapas-de-calor-y-algoritmo-de-centro-de-gravedad-utilizando-python/" target="_blank" rel="noopener"><strong>Mapas de calor y Algoritmo de Centro de Gravedad utilizando Python</strong></a>
			</div>
		</div>
	
<p>La pregunta siguiente que nos hacemos es <em>¿Cómo determinar la localización de múltiples instalaciones?</em> En realidad, hay muchas respuestas para este interrogante, y gran parte de ellas conducen a la <strong>agrupación geoespacial</strong> (Clustering).</p>
<h2>¿Qué es la agrupación geoespacial (Clustering)?</h2>

		<div id="que-es-la-agrupacion-geoespacial-clustering" data-title="¿Qué es la agrupación geoespacial (Clustering)?" class="index-title"></div>
	
<p>La agrupación geoespacial es un método que se utiliza para asociar un conjunto de objetos espaciales en grupos denominados «<em>clusters</em>«. Los objetos que conforman cada grupo presentan un grado de similitud asociado a un atributo o varios atributos en particular.</p>
<p>El objetivo de la agrupación geoespacial, consiste en determinar una relación entre atributos espaciales (coordenadas, ubicación) y no espaciales (demanda, por ejemplo).</p>
<p>En la literatura encontraremos varios tipos de agrupación geoespacial, cada uno con un enfoque particular, y un campo de aplicación específico; entre los cuales podemos encontrar:</p>

		<div class="lightbulb tie-list-shortcode">
<ul>
<li>Agrupación de particiones</li>
<li>Agrupación jerárquica</li>
<li>Agrupación <em>Fuzzy</em></li>
<li>Agrupación basada en densidad</li>
</ul>

		</div>
	
<p>En nuestro caso, que pretendemos determinar la localización de varias instalaciones, considerando la ponderación y ubicación de los puntos existentes, requerimos de un modelo capaz de relacionar atributos espaciales (coordenadas) y no espaciales (peso de cada nodo). Que nos permita, primero agrupar los puntos dados (ubicaciones), y eventualmente, aplicar un algoritmo de <a href="https://ingenieriaindustrialonline.com/diseno-y-distribucion-en-planta/metodo-del-centro-de-gravedad/" target="_blank" rel="noopener"><strong>Centro de Gravedad</strong></a>, para determinar localizaciones potenciales.</p>
<p>Para tales efectos, vamos a utilizar la <strong>agrupación de particiones</strong>, que se caracteriza, entre otras, por:</p>

		<div class="checklist tie-list-shortcode">
<ul>
<li>Agrupar los puntos espaciales en subconjuntos</li>
<li>Cada punto agrupado pertenece solo a un subconjunto (clúster)</li>
<li>Cada subconjunto tiene al menos un punto</li>
</ul>

		</div>
	
<p>Vale la pena destacar que en cuanto a la agrupación de participaciones, en esta categoría encontraremos varios métodos de partición, y nosotros utilizaremos el método <em><strong>K-Means</strong></em>, un algoritmo de aprendizaje automático (Machine Learning) no supervisado. Para ello utilizaremos <em>Python</em>.</p>
<figure id="attachment_28445" aria-describedby="caption-attachment-28445" style="width: 299px" class="wp-caption aligncenter"><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/clustering.png" alt="clustering" width="299" height="290" class=" wp-image-28445" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/clustering.png 471w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/clustering-300x291.png 300w" sizes="(max-width: 299px) 100vw, 299px" /><figcaption id="caption-attachment-28445" class="wp-caption-text">Agrupación por particiones</figcaption></figure>
<p>Para sintetizar, el objetivo de este artículo será el de emplear un algoritmo de aprendizaje automático capaz de agrupar nuestros nodos en <em>clusters</em>, de acuerdo a atributos espaciales (coordenadas) y no espaciales (ponderación); para luego, utilizar un algoritmo de Centro de Gravedad en cada <em>clúster</em> para determinar la localización de múltiples instalaciones (almacenes, depósitos, etc.).</p>
<p>En el desarrollo de este ejercicio emplearemos:</p>

		<div class="plus tie-list-shortcode">
<ul>
<li><em><strong>Colaboratory</strong>: </em>Este es un entorno de programación y ejecución virtual de Python desarrollado por Google. Nos permitirá no tener la necesidad de realizar ninguna instalación en nuestros equipos. Todo lo que desarrollemos lo ejecutaremos en un cuaderno virtual.</li>
<li><strong><em>Python</em></strong>: Este será el lenguaje de programación que vamos a utilizar, y advertimos: No es necesario tener conocimientos previos, y el objetivo del artículo no es convertirnos en programadores expertos. Utilizaremos fragmentos de códigos, librerías disponibles, y explicaremos lo necesario para configurar nuestro desarrollo de acuerdo a los objetivos específicos de nuestros modelos.</li>
<li><strong><em>SkLearn</em></strong>: Las librerías son a <em>Python</em>, lo que las <em>apps </em>son a un teléfono celular. Esta es quizá una de las características más a tractivas de este lenguaje: Casi que existe una librería para cada necesidad. En este caso, <em>SKLearn</em>, es una librería que integra un conjunto de métodos de aprendizaje automático y minería de datos.</li>
<li><em><strong>K-Means</strong>: </em>Este es un módulo de <em>SKLearn</em> que contiene el algoritmo de agrupación <em>KMeans,</em> el cual separa muestras en <em>n</em> grupos de varianza igual, minimizando un criterio conocido como inercia o suma de cuadrados dentro del grupo.</li>
<li><em><strong>Matplotlib</strong>: </em>Es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas en Python. Nos permitirá visualizar nuestros nodos y nuestras localizaciones solución.</li>
<li><strong><em>Pandas</em></strong>: <span>Es un paquete de Python que proporciona estructuras de datos rápidas, y flexibles, diseñadas para que el trabajo con datos estructurados (tabulares, multidimensionales, potencialmente heterogéneos) y de series de tiempo sea fácil e intuitivo.</span></li>
<li><em><strong>Numpy</strong>: </em>Es una librería que nos permitirá efectuar operaciones matriciales en Python.</li>
</ul>

		</div>
	
<hr />
<p>Para desarrollar estas herramientas, vamos a plantear un caso típico de localización de múltiples instalaciones a partir de la consideración de otros nodos (nodos de demanda, por ejemplo).</p>
<h2>Caso de aplicación</h2>

		<div id="caso-de-aplicacion" data-title="Caso de aplicación" class="index-title"></div>
	
<blockquote class=" quote-simple "><p>El Departamento de Desarrollo Sostenible de la ciudad de Cali se encuentra implementando una estrategia piloto de recolección de aceite de cocina usado. Ha articulado este proyecto con una Universidad, la cual desarrolló 4 contenedores inteligentes (BIN’s) para la disposición del bioresiduo.</p></blockquote>
<blockquote class=" quote-simple "><p>En investigaciones asociadas, la Universidad ha determinado que el reciclaje del aceite es un problema de densidad; esto quiere decir que es vital la ubicación de los contenedores (cobertura), para así mismo optimizar el proceso de disposición y recolección. El proyecto piloto piensa articular a las instituciones de educación como puntos potenciales de recolección. Por medio de las instituciones piensan socializar el programa con la comunidad. El primer reto del proyecto consiste en determinar la ubicación de los contenedores inteligentes (4 unidades). La información relacionada con las instituciones de educación que hacen parte del programa (ubicación geográfica / población estudiantil), se detalla a continuación:</p></blockquote>
<table width="611">
<tbody>
<tr>
<td width="80">Nodo</td>
<td width="224">Lugar (Colegios)</td>
<td width="127">Latitud</td>
<td width="100">Longitud</td>
<td width="80">Peso</td>
</tr>
<tr>
<td>0</td>
<td> Comfandi San Nicolás</td>
<td>3,453591118</td>
<td>-76,52254886</td>
<td>1494</td>
</tr>
<tr>
<td>1</td>
<td> Mayor de Santiago de Cali</td>
<td>3,451577758</td>
<td>-76,51023216</td>
<td>908</td>
</tr>
<tr>
<td>2</td>
<td> Municipal Comfandi</td>
<td>3,448107915</td>
<td>-76,51074714</td>
<td>697</td>
</tr>
<tr>
<td>3</td>
<td> Internado San Carlos</td>
<td>3,446994135</td>
<td>-76,51525325</td>
<td>1714</td>
</tr>
<tr>
<td>4</td>
<td> León de Greiff</td>
<td>3,447979402</td>
<td>-76,49993247</td>
<td>1731</td>
</tr>
<tr>
<td>5</td>
<td> Nuestra Señora de la Anunciación</td>
<td>3,445152112</td>
<td>-76,49641342</td>
<td>2297</td>
</tr>
<tr>
<td>6</td>
<td> Fernando de Aragón</td>
<td>3,437355603</td>
<td>-76,51383704</td>
<td>1265</td>
</tr>
<tr>
<td>7</td>
<td> Casa Evangélica</td>
<td>3,437955337</td>
<td>-76,52299947</td>
<td>1658</td>
</tr>
<tr>
<td>8</td>
<td> San Alberto Magno</td>
<td>3,433028941</td>
<td>-76,52707643</td>
<td>604</td>
</tr>
<tr>
<td>9</td>
<td> Santa María Goretty</td>
<td>3,433414486</td>
<td>-76,50720662</td>
<td>416</td>
</tr>
<tr>
<td>10</td>
<td> San Alberto Magno</td>
<td>3,433157456</td>
<td>-76,5267331</td>
<td>1584</td>
</tr>
<tr>
<td>11</td>
<td> San Ignacio de Loyola</td>
<td>3,431786629</td>
<td>-76,51733464</td>
<td>2350</td>
</tr>
<tr>
<td>12</td>
<td> Nuestro Futuro</td>
<td>3,430629992</td>
<td>-76,50360174</td>
<td>964</td>
</tr>
<tr>
<td>13</td>
<td> Sabio Caldas</td>
<td>3,429087807</td>
<td>-76,51660508</td>
<td>329</td>
</tr>
<tr>
<td>14</td>
<td> CREAD</td>
<td>3,425060978</td>
<td>-76,51488847</td>
<td>774</td>
</tr>
<tr>
<td>15</td>
<td> Licomtec</td>
<td>3,416664559</td>
<td>-76,51673383</td>
<td>1818</td>
</tr>
<tr>
<td>16</td>
<td>  Nuestra Señora De La Providencia</td>
<td>3,419534772</td>
<td>-76,49591989</td>
<td>1530</td>
</tr>
<tr>
<td>17</td>
<td> Real Suizo</td>
<td>3,415208029</td>
<td>-76,49323768</td>
<td>2106</td>
</tr>
<tr>
<td>18</td>
<td> Nuevo Edén</td>
<td>3,415722099</td>
<td>-76,53383559</td>
<td>330</td>
</tr>
<tr>
<td>19</td>
<td> Católico</td>
<td>3,413066071</td>
<td>-76,53984374</td>
<td>976</td>
</tr>
<tr>
<td>20</td>
<td> Santa María Stella</td>
<td>3,427031556</td>
<td>-76,55134505</td>
<td>1975</td>
</tr>
<tr>
<td>21</td>
<td> Santa Isabel</td>
<td>3,40805355</td>
<td>-76,50817223</td>
<td>936</td>
</tr>
<tr>
<td>22</td>
<td> Compartir</td>
<td>3,431957663</td>
<td>-76,47495575</td>
<td>1563</td>
</tr>
<tr>
<td>23</td>
<td> Lancaster</td>
<td>3,400770816</td>
<td>-76,55177421</td>
<td>1219</td>
</tr>
<tr>
<td>24</td>
<td> Parroquial Divino Salvador</td>
<td>3,397086588</td>
<td>-76,54259033</td>
<td>1954</td>
</tr>
<tr>
<td>25</td>
<td> Reyes Católicos</td>
<td>3,393316667</td>
<td>-76,53735466</td>
<td>399</td>
</tr>
<tr>
<td>26</td>
<td> Liceo Anglo del Valle</td>
<td>3,387318719</td>
<td>-76,51975937</td>
<td>1741</td>
</tr>
<tr>
<td>27</td>
<td> Laurence</td>
<td>3,383420238</td>
<td>-76,52078934</td>
<td>1111</td>
</tr>
<tr>
<td>28</td>
<td> Los Almendros</td>
<td>3,381278208</td>
<td>-76,52023144</td>
<td>1826</td>
</tr>
<tr>
<td>29</td>
<td> Bautista</td>
<td>3,37720834</td>
<td>-76,52327843</td>
<td>1772</td>
</tr>
<tr>
<td>30</td>
<td> Lacordaire</td>
<td>3,378150837</td>
<td>-76,54460736</td>
<td>1965</td>
</tr>
<tr>
<td>31</td>
<td> General José María Córdoba</td>
<td>3,393573314</td>
<td>-76,54932805</td>
<td>841</td>
</tr>
<tr>
<td>32</td>
<td> El Hogar</td>
<td>3,390745864</td>
<td>-76,5503151</td>
<td>770</td>
</tr>
<tr>
<td>33</td>
<td> Americano</td>
<td>3,379093255</td>
<td>-76,54688187</td>
<td>650</td>
</tr>
<tr>
<td>34</td>
<td> Santa Filomena</td>
<td>3,401969935</td>
<td>-76,51345082</td>
<td>1401</td>
</tr>
<tr>
<td>35</td>
<td> Tomás Vasconi</td>
<td>3,403040928</td>
<td>-76,5173132</td>
<td>1474</td>
</tr>
<tr>
<td>36</td>
<td> República del Salvador</td>
<td>3,404454636</td>
<td>-76,52143308</td>
<td>1926</td>
</tr>
<tr>
<td>37</td>
<td> Los Andes</td>
<td>3,429601077</td>
<td>-76,53761216</td>
<td>1566</td>
</tr>
<tr>
<td>38</td>
<td>Villacolombia</td>
<td>3,445493943</td>
<td>-76,50169202</td>
<td>2354</td>
</tr>
<tr>
<td>39</td>
<td>Las Américas</td>
<td>3,449220822</td>
<td>-76,50594064</td>
<td>2043</td>
</tr>
<tr>
<td>40</td>
<td>SantaFe</td>
<td>3,442238267</td>
<td>-76,50988885</td>
<td>2333</td>
</tr>
<tr>
<td>41</td>
<td>Evaristo García</td>
<td>3,440781776</td>
<td>-76,51752778</td>
<td>696</td>
</tr>
<tr>
<td>42</td>
<td>Alfredo Vasquez Cobo</td>
<td>3,435598366</td>
<td>-76,5164549</td>
<td>1073</td>
</tr>
<tr>
<td>43</td>
<td>Ciudad de Cali</td>
<td>3,431143181</td>
<td>-76,51272126</td>
<td>1275</td>
</tr>
<tr>
<td>44</td>
<td>INEM</td>
<td>3,482761991</td>
<td>-76,49976083</td>
<td>1485</td>
</tr>
<tr>
<td>45</td>
<td>Olaya Herrera</td>
<td>3,478178519</td>
<td>-76,51280709</td>
<td>1470</td>
</tr>
<tr>
<td>46</td>
<td>Guillermo Valencia</td>
<td>3,47449459</td>
<td>-76,5136654</td>
<td>1248</td>
</tr>
<tr>
<td>47</td>
<td>José Ignacio Rengifo</td>
<td>3,471624543</td>
<td>-76,5136654</td>
<td>2160</td>
</tr>
<tr>
<td>48</td>
<td>Santo Tomás</td>
<td>3,45830227</td>
<td>-76,5164549</td>
<td>1776</td>
</tr>
<tr>
<td>49</td>
<td>La Merced</td>
<td>3,46271449</td>
<td>-76,5024645</td>
<td>706</td>
</tr>
<tr>
<td>50</td>
<td>Pedro Antonio Molina</td>
<td>3,482804827</td>
<td>-76,48761579</td>
<td>2369</td>
</tr>
<tr>
<td>51</td>
<td>Santa Librada</td>
<td>3,46228612</td>
<td>-76,52302095</td>
<td>2498</td>
</tr>
<tr>
<td>52</td>
<td>República de Israel</td>
<td>3,463656904</td>
<td>-76,51053258</td>
<td>1510</td>
</tr>
<tr>
<td>53</td>
<td>San Vicente Paul</td>
<td>3,466227117</td>
<td>-76,50950261</td>
<td>2330</td>
</tr>
<tr>
<td>54</td>
<td>Manuel María Mallarino</td>
<td>3,456760129</td>
<td>-76,48851701</td>
<td>1464</td>
</tr>
<tr>
<td>55</td>
<td>Sebastían de Belalcazar</td>
<td>3,460229941</td>
<td>-76,48521253</td>
<td>628</td>
</tr>
<tr>
<td>56</td>
<td>Liceo Departamental</td>
<td>3,423860462</td>
<td>-76,5385563</td>
<td>364</td>
</tr>
<tr>
<td>57</td>
<td>Libardo Madrid</td>
<td>3,422061154</td>
<td>-76,54383489</td>
<td>2439</td>
</tr>
<tr>
<td>58</td>
<td>Metropolitano Santa Anita</td>
<td>3,401691038</td>
<td>-76,54218265</td>
<td>1815</td>
</tr>
<tr>
<td>59</td>
<td>San José</td>
<td>3,396935816</td>
<td>-76,55031511</td>
<td>2230</td>
</tr>
</tbody>
</table>
<hr />
<p>Para tales efectos, desarrollaremos un modelo que apoye el análisis preliminar y la localización de los múltiples contenedores. También, que tenga la capacidad de predecir el grupo (clúster) al que pertenecería un nodo nuevo.</p>
<hr />
<h3>Paso 1: Crear el entorno de trabajo en Colaboratory</h3>

		<div id="paso-1-crear-el-entorno-de-trabajo-en-colaboratory" data-title="Paso 1: Crear el entorno de trabajo en Colaboratory" class="index-title"></div>
	
<p><span>Lo primero que vamos a hacer consiste en crear un entorno de trabajo en <em>Google</em> </span><em>Colaboratory</em><span>, así que vayamos allá: </span><a href="https://colab.research.google.com/#create=true" target="_blank" rel="noopener"><em><strong>Abrir cuaderno nuevo</strong></em></a><span>.</span></p>
<p>Verán que tienen un lienzo para programar el modelo, así que en este cuaderno podemos ir generando las líneas de código que explicaremos en los pasos siguientes.</p>
<h3>Paso 2: Importar las librerías necesarias</h3>

		<div id="paso-2-importar-las-librerias-necesarias" data-title="Paso 2: Importar las librerías necesarias" class="index-title"></div>
	
<p>Respecto a las librerías, en la introducción del artículo hicimos una descripción de la funcionalidad de cada una, veamos como importarlas en nuestro entorno:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Importar las librerías necesarias
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans</code></pre>
</div>
<p>De esta manera, tenemos todo lo necesario para empezar a desarrollar nuestro código.</p>
<h3>Paso 3: Importar los datos desde Excel</h3>

		<div id="paso-3-importar-los-datos-desde-excel" data-title="Paso 3: Importar los datos desde Excel" class="index-title"></div>
	
<p>De acuerdo a las necesidades del modelo, podemos desarrollar un código que permita la entrada manual de la información, la captura de los datos desde entornos digitales (Internet, por ejemplo), o podemos, desde luego, alimentar nuestro modelo con información contenida en documentos externos, como es el caso de un archivo de Microsoft Excel.</p>
<p>Esta puede considerarse como una de las ventajas de utilizar <em>Python, </em>su capacidad de integrarse con cualquier fuente de datos. En nuestro caso, toda la información se encuentra contenida en un documento de Excel, el cual presenta el siguiente formato:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/datos_excel.png" alt="datos_excel" width="612" height="241" class="size-full wp-image-28446 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/datos_excel.png 612w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/datos_excel-300x118.png 300w" sizes="(max-width: 612px) 100vw, 612px" /></p>
<p>Ya veremos cómo, parte de estos datos son prescindibles y otros indispensables.</p>

		<div class="box download  ">
			<div class="box-inner-block">
				<span class="fa tie-shortcode-boxicon"></span>Puedes descargar el documento de Excel que utilizamos en este ejemplo: <a href="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/cluster.xlsx" target="_blank" rel="noopener"><strong>Base de datos</strong></a>
			</div>
		</div>
	
<p>En <em>Colaboratory</em>, el siguiente fragmento permitirá cargar un archivo al entorno de ejecución:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>from google.colab import files

uploaded = files.upload()

for fn in uploaded.keys():
  print('User uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))</code></pre>
</div>
<p>Al ejecutar este fragmento de código, se abrirá una ventana emergente del explorador que permitirá cargar nuestra base de datos, en nuestro caso el archivo tienen el nombre de <em>cluster.xlsx.</em></p>
<p>La siguiente línea de código permitirá almacenar los datos contenidos en el documento en un <em>Dataframe</em> de nuestro entorno, dentro de la variable <em>data</em>.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Leer el documento de Excel y almacenar los datos en la variable data
data = pd.read_excel('cluster.xlsx')</code></pre>
</div>
<p>Podemos en cualquier momento confirmar si la carga de los datos se ha realizado correctamente, para eso imprimiremos las primeras cinco filas del  <em>DataFrame:</em></p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>data.head()</code></pre>
</div>
<p>Al ejecutar esta instrucción tenemos la siguiente salida:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/head_cluster.png" alt="head_cluster" width="539" height="237" class="size-full wp-image-28448 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/head_cluster.png 539w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/head_cluster-300x132.png 300w" sizes="(max-width: 539px) 100vw, 539px" /></p>
<h3>Paso 4: Graficar los puntos dados iniciales (Nodos)</h3>

		<div id="paso-4-graficar-los-puntos-dados-iniciales-nodos" data-title="Paso 4: Graficar los puntos dados iniciales (Nodos)" class="index-title"></div>
	
<p>Nuestros puntos iniciales, o las ubicaciones de partida son las instituciones de educación que nos otorga el planteamiento del problema.</p>
<p>Para graficar estos puntos utilizamos el sistema de coordenadas disponible: Latitud y Longitud. Así entonces, debemos extraer estos datos de la hoja de cálculo (<em>DataFrame</em>) que hemos importado al modelo; convertir estas coordenadas en una matriz bidimensional (Latitud y Longitud) y graficar los puntos:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Graficar los nodos dados (ubicaciones)
Lat= data['Latitud']
Lon = data['Longitud']
Peso = data['Peso']
X = []
for i in range(len(data['Latitud'])):
    X.append(Lat[i])
    X.append(Lon[i])

X = np.array(X)

X = X.reshape(-1, 2,)


plt.scatter(Lat, Lon)
plt.show()</code></pre>
</div>
<p>Al ejecutar este fragmento de código, tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/ubicaciones-iniciales.png" alt="ubicaciones iniciales" width="393" height="248" class="size-full wp-image-28449 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/ubicaciones-iniciales.png 393w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/ubicaciones-iniciales-300x189.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<p>Podemos apreciar cómo se encuentran dispersos los nodos iniciales, formando parte un mismo conjunto que es la población. Las coordenadas son latitud y longitud. Los nodos son, una vez más recordamos, las instituciones educativas, de acuerdo al caso de estudio.</p>
<h3>Paso 5: Agrupar los nodos geoespacialmente mediante Machine Learning</h3>

		<div id="paso-5-agrupar-los-nodos-geoespacialmente-mediante-machine-learning" data-title="Paso 5: Agrupar los nodos geoespacialmente mediante Machine Learning" class="index-title"></div>
	
<p>Cuando mencionamos Machine Learning, a menudo la primera consideración que tenemos es de complejidad. Pues bien, muchos de los algoritmos que hemos utilizado durante décadas son en realidad de aprendizaje automático, como por ejemplo la <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/"><em><strong>regresión lineal</strong></em></a>. El algoritmo de <em>K-Means </em>que emplearemos de forma automatizada mediante <em>Python</em>, utiliza centroides que minimizan la inercia, o el criterio de suma de cuadrados de cada clúster:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/formula_cluster.png" alt="formula_cluster" width="203" height="65" class="size-full wp-image-28451 aligncenter" /></p>
<p>Me pareció conveniente explicar un poco la teoría, pero vayamos a la práctica. Toda vez que tenemos los nodos del modelo, lo siguiente que debemos indicar es la cantidad de agrupaciones que queremos (clúster). Ya que el problema plantea la disposición de 4 contenedores, vamos a dividir la población de nodos en 4 conjuntos.</p>
<p>Luego, correremos el algoritmo <em>K-Means, </em>veamos cómo:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Ejecutar el algoritmo KMeans
clusters = 4
KMean = KMeans(n_clusters=clusters)
KMean_g = KMean.fit_predict(X)
KMean.fit(X)</code></pre>
</div>
<p>Lo siguiente que haremos será establecer los centroides de cada clúster, es decir, la ubicación de nuestros contendores. En primer lugar, el modelo nos dará las coordenadas. Utilizaremos la siguiente línea de código:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Determinar los centroides de cada clúster
KMean.cluster_centers_</code></pre>
</div>
<p>Al ejecutarla tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides.png" alt="centroides" width="436" height="129" class="size-full wp-image-28452 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides.png 436w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides-300x89.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></p>
<p>Estas son las coordenadas que indican el centro de cada uno de nuestros grupos de nodos. Y teóricamente ahí deberíamos disponer nuestros contenedores.</p>
<h3>Paso 6: Graficar los clusters y los centroides (Localizaciones múltiples)</h3>

		<div id="paso-6-graficar-los-clusters-y-los-centroides-localizaciones-multiples" data-title="Paso 6: Graficar los clusters y los centroides (Localizaciones múltiples)" class="index-title"></div>
	
<p>El siguiente paso consiste en graficar todas las coordenadas que ya tenemos: tantos los nodos iniciales, como los los centroides, o las localizaciones solución. Veamos cómo:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Graficar todas las coordenadas (Puntos y centroides)
plt.scatter(X[:,0], X[:,1], c=KMean_g) #Puntos iniciales

#Centroides
plt.scatter(KMean.cluster_centers_[0][0], KMean.cluster_centers_[0][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[1][0], KMean.cluster_centers_[1][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[2][0], KMean.cluster_centers_[2][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[3][0], KMean.cluster_centers_[3][1], s=50, c='r')</code></pre>
</div>
<p>Al ejecutar el fragmento tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II.png" alt="centroides_II" width="393" height="248" class="size-full wp-image-28453 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II.png 393w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II-300x189.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<p>Vemos cómo se han efectuado las agrupaciones de los nodos (colores), y los marcadores rojos indican los centroides. Este debería ser el final de nuestro desarrollo, sin embargo, no sé si lo han notado, siempre hemos hablado de centroides, nunca de centros de gravedad o centros de masa. Bien, no sé si también han identificado que en ningún momento hemos considerado el peso de cada nodo, en este caso la <em>población estudiantil </em>de cada institución.</p>
<p><em>¿Esto qué implica?</em> Implica que hemos desarrollado un modelo que tiene exclusivamente consideraciones espaciales. De hecho, visualmente puede observarse cómo, básicamente los centroides se ubican en lo que podría considerarse el medio de cada clúster, sin ninguna consideración adicional aparente, por lo menos a la vista.</p>
<p>Pues bien, vamos a solucionarlo, para ello debemos retocar algunos de los pasos anteriores:</p>
<h3>Paso 5 (Recargado): Agrupar los nodos geoespacialmente mediante Machine Learning (Considerando atributos espaciales y no espaciales)</h3>

		<div id="paso-5-recargado-agrupar-los-nodos-geoespacialmente-mediante-machine-learning-considerando-atributos-espaciales-y-no-espaciales" data-title="Paso 5 (Recargado): Agrupar los nodos geoespacialmente mediante Machine Learning (Considerando atributos espaciales y no espaciales)" class="index-title"></div>
	
<p>Dentro de nuestro marco de datos (<em>DataFrame</em>) tenemos la información relacionada al peso de cada nodo (<em>Población estudiantil</em>). Pues bien, vamos a considerarla al ejecutar el algoritmo <em>K-Means</em>.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Ejecutar el algoritmo KMeans (Considerando el peso de los nodos)
clusters = 4
KMean = KMeans(n_clusters=clusters)
KMean_g = KMean.fit_predict(X)
KMean.fit(X, sample_weight=Peso)</code></pre>
</div>
<p>Lo siguiente que haremos será establecer los centroides de cada clúster, que ahora sí serán Centros de Gravedad; es decir, la ubicación de nuestros contendores. En primer lugar, el modelo nos dará las coordenadas. Utilizaremos la siguiente línea de código:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Determinar los centroides de cada clúster
KMean.cluster_centers_</code></pre>
</div>
<p>Al ejecutarla tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_recargado.png" alt="centroides_recargado" width="436" height="129" class="size-full wp-image-28454 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_recargado.png 436w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_recargado-300x89.png 300w" sizes="(max-width: 436px) 100vw, 436px" /></p>
<p>Los centroides han cambiado, ahora son centros de gravedad afectados por el peso de cada nodo. Es posible que incluso haya cambiado la agrupación de los nodos (composición de los clusters).</p>
<h3>Paso 6 (Recargado): Graficar los clusters y los Centros de Gravedad (Localizaciones múltiples)</h3>

		<div id="paso-6-recargado-graficar-los-clusters-y-los-centros-de-gravedad-localizaciones-multiples" data-title="Paso 6 (Recargado): Graficar los clusters y los Centros de Gravedad (Localizaciones múltiples)" class="index-title"></div>
	
<p>El siguiente paso consiste en graficar todas las coordenadas que ya tenemos: tantos los nodos iniciales, como los los Centros de Gravedad, o las localizaciones solución. Veamos cómo:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>#Graficar todas las coordenadas (Puntos y centroides)
plt.scatter(X[:,0], X[:,1], c=KMean_g) #Puntos iniciales

#Centroides
plt.scatter(KMean.cluster_centers_[0][0], KMean.cluster_centers_[0][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[1][0], KMean.cluster_centers_[1][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[2][0], KMean.cluster_centers_[2][1], s=50, c='r')
plt.scatter(KMean.cluster_centers_[3][0], KMean.cluster_centers_[3][1], s=50, c='r')</code></pre>
</div>
<p>Al ejecutar el fragmento tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad.png" alt="Centros de gravedad" width="393" height="248" class="size-full wp-image-28455 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad.png 393w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad-300x189.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>
<p>El resultado respecto a los centroides es diferente. La consideración de un atributo no espacial, en este caso el peso de cada nodo (<em>población estudiantil de cada institución educativa</em>), ha incidido en la ubicación propuesta de las localizaciones solución. Y este debería ser el final de nuestro modelo.</p>
<p>Hemos logrado agrupar nuestros puntos iniciales en clusters, y luego hemos determinado los Centros de Gravedad de cada uno de los clusters.</p>
<p>Por último, veamos una característica de la librería <em>K-Means </em>Análisis predictivo de nodos en clusters, es decir, de acuerdo a unas coordenadas dadas, podemos estimar el grupo al que pertenecerá un nuevo nodo.</p>
<h3>Paso 7: Predicción de clusters</h3>

		<div id="paso-7-prediccion-de-clusters" data-title="Paso 7: Predicción de clusters" class="index-title"></div>
	
<p>En primer lugar ejecutaremos una línea que nos permite identificar a cada nodo dentro de un grupo. Ya que tenemos 4 grupos, estos se identificarán de la siguiente manera: 0, 1, 2, 3.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>KMean.labels_</code></pre>
</div>
<p>Al ejecutar esta línea tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/grupos_nodos.png" alt="grupos_nodos" width="622" height="111" class="size-full wp-image-28456 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/grupos_nodos.png 622w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/grupos_nodos-300x54.png 300w" sizes="(max-width: 622px) 100vw, 622px" /></p>
<p>Vemos como cada una de las 60 instituciones educativas (nodos), tienen un identificador de grupo dentro del modelo.</p>
<p>Ahor, dadas las coordenadas de un nuevo nodo, podemos predecir el grupo al cual pertenecerá:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>sample_test=np.array([-3.433,-76.22])
second_test=sample_test.reshape(1, -1)
KMean.predict(second_test)</code></pre>
</div>
<p>Al ejecutar este fragmento tendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/nodos_prediccion.png" alt="nodos_prediccion" width="483" height="118" class="size-full wp-image-28457 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/nodos_prediccion.png 483w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/nodos_prediccion-300x73.png 300w" sizes="(max-width: 483px) 100vw, 483px" /></p>
<p>Es decir, el algoritmo predice que de acuerdo a las coordenada dadas, el nuevo nodo formaría parte del clúster 0.</p>
<hr />
<p>Pudimos observar cómo varía el resultado dependiendo de la consideración de atributos netamente geoespaciales, y de atributos no espaciales, como la ponderación de cada nodo.</p>

		<div class="post-content-slideshow-outer">
			<div class="post-content-slideshow">

			<div class="loader-overlay"><div class="spinner-circle"></div></div>

				<div class="tie-slick-slider">

			<div class="slide post-content-slide">
				 Atributos geoespaciales |</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II.png" alt="centroides_II" width="393" height="248" class="size-full wp-image-28453 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II.png 393w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/centroides_II-300x189.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>

			</div><!-- post-content-slide -->
		

			<div class="slide post-content-slide">
				 Atributos geoespaciales y de ponderación |</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad.png" alt="Centros de gravedad" width="393" height="248" class="size-full wp-image-28455 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad.png 393w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Centros-de-gravedad-300x189.png 300w" sizes="(max-width: 393px) 100vw, 393px" /></p>

			</div><!-- post-content-slide -->
		


					<div class="slider-nav-wrapper">
						<ul class="tie-slider-nav"></ul>
					</div>
				</div><!-- tie-slick-slider -->
			</div><!-- post-content-slideshow -->
		</div><!-- post-content-slideshow-outer -->
	
<h2>Integración con mapas de calor y entornos geográficos reales</h2>
<p>Uno de los puntos negativos del modelo que acabamos de desarrollar es quizá que no nos permite visualizar gráficamente la densidad de los puntos. Si observamos las gráficas, todos los puntos parecen tener el mismo tamaño, y si bien esta no es una consideración para el funcionamiento del algoritmo; en el análisis preliminar quisiéramos tener esta herramienta. Otra consideración adicional sería la posibilidad de graficar todos nuestros puntos, y los centros de gravedad de cada (clúster) en un entorno geográfico real.</p>
<p>Pues bien, una de las ventajas fundamentales de <em>Python </em>consiste en que podemos integrar distintos desarrollos en nuestros modelos, tal es el caso del desarrollo que efectúanos en un artículo anterior (<a href="https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/mapas-de-calor-y-algoritmo-de-centro-de-gravedad-utilizando-python/"><strong>Mapas de calor y Entornos geográficos reales</strong></a>); de tal manera que podamos complementar nuestro modelo.</p>
<p>No vamos a profundizar en la librerías, ni en la definición de las variables, para eso recomendamos leer el artículo. Veamos entonces, como complementamos este modelo:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>import folium
import statistics
from folium.plugins import HeatMap
mediaLong = statistics.mean(Lon)
mediaLat = statistics.mean(Lat)

# Crear un objeto de mapa base Map()
mapa = folium.Map(location=[mediaLat, mediaLong], zoom_start = 13)

# Crear una capa de mapa de calor
mapa_calor = HeatMap( list(zip(Lat, Lon, data["Peso"])),
                   min_opacity=0.2,
                   max_val=data["Peso"].max(),
                   radius=50, 
                   blur=50, 
                   max_zoom=1)

#Creamos el marcador de Centro de Gravedad
tooltip = 'Centro de gravedad'
folium.Marker([KMean.cluster_centers_[0][0], KMean.cluster_centers_[0][1]], popup="Centro", tooltip = tooltip).add_to(mapa)
folium.Marker([KMean.cluster_centers_[1][0], KMean.cluster_centers_[1][1]], popup="Centro", tooltip = tooltip).add_to(mapa)
folium.Marker([KMean.cluster_centers_[2][0], KMean.cluster_centers_[2][1]], popup="Centro", tooltip = tooltip).add_to(mapa)
folium.Marker([KMean.cluster_centers_[3][0], KMean.cluster_centers_[3][1]], popup="Centro", tooltip = tooltip).add_to(mapa)

# Adherimos la capa de mapa de calor al mapa principal
mapa_calor.add_to(mapa)
mapa</code></pre>
</div>
<p>Al ejecutar este fragmento tendremos el siguiente resultado:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Mapa-de-calorII.png" alt="Mapa de calorII" width="700" height="394" class="size-full wp-image-28492 aligncenter" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Mapa-de-calorII.png 700w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Mapa-de-calorII-300x169.png 300w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/10/Mapa-de-calorII-390x220.png 390w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p>Ahora tenemos un modelo capaz de <strong>agrupar nuestros nodos en clusters</strong> de acuerdo a atributos geoespaciales; capaz de <strong>determinar los centros de gravedad</strong> de cada cluster de acuerdo a atributos no espaciales (en nuestro caso la población de los nodos); capaz de complementarse con una capa de visualización de <strong>mapa de calor</strong> que nos permite apreciar la densidad y todo esto <strong>puede visualizarse en un entorno geográfico real</strong>.</p>
<h2>Consideraciones finales</h2>

		<div id="consideraciones-finales" data-title="Consideraciones finales" class="index-title"></div>
	
<p>Ya lo expresamos anteriormente, la base del algoritmo <em>K-Means </em>es la consideración y minimización de la inercia, y en espacios de muy altas dimensiones, las distancias suelen inflarse, ya que esta no es una medida normalizada.</p>
<p>Sin embargo, para los efectos que hemos empleado, el algoritmo suele arrojar resultados satisfactorios.</p>
<p>El código completo de este desarrollo lo puedes encontrar en nuestro cuaderno: <a href="https://colab.research.google.com/drive/1qboyfxT1kdjn9XiqXudZBf74dUtxwCkn?usp=sharing" target="_blank" rel="noopener"><em><strong>Localización de varias instalaciones mediante agrupación geoespacial y Centro de Gravedad (Python)</strong></em></a>.</p>
<p>La entrada <a href="https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/localizacion-de-varios-almacenes-mediante-agrupacion-geoespacial/">Localización de varios almacenes mediante agrupación geoespacial</a> se publicó primero en <a href="https://ingenieriaindustrialonline.com">Ingenieria Industrial Online</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ingenieriaindustrialonline.com/localizacion-de-instalaciones/localizacion-de-varios-almacenes-mediante-agrupacion-geoespacial/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Regresión lineal en Python</title>
		<link>https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/</link>
					<comments>https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/#respond</comments>
		
		<dc:creator><![CDATA[Bryan Salazar López]]></dc:creator>
		<pubDate>Tue, 03 Aug 2021 04:48:19 +0000</pubDate>
				<category><![CDATA[Inteligencia artificial]]></category>
		<category><![CDATA[Pronóstico de la demanda]]></category>
		<category><![CDATA[Algoritmo supervisado]]></category>
		<category><![CDATA[Ciencia de datos]]></category>
		<category><![CDATA[Machine learning]]></category>
		<category><![CDATA[Mínimos cuadrados]]></category>
		<category><![CDATA[Planeación de la demanda]]></category>
		<category><![CDATA[Pronósticos]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Regresión lineal]]></category>
		<guid isPermaLink="false">https://ingenieriaindustrialonline.com/?p=26386</guid>

					<description><![CDATA[<p>Quienes nos adentramos desde hace varios años en el mundo de la estimación de la demanda, hemos considerado a la regresión lineal, o al método de los mínimos cuadrados, como un modelo de pronóstico, no mucho más que eso. Sabemos que nos permite hallar el valor esperado de una variable aleatoria a cuando b toma un valor específico. Entendemos &#8230;</p>
<p>La entrada <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/">Regresión lineal en Python</a> se publicó primero en <a href="https://ingenieriaindustrialonline.com">Ingenieria Industrial Online</a>.</p>
]]></description>
										<content:encoded><![CDATA[
		<div id="introduccion" data-title="Introducción" class="index-title"></div>
	
<p>Quienes nos adentramos desde hace varios años en el mundo de la estimación de la demanda, hemos considerado a la <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal/"><strong>regresión lineal</strong></a>, o al método de los mínimos cuadrados, como un modelo de pronóstico, no mucho más que eso.</p>
<p>Sabemos que nos permite hallar el valor esperado de una variable aleatoria <em><strong>a</strong></em> cuando <em><strong>b</strong></em><strong> </strong>toma un valor específico. Entendemos que este método implica un supuesto de linealidad cuando la demanda presenta un comportamiento creciente o decreciente.</p>
<p>Es común que hagamos uso de una hoja de cálculo sobre la cual aplicamos las fórmulas de regresión, tal como lo detallamos en este artículo de introducción: <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal/"><em><strong>regresión lineal</strong></em>.</a></p>
<p>Sin embargo, con los avances computacionales, con el incremento de la capacidad de procesamiento de información, con el crecimiento de las herramientas utilizadas en la ciencia de datos; con la consideración de términos como <em>inteligencia artificial, machine learning</em>, y muchos conceptos relacionados; podemos definir a la regresión lineal en este contexto: <em>La regresión lineal es una técnica paramétrica de Machine Learning. Es un algoritmo supervisado.</em></p>

		<div class="box info  ">
			<div class="box-inner-block">
				<span class="fa tie-shortcode-boxicon"></span>Con «paramétrica» queremos decir que, incluso antes de mirar a los datos, ya sabemos cuántos parámetros (o coeficientes) son necesarios. En el caso que estemos usando una sola variable, <em><strong>x</strong></em>, sabemos que una línea necesita 2 parámetros. Con «supervisado» queremos decir que, el algoritmo aprende por si mismo 
			</div>
		</div>
	
<hr />
<p>En esta oportunidad, y teniendo en cuenta lo que venimos mencionando; utilizaremos <em>Python</em>, y una librería para aprendizaje automático: <a href="https://scikit-learn.org/"><em>scikit-learn</em></a>, para abordar modelos de regresión lineal. Las ventajas de <em>Python </em>como lenguaje que nos permita integrar diversas aplicaciones, fuentes de información, y posibilidades de modelamiento de datos a gran escala, son muchas. Por esta razón dejaremos esta herramienta a disposición.</p>
<h2 id="cc-m-header-5710915713" class="">Ejemplo de aplicación de Regresión lineal mediante <em>Python</em></h2>

		<div id="ejemplo-de-aplicacion-de-regresion-lineal-mediante-python" data-title="Ejemplo de aplicación de Regresión lineal mediante Python" class="index-title"></div>
	
<div id="cc-m-5860634213" class="j-module n j-hgrid ">
<div class="cc-m-hgrid-column last">
<div id="cc-matrix-1350138413">
<div id="cc-m-5710916713" class="j-module n j-text ">
<p>La juguetería <em>Gaby</em> desea estimar mediante regresión lineal simple las ventas para el mes de Julio de su nuevo carrito infantil <em>«Mate»</em>. La información del comportamiento de las ventas de todos sus almacenes de cadena se presenta en el siguiente tabulado:</p>
<p>&nbsp;</p>
</div>
</div>
</div>
</div>
<div id="cc-m-5710917013" class="j-module n j-table ">
<table style="margin-left: auto; margin-right: auto;" border="0" cellspacing="0" cellpadding="3" align="">
<tbody>
<tr dir="" lang="" style="background-color: #000000;" xml:lang="" align="" valign="" bgcolor="">
<td style="text-align: center;"><span style="color: #ffffff;">Mes</span></td>
<td colspan="1" rowspan="1" style="text-align: center;"><span style="color: #ffffff;">Periodo</span></td>
<td style="text-align: center;"><span style="color: #ffffff;">Ventas</span></td>
</tr>
<tr>
<td style="text-align: center;"> Enero</td>
<td colspan="1" rowspan="1" style="text-align: center;">1</td>
<td style="text-align: center;">7000</td>
</tr>
<tr>
<td colspan="1" rowspan="1" style="text-align: center;">Febrero</td>
<td colspan="1" rowspan="1" style="text-align: center;">2</td>
<td style="text-align: center;" colspan="1" rowspan="1">9000</td>
</tr>
<tr>
<td colspan="1" rowspan="1" style="text-align: center;">Marzo</td>
<td colspan="1" rowspan="1" style="text-align: center;">3</td>
<td style="text-align: center;" colspan="1" rowspan="1">5000</td>
</tr>
<tr>
<td colspan="1" rowspan="1" style="text-align: center;">Abril</td>
<td colspan="1" rowspan="1" style="text-align: center;">4</td>
<td style="text-align: center;" colspan="1" rowspan="1">11000</td>
</tr>
<tr>
<td colspan="1" rowspan="1" style="text-align: center;">Mayo</td>
<td colspan="1" rowspan="1" style="text-align: center;">5</td>
<td style="text-align: center;" colspan="1" rowspan="1">10000</td>
</tr>
<tr>
<td colspan="1" rowspan="1" style="text-align: center;">Junio</td>
<td colspan="1" rowspan="1" style="text-align: center;">6</td>
<td style="text-align: center;" colspan="1" rowspan="1">13000</td>
</tr>
</tbody>
</table>
</div>
<div id="cc-m-5710917313" class="j-module n j-text ">
<hr />
</div>
<h3>Importar librerías</h3>

		<div id="importar-librerias" data-title="Importar librerías" class="index-title"></div>
	
<p>Para llevar a cabo este ejercicio necesitaremos una serie de librerías, vamos a describir cada una de ellas:</p>

		<div class="checklist tie-list-shortcode">
<ul>
<li>Numpy: Es el paquete fundamental para la computación en matrices con Python.</li>
<li>Matplotlib: Es un paquete para crear gráficos en Python.</li>
<li>Sklearn: Un conjunto de módulos de Python para el aprendizaje automático y la minería de datos.</li>
</ul>

		</div>
	
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
</code></pre>
</div>
<p>Desde la librería <em>sklearn </em>importaremos las clases <em>liner_model </em>y <em>mean_squared_error</em> para obtener la regresión lineal por mínimos cuadrados y para evaluar la calidad de a regresión.</p>
<h3>Crear la data de entrada</h3>

		<div id="crear-la-data-de-entrada" data-title="Crear la data de entrada" class="index-title"></div>
	
<p>De acuerdo a nuestro ejemplo, los periodos los almacenaremos en una lista contenida en la variable <em><strong>x</strong></em>. Así mismo, los datos de la demanda los almacenaremos en una lista contenida en la variable <em><strong>y</strong></em>.</p>
<p>Crearemos una lista (<em><strong>z</strong></em>) con los períodos que queremos pronosticar, en este caso, las ventas para el periodo 7.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>x = [1,2,3,4,5,6]
y = [7000,  9000, 5000, 11000, 10000, 13000]
z = [7]

#Convertimos las listas de entrada en matrices
x = np.array(x)
y = np.array(y)
z = np.array(z)

#Graficamos los datos de entrada
plt.scatter(x,y,label='data', color='blue')
plt.title('Distribución entre meses y demanda');
</code></pre>
</div>
<p>Las listas con los datos de entrada los convertiremos en matrices para procesar posteriormente la información. El modelo de aprendizaje automático trabaja a partir de matrices.</p>
<p>Por último, graficaremos la data de entrada. El resultado parcial de nuestro programa será:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/Figure-2021-08-02-220254.png" alt="regresión_lineal" width="388" height="264" class="aligncenter size-full wp-image-26388" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/Figure-2021-08-02-220254.png 388w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/Figure-2021-08-02-220254-300x204.png 300w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/Figure-2021-08-02-220254-220x150.png 220w" sizes="(max-width: 388px) 100vw, 388px" /></p>
<h3>Entrenar el modelo de regresión lineal</h3>

		<div id="entrenar-el-modelo-de-regresion-lineal" data-title="Entrenar el modelo de regresión lineal" class="index-title"></div>
	
<p>Crearemos una instancia de la clase <em>LinearRegression</em> con el nombre de <em>regresion_lineal</em>. A continuación, utilizaremos el método <em><strong>fit </strong></em>el cual ajusta el modelo lineal de acuerdo a los datos de entrada (<em><strong>x</strong></em>, <em><strong>y</strong></em>).</p>

		<div class="box info  ">
			<div class="box-inner-block">
				<span class="fa tie-shortcode-boxicon"></span>Utilizamos la rutina <em><strong>reshape</strong></em> para dar una nueva forma a la matriz <em><strong>x</strong></em>. No se modifica, solo cambia de forma, en este caso los datos contenidos en la matriz se almacenarán en una sola columna
			</div>
		</div>
	
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>regresion_lineal = linear_model.LinearRegression()
regresion_lineal.fit(x.reshape(-1,1), y) 
# Imprimimos los parámetros que ha estimado la regresión lineal
print('\nParámetros del modelo de regresión')
print('b (Pendiente) = ' + str(regresion_lineal.coef_) + ', a (Punto de corte) = ' + str(regresion_lineal.intercept_))
</code></pre>
</div>
<p>Lo siguiente que haremos &#8211; y ya que el modelo de regresión se ha ajustado a los datos de entrada &#8211; será obtener los parámetros de regresión:</p>

		<div class="checklist tie-list-shortcode">
<ul>
<li><em>coef_ = </em>Valor de la pendiente.</li>
<li><em>intercept_ = </em>intersección de la línea con el eje.</li>
</ul>

		</div>
	
<p>Hemos añadido algo de formato a los parámetros que mostrará el desarrollo. Veamos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_parametros.png" alt="regresion_lineal_parametros" width="613" height="330" class="aligncenter size-full wp-image-26389" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_parametros.png 613w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_parametros-300x162.png 300w" sizes="(max-width: 613px) 100vw, 613px" /></p>
<p>En este punto ya hemos obtenido a través del modelo entrenado, los parámetros de regresión del conjunto de datos.</p>
<h3>Prediciendo datos a partir del modelo entrenado</h3>

		<div id="prediciendo-datos-a-partir-del-modelo-entrenado" data-title="Prediciendo datos a partir del modelo entrenado" class="index-title"></div>
	
<p>Toda vez que el modelo ha obtenido los parámetros de regresión, podemos predecir datos utilizando el método <em><strong>predict</strong></em>.</p>
<p>En este caso, queremos pronosticar el valor de la demanda (<em><strong>y</strong></em>) para el periodo 7 (<em><strong>z</strong></em>).</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>pronostico = regresion_lineal.predict(z.reshape(-1,1))

print('\nPronósticos')
for i in range(len(z)):
print('Pronóstico para el periodo {0} = {1} '.format(z[i], pronostico[i]))
</code></pre>
</div>
<p>La matriz de las predicciones se almacenará en la variable <em><strong>pronostico</strong>. </em>El método <em><strong>predict </strong></em>hará la tarea. Recordemos que los periodos a partir de los cuales queremos conocer la demanda se encuentran en la matriz <em><strong>z</strong></em>. Por ende, queremos predecir con base en los valores de <em>z. </em>Así:</p>
<p style="text-align: center;">pronostico = regresion_lineal.predict(z.reshape(-1,1))</p>
<p>Podríamos simplemente imprimir la variable <em><strong>pronostico</strong></em>, en cuyo caso obtendremos nuestras predicciones en forma de matriz. Sin embargo, hemos decidido utilizar un bucle que nos imprima línea por línea (útil en los casos en los cuales queramos ronostica más de un período). Veamos el resultado parcial de nuestro código:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_pronostico.png" alt="regresion_lineal_pronostico" width="622" height="383" class="aligncenter size-full wp-image-26390" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_pronostico.png 622w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_pronostico-300x185.png 300w" sizes="(max-width: 622px) 100vw, 622px" /></p>
<p>Podemos observar que la estimación de la regresión lineal del modelo que acabamos de entrenar para <em><strong>x = 7</strong></em> es <em><strong>y = 13066,66</strong></em>. Puede contrastar este resultado con el obtenido mediante hojas de cálculo: <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal/"><em><strong>regresión lineal</strong></em></a>.</p>
<h3>Evaluando la calidad de la regresión</h3>

		<div id="evaluando-la-calidad-de-la-regresion" data-title="Evaluando la calidad de la regresión" class="index-title"></div>
	
<p>Para evaluar la calidad del modelo de regresión desarrollado utilizaremos el error cuadrático medio y el coeficiente de determinación R². Ambos datos podemos obtenerlos de una manera muy sencilla mediante la librería empleada. Veamos:</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>pronostico_entrenamiento = regresion_lineal.predict(x.reshape(-1,1))
mse = mean_squared_error(y_true = y, y_pred = pronostico_entrenamiento)
rmse = np.sqrt(mse)
print('\nEvaluación de calidad de la regresión')
print('Error Cuadrático Medio (MSE) = ' + str(mse))
print('Raíz del Error Cuadrático Medio (RMSE) = ' + str(rmse))

r2 = regresion_lineal.score(x.reshape(-1,1), y)
print('Coeficiente de Determinación R2 = ' + str(r2))
</code></pre>
</div>
<p>Para tratar de simplificar lo anterior, podemos decir que en la práctica lo necesario es calcular el pronóstico para los valores en <em><strong>x </strong></em>conocidos como valores de entrada; dicho en otras palabras, el pronóstico para los valores en <em><strong>x </strong></em> utilizados para entrenar el modelo. De esa manera el error cuadrático medio (método <em><strong>mean_squared_error</strong></em>) comparará el valor de los datos en <em><strong>y </strong></em>«reales» versus los valores en <em><strong>y </strong></em>«pronosticados» (Para los <em><strong>x</strong></em> conocidos &#8211; entrenamiento -).</p>
<p>Para hallar la raíz del error cuadrático básicamente usamos la función de Python <em><strong>sqrt</strong></em> que calcula la raíz cuadrada del argumento dado.</p>
<p>Para obtener el coeficiente R² utilizaremos el método <em><strong>score</strong></em>.</p>
<p>Imprimiremos los valores y obtendremos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_evaluacion_calidad.png" alt="regresion_lineal_evaluacion_calidad" width="609" height="469" class="aligncenter size-full wp-image-26391" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_evaluacion_calidad.png 609w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_evaluacion_calidad-300x231.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<p>El coeficiente R² igual a 0,532 indica la existencia de una correlación pero nada fuerte.</p>
<h3>Graficar la línea de la tendencia del modelo</h3>

		<div id="graficar-la-linea-de-la-tendencia-del-modelo" data-title="Graficar la línea de la tendencia del modelo" class="index-title"></div>
	
<p>Vamos a graficar la línea de la tendencia, para eso necesitamos los valores de entrada para <em><strong>x</strong></em> y la demanda pronosticada (dependiente). Utilizaremos <em><strong>plot</strong></em> de manera que la gráfica resultante sea una línea y dentro de los argumentos le daremos color rojo.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>plt.plot(x,pronostico_entrenamiento,label='data', color='red')
plt.xlabel('Meses')
plt.ylabel('Demanda')
</code></pre>
</div>
<p>Además nombraremos los ejes del gráfico. Veamos:</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_grafica.png" alt="regresion_lineal_tendencia_grafica" width="610" height="499" class="aligncenter size-full wp-image-26392" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_grafica.png 610w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_grafica-300x245.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></p>
<p>Hasta aquí hemos logrado entrenar un modelo de regresión lineal; logramos obtener la predicción con base en el modelo entrenado. Logramos graficar los datos de entrada y la línea de tendencia. Del mismo modo logramos evaluar la calidad de la regresión mediante un par de indicadores.</p>
<p>Veamos ahora una pequeña variación:<em> queremos obtener predicciones para diversos periodos.</em> Lo único que necesitaremos es modificar la lista de entrada <em><strong>z</strong></em>. En esta lista contenemos los periodos que queremos pronosticar. Veamos lo que pasa cuando z = [7, 8, 9, 10].</p>
<p><img decoding="async" src="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_graficaII.png" alt="regresion_lineal_tendencia_graficaII" width="602" height="553" class="aligncenter size-full wp-image-26393" srcset="https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_graficaII.png 602w, https://ingenieriaindustrialonline.com/wp-content/uploads/2021/08/regresion_lineal_tendencia_graficaII-300x276.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></p>
<p>Aquí apreciamos la utilidad del bucle que implementamos para imprimir los pronósticos línea por línea.</p>
<hr />
<p>A continuación, dejamos a disposición el código completo del modelo de regresión:</p>
<p>rojo.</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-python" data-lang="Python"><code>import numpy as np
import matplotlib.pyplot as plt 
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score

#Inputs
x = np.array([1,2,3,4,5,6]) #periodo de entrenamiento
y = np.array([7000,  9000, 5000, 11000, 10000, 13000])
z = np.array([7, 8, 9, 10, 11, 12]) #Periodos que deseo pronosticar

plt.scatter(x,y,label='data', color='blue')
plt.title('Distribución entre meses y demanda');

regresion_lineal = linear_model.LinearRegression()
regresion_lineal.fit(x.reshape(-1,1), y) 
print('\nParámetros del modelo de regresión')
print('b (Pendiente) = ' + str(regresion_lineal.coef_) + ', a (Punto de corte) = ' + str(regresion_lineal.intercept_))

# vamos a predecir el periodo 7 (z = [7]
pronostico = regresion_lineal.predict(z.reshape(-1,1))

print('\nPronósticos')
for i in range(len(z)):
    print('Pronóstico para el periodo {0} = {1} '.format(z[i], pronostico[i]))

pronostico_entrenamiento = regresion_lineal.predict(x.reshape(-1,1))
mse = mean_squared_error(y_true = y, y_pred = pronostico_entrenamiento)
rmse = np.sqrt(mse)
print('\nEvaluación de calidad de la regresión')
print('Error Cuadrático Medio (MSE) = ' + str(mse))
print('Raíz del Error Cuadrático Medio (RMSE) = ' + str(rmse))

r2 = regresion_lineal.score(x.reshape(-1,1), y)
print('Coeficiente de Determinación R2 = ' + str(r2))

plt.plot(x,pronostico_entrenamiento,label='data', color='red')
plt.xlabel('Meses')
plt.ylabel('Demanda')
</code></pre>
</div>
<div>
<div id="cc-m-5710911713" class="j-module n j-imageSubtitle ">
<div id="cc-m-5710919613" class="j-module n j-imageSubtitle ">
<hr />
<h2>¿Cómo ejecutar el modelo?
		<div id="como-ejecutar-el-modelo" data-title="¿Cómo ejecutar el modelo?" class="index-title"></div>
	</h2>
<p><em><strong>Alternativa 1, ejecución en nuestro equipo:</strong></em></p>
<p>Lo primero que debemos considerar, en el caso de que queramos ejecutar este código en nuestro equipo, es que es preciso contar con la instalación de <em>Python</em>.</p>
<p>Ahora, lo recomendable es trabajar con algún editor de código práctico (IDE), por ejemplo: <a href="https://www.sublimetext.com/3"><strong><em>Sublime Text</em></strong></a>, o <em><strong>Spyder</strong></em> (Una herramienta más completa y por ende más robusta y pesada).</p>
<p><em><strong>Alternativa 2, ejecución en un entorno virtual (Recomendado):</strong></em></p>
<p>Podemos utilizar del mismo modo, un entorno virtual. En este caso recomendamos el uso de <em><strong>Colaboratory de Google</strong></em>, un entorno que cuenta con todas las herramientas necesarias para nuestros desarrollos. No tendremos que instalar nada en nuestro equipo, y aprovecharemos la potencia de las máquinas de Google.</p>
<p>Puedes ver y ejecutar el cuaderno de este módulo en nuestro <em>Colaboratory: <a href="https://colab.research.google.com/drive/1gH-nOk7xJT9bVjaVRl0jj73pStImGUBF?usp=sharing"><strong>Regresión lineal en Python</strong></a>.</em></p>
</div>
</div>
</div>
<p>La entrada <a href="https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/">Regresión lineal en Python</a> se publicó primero en <a href="https://ingenieriaindustrialonline.com">Ingenieria Industrial Online</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ingenieriaindustrialonline.com/pronostico-de-la-demanda/regresion-lineal-en-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
