import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import squarify # generar gráfico de grupos
from sklearn.cluster import KMeans #generar gráfico de grupos
import plotly.express as px #generar gráfico de embudo
#Lectura de data en CSV
data = pd.read_csv('/work/FDI Case Study.csv')
#Se Pivotea la Tabla
dataPivot = data.set_index('Sector').stack().reset_index()
#Cambiamos de nombre las nuevas columnas de la tabla pivoteada
dataPivot_cols=['Sector','Year','FDI Value']
dataPivot.columns=dataPivot_cols
#Creamos una nueva columna con solo el año
dataPivot['Fiscal Year'] = dataPivot['Year'].astype(str).str[0:4]
#Ordenamos las columnas
dataPivot = dataPivot[["Sector", "Fiscal Year", "FDI Value"]]
print(dataPivot)
8. ¿Cuál es la proporción de inversión entre sectores desde la perspectiva de la IED?
#Visualizamos el Tipo de Datos para proceder a interpretar los datos
dataPivot.info()
#Creamos un dataframe "Aux" a partir del "dataPivot", pues se trata la información solo para esta pregunta.
#El dataframe "Aux" recopila la sumatoria de FDI por Categoria
aux=dataPivot.groupby(['Sector']).sum().reset_index()
#Ordenamos los valores
aux = aux.sort_values(by='FDI Value', ascending=False)
#Reemplazamos nombres largos
aux.loc[aux.Sector == 'SERVICES SECTOR (Fin._Banking_Insurance_Non Fin/Business_Outsourcing_R&D_Courier_Tech. Testing and Analysis_Other)', 'Sector'] = 'SERVICES SECTOR'
aux.loc[aux.Sector == 'CONSTRUCTION DEVELOPMENT: Townships_ housing_ built-up infrastructure and construction-development projects', 'Sector'] = 'CONSTRUCTION DEVELOPMENT'
print(aux)
#Establecemos parámetros para el diagrama de árbol
plt.figure(figsize=(12,12))
#Limitamos la cantidad de Sectores a ver
sizes=aux['FDI Value'].head(99)
#Generamos el gráfico, limitando la cantidad de labels a mostrar
plt.title('Diagrama de Arbol')
squarify.plot(sizes, label=aux['Sector'][:10],alpha=0.3, pad=True, text_kwargs={'size':'9', 'color':'black',})
plt.axis('off')
plt.show()
#Desde la perspectiva de porcentajes, creamos una nueva columna temporal donde se mostrará el porcentaje de cada sector.
aux['Porcentaje']=(aux['FDI Value']-aux['FDI Value'].min())/(aux['FDI Value'].max()-aux['FDI Value'].min())
aux['Porcentaje']=aux['Porcentaje']*100
aux['Porcentaje'] = aux['Porcentaje'].astype(str).str[0:4]
aux['Porcentaje'] = aux['Porcentaje'].astype(float)
#Creamos el diagrama de embudo en base a la nueva columna
data = dict(
number=aux['Porcentaje'].head(20),
stage=aux['Sector'].head(20))
fig = px.funnel(data, x='number', y='stage')
fig.show()
#Eliminamos la columna temporal
aux = aux.drop(columns=['Porcentaje'])
9. ¿Hay grupos específicos presentes en los datos?
print(aux)
#Antes de usar el algoritmos K-Means, buscamos la cantidad de grupos idóneo en la muestra.
wcss= []
aux3 = aux.drop(columns=['Sector'])
for i in range (1,10):
kmeans = KMeans (n_clusters = i, max_iter=300)
kmeans.fit(aux3)
wcss.append(kmeans.inertia_)
plt.title('Diagrama de Codos')
plt.plot(range(1,10),wcss)
plt.show()
#Se observa que a partir del 4 grupo, el descenso disminuye, por ende, elegimos 4 como número de grupos
#Crearemos un nuevo dataframe llamado "new_aux", basado en la "aux"; la diferencia radica en que acá se añadirá una nueva columna a fin de simular un espacio
#bidimensional
new_aux=aux.assign(Val=1)
#Se crean arrays a partir las columnas del dataframe
x=new_aux['Val'].values
y=new_aux['FDI Value'].values
#Se crea un array de coordenadas
X=np.array(list(zip(x,y)))
Y=np.array(new_aux['Sector'])
#Se usa el algoritmo K-Means para encontrar los grupos
kmeans=KMeans(n_clusters=4)
kmeans=kmeans.fit(X)
labels=kmeans.predict(X)
centroids=kmeans.cluster_centers_
#Se dibujan los puntos y colerean los grupos
plt.figure(figsize=(12,12))
colors=["m.","r.","c.","y.","b."]
#Se dibujan los puntos
for i in range (len(X)):
#print("Grupo " ,labels[i], ": \t",Y[i] )
plt.plot(X[i][0],X[i][1],colors[labels[i]],markersize=10)
plt.title('Diagrama de Grupos')
plt.scatter(centroids[:,0],centroids[:,1],marker='x',s=10,linewidths=5,zorder=10)
plt.show
10. ¿Podemos pronosticar la tendencia para el año siguiente?
#Creamos un nuevo dataframe "aux2", basado en el original "dataPivot", solo que acá se agrupó por años.
aux2=dataPivot.groupby(['Fiscal Year']).sum().reset_index()
#print(aux2)
#Cambiamos el tipo de dato de la columna
aux2 = aux2.astype({"Fiscal Year": int})
#Verificamos el tipo con aux2.info()
#Definimos las variables propias para el cálculo de la regresión lineal
n=aux2['Fiscal Year'].size
x=np.array(aux2['Fiscal Year'])
y=np.array(aux2['FDI Value'])
sumx=sum(x)
sumy=sum(y)
sumxy=sum(x*y)
sumx2=sum(x*x)
sumy2=sum(y*y)
promx=sumx/n
promy=sumy/n
m = (sumx*sumy - n*sumxy)/(sumx**2 - n*sumx2)
b = promy - m*promx
#Definimos el intervalo de pronóstico
x_pred=np.array([2017,2018,2019,2020])
#Configuramos el tamaño de la tabla
fig, ax = plt.subplots(figsize=(16, 6))
#Se dibujan los datos y las líneas
plt.plot(x,y,'o',label='Datos')
plt.plot(x,m*x+b,label='Ajuste')
#Se dibuja los puntos pronosticados
plt.plot(x_pred,m*x_pred+b,'o',label='Datos Predecidos')
#Se dibuja la pendiente de pronóstico
plt.plot(x_pred,m*x_pred+b,label='Prediccion')
#Se pone valor a los puntos de predicción
for a_1,b_1 in zip(x_pred, m*x_pred+b):
plt.text(a_1,b_1, ' '+str(b_1)[:7])
#Se Customiza el grádfico
plt.xlabel('Años')
plt.ylabel('Valor del PDI')
plt.title('Predicción')
plt.grid(which='both')
plt.legend()
#Se customiza la Grid
ax.set_xlim(1999, 2022)
ax.xaxis.set_major_locator(plt.MultipleLocator(1))
#Dibujamos
plt.show()