<jupyter_start><jupyter_text>ANALISIS MULTIVARIADO DE DATOS<jupyter_code>#Estandarizar una variable
from scipy.stats import zscore
modelo['ROA (z)'] = zscore(modelo['ROA'])
print(modelo)
from scipy import stats
import numpy as np

indice_bbva = modelo['paises']=='Banco Continental'


modelo['roa_bbva (z)'] = np.zeros(len(modelo))  # ponemos 0 para despues poder modificarla
print(modelo)
modelo['roa_bbva (z)'][indice_bbva] = stats.zscore(modelo['ROA'][indice_bbva])
print(modelo)

modelo['CAP'].hist(bins = 30)
plt.ylabel('Frecuencia')
plt.show()
corr = modelo.corr()
plt.figure(figsize=(10, 10))
sns.heatmap(corr, vmax=.8, linewidths=0.01,
            square=True,annot=True, cmap = 'Blues')
import matplotlib.pyplot as plt

plt.scatter(modelo.ROA,modelo.LOAN)
plt.ylabel(r'LOAN', fontsize=15, color='black')
plt.xlabel(r'ROA', fontsize=15, color='black')
def error_cuadratico_medio(X,y,beta):
  error=0.0
  for n,val in enumerate(y):
    y_est = beta[0] + beta[1]*X[n]
    error = error + (y_est - y[n])**2
  return error/len(y)

beta0 = np.arange(-50,200,0.25)
beta = np.arange(-1,1,0.01)
X0, Y0 = np.meshgrid(beta0, beta)

Z = error_cuadratico_medio(modelo.LOAN,modelo.PROV,[X0,Y0])

from matplotlib import cm

fig, ax = plt.subplots(subplot_kw={"projection": "3d"}, figsize=(10, 10))
surf = ax.plot_surface(X0, Y0, Z, cmap=cm.coolwarm, linewidth=0, antialiased=False)
ax.set_zlabel('Error cuadratico medio')
ax.set_xlabel('beta0')
ax.set_ylabel('beta1')
from sklearn.linear_model import LinearRegression
columnas_interes = ['LOAN','CAP']
columnas_interes2 = ['ROA']
X = modelo[columnas_interes]
y = modelo[columnas_interes2]

reg = LinearRegression()
reg.fit(X,y)

estimated = [reg.intercept_, reg.coef_]  # los parametros estimados
print(estimated)

R2 = reg.score(X,y) # R2
print(R2)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 3)
# Coeficientes del modelo 
beta_0_estimado = reg.intercept_
beta_1_estimado = reg.coef_[0]

print('Ordenada al origen = ',format(beta_0_estimado))
print('Pendiente = ',format(beta_1_estimado))
# Calidad del ajuste
print('Calidad de ajuste R^2 = ',format(reg.score(X, y)))
reg.predict(X_train)
# Error de test del modelo 
# ==============================================================================
from sklearn.metrics import mean_squared_error
predicciones = reg.predict(X = X_test)
print(predicciones[0:3,])

rmse = mean_squared_error(
        y_true  = y_test,
        y_pred  = predicciones,
        squared = False
       )
print("")
print(f"El error (rmse) de test es: {rmse}")
import statsmodels.api as sm
# Creación del modelo utilizando matrices como en scikitlearn
# ==============================================================================
# A la matriz de predictores se le tiene que añadir una columna de 1s para el intercept del modelo
X_train = sm.add_constant(X_train, prepend=True)
modelo11 = sm.OLS(endog=y_train, exog=X_train,)
rrr = modelo11.fit()
print(rrr.summary())
# Intervalos de confianza para los coeficientes del modelo
# ==============================================================================
rrr.conf_int(alpha=0.05)
# Predicciones con intervalo de confianza del 95%
# ==============================================================================
predicciones = rrr.get_prediction(exog = X_train).summary_frame(alpha=0.05)
predicciones.head(4)
######################################################################################################################
######################################################################################################################
# Predicciones con intervalo de confianza del 95%
# ==============================================================================
predicciones = rrr.get_prediction(exog = X_train).summary_frame(alpha=0.05)
predicciones['x'] = X_train
predicciones['y'] = y_train
predicciones = predicciones.sort_values('x')

# Gráfico del modelo
# ==============================================================================
fig, ax = plt.subplots(figsize=(6, 3.84))

ax.scatter(predicciones['x'], predicciones['y'], marker='o', color = "gray")
ax.plot(predicciones['x'], predicciones["mean"], linestyle='-', label="OLS")
ax.plot(predicciones['x'], predicciones["mean_ci_lower"], linestyle='--', color='red', label="95% CI")
ax.plot(predicciones['x'], predicciones["mean_ci_upper"], linestyle='--', color='red')
ax.fill_between(predicciones['x'], predicciones["mean_ci_lower"], predicciones["mean_ci_upper"], alpha=0.1)
ax.legend()
# Intervalos de confianza para los coeficientes del modelo
# ==============================================================================
intervalos_ci = rrr.conf_int(alpha=0.05)
intervalos_ci.columns = ['2.5%', '97.5%']
intervalos_ci
# Diagnóstico errores (residuos) de las predicciones de entrenamiento
# ==============================================================================
y_train = y_train.values.flatten()
prediccion_train = rrr.predict(exog = X_train)
residuos_train   = prediccion_train - y_train
# Gráficos
# ==============================================================================
fig, axes = plt.subplots(nrows=3, ncols=2, figsize=(9, 8))

axes[0, 0].scatter(y_train, prediccion_train, edgecolors=(0, 0, 0), alpha = 0.4)
axes[0, 0].plot([y_train.min(), y_train.max()], [y_train.min(), y_train.max()],
                'k--', color = 'black', lw=2)
axes[0, 0].set_title('Valor predicho vs valor real', fontsize = 10, fontweight = "bold")
axes[0, 0].set_xlabel('Real')
axes[0, 0].set_ylabel('Predicción')
axes[0, 0].tick_params(labelsize = 7)

axes[0, 1].scatter(list(range(len(y_train))), residuos_train,
                   edgecolors=(0, 0, 0), alpha = 0.4)
axes[0, 1].axhline(y = 0, linestyle = '--', color = 'black', lw=2)
axes[0, 1].set_title('Residuos del modelo', fontsize = 10, fontweight = "bold")
axes[0, 1].set_xlabel('id')
axes[0, 1].set_ylabel('Residuo')
axes[0, 1].tick_params(labelsize = 7)

sns.histplot(
    data    = residuos_train,
    stat    = "density",
    kde     = True,
    line_kws= {'linewidth': 1},
    color   = "firebrick",
    alpha   = 0.3,
    ax      = axes[1, 0]
)

axes[1, 0].set_title('Distribución residuos del modelo', fontsize = 10,
                     fontweight = "bold")
axes[1, 0].set_xlabel("Residuo")
axes[1, 0].tick_params(labelsize = 7)


sm.qqplot(
    residuos_train,
    fit   = True,
    line  = 'q',
    ax    = axes[1, 1], 
    color = 'firebrick',
    alpha = 0.4,
    lw    = 2
)
axes[1, 1].set_title('Q-Q residuos del modelo', fontsize = 10, fontweight = "bold")
axes[1, 1].tick_params(labelsize = 7)

axes[2, 0].scatter(prediccion_train, residuos_train,
                   edgecolors=(0, 0, 0), alpha = 0.4)
axes[2, 0].axhline(y = 0, linestyle = '--', color = 'black', lw=2)
axes[2, 0].set_title('Residuos del modelo vs predicción', fontsize = 10, fontweight = "bold")
axes[2, 0].set_xlabel('Predicción')
axes[2, 0].set_ylabel('Residuo')
axes[2, 0].tick_params(labelsize = 7)

# Se eliminan los axes vacíos
fig.delaxes(axes[2,1])

fig.tight_layout()
plt.subplots_adjust(top=0.9)
fig.suptitle('Diagnóstico residuos', fontsize = 12, fontweight = "bold");<jupyter_output><empty_output><jupyter_text>TEST DE NORMALIDADSe comprueba si los residuos siguen una distribución normal empleando dos test estadísticos: Shapiro-Wilk test y D'Agostino's K-squared test. Este último es el que incluye el summary de statsmodels bajo el nombre de Omnibus.En ambos test, la hipótesis nula considera que los datos siguen una distribución normal, por lo tanto, si el p-value no es inferior al nivel de referencia alpha seleccionado, no hay evidencias para descartar que los datos se distribuyen de forma normal.<jupyter_code># Normalidad de los residuos Shapiro-Wilk test
# ==============================================================================
shapiro_test = stats.shapiro(residuos_train)
shapiro_test
# Normalidad de los residuos D'Agostino's K-squared test
# ==============================================================================
k2, p_value = stats.normaltest(residuos_train)
print(f"Estadítico= {k2}, p-value = {p_value}")
from sklearn.metrics import confusion_matrix

ypred = rrr.predict(X) # con esto obtengo la predicción de las etiquetas en base a mis datos

print(ypred)

cm = confusion_matrix(ypred, y) # primera entrada son las etiquetas predichas, segunda son las reales

print(cm)
# haciendo grafica de lineas para ROA por años
modelo_nn = modelo.groupby(['year']).sum().reset_index()
plt.plot(modelo['year'], modelo['ROA'])
plt.show()
# haciendo grafica de lineas para gasto por edad para Mexico y España
modelo_nnn = modelo.groupby(['year', 'paises']).sum().reset_index()

# calculando datasets por pais
modelo_continental = modelo_nnn[modelo_nnn['paises'] == 'Banco Continental']
modelo_azteca = modelo_nnn[modelo_nnn['paises'] == 'Banco Azteca']

# haciendo la grafica
plt.plot(modelo_continental['year'], modelo_continental['ROA'], label='BC')
plt.plot(modelo_azteca['year'], modelo_azteca['ROA'], label='BA')
plt.legend()
plt.show()
# haciendo grafica de lineas para gasto por edad con distintos markers
modelo_aa = modelo.groupby(['year']).sum().reset_index()
plt.scatter(modelo_aa['year'], modelo_aa['ROA'], marker='D')
plt.show()
# haciendo grafica de lineas para gasto por edad para Mexico y España
modelo_nnn = modelo.groupby(['year', 'paises']).sum().reset_index()

# calculando datasets por pais
modelo_continental = modelo_nnn[modelo_nnn['paises'] == 'Banco Continental']
modelo_azteca = modelo_nnn[modelo_nnn['paises'] == 'Banco Azteca']

# haciendo la grafica
plt.scatter(modelo_continental['year'], modelo_continental['ROA'], label='BC')
plt.plot(modelo_continental['year'], modelo_continental['ROA'], label='BC')
plt.scatter(modelo_azteca['year'], modelo_azteca['ROA'], label='BA')
plt.plot(modelo_azteca['year'], modelo_azteca['ROA'], label='BA')
plt.legend()
plt.show()
# miramos ahora las tipologia de variables que tenemos
modelo.info()
modelo.describe()
# empezamos con un grafico de barras de la proveniencia geografica
sns.countplot(x='paises', data=modelo)
# ahora hacemos un boxplot de la variable success
sns.boxplot(y = 'CAP', data = modelo)
#seguimos con un histograma
sns.distplot(modelo['ROA'])
# y si quieremos ver frequencias en lugar de probabilidades
sns.distplot(modelo['ROA'], kde = False)
# por fin, miramos histograma y boxplot de alcohol
sns.boxplot(y = 'ROA', data = modelo)
plt.figure()
sns.distplot(modelo['ROA'], kde = False)<jupyter_output>C:\ProgramData\Anaconda3\lib\site-packages\seaborn\distributions.py:2557: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).
  warnings.warn(msg, FutureWarning)<jupyter_text>ANALISIS MULTIVARIADO<jupyter_code># Primero empezamos con el scatter plot
sns.relplot(x="LOAN", y="PROV", data=modelo)
# ahora scatter plot mas linea, para identificar mejor las tendencias
sns.regplot(x="LOAN", y="PROV", data=modelo)
# ahora vamos con correlacion entre variable categorica y variable numerica!
print(sns.barplot(x="LOAN", y="PROV", data=modelo))
# mismas variables, con el boxplot lo vemos con mas detalles
sns.boxplot(x="LOAN", y="PROV", data=modelo)
# y si queremos mirar todas las correlaciones?
corr = modelo.corr()
plt.figure(figsize=(10, 10))
sns.heatmap(corr, vmax=.8, linewidths=0.01,
            square=True,annot=True)<jupyter_output><empty_output><jupyter_text>VISUALIZACIÓN DE DATOS<jupyter_code>sns.lmplot(x="LOAN", y="PROV", data=modelo)
sns.lmplot(x="LOAN", y="PROV", data=modelo, truncate = True, scatter_kws={'s':0.8, 'alpha':0.3})
# Agrupando datos por genero y contando
df_modelo = modelo.groupby(['paises']).count()
df_modelo = df_modelo.rename(columns={"paises": "count"})
df_modelo
# Agrupando datos por edad y contando
df_modelo_media = modelo.groupby(['paises']).mean()
df_modelo_media
# seleccionar una columna opcion 1
modelo['paises']
# utilidad de seleccionar con listas
columnas_interes = ['paises', 'ROA', 'LOAN']
a_modelo = modelo[columnas_interes]
a_modelo
# eliminar una columna
a_modelo.drop(columns='LOAN')
# filtrando para genero femenino
modelo[modelo['paises'] == 'Banco Azteca']
# filtrando para edades mayores a 30 (pero no iguales)
modelo[modelo['ROA']>0]
# condiciones para filtrar
cond1 = modelo['paises'] == 'Banco Azteca'
cond2 = modelo['ROA']>0
# filtrar por varias condiciones con "y"
modelo[cond1 & cond2].count()
# crear columnas condicionalmente
condiciones = [
    (modelo["ROA"]<0),
    (modelo["ROA"]>=0),
    (modelo["ROA"]>0.5),
]
opciones = ["malo", "bueno", "sobresaliente"]

# incluir condiciones y opciones
modelo["resultado"] = np.select(condiciones, opciones)
modelo
modelo
# ordenar por edad de forma ascendente: de menor a mayor
modelo.sort_values(by=['ROA'])
# ordenar por edad de forma ascendente: de mayor a menor
modelo.sort_values(by=['ROA'], ascending=False)
# ordenar por pais y gasto ambos de forma ascendente: de mayor a menor
modelo.sort_values(by=['paises', 'ROA'])
# buscar venta con máximo de gasto
modelo[modelo['ROA'] == modelo['ROA'].max()]
# calcular suma de gastos el día lunes
modelo_2015 = modelo[modelo['year']==2015]
modelo_2015['ROA'].mean()
# agrupar por pais y genero, luego calcular la mediana
modelo.groupby([modelo['paises']=='Scotiabank Peru', 'year']).mean()
# agrupar por pais y genero, luego calcular la mediana
modelo.groupby(['paises', 'year']).mean()
modelo.dtypes
is_2014 = modelo['year'] == 2014

modelo_2014 = modelo[is_2014]

print(modelo_2014.head())

print('cantidad de datos', len(modelo_2014))
modelo_2014.groupby(['paises']).mean()['ROA']
print('minimo: ', modelo['year'].min())
print('maximo: ', modelo['year'].max())
modelo[(modelo['year']==2014) & (modelo['paises']=='BCP')]
modelo_2014['CAP'].hist(bins = 30)
modelo_2014.groupby(['paises']).mean()['ROA'].plot.barh()
modelo_2014.groupby(['paises']).mean()['ROA'].plot.bar()
plt.figure(figsize=(5,5),dpi=80)
plt.scatter(x=modelo_2014['ROA'], y=modelo_2014['paises'])
modelo_2014['ROA'].quantile([0,0.25,0.5,0.75,1])
modelo['ROA'].quantile([0,0.25,0.5,0.75,1])
modelo_2014['ROA'].quantile(np.linspace(0,1,5)).plot.bar()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.21729443709531435, 'fraction_numerical': 0.023254194806099006, 'mean_word_length': 6.492957746478873, 'pattern_counts': {'":': 2, '<': 17, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '342438', 'license': 'MIT', 'n_tokens_mistral': 5515, 'n_tokens_neox': 5206, 'n_words': 1144, 'path': 'data/ANALYSIS FACTORS.ipynb', 'repo_name': 'JeancarloGeldres/Analysis-Factors-Interns-', 'size': '14363'}