#1 Las correlaciones que se obtienen usando el m ́etodo corr son m ́as exactas que las obtenidas en el circulo de correlacion. Indique si lo descrito anteriormente es verdadero o falso, debe brindar una explicaci ́on a su respuesta


##Es falso. El método corr calcula el coeficiente de correlación de Pearson, que mide la relación lineal entre dos variables continuas. El resultado de corr es una medida numérica de la fuerza y dirección de la correlación, que varía entre -1 y 1. Por otro lado, el círculo de correlación es una herramienta gráfica que se utiliza para visualizar la correlación entre dos variables categóricas. En lugar de medir la correlación numéricamente, el círculo de correlación muestra la distribución de las categorías en una gráfica circular.
import os
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from prince import PCA as PCA_Prince
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
class ACP:
    def __init__(self, datos, n_componentes = 5): 
        self.__datos = datos
        self.__modelo = PCA_Prince(n_components = n_componentes).fit(self.__datos)
        self.__correlacion_var = self.__modelo.column_correlations(self.__datos)
        self.__coordenadas_ind = self.__modelo.row_coordinates(self.__datos)
        self.__contribucion_ind = self.__modelo.row_contributions(self.__datos)
        self.__cos2_ind = self.__modelo.row_cosine_similarities(self.__datos)
        self.__var_explicada = [x * 100 for x in self.__modelo.explained_inertia_]
    @property
    def datos(self):
        return self.__datos
    @datos.setter
    def datos(self, datos):
        self.__datos = datos
    @property
    def modelo(self):
        return self.__modelo
    @property
    def correlacion_var(self):
        return self.__correlacion_var
    @property
    def coordenadas_ind(self):
        return self.__coordenadas_ind
    @property
    def contribucion_ind(self):
        return self.__contribucion_ind
    @property
    def cos2_ind(self):
        return self.__cos2_ind
    @property
    def var_explicada(self):
        return self.__var_explicada
    @var_explicada.setter
    def var_explicada(self, var_explicada):
        self.__var_explicada = var_explicada
    @modelo.setter
    def modelo(self, modelo):
        self.__modelo = modelo
    @correlacion_var.setter
    def correlacion_var(self, correlacion_var):
        self.__correlacion_var = correlacion_var
    @coordenadas_ind.setter
    def coordenadas_ind(self, coordenadas_ind):
        self.__coordenadas_ind = coordenadas_ind
    @contribucion_ind.setter
    def contribucion_ind(self, contribucion_ind):
        self.__contribucion_ind = contribucion_ind
    @cos2_ind.setter
    def cos2_ind(self, cos2_ind):
        self.__cos2_ind = cos2_ind
    def plot_plano_principal(self, ejes = [0, 1], ind_labels = True, titulo = 'Plano Principal'):
        x = self.coordenadas_ind[ejes[0]].values
        y = self.coordenadas_ind[ejes[1]].values
        plt.style.use('seaborn-whitegrid')
        plt.scatter(x, y, color = 'gray')
        plt.title(titulo)
        plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
        plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
        inercia_x = round(self.var_explicada[ejes[0]], 2)
        inercia_y = round(self.var_explicada[ejes[1]], 2)
        plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
        plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
        if ind_labels:
            for i, txt in enumerate(self.coordenadas_ind.index):
                plt.annotate(txt, (x[i], y[i]))
    def plot_circulo(self, ejes = [0, 1], var_labels = True, titulo = 'Círculo de Correlación'):
        cor = self.correlacion_var.iloc[:, ejes].values
        plt.style.use('seaborn-whitegrid')
        c = plt.Circle((0, 0), radius = 1, color = 'steelblue', fill = False)
        plt.gca().add_patch(c)
        plt.axis('scaled')
        plt.title(titulo)
        plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
        plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
        inercia_x = round(self.var_explicada[ejes[0]], 2)
        inercia_y = round(self.var_explicada[ejes[1]], 2)
        plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
        plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
        for i in range(cor.shape[0]):
            plt.arrow(0, 0, cor[i, 0] * 0.95, cor[i, 1] * 0.95, color = 'steelblue', 
                      alpha = 0.5, head_width = 0.05, head_length = 0.05)
            if var_labels:
                plt.text(cor[i, 0] * 1.05, cor[i, 1] * 1.05, self.correlacion_var.index[i], 
                         color = 'steelblue', ha = 'center', va = 'center')
    def plot_sobreposicion(self, ejes = [0, 1], ind_labels = True, 
                      var_labels = True, titulo = 'Sobreposición Plano-Círculo'):
        x = self.coordenadas_ind[ejes[0]].values
        y = self.coordenadas_ind[ejes[1]].values
        cor = self.correlacion_var.iloc[:, ejes]
        scale = min((max(x) - min(x)/(max(cor[ejes[0]]) - min(cor[ejes[0]]))), 
                    (max(y) - min(y)/(max(cor[ejes[1]]) - min(cor[ejes[1]])))) * 0.7
        cor = self.correlacion_var.iloc[:, ejes].values
        plt.style.use('seaborn-whitegrid')
        plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
        plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
        inercia_x = round(self.var_explicada[ejes[0]], 2)
        inercia_y = round(self.var_explicada[ejes[1]], 2)
        plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
        plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
        plt.scatter(x, y, color = 'gray')
        if ind_labels:
            for i, txt in enumerate(self.coordenadas_ind.index):
                plt.annotate(txt, (x[i], y[i]))
        for i in range(cor.shape[0]):
            plt.arrow(0, 0, cor[i, 0] * scale, cor[i, 1] * scale, color = 'steelblue', 
                      alpha = 0.5, head_width = 0.05, head_length = 0.05)
            if var_labels:
                plt.text(cor[i, 0] * scale * 1.15, cor[i, 1] * scale * 1.15, 
                         self.correlacion_var.index[i], 
                         color = 'steelblue', ha = 'center', va = 'center')
#2

datos = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/country_indicators.csv")
print(datos)


##a
##                  country  child_mort  exports  ...  life_expec  total_fer   gdpp
## 0            Afghanistan        90.2     10.0  ...        56.2       5.82    553
## 1                Albania        16.6     28.0  ...        76.3       1.65   4090
## 2                Algeria        27.3     38.4  ...        76.5       2.89   4460
## 3                 Angola       119.0     62.3  ...        60.1       6.16   3530
## 4    Antigua and Barbuda        10.3     45.5  ...        76.8       2.13  12200
## ..                   ...         ...      ...  ...         ...        ...    ...
## 162              Vanuatu        29.2     46.6  ...        63.0       3.50   2970
## 163            Venezuela        17.1     28.5  ...        75.4       2.47  13500
## 164              Vietnam        23.3     72.0  ...        73.1       1.95   1310
## 165                Yemen        56.3     30.0  ...        67.5       4.67   1310
## 166               Zambia        83.1     37.0  ...        52.0       5.40   1460
## 
## [167 rows x 10 columns]
Resnum = datos.dropna().describe()
### Para la variable Exports se ve que fueron un total de 167 registos, con una media de 41 exportaciones al rededor del mundo. La desviacion estandar fue de 27.4, un minimo de 0.1 exportaciones, que quiere decir que se redonde a cero y que no hubo exportaciones. En cuanto a los percentiles, el 25% de los datos se ene=centran alrededor de 23 exportaciones, la mitad de los datos en 35 exportaciones, el 75% en 51 exportaciones y el maximo en 200, como estan dicididos los datos podemos observar que hay algunos outliers, que pueden causar unas malas interpretaciones de los datos.

### para la variable PDP, o PIB en español. Vemos que de igual manera hay 167 registros con una media de 12,964.15, la desviacion estandar es de 18,328.70. En cuanto al minimo es de 231, el 25% de los datos se encuentran en 1330, la mitad de los datos en 4660. el 75% de los datos en 14,050 y el máximo en 105,000. lo que podemos decir que puede haber out liers, sin embargo, hay una expotencializacion en los datos muy fuerte mientras se van acercando al tope.


##b

corr = datos.corr()
## <string>:1: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.
print(corr)
##             child_mort   exports    health  ...  life_expec  total_fer      gdpp
## child_mort    1.000000 -0.318093 -0.200402  ...   -0.886676   0.848478 -0.483032
## exports      -0.318093  1.000000 -0.114408  ...    0.316313  -0.320011  0.418725
## health       -0.200402 -0.114408  1.000000  ...    0.210692  -0.196674  0.345966
## imports      -0.127211  0.737381  0.095717  ...    0.054391  -0.159048  0.115498
## income       -0.524315  0.516784  0.129579  ...    0.611962  -0.501840  0.895571
## inflation     0.288276 -0.107294 -0.255376  ...   -0.239705   0.316921 -0.221631
## life_expec   -0.886676  0.316313  0.210692  ...    1.000000  -0.760875  0.600089
## total_fer     0.848478 -0.320011 -0.196674  ...   -0.760875   1.000000 -0.454910
## gdpp         -0.483032  0.418725  0.345966  ...    0.600089  -0.454910  1.000000
## 
## [9 rows x 9 columns]
sns.scatterplot(x='exports', y='imports', data=datos)
plt.show()

### Se puede ver las correlacionciones se puede ver que unas de las más fuertes y que esta positivamente es las de las importaciones con las exportaciones, lo que quiere decir que si un pais exporta, es muy probable que tambien importe o a la inversa también.

##c

dataacp = datos.select_dtypes(include=['float64', 'int64'])
print(dataacp.dtypes)

#plano principal
## child_mort    float64
## exports       float64
## health        float64
## imports       float64
## income          int64
## inflation     float64
## life_expec    float64
## total_fer     float64
## gdpp            int64
## dtype: object
acp = ACP(dataacp, n_componentes=9)
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,6), dpi=200)
acp.plot_plano_principal(ind_labels=False)
## <string>:55: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

# Circulo

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,6), dpi=200)
acp.plot_circulo()
## <string>:69: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

# sobre-posición

fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,6), dpi=200)
acp.plot_sobreposicion(ind_labels=False)
## <string>:94: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

### En la formacion de clusters, podemos ver en la última gráfica que se forman 3 muy claros. En uno estan "imports" y "exports", sus características principales son las relacionenes entre las llegadas de bienes a los paises.En otra esta "child_mort", "total_fer" e "inflacion", sus características es que velan por el desarrollo social de los paises. Y en el ultimo "income","gdpp","life_exp" y health, que tienen relacion a la economia, salarios y finaciacion de los paises.

def recodificar(col, nuevo_codigo):
    col_cod = pd.Series(col, copy=True)
    for llave, valor in nuevo_codigo.items():
        col_cod.replace(llave, valor, inplace=True)
    return col_cod
#3

data = pd.read_csv("C:/Users/Rodrigo/Desktop/TEC/Concentracion/datos/VirtualPatient.csv")
print(data)


##a
##     gender  age  ...  life_quality social_visits
## 0        M   78  ...           6.8             1
## 1        M   79  ...           7.2           999
## 2        M   79  ...           6.5             1
## 3        M   80  ...           6.9             1
## 4        F   72  ...           7.3             2
## ..     ...  ...  ...           ...           ...
## 112      F   75  ...           8.0             7
## 113      F   78  ...           9.0             7
## 114      F   78  ...          10.0             7
## 115      F   78  ...          10.0             7
## 116      F   79  ...           8.0             4
## 
## [117 rows x 15 columns]
fig, axs = plt.subplots(1, 2, figsize=(8, 4))

vision = pd.crosstab(index=data["vision"], columns="Conteo", colnames=[""])
alto_vision = [vision.iloc[0,0], vision.iloc[1,0], vision.iloc[2,0]]
barras_vision = ('Sees moderately', 'Sees poorly', 'Sees well')
axs[0].bar(barras_vision, alto_vision, color=['red', 'blue', 'yellow'])
## <BarContainer object of 3 artists>
axs[0].set_title('Visión')

audition = pd.crosstab(index=data["audition"], columns="Conteo", colnames=[""])
alto_audicion = [audition.iloc[0,0], audition.iloc[1,0]]
barras_audicion = ('Hears moderately', 'Hears well')
axs[1].bar(barras_audicion, alto_audicion, color=['red', 'blue'])
## <BarContainer object of 2 artists>
axs[1].set_title('Audición')

plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.4, hspace=0.4)
plt.show()

###las variables que se mostraron son vision y audition, las cuales tienen como valores 'Sees moderately', 'Sees poorly', 'Sees well' y 'Hears moderately', 'Hears well'. En vision se puede ver que 'Sees well' tiene el mayor número de registos, al igual que en Audition se ve que 'Hears well' tiene el mayor numeros de registros, lo que se puede influir que la mayoria de los pacientes estan sanos, sin embargo hay un porcentajes de peronas que no escuchan y vem bien.


##b

corre = data.corr()
## <string>:1: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.
fig, ax = plt.subplots(figsize=(12, 8), dpi=150)
paleta = sns.diverging_palette(220, 10, as_cmap=True).reversed()
heatmap = sns.heatmap(corre, vmin=-1, vmax=1, cmap=paleta,
                      square=True, annot=True, ax=ax)

heatmap.set_xticklabels(heatmap.get_xticklabels(), rotation=90)
heatmap.set_yticklabels(heatmap.get_yticklabels(), rotation=0)
plt.show()


### en la matriz de correlaciones se analizan las variables, los rangos van del 1 al -1 donde entre más cercano a los extremos, más es su relación. es decir, mientras más se acerque al uno, va a tener una correlación mas directa, y entre mas se acerca al -1 va a tener una relacion inversa. En la matriz se muestra con color azul las correlaiciones mas fuertes positivamente como lo es con las variables "gait_get_up" y "gait_speed_4m" que podemos decir que la velocidad de un paciente en caminar cuatro metros esta estrechamente relacionada con la velocidad al pararce, es decir que si camina rapido se va a parar rapido, pero si camina lento, se va a levantar lento.. Con color rojo se muestran las correlaciones mas fuertes pero negativamente, como los son "life quality" y "anxiety perception", lo que nos quiere decir es que estan en sentidos opuestos la calidad de vida con las prescripciones de anciedad, es decir, mientras mejor sea tu calidad de vida, menos van a ser las prescripciones de ansiedad. y en color muy claro, casi blanco las variables que casí no tienen correlacion, como por eemplo "hospitalization_three_years" y "age", no tiene relacion alguna.

##c

numerics = data.select_dtypes(include=['float64', 'int64'])
vision_onehot = pd.get_dummies(data["vision"], prefix="vision")
datos = pd.concat([numerics, vision_onehot], axis=1)

datos_s = pd.DataFrame(StandardScaler().fit_transform(datos), columns=datos.columns, index=datos.index)

acp = ACP(datos_s, n_componentes=5)
#acp.coordenadas_ind

fig, ax = plt.subplots(nrows=1, ncols=1, figsize = (10,6), dpi = 200)
acp.plot_plano_principal(ind_labels = False)
## <string>:55: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

fig, ax = plt.subplots(nrows=1, ncols=1, figsize = (10,6), dpi = 200)
acp.plot_circulo()
## <string>:69: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize = (12,10), dpi = 200)
acp.plot_sobreposicion(ind_labels = False)
## <string>:94: MatplotlibDeprecationWarning: The seaborn styles shipped by Matplotlib are deprecated since 3.6, as they no longer correspond to the styles shipped by seaborn. However, they will remain available as 'seaborn-v0_8-<style>'. Alternatively, directly use the seaborn API instead.
plt.show()

### En la siguiente grafica podemos ver que predominan 3 clusters, uno con la mayoria de los datos en el cual estan las variables de "life_quality", "vision_2", "hospitalization three years", los cuales nos pueden decir las peronas mas sanas, las que mejor vista tienen, y las que menos tiempo han estando en el sopital. El otro cluster con "age", "gait get up", "bmi score", "gait get up", "exhaustion score", este cluster nos dice sobre las caracteristicas de los pacientes en cuanto al rendimiento físico y la edad. Y el último que contiene "vision_0" y "anxiety perception" nos puede decir sobre los pacientes que tienen asiedad y algun tipo de problema de vision.