Microproyecto 3, Inteligencia Artificial:

Análisis de Índices de Desempleo Joven y Empleo en agricultura por medio de clustering.

Integrantes del equipo:

* Alejandro Mejía

* Cristian Tamayo

* Juan G Sarrias

Nov. 2020

P1. Cargamos librerías

Las librerías necesarias serán pandas y numpy para el manejo de los datos, matplot para gráficas y sklearn para el análisis de Kmeans.

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin_min

%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['figure.figsize'] = (25, 12)
plt.style.use('ggplot')

P2. Importamos los datos.

P2.1. Primero de desempleo:

In [2]:
#Se importan datos de desempleo desde el PC a Colaboratory
from google.colab import files
import io
uploaded = files.upload()
desempleo_dataframe_leido = pd.read_csv(io.BytesIO(uploaded['unemployment.csv']), header=1)
desempleo_dataframe_leido.head()
Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.
Saving unemployment.csv to unemployment.csv
Out[2]:
HDI Rank (2018) Country 1991 Unnamed: 3 1995 Unnamed: 5 2000 Unnamed: 7 2005 Unnamed: 9 2010 Unnamed: 11 2011 Unnamed: 13 2012 Unnamed: 15 2013 Unnamed: 17 2014 Unnamed: 19 2015 Unnamed: 21 2016 Unnamed: 23 2017 Unnamed: 25 2018 Unnamed: 27
0 170 Afghanistan 4.7 NaN 5.6 NaN 5.5 NaN 4.5 NaN 3.8 NaN 3.4 NaN 2.9 NaN 3.0 NaN 3.0 NaN 2.9 NaN 2.8 NaN 2.7 NaN 2.6 a
1 69 Albania 26.4 NaN 27.5 NaN 28.5 NaN 27.5 NaN 30.9 NaN 23.2 NaN 29.0 NaN 31.3 NaN 39.2 NaN 40.1 NaN 35.4 NaN 31.6 NaN 31.0 a
2 82 Algeria 34.5 NaN 52.0 NaN 50.6 NaN 30.7 NaN 21.9 NaN 22.5 NaN 27.6 NaN 25.1 NaN 25.4 NaN 29.8 NaN 25.6 NaN 29.7 NaN 30.0 a
3 149 Angola 53.0 NaN 49.6 NaN 53.2 NaN 47.2 NaN 20.6 NaN 16.9 NaN 17.0 NaN 17.2 NaN 17.2 NaN 16.9 NaN 17.0 NaN 16.7 NaN 17.1 a
4 48 Argentina 13.9 NaN 39.2 NaN 32.4 NaN 26.3 NaN 19.5 NaN 18.8 NaN 18.4 NaN 19.7 NaN 19.2 NaN 20.5 NaN 22.0 NaN 23.2 NaN 25.2 a

P2.2. Y ahora de empleo:

In [3]:
#Se importan datos de desempleo desde el PC a Colaboratory
from google.colab import files
import io
uploaded = files.upload()
empleo_dataframe_leido = pd.read_csv(io.BytesIO(uploaded['employment.csv']), header=1)
empleo_dataframe_leido.head()
Upload widget is only available when the cell has been executed in the current browser session. Please rerun this cell to enable.
Saving employment.csv to employment.csv
Out[3]:
HDI Rank (2018) Country 1991 Unnamed: 3 1995 Unnamed: 5 2000 Unnamed: 7 2005 Unnamed: 9 2010 Unnamed: 11 2011 Unnamed: 13 2012 Unnamed: 15 2013 Unnamed: 17 2014 Unnamed: 19 2015 Unnamed: 21 2016 Unnamed: 23 2017 Unnamed: 25 2018 Unnamed: 27
0 170 Afghanistan 57.7 NaN 63.2 NaN 69.1 NaN 61.5 NaN 48.8 NaN 44.5 NaN 38.9 NaN 38.7 NaN 38.7 NaN 38.7 NaN 38.8 NaN 38.8 NaN 38.6 a
1 69 Albania 47.5 NaN 47.1 NaN 46.2 NaN 45.3 NaN 42.1 NaN 45.4 NaN 46.0 NaN 44.2 NaN 42.9 NaN 41.4 NaN 39.8 NaN 38.2 NaN 38.0 a
2 82 Algeria 23.6 NaN 22.8 NaN 22.0 NaN 18.7 NaN 11.8 NaN 10.8 NaN 10.2 NaN 9.7 NaN 9.2 NaN 8.7 NaN 8.3 NaN 9.4 NaN 9.3 a
3 149 Angola 39.8 NaN 40.2 NaN 38.7 NaN 38.4 NaN 48.7 NaN 51.2 NaN 50.9 NaN 50.3 NaN 49.8 NaN 49.4 NaN 49.4 NaN 49.3 NaN 49.1 a
4 48 Argentina 0.3 NaN 0.6 NaN 0.7 NaN 1.3 NaN 1.3 NaN 0.6 NaN 0.6 NaN 0.6 NaN 0.6 NaN 0.3 NaN 0.1 NaN 0.1 NaN 0.1 a

P3. Depuramos

P3.1. Depuramos los datos de desempleo.

-Vemos que el dataset tiene columnas vacías, por lo cual se deben borrar (las Unnamed).

-Tambien, borramos las celdas con nombres de países nulos, pues no tienen relevancia en el análisis.

In [4]:
# Borramos unnamed
for i in range(3,29,2):
  title = 'Unnamed: '+str(i)
  desempleo_dataframe_leido.drop([title],axis=1,inplace=True)
# Borramos paises nulos
desempleo_dataframe = desempleo_dataframe_leido[desempleo_dataframe_leido['Country'].isnull()==False]
desempleo_dataframe.head()
Out[4]:
HDI Rank (2018) Country 1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
0 170 Afghanistan 4.7 5.6 5.5 4.5 3.8 3.4 2.9 3.0 3.0 2.9 2.8 2.7 2.6
1 69 Albania 26.4 27.5 28.5 27.5 30.9 23.2 29.0 31.3 39.2 40.1 35.4 31.6 31.0
2 82 Algeria 34.5 52.0 50.6 30.7 21.9 22.5 27.6 25.1 25.4 29.8 25.6 29.7 30.0
3 149 Angola 53.0 49.6 53.2 47.2 20.6 16.9 17.0 17.2 17.2 16.9 17.0 16.7 17.1
4 48 Argentina 13.9 39.2 32.4 26.3 19.5 18.8 18.4 19.7 19.2 20.5 22.0 23.2 25.2

P3.2. Depuramos los datos de empleo:

-Vemos que el dataset tiene columnas vacías, por lo cual se deben borrar (las Unnamed).

-Tambien, borramos las celdas con nombres de países nulos, pues no tienen relevancia en el análisis.

In [5]:
# Borramos unnamed
for i in range(3,29,2):
  title = 'Unnamed: '+str(i)
  empleo_dataframe_leido.drop([title],axis=1,inplace=True)
# Borramos paises nulos
empleo_dataframe = empleo_dataframe_leido[empleo_dataframe_leido['Country'].isnull()==False]
empleo_dataframe.head()
Out[5]:
HDI Rank (2018) Country 1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
0 170 Afghanistan 57.7 63.2 69.1 61.5 48.8 44.5 38.9 38.7 38.7 38.7 38.8 38.8 38.6
1 69 Albania 47.5 47.1 46.2 45.3 42.1 45.4 46.0 44.2 42.9 41.4 39.8 38.2 38.0
2 82 Algeria 23.6 22.8 22.0 18.7 11.8 10.8 10.2 9.7 9.2 8.7 8.3 9.4 9.3
3 149 Angola 39.8 40.2 38.7 38.4 48.7 51.2 50.9 50.3 49.8 49.4 49.4 49.3 49.1
4 48 Argentina 0.3 0.6 0.7 1.3 1.3 0.6 0.6 0.6 0.6 0.3 0.1 0.1 0.1
In [6]:
#celda backup CORRER 1 SOLA VEZ
backupempleo=empleo_dataframe.copy()
backupdesempleo=desempleo_dataframe.copy()
In [ ]:
#celda restore CORRER CADA QUE HAYAN ERRORES POR BORRADO:
empleo_dataframe=backupempleo.copy()
desempleo_dataframe=backupdesempleo.copy()

P3.3. Eliminamos vacíos.

Vemos que hay filas vacías además de países que no tienen ni un solo dato propio, por lo que no sirven para el análisis ya que no se pueden rellenar con valores parecidos. Por este motivo, se eliminan.

In [7]:
# Celdas vacias
empleo_dataframe[empleo_dataframe['HDI Rank (2018)'].isnull()==True]
Out[7]:
HDI Rank (2018) Country 1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
191 NaN Human Development .. .. .. .. .. .. .. .. .. .. .. ..
197 NaN Regions .. .. .. .. .. .. .. .. .. .. .. ..
In [8]:
# Paises sin datos de empleo
empleo_dataframe[(empleo_dataframe['1991']=='..') & (empleo_dataframe['2000']=='..') & (empleo_dataframe['2018']=='..')]
Out[8]:
HDI Rank (2018) Country 1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
180 36 Andorra .. .. .. .. .. .. .. .. .. .. .. .. ..
181 74 Antigua and Barbuda .. .. .. .. .. .. .. .. .. .. .. .. ..
182 98 Dominica .. .. .. .. .. .. .. .. .. .. .. .. ..
183 135 Micronesia (Federated States of) .. .. .. .. .. .. .. .. .. .. .. .. ..
184 78 Grenada .. .. .. .. .. .. .. .. .. .. .. .. ..
185 132 Kiribati .. .. .. .. .. .. .. .. .. .. .. .. ..
186 73 Saint Kitts and Nevis .. .. .. .. .. .. .. .. .. .. .. .. ..
187 18 Liechtenstein .. .. .. .. .. .. .. .. .. .. .. .. ..
188 117 Marshall Islands .. .. .. .. .. .. .. .. .. .. .. .. ..
189 55 Palau .. .. .. .. .. .. .. .. .. .. .. .. ..
190 62 Seychelles .. .. .. .. .. .. .. .. .. .. .. .. ..
In [9]:
# Se borran vacios 
empleo_dataframe = empleo_dataframe[empleo_dataframe['HDI Rank (2018)'].isnull()==False]
# Se borran paises sin datos
empleo_dataframe = empleo_dataframe[(empleo_dataframe['1991']!='..') & (empleo_dataframe['2000']!='..') & (empleo_dataframe['2018']!='..')]

P3.4. Convertimos a tipo numérico.

Los valores fueron leídos en formato string, serán convertidos a float para el análisis.

In [10]:
# Decada 2000 empleo a numerico
empleo_dataframe["1991"] = pd.to_numeric(empleo_dataframe["1991"], downcast="float")
empleo_dataframe["1995"] = pd.to_numeric(empleo_dataframe["1995"], downcast="float")
empleo_dataframe["2000"] = pd.to_numeric(empleo_dataframe["2000"], downcast="float")
empleo_dataframe["2005"] = pd.to_numeric(empleo_dataframe["2005"], downcast="float")
# Decada 2010 empleo a numerico
empleo_dataframe["2010"] = pd.to_numeric(empleo_dataframe["2010"], downcast="float")
empleo_dataframe["2011"] = pd.to_numeric(empleo_dataframe["2011"], downcast="float")
empleo_dataframe["2012"] = pd.to_numeric(empleo_dataframe["2012"], downcast="float")
empleo_dataframe["2013"] = pd.to_numeric(empleo_dataframe["2013"], downcast="float")
# Decada 2018 empleo a numerico
empleo_dataframe["2014"] = pd.to_numeric(empleo_dataframe["2014"], downcast="float")
empleo_dataframe["2015"] = pd.to_numeric(empleo_dataframe["2015"], downcast="float")
empleo_dataframe["2016"] = pd.to_numeric(empleo_dataframe["2016"], downcast="float")
empleo_dataframe["2017"] = pd.to_numeric(empleo_dataframe["2017"], downcast="float")
empleo_dataframe["2018"] = pd.to_numeric(empleo_dataframe["2018"], downcast="float")
In [11]:
empleo_dataframe.describe()
Out[11]:
1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
count 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000 195.000000
mean 35.516399 34.863586 33.665634 31.695887 29.426167 29.048716 28.582567 28.219484 27.779480 27.385126 27.154875 26.933336 26.785131
std 24.787752 24.895895 24.971039 24.444195 23.710814 23.552116 23.358904 23.249109 23.072731 22.961369 23.028055 22.942501 22.862396
min 0.300000 0.200000 0.300000 0.300000 0.200000 0.200000 0.200000 0.200000 0.200000 0.200000 0.100000 0.100000 0.100000
25% 12.500000 11.650000 10.250000 9.000000 7.800000 7.700000 7.050000 6.850000 6.850000 7.000000 6.750000 6.300000 6.250000
50% 31.700001 31.400000 30.299999 28.400000 25.600000 25.500000 25.400000 24.000000 23.500000 23.299999 21.299999 21.200001 21.100000
75% 54.750000 52.500000 51.550001 51.000000 47.650000 46.650000 45.900000 45.250000 44.549999 43.850000 43.050001 42.549999 42.200001
max 91.300003 92.000000 92.099998 92.099998 91.699997 91.599998 91.599998 91.599998 91.400002 91.699997 91.800003 91.900002 92.000000

P3.5. Se agrupa por décadas .

Los datos que se tienen de porcentajes por año fueron agrupados según su promedio de la siguiente forma:

* Los países entre 1991 y 2000 fueron agrupados en la década del 2000 (d2000).

* Los países entre 2005 y 2010 fueron agrupados en la década del 2010 (d2010).

* Los países entre 2011 y 2018 fueron agrupados en la década del 2018 (d2018).

Luego de agrupar, se ignoran los años individuales.

In [12]:
# Se agrupan por promedio
empleo_dataframe['d2000-empleo'] = empleo_dataframe.iloc[:, 2:5].mean(axis=1) 
empleo_dataframe['d2010-empleo'] = empleo_dataframe.iloc[:, 5:7].mean(axis=1) 
empleo_dataframe['d2018-empleo'] = empleo_dataframe.iloc[:, 7:15].mean(axis=1) 
# Se seleccionan las agrupadas
empleo_final = empleo_dataframe.loc[:,['Country','HDI Rank (2018)','d2000-empleo','d2010-empleo','d2018-empleo']]
empleo_final.head()
Out[12]:
Country HDI Rank (2018) d2000-empleo d2010-empleo d2018-empleo
0 Afghanistan 170 63.333332 55.150002 39.462502
1 Albania 69 46.933334 43.699997 41.987499
2 Algeria 82 22.800001 15.250000 9.450001
3 Angola 149 39.566666 43.550003 49.924999
4 Argentina 48 0.533333 1.300000 0.375000

P3.6. Se repiten los pasos anteriores para desempleo:

Los pasos del 3.3 al 3.5 se aplican en el dataframe de desempleo en jóvenes.

In [13]:
# Se borran los paises con ranks nulos
desempleo_dataframe = desempleo_dataframe[desempleo_dataframe['HDI Rank (2018)'].isnull()==False]

# Se borran los paises sin ningun dato
desempleo_dataframe = desempleo_dataframe[(desempleo_dataframe['1991']!='..') & (desempleo_dataframe['2000']!='..') & (desempleo_dataframe['2018']!='..')]

# Decada 2000 empleo a numerico
desempleo_dataframe["1991"] = pd.to_numeric(desempleo_dataframe["1991"], downcast="float")
desempleo_dataframe["1995"] = pd.to_numeric(desempleo_dataframe["1995"], downcast="float")
desempleo_dataframe["2000"] = pd.to_numeric(desempleo_dataframe["2000"], downcast="float")
desempleo_dataframe["2005"] = pd.to_numeric(desempleo_dataframe["2005"], downcast="float")

# Decada 2010 empleo a numerico
desempleo_dataframe["2010"] = pd.to_numeric(desempleo_dataframe["2010"], downcast="float")
desempleo_dataframe["2011"] = pd.to_numeric(desempleo_dataframe["2011"], downcast="float")
desempleo_dataframe["2012"] = pd.to_numeric(desempleo_dataframe["2012"], downcast="float")
desempleo_dataframe["2013"] = pd.to_numeric(desempleo_dataframe["2013"], downcast="float")

# Decada 2018 empleo a numerico
desempleo_dataframe["2014"] = pd.to_numeric(desempleo_dataframe["2014"], downcast="float")
desempleo_dataframe["2015"] = pd.to_numeric(desempleo_dataframe["2015"], downcast="float")
desempleo_dataframe["2016"] = pd.to_numeric(desempleo_dataframe["2016"], downcast="float")
desempleo_dataframe["2017"] = pd.to_numeric(desempleo_dataframe["2017"], downcast="float")
desempleo_dataframe["2018"] = pd.to_numeric(desempleo_dataframe["2018"], downcast="float")

# Se agrupan por promedio
desempleo_dataframe['d2000-desempleo'] = desempleo_dataframe.iloc[:, 2:5].mean(axis=1) 
desempleo_dataframe['d2010-desempleo'] = desempleo_dataframe.iloc[:, 5:7].mean(axis=1) 
desempleo_dataframe['d2018-desempleo'] = desempleo_dataframe.iloc[:, 7:15].mean(axis=1) 

# Se seleccionan las agrupadas
desempleo_final = desempleo_dataframe.loc[:,['Country','HDI Rank (2018)','d2000-desempleo','d2010-desempleo','d2018-desempleo']]
desempleo_final.head()
Out[13]:
Country HDI Rank (2018) d2000-desempleo d2010-desempleo d2018-desempleo
0 Afghanistan 170 5.266666 4.150000 2.912500
1 Albania 69 27.466667 29.200001 32.599998
2 Algeria 82 45.700001 26.299999 26.962500
3 Angola 149 51.933334 33.900002 17.000002
4 Argentina 48 28.500000 22.900000 20.875000

P3.7. Se juntan los dataset de empleo y desempleo.

Por países, se juntan los datos de empleo en agricultura y desempleo joven.

In [14]:
prototipo = pd.merge(empleo_final, desempleo_final, on=['Country','HDI Rank (2018)'])
prototipo
Out[14]:
Country HDI Rank (2018) d2000-empleo d2010-empleo d2018-empleo d2000-desempleo d2010-desempleo d2018-desempleo
0 Afghanistan 170 63.333332 55.150002 39.462502 5.266666 4.150000 2.912500
1 Albania 69 46.933334 43.699997 41.987499 27.466667 29.200001 32.599998
2 Algeria 82 22.800001 15.250000 9.450001 45.700001 26.299999 26.962500
3 Angola 149 39.566666 43.550003 49.924999 51.933334 33.900002 17.000002
4 Argentina 48 0.533333 1.300000 0.375000 28.500000 22.900000 20.875000
... ... ... ... ... ... ... ... ...
175 Venezuela (Bolivarian Republic of) 96 12.233334 9.250000 7.462500 18.766668 17.750000 15.250001
176 Viet Nam 118 66.633339 51.800003 44.337502 4.133333 4.250000 5.325000
177 Yemen 177 49.633331 29.850000 31.787500 17.466667 20.799999 24.137499
178 Zambia 143 71.266670 68.250000 55.612499 26.233332 27.549999 17.200001
179 Zimbabwe 150 59.933334 67.250000 66.674995 10.900001 7.700000 8.637500

180 rows × 8 columns

P4. Analisis de los datos:

P4.1. Graficamos las variables

Observamos la gráfica de los datos mediante histogramas para visualizar la distribución de estos y así poder elegir nuestras variables para la construcción de los clústeres

In [15]:
plt.rcParams['figure.figsize'] = (25, 12)

prototipo.hist()
plt.show()

P4.2. Elegimos 3 variables y visualizamos que no haya correlación

Definimos la entrada con las variables d2000-empleo, d2000-desempleo y d2018-desempleo, y observamos si hay o no una correlación entre estas.

In [16]:
sb.pairplot(prototipo.dropna(), size=4,vars=["d2000-empleo", "d2000-desempleo", "d2018-desempleo"],kind='scatter')
/usr/local/lib/python3.6/dist-packages/seaborn/axisgrid.py:1912: UserWarning: The `size` parameter has been renamed to `height`; please update your code.
  warnings.warn(msg, UserWarning)
Out[16]:
<seaborn.axisgrid.PairGrid at 0x7f79f7a0f320>

P4.3. Definimos la entrada con las tres variables elegidas y graficamos en 3D para visualizar mejor el comportamiento.

In [17]:
X = prototipo
In [18]:
X_arr = np.array(prototipo[["d2000-empleo", "d2000-desempleo", "d2018-desempleo"]])
X_arr.shape
Out[18]:
(180, 3)
In [19]:
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(X_arr[:, 0], X_arr[:, 1], X_arr[:, 2],s=60)
Out[19]:
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7f79edc31c88>

P4.4. Graficamos el codo (elbow) para de forma visual intentar obtener un número óptimo de clusters.

Para nuestros datos fue de cuatro, ya que visualmente es más fácil de identificar el cambio en la pendiente en este punto.

In [20]:
Nc = range(1, 40)
kmeans = [KMeans(n_clusters=i) for i in Nc]
kmeans
score = [kmeans[i].fit(X_arr).score(X_arr) for i in range(len(kmeans))]
score
plt.plot(Nc,score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()

P4.5. Usamos el estadístico de GAP para obtener un número de clusters calculado analíticamente y que respalde el número que elegimos mediante elbow.

In [21]:
data = X_arr
nrefs = 1
maxClusters = 10

gaps = np.zeros((len(range(1, maxClusters)),))
resultsdf = pd.DataFrame({'clusterCount': [], 'gap': []})
for gap_index, k in enumerate(range(1, maxClusters)):
    refDisps = np.zeros(nrefs) # Holder for reference dispersion results
    # For n references, generate random sample and perform kmeans getting resulting dispersion of each loop
    for i in range(nrefs):
        np.random.seed(0)
        randomReference = np.random.random_sample(size=data.shape) # Create new random reference set
        km = KMeans(k) # Fit to it
        km.fit(randomReference)

        refDisp = km.inertia_
        refDisps[i] = refDisp
        
    km = KMeans(k) # Fit cluster to original data and create dispersion
    km.fit(data)

    origDisp = km.inertia_

    gap = np.log(np.mean(refDisps)) - np.log(origDisp) # Calculate gap statistic
    gaps[gap_index] = gap # Assign this loop's gap statistic to gaps

    resultsdf = resultsdf.append({'clusterCount': k, 'gap': gap}, ignore_index=True)
# Plus 1 because index of 0 means 1 cluster is optimal, index 2 = 3 clusters are optimal
k,resultsdf = (gaps.argmax() + 1, resultsdf)

n_clusters = k
print(k)
4

P5. Creación y análisis del cluster

P5.1. Utilizamos KMeans para crear los cuatro clusters que elegimos anteriormente basados en elbow.

Adicionalmente mostramos los centroides de cada uno de los clusters.

In [61]:
kmeans = KMeans(n_clusters=5).fit(X_arr)
centroids = kmeans.cluster_centers_
print(centroids)
[[72.441666  7.499999  7.289583]
 [10.555384 14.397949 15.633461]
 [15.975758 36.628784 39.210228]
 [44.543938 26.304546 26.10909 ]
 [42.53238   9.198095  9.709285]]

P5.2. Graficamos los clusters

Mostramos por colores los clusters y agregamos una estrella en el centroide de estos.

In [63]:
# Predicting the clusters
labels = kmeans.predict(X_arr)
# Getting the cluster centers
C = kmeans.cluster_centers_
colores=['red','green','blue','cyan','yellow']
asignar=[]
for row in labels:
    asignar.append(colores[row])
 
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(X_arr[:, 0], X_arr[:, 1], X_arr[:, 2], c=asignar,s=60)
ax.scatter(C[:, 0], C[:, 1], C[:, 2], marker='*', c=colores, s=1000)
Out[63]:
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7f79e405e898>

P5.3. Se grafican las proyecciones para observar de mejor manera los cluster segun 2 de las 3 variables.

In [64]:
f1 = X["d2000-empleo"].values
f2 = X["d2000-desempleo"].values
 
plt.scatter(f1, f2, c=asignar, s=70)
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
In [65]:
f1 = X["d2000-empleo"].values
f2 = X["d2018-desempleo"].values
 
plt.scatter(f1, f2, c=asignar, s=70)
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()
In [66]:
f1 = X["d2000-desempleo"].values
f2 = X["d2018-desempleo"].values
 
plt.scatter(f1, f2, c=asignar, s=70)
plt.scatter(C[:, 0], C[:, 1], marker='*', c=colores, s=1000)
plt.show()

P5.4. índices mas representativos de cada cluster

Se muestran los índices de los más cercanos a cada centroide.

In [67]:
closest, _ = pairwise_distances_argmin_min(kmeans.cluster_centers_, X_arr)
closest
Out[67]:
array([ 66, 115,  39,   1, 128])
In [68]:
n = 1
for row in closest:
  print("\nUsuario mas representativo de cluster: "+str(n)+"\n")
  print(prototipo.iloc[row])
  n = n+1
Usuario mas representativo de cluster: 1

Country            Guinea-Bissau
HDI Rank (2018)              178
d2000-empleo                69.1
d2010-empleo                69.7
d2018-empleo             68.7875
d2000-desempleo              7.7
d2010-desempleo             7.75
d2018-desempleo           7.6625
Name: 66, dtype: object

Usuario mas representativo de cluster: 2

Country            New Zealand
HDI Rank (2018)             14
d2000-empleo           9.73333
d2010-empleo              7.05
d2018-empleo            6.4125
d2000-desempleo        15.0333
d2010-desempleo          13.55
d2018-desempleo         14.825
Name: 115, dtype: object

Usuario mas representativo de cluster: 3

Country            Croatia
HDI Rank (2018)         46
d2000-empleo       19.0333
d2010-empleo          15.8
d2018-empleo        9.7375
d2000-desempleo       38.2
d2010-desempleo      32.25
d2018-desempleo    37.6125
Name: 39, dtype: object

Usuario mas representativo de cluster: 4

Country            Albania
HDI Rank (2018)         69
d2000-empleo       46.9333
d2010-empleo          43.7
d2018-empleo       41.9875
d2000-desempleo    27.4667
d2010-desempleo       29.2
d2018-desempleo       32.6
Name: 1, dtype: object

Usuario mas representativo de cluster: 5

Country            Philippines
HDI Rank (2018)            106
d2000-empleo           42.1667
d2010-empleo              34.4
d2018-empleo              29.1
d2000-desempleo        8.96667
d2010-desempleo            9.6
d2018-desempleo          8.575
Name: 128, dtype: object

P5.5. Se clasifica latinoamérica en los clústers según los datos del dataset para luego concluir.

In [134]:
# Obtenemos el empleo en latinoamerica por decadas del dataset de empleo
empleo_final[empleo_final['Country']=='Latin America and the Caribbean']
Out[134]:
Country HDI Rank (2018) d2000-empleo d2010-empleo d2018-empleo
201 Latin America and the Caribbean 22.0 18.15 14.662499
In [135]:
# Obtenemos el desempleo en latinoamerica del dataset backup, ya que el original fue modificado.
A = backupdesempleo[backupdesempleo['Country']=="Latin America and the Caribbean"].copy()
A
Out[135]:
HDI Rank (2018) Country 1991 1995 2000 2005 2010 2011 2012 2013 2014 2015 2016 2017 2018
201 Latin America and the Caribbean .. 14.0 16.7 15.9 14.5 13.9 13.7 13.8 13.6 14.7 17.2 17.6 17.6
In [136]:
# Se aplican las correcciones al dato de latinoamerica para obtener el desempleo por decadas
# Decada 2000 empleo a numerico
A["1995"] = pd.to_numeric(A["1995"], downcast="float")
A["2000"] = pd.to_numeric(A["2000"], downcast="float")
A["2005"] = pd.to_numeric(A["2005"], downcast="float")

# Decada 2010 empleo a numerico
A["2010"] = pd.to_numeric(A["2010"], downcast="float")
A["2011"] = pd.to_numeric(A["2011"], downcast="float")
A["2012"] = pd.to_numeric(A["2012"], downcast="float")
A["2013"] = pd.to_numeric(A["2013"], downcast="float")

# Decada 2018 empleo a numerico
A["2014"] = pd.to_numeric(A["2014"], downcast="float")
A["2015"] = pd.to_numeric(A["2015"], downcast="float")
A["2016"] = pd.to_numeric(A["2016"], downcast="float")
A["2017"] = pd.to_numeric(A["2017"], downcast="float")
A["2018"] = pd.to_numeric(A["2018"], downcast="float")

# Se agrupan por promedio
A['d2000-desempleo'] = A.iloc[:, 3:5].mean(axis=1) 
A['d2010-desempleo'] = A.iloc[:, 5:7].mean(axis=1) 
A['d2018-desempleo'] = A.iloc[:, 7:15].mean(axis=1) 

# Se seleccionan las agrupadas
desempleo_final = A.loc[:,['Country','HDI Rank (2018)','d2000-desempleo','d2010-desempleo','d2018-desempleo']]
desempleo_final.head()
Out[136]:
Country HDI Rank (2018) d2000-desempleo d2010-desempleo d2018-desempleo
201 Latin America and the Caribbean 15.35 15.2 15.262499

P5.5.1. Obtenemos el resultado luego de clasificar Latinoamérica:

In [138]:
#Colocamos los valores de d2000-empleo,d2000-desempleo y d2018-desempleo de latinoamerica para clasificarlos.
X_new = np.array([[22.0,15.35,15.262499]]) 

new_labels = kmeans.predict(X_new)
print("Latinoamerica fue clasificado en el cluster: "+str(new_labels[0]+1))
Latinoamerica fue clasificado en el cluster: 2

P5.6. Se clasifican países de cada continente.

In [140]:
lista = []
paises = ['Colombia', 'France', 'Nigeria', 'Japan', 'New Zealand']
for pais in paises:
  a = prototipo[prototipo['Country']==pais].iloc[0]
  empleo2000pais=a[2]
  desempleo2000pais=a[5]
  desempleo2018pais=a[7]
  lista.append([empleo2000pais,desempleo2000pais,desempleo2018pais])
Xnew = np.array(lista)
new_labels = kmeans.predict(Xnew)
for i in range(0, len(new_labels)):
  print("El pais "+str(paises[i])+" pertenece al cluster "+str((new_labels[i]+1)))
  print(prototipo[prototipo['Country']==paises[i]].iloc[0])
  print("\n")
El pais Colombia pertenece al cluster 2
Country            Colombia
HDI Rank (2018)          79
d2000-empleo           23.3
d2010-empleo          19.55
d2018-empleo        16.6125
d2000-desempleo     24.0667
d2010-desempleo       22.85
d2018-desempleo     18.5375
Name: 34, dtype: object


El pais France pertenece al cluster 2
Country             France
HDI Rank (2018)         26
d2000-empleo       4.76667
d2010-empleo          3.25
d2018-empleo        2.8375
d2000-desempleo    22.2667
d2010-desempleo       21.3
d2018-desempleo       23.2
Name: 57, dtype: object


El pais Nigeria pertenece al cluster 5
Country            Nigeria
HDI Rank (2018)        158
d2000-empleo       49.3333
d2010-empleo         42.85
d2018-empleo       37.8625
d2000-desempleo        8.8
d2010-desempleo       9.35
d2018-desempleo     14.825
Name: 118, dtype: object


El pais Japan pertenece al cluster 2
Country              Japan
HDI Rank (2018)         19
d2000-empleo       5.83333
d2010-empleo           4.3
d2018-empleo          3.65
d2000-desempleo        6.6
d2010-desempleo        9.1
d2018-desempleo          6
Name: 81, dtype: object


El pais New Zealand pertenece al cluster 2
Country            New Zealand
HDI Rank (2018)             14
d2000-empleo           9.73333
d2010-empleo              7.05
d2018-empleo            6.4125
d2000-desempleo        15.0333
d2010-desempleo          13.55
d2018-desempleo         14.825
Name: 115, dtype: object


P6. Soluciones enunciado del Microproyecto.

1. El preprocesamiento realizado a los datos, se hizo en el numeral P3. del índice.

2. La técnica utilizada fue la gráfica de Elbow respaldada con el estadístico de GAP, como se ve en los numerales P4.4 y P4.5.

3. Las características más representativas de cada uno de los 4 grupos, basados principalmente en los centroides (índice P5.4.) fueron:

* Países del Cluster 1:

Los países del Cluster 1, son aquellos con un empleo muy alto en agricultura y desempleo bajo en la población joven, como vemos en Guinea-Bissau, el más representativo.

* Países del Cluster 2:

Respecto al Cluster 2, vemos que sus países tienen un empleo en agricultura bajo y desempleo bajo en la población juvenil. Su país más representativo es Nueva Zelanda (curiosamente Colombia está en este cluster).

* Países del Cluster 3:

La característica más representativa de los países en el cluster 3 es el desempleo juvenil, con un valor elevado como se ve en su país más representativo: Croacia.

* Países del Cluster 4:

En el cluster 4, los países poseen un porcentaje de empleo en agricultura medio y un desempleo en la población joven medio también, a este cluster lo representa mayormente: Albania.

* Países del Cluster 5:

Por último, los países del cluster 5 son aquellos con un porcentaje de empleo en agricultura medio y un desempleo juvenil muy bajo, representado en: Filipinas.

4. Tendencias encontradas en el análisis de los datos:

* Analizando los países del cluster 3 y 1, vemos que con el paso de las decadas ha disminuido el empleo en la agricultura.

* Observando los países del cluster 1, notamos que la mayoría de países del continente africano pertenecen a este cluster, indicando que son países dedicados mayormente a la agricultura a pesar del paso de las décadas.

* Los clusters 1 y 5 son de los países con mayor porcentaje de empleo en la agricultura. Se observa respecto a estos cluster que los países que tienen mucho empleo en la agricultura, generalmente tienen poco desempleo juvenil.

* Los países del cluster 4 fueron los que tuvieron porcentajes de desempleo más estables a través de las décadas.

* Contrario a lo que se puede considerar comunmente, un indice alto de empleos no indica un indice bajo de desempleos, ni viceversa. Esto lo podemos observar en el cluster 2 de paises, en el que hay bajo empleo y bajo desempleo; igualmente el cluster 4 tiene un indice relativamente alto de empleo pero igualmente un indice alto de desempleo.

5. Vemos en P5.5.1 del índice, que Latinoamérica con un desempleo juvenil de 15% aproximadamente y un empleo en agricultura de 22%, fue clasificado en el cluster 2, el cual nos indica que posee un valor de desempleo bajo y un valor de empleo en agricultura igualmente bajo. De hecho vemos que Colombia en P5.6 del índice fue clasificado en ese cluster.

Se citó un país aleatorio de cada continente (índice P5.6) y se notó que 4 de los elegidos fueron clasificados en el cluster 2.