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)
Sector Fiscal Year FDI Value
0 METALLURGICAL INDUSTRIES 2000 22.69
1 METALLURGICAL INDUSTRIES 2001 14.14
2 METALLURGICAL INDUSTRIES 2002 36.61
3 METALLURGICAL INDUSTRIES 2003 8.11
4 METALLURGICAL INDUSTRIES 2004 200.38
... ... ... ...
1066 MISCELLANEOUS INDUSTRIES 2012 229.49
1067 MISCELLANEOUS INDUSTRIES 2013 468.74
1068 MISCELLANEOUS INDUSTRIES 2014 765.88
1069 MISCELLANEOUS INDUSTRIES 2015 668.77
1070 MISCELLANEOUS INDUSTRIES 2016 296.40
[1071 rows x 3 columns]
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()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1071 entries, 0 to 1070
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Sector 1071 non-null object
1 Fiscal Year 1071 non-null object
2 FDI Value 1071 non-null float64
dtypes: float64(1), object(2)
memory usage: 25.2+ KB
#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)
Sector FDI Value
54 SERVICES SECTOR 59476.49
11 COMPUTER SOFTWARE & HARDWARE 24669.49
13 CONSTRUCTION DEVELOPMENT 24293.09
58 TELECOMMUNICATIONS 23946.01
3 AUTOMOBILE INDUSTRY 16673.92
.. ... ...
44 PHOTOGRAPHIC RAW FILM AND PAPER 67.28
8 COAL PRODUCTION 27.74
35 MATHEMATICAL SURVEYING AND DRAWING INSTRUMENTS 7.98
15 DEFENCE INDUSTRIES 5.12
9 COIR 4.06
[63 rows x 2 columns]
#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)
Sector FDI Value
54 SERVICES SECTOR 59476.49
11 COMPUTER SOFTWARE & HARDWARE 24669.49
13 CONSTRUCTION DEVELOPMENT 24293.09
58 TELECOMMUNICATIONS 23946.01
3 AUTOMOBILE INDUSTRY 16673.92
.. ... ...
44 PHOTOGRAPHIC RAW FILM AND PAPER 67.28
8 COAL PRODUCTION 27.74
35 MATHEMATICAL SURVEYING AND DRAWING INSTRUMENTS 7.98
15 DEFENCE INDUSTRIES 5.12
9 COIR 4.06
[63 rows x 2 columns]
#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()