import pandas as pd
# Assuming your CSV file is named 'your_file.csv'
# Replace 'your_file.csv' with the actual name of your file
try:
df = pd.read_csv('Medicaldataset.csv',sep=";")
print("Primeras filas del DataFrame:")
print(df.head())
print("\nInformación general del DataFrame:")
df.info()
except FileNotFoundError:
print("Error: 'your_file.csv' no encontrado. Asegúrate de que el archivo CSV está en el directorio correcto.")
except Exception as e:
print(f"Ocurrió un error al leer el archivo CSV: {e}")
print(f"\nEl DataFrame tiene {df.shape[0]} filas.")
df.head()
# Eliminar las columnas "CK-MB" y "Systolic blood pressure"
columns_to_drop = ["CK-MB", "Systolic blood pressure"]
df = df.drop(columns=columns_to_drop, errors='ignore')
print("\nDataFrame después de eliminar columnas:")
print(df.head())
# Permíteme definir algunas que son categóricas pero que están en el dataset como numéricas nominales
# Lista de variables que son categóricas pero están representadas como numéricas
categorical_numerical_vars = ['Gender'] # Agrega aquí los nombres de tus variables
# Separar las columnas en listas de variables numéricas y categóricas
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns.tolist()
categorical_cols = df.select_dtypes(include=['object', 'category']).columns.tolist()
# Mover las variables especificadas de la lista numérica a la categórica si existen en la lista numérica
for var in categorical_numerical_vars:
if var in numeric_cols:
numeric_cols.remove(var)
categorical_cols.append(var)
print("Variables numéricas:", numeric_cols)
print("Variables categóricas:", categorical_cols)
# Verificar si hay valores nulos por columna
print("Número de valores nulos por columna antes de la eliminación:")
print(df.isnull().sum())
# Eliminar filas con cualquier valor nulo
df.dropna(inplace=True)
print("\nDataFrame después de eliminar filas con valores nulos:")
print(df.head())
print("\nNúmero de valores nulos por columna después de la eliminación:")
print(df.isnull().sum())
from sklearn.preprocessing import LabelEncoder
# Inicializar LabelEncoder
label_encoder = LabelEncoder()
# Aplicar LabelEncoder a cada columna categórica
for col in categorical_cols:
df[col] = label_encoder.fit_transform(df[col])
print("\nDataFrame después de la codificación con LabelEncoder:")
print(df.head())
# Verificar los tipos de datos después de la codificación
print("\nTipos de datos después de la codificación:")
df.dtypes
df.describe()
# Identificar duplicados
num_duplicates = df.duplicated().sum()
print(f"\nNúmero de registros duplicados antes de la eliminación: {num_duplicates}")
# Eliminar duplicados
df_cleaned = df.drop_duplicates()
print("\nDataFrame después de eliminar registros duplicados:")
print(df_cleaned.head())
print(f"\nNúmero de registros después de eliminar duplicados: {len(df_cleaned)}")
df=df_cleaned
import matplotlib.pyplot as plt
# Aplica boxplot para detectar outliers en las variables numéricas
for col in numeric_cols:
plt.figure(figsize=(10, 4))
df_cleaned.boxplot(column=col)
plt.title(f'Boxplot de {col}')
plt.ylabel('Valor')
plt.show()
import matplotlib.pyplot as plt
# Function to detect and remove outliers using IQR
def remove_outliers_iqr(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# Identify outliers
outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
print(f"Número de valores atípicos detectados en '{column}': {len(outliers)}")
# Remove outliers
df_cleaned = df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
print(f"Registros después de eliminar valores atípicos en '{column}': {len(df_cleaned)}")
return df_cleaned
# Apply outlier removal to each numeric column
df_no_outliers = df_cleaned.copy() # Start with the DataFrame without duplicates
for col in numeric_cols:
df_no_outliers = remove_outliers_iqr(df_no_outliers, col)
print("-" * 30)
print("\nDataFrame después de eliminar valores atípicos de todas las variables numéricas:")
print(df_no_outliers.head())
print(f"\nNúmero final de registros después de eliminar duplicados y valores atípicos: {len(df_no_outliers)}")
# Opcionalmente, puedes visualizar los boxplots nuevamente para verificar
for col in numeric_cols:
plt.figure(figsize=(10, 4))
df_no_outliers.boxplot(column=col)
plt.title(f'Boxplot de {col} (sin atípicos)')
plt.ylabel('Valor')
plt.show()
df=df_no_outliers
# Número de filas en el DataFrame
print(f"\nEl DataFrame tiene {len(df)} filas.")
# También puedes usar:
# print(f"\nEl DataFrame tiene {df.shape[0]} filas.")
import matplotlib.pyplot as plt
# Histograms for numerical columns by 'Result' class
# Ensure 'Result' is in the categorical columns and is encoded
if 'Result' in numeric_cols:
numeric_cols.remove('Result')
if 'Result' not in categorical_cols:
categorical_cols.append('Result') # Ensure 'Result' is treated as categorical
# Apply LabelEncoder to 'Result' if it's not already encoded
if df['Result'].dtype not in ['int64', 'float64']:
label_encoder = LabelEncoder()
df['Result'] = label_encoder.fit_transform(df['Result'])
print("\n'Result' column encoded.")
print(df[['Result']].head())
# Get unique classes in the 'Result' column
classes = df['Result'].unique()
classes.sort() # Sort classes for consistent plotting order
# Iterate through each numerical column
for col in numeric_cols:
plt.figure(figsize=(12, 6))
plt.title(f'Histogram of {col} by Result Class')
plt.xlabel(col)
plt.ylabel('Frequency')
# Iterate through each class in the 'Result' column
for cls in classes:
# Filter data for the current class
df_class = df[df['Result'] == cls]
# Plot histogram for the current class
# Set alpha for transparency to see overlapping histograms
plt.hist(df_class[col], bins=30, alpha=0.5, label=f'Class {cls}')
# Calculate mean and median for the current class
mean_val = df_class[col].mean()
median_val = df_class[col].median()
# Add vertical lines for mean and median
plt.axvline(mean_val, color=plt.cm.get_cmap('viridis')(cls/len(classes)), linestyle='dashed', linewidth=1, label=f'Class {cls} Mean: {mean_val:.2f}')
plt.axvline(median_val, color=plt.cm.get_cmap('viridis')(cls/len(classes)), linestyle='dotted', linewidth=1, label=f'Class {cls} Median: {median_val:.2f}')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
import matplotlib.pyplot as plt
# Realizar histograma y box plot por columna numérica separada por clases ('Result')
for col in numeric_cols:
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10, 8))
# Histograma en la parte superior
axes[0].set_title(f'Histograma de {col} por clase de Resultado')
axes[0].set_xlabel(col)
axes[0].set_ylabel('Frecuencia')
for cls in classes:
axes[0].hist(df[df['Result'] == cls][col], bins=30, alpha=0.7, label=f'Clase {cls}')
axes[0].legend(title='Clase de Resultado')
axes[0].grid(True, linestyle='--', alpha=0.6)
# Box plot horizontal en la parte inferior
axes[1].set_title(f'Box Plot de {col} por clase de Resultado')
axes[1].set_xlabel('Valor')
axes[1].set_ylabel('Clase de Resultado')
df.boxplot(column=col, by='Result', ax=axes[1], vert=False, patch_artist=True)
plt.suptitle('') # Eliminar el título superpuesto de boxplot por defecto
plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # Ajustar el layout para evitar superposiciones
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# Crear gráficos de densidad por cada variable numérica con las clases superpuestas
# Asegúrate de que las variables numéricas y la columna 'Result' estén definidas correctamente
# 'numeric_cols' debe ser una lista de nombres de columnas numéricas
# 'Result' debe ser el nombre de la columna de clases y estar en formato numérico (codificado)
# Verificar si la columna 'Result' existe y está codificada numéricamente
if 'Result' in df.columns and pd.api.types.is_numeric_dtype(df['Result']):
classes = df['Result'].unique()
classes.sort()
# Iterar a través de cada columna numérica
for col in numeric_cols:
plt.figure(figsize=(12, 6))
plt.title(f'Gráfico de Densidad de {col} por Clase de Resultado')
plt.xlabel(col)
plt.ylabel('Densidad')
# Iterar a través de cada clase en la columna 'Result'
for cls in classes:
# Filtrar datos para la clase actual
df_class = df[df['Result'] == cls]
# Trazar el gráfico de densidad (KDE plot) para la clase actual
# Usamos .plot(kind='kde') de pandas para esto
df_class[col].plot(kind='kde', label=f'Clase {cls}', alpha=0.7)
plt.legend(title='Clase de Resultado')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
else:
print("Error: La columna 'Result' no está presente o no está en un formato numérico adecuado para graficar la densidad por clases.")
print("Asegúrate de que 'Result' se incluyó en la codificación o que es una columna numérica.")
import matplotlib.pyplot as plt
import seaborn as sns
# Usa pairplot() para explorar visualmente las relaciones entre pares de variables numéricas
# separadas por clase objetivo ('Result')
print("\nVisualizando relaciones entre variables numéricas con pairplot:")
sns.pairplot(df, hue='Result', diag_kind='kde')
plt.suptitle('Pairplot de Variables Numéricas por Clase de Resultado', y=1.02)
plt.show()
import matplotlib.pyplot as plt
# Excluir la variable objetivo ('Result') de las variables numéricas para la matriz de correlación
numeric_cols_for_corr = [col for col in numeric_cols if col != 'Result']
# Calcular la matriz de correlación solo para las variables numéricas (sin 'Result')
correlation_matrix = df[numeric_cols_for_corr].corr()
print("\nMatriz de correlación de variables numéricas (excluyendo 'Result'):")
print(correlation_matrix)
# Visualizar la matriz de correlación usando un heatmap
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5)
plt.title('Heatmap de la Matriz de Correlación de Variables Numéricas (excluyendo "Result")')
plt.show()
import pandas as pd
from scipy.stats import chi2_contingency
# Asegúrate de que 'Result' está en las columnas categóricas o la trataremos como tal
# Si 'Result' fue movida a numéricas anteriormente, la volvemos a considerar categórica
# basándonos en la tarea (análisis con Chi-cuadrado sobre variables Categóricas vs. Result)
if 'Result' not in categorical_cols and 'Result' in df.columns:
# Si 'Result' está en el DataFrame pero no en categorical_cols, la añadimos
# Esto puede pasar si 'Result' fue tratada como numérica en alguna parte del código anterior
categorical_cols.append('Result')
if 'Result' in numeric_cols:
numeric_cols.remove('Result') # Remover de numéricas si estaba ahí por error para este análisis
# Lista para almacenar los resultados del test de Chi-cuadrado
chi2_results = {}
# Nivel de significancia (alpha)
alpha = 0.05
print("\nRealizando Test de Chi-cuadrado para Variables Categóricas vs. Result:")
print("-" * 60)
# Iterar sobre cada variable categórica (excluyendo 'Result')
for col in categorical_cols:
if col != 'Result':
print(f"Analizando la relación entre '{col}' y 'Result'...")
# Crear la tabla de contingencia
contingency_table = pd.crosstab(df[col], df['Result'])
# Asegurarse de que la tabla no esté vacía
if contingency_table.shape[0] > 1 and contingency_table.shape[1] > 1:
# Realizar el test de Chi-cuadrado
chi2, p, dof, ex = chi2_contingency(contingency_table)
# Almacenar los resultados
chi2_results[col] = {'chi2': chi2, 'p_value': p, 'dof': dof}
# Imprimir el resultado y determinar la significancia
print(f" Estadístico Chi-cuadrado: {chi2:.4f}")
print(f" Valor p: {p:.4f}")
print(f" Grados de libertad: {dof}")
if p < alpha:
print(f" Conclusión: '{col}' es SIGNIFICATIVA (p < {alpha}) - Hay una asociación estadísticamente significativa con 'Result'.")
else:
print(f" Conclusión: '{col}' NO es SIGNIFICATIVA (p >= {alpha}) - No hay evidencia suficiente de asociación con 'Result'.")
else:
print(f" No se puede realizar el test de Chi-cuadrado para '{col}': La tabla de contingencia es demasiado pequeña ({contingency_table.shape}).")
print("-" * 60)
# Reporte final de variables significativas y no significativas
print("\nReporte de Significancia (Nivel alpha = 0.05):")
print("-" * 40)
significant_vars = [var for var, res in chi2_results.items() if res['p_value'] < alpha]
non_significant_vars = [var for var, res in chi2_results.items() if res['p_value'] >= alpha]
print("Variables Categóricas Significativas (asociación con 'Result'):")
if significant_vars:
for var in significant_vars:
print(f"- {var} (Valor p: {chi2_results[var]['p_value']:.4f})")
else:
print("Ninguna variable categórica fue estadísticamente significativa.")
print("\nVariables Categóricas NO Significativas (sin asociación con 'Result'):")
if non_significant_vars:
# También incluimos variables que no pudieron ser testeadas
non_significant_vars.extend([col for col in categorical_cols if col != 'Result' and col not in chi2_results])
for var in set(non_significant_vars): # Usamos set para evitar duplicados si una variable no pudo ser testeada
if var in chi2_results:
print(f"- {var} (Valor p: {chi2_results[var]['p_value']:.4f})")
else:
print(f"- {var} (No se pudo testear, tabla de contingencia insuficiente)")
else:
print("Todas las variables categóricas testeadas fueron estadísticamente significativas.")
print("-" * 40)
import pandas as pd
from scipy import stats
print("\nRealizando pruebas estadísticas (t-student o ANOVA) para Variables Numéricas vs. Result:")
print("-" * 80)
# Nivel de significancia (alpha)
alpha = 0.05
# Asegurarse de que 'Result' está presente y es numérica para este análisis
if 'Result' in df.columns and pd.api.types.is_numeric_dtype(df['Result']):
# Obtener las clases únicas de 'Result'
result_classes = df['Result'].unique()
num_classes = len(result_classes)
# Iterar sobre cada variable numérica
for col in numeric_cols:
print(f"Analizando la relación entre '{col}' y 'Result' ({num_classes} clases)...")
# Crear una lista de series, una por cada grupo de 'Result'
groups = [df[col][df['Result'] == cls].dropna() for cls in result_classes]
# Verificar si los grupos tienen suficientes datos
valid_groups = [group for group in groups if len(group) > 1]
if len(valid_groups) == num_classes: # Solo procedemos si todos los grupos tienen datos > 1
if num_classes == 2:
# Aplicar T-student si hay exactamente 2 clases en 'Result'
print(f" Aplicando prueba t-student (2 clases en 'Result')...")
try:
# Realizar el test t-student independiente
# asume varianzas iguales; para asumir desiguales use equal_var=False
t_statistic, p_value = stats.ttest_ind(valid_groups[0], valid_groups[1], nan_policy='omit')
print(f" Estadístico T: {t_statistic:.4f}")
print(f" Valor p: {p_value:.4f}")
# Determinar significancia
if p_value < alpha:
print(f" Conclusión: '{col}' es SIGNIFICATIVA (p < {alpha}) - Hay una diferencia promedio estadísticamente significativa entre los grupos de 'Result'.")
else:
print(f" Conclusión: '{col}' NO es SIGNIFICATIVA (p >= {alpha}) - No hay evidencia suficiente de diferencia promedio entre los grupos de 'Result'.")
except Exception as e:
print(f" Error al realizar la prueba t-student para '{col}': {e}")
elif num_classes > 2:
# Aplicar ANOVA si hay más de 2 clases en 'Result'
print(f" Aplicando prueba ANOVA ({num_classes} clases en 'Result')...")
try:
# Realizar el test ANOVA
f_statistic, p_value = stats.f_oneway(*valid_groups)
print(f" Estadístico F: {f_statistic:.4f}")
print(f" Valor p: {p_value:.4f}")
# Determinar significancia
if p_value < alpha:
print(f" Conclusión: '{col}' es SIGNIFICATIVA (p < {alpha}) - Hay al menos un grupo de 'Result' cuya media difiere significativamente de las otras.")
else:
print(f" Conclusión: '{col}' NO es SIGNIFICATIVA (p >= {alpha}) - No hay evidencia suficiente de que las medias de los grupos de 'Result' difieran.")
except Exception as e:
print(f" Error al realizar la prueba ANOVA para '{col}': {e}")
else:
print(f" No se puede realizar la prueba estadística para '{col}': El número de clases de 'Result' ({num_classes}) no es 2 o más de 2.")
else:
print(f" No se puede realizar la prueba estadística para '{col}': No hay suficientes datos en algunos grupos de 'Result'.")
print("-" * 80)
else:
print("Error: La columna 'Result' no está presente o no está en un formato numérico adecuado para realizar pruebas t-student o ANOVA.")
print("Asegúrate de que 'Result' fue codificada numéricamente.")
# Reporte final de variables numéricas significativas y no significativas (basado en las pruebas realizadas)
print("\nReporte de Significancia para Variables Numéricas (Nivel alpha = 0.05):")
print("-" * 60)
significant_numeric_vars = []
non_significant_numeric_vars = []
untested_numeric_vars = []
# Re-iterar o almacenar los resultados para el reporte final si se desea
# Este snippet solo imprime durante la ejecución. Para un reporte consolidado,
# se deberían almacenar los resultados de p_value en un diccionario o lista.
# Ejemplo de cómo podrías estructurarlo (requiere modificar el bucle anterior para almacenar):
# numeric_test_results = {} # Diccionario para almacenar p-values de tests numéricos
# Después del bucle de t-student/ANOVA:
# print("Variables Numéricas Significativas (asociación con 'Result'):")
# sig_num = [var for var, p in numeric_test_results.items() if p < alpha]
# if sig_num:
# for var in sig_num:
# print(f"- {var} (Valor p: {numeric_test_results[var]:.4f})")
# else:
# print("Ninguna variable numérica fue estadísticamente significativa.")
# print("\nVariables Numéricas NO Significativas (sin asociación con 'Result'):")
# non_sig_num = [var for var, p in numeric_test_results.items() if p >= alpha]
# if non_sig_num:
# print("Variables testeadas como no significativas:")
# for var in non_sig_num:
# print(f"- {var} (Valor p: {numeric_test_results[var]:.4f})")
# else:
# print("Todas las variables numéricas testeadas fueron estadísticamente significativas.")
# print("\nVariables Numéricas NO testeadas (por falta de datos en grupos, etc.):")
# # Aquí necesitarías una lista de variables que no pudieron ser testeadas
# # untested_num = ...
# if untested_numeric_vars:
# for var in untested_numeric_vars:
# print(f"- {var}")
# else:
# print("Todas las variables numéricas fueron testeadas.")
# Como el código anterior no almacena los resultados centralmente,
# simplemente resumimos lo que se imprimió:
print("Consulta los resultados detallados de cada variable numérica y su valor p en la salida anterior.")
print("Las variables con un 'Valor p' menor a 0.05 se consideran significativas.")
print("-" * 60)
# Guardar el DataFrame final en un archivo CSV
df.to_csv('dataframe_final.csv', index=False,sep=";")
# Guardar las listas de variables numéricas y categóricas
import json
variables_info = {
'numeric_variables': numeric_cols,
'categorical_variables': categorical_cols
}
with open('variables_info.json', 'w') as f:
json.dump(variables_info, f, indent=4)
print("\nDataFrame final guardado como 'dataframe_final.csv'")
print("Listas de variables numéricas y categóricas guardadas como 'variables_info.json'")