From c0d0809f029024b5766f447306f732a7e64bce59 Mon Sep 17 00:00:00 2001 From: Libzae Date: Sat, 11 Jan 2025 11:07:57 +0100 Subject: [PATCH] lab done --- lab-hypothesis-testing.ipynb | 376 +++++++++++++++++++++++++++++++++-- 1 file changed, 363 insertions(+), 13 deletions(-) diff --git a/lab-hypothesis-testing.ipynb b/lab-hypothesis-testing.ipynb index 18ad6d5..ffcb0ed 100644 --- a/lab-hypothesis-testing.ipynb +++ b/lab-hypothesis-testing.ipynb @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -278,7 +278,7 @@ "[800 rows x 11 columns]" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -301,7 +301,89 @@ "metadata": {}, "outputs": [], "source": [ - "#code here" + "#Para evaluar si los Pokémon de tipo Dragón (Dragon) tienen, en promedio, \n", + "#más puntos de salud (HP) que los Pokémon de tipo Planta (Grass), \n", + "#podemos usar un test estadístico para comparar las medias de dos grupos independientes. \n", + "\n", + "#Dado que estamos comparando dos grupos diferentes de Pokémon y sus estadísticas de HP, \n", + "#el t-test de muestras independientes es apropiado." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Set the hypothesis\n", + "\n", + "\n", + "\n", + "#H0: mu Pokemon Grass = Pokemon Planta\n", + "#H1: mu 1st class_prices!= 65" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.05" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T-statistic: 3.5904, P-value: 0.0005\n", + "Rechazar la hipótesis nula. Los Pokémon de tipo Dragón tienen un HP promedio significativamente mayor que los de tipo Planta.\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "from scipy.stats import ttest_ind\n", + "\n", + "# Supongamos que 'df' es tu DataFrame con los datos de Pokémon\n", + "# Filtrar los Pokémon de tipo Dragon y Grass\n", + "dragon_hp = df[df['Type 1'] == 'Dragon']['HP']\n", + "grass_hp = df[df['Type 1'] == 'Grass']['HP']\n", + "\n", + "# Realizar el t-test de dos muestras independientes\n", + "t_stat, p_value = ttest_ind(dragon_hp, grass_hp)\n", + "\n", + "# Imprimir resultados\n", + "print(f\"T-statistic: {t_stat:.4f}, P-value: {p_value:.4f}\")\n", + "\n", + "# Inferencia\n", + "if p_value < 0.05:\n", + " print(\"Rechazar la hipótesis nula. Los Pokémon de tipo Dragón tienen un HP promedio significativamente mayor que los de tipo Planta.\")\n", + "else:\n", + " print(\"No se puede rechazar la hipótesis nula. No hay evidencia suficiente para decir que los Pokémon de tipo Dragón tienen un HP promedio mayor que los de tipo Planta.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Explicación del Código\n", + "#Selección de Datos: df[df['Type 1'] == 'Dragon']['HP'] selecciona los puntos de HP de Pokémon cuyo Type 1 es Dragon, \n", + "#y se hace similarmente para Grass.\n", + "\n", + "#ttest_ind(): Realiza el test t de dos muestras independientes sobre las dos series de HP.\n", + "\n", + "#Interpreta el Valor-p (P-value):\n", + "\n", + "#Si el valor-p es menor que 0.05, rechazas la hipótesis nula, lo que sugiere que hay una diferencia significativa entre los HP promedio de los dos grupos.\n", + "#Si el valor-p es mayor o igual a 0.05, no se puede rechazar la hipótesis nula, lo que indica que no hay evidencia suficiente para afirmar que los HP promedio son diferentes." ] }, { @@ -313,11 +395,50 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HP: T-statistic = 8.0361, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para HP. Hay una diferencia significativa en HP entre Pokémon Legendarios y No-Legendarios.\n", + "\n", + "Attack: T-statistic = 10.3973, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para Attack. Hay una diferencia significativa en Attack entre Pokémon Legendarios y No-Legendarios.\n", + "\n", + "Defense: T-statistic = 7.1812, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para Defense. Hay una diferencia significativa en Defense entre Pokémon Legendarios y No-Legendarios.\n", + "\n", + "Sp. Atk: T-statistic = 14.1914, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para Sp. Atk. Hay una diferencia significativa en Sp. Atk entre Pokémon Legendarios y No-Legendarios.\n", + "\n", + "Sp. Def: T-statistic = 11.0378, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para Sp. Def. Hay una diferencia significativa en Sp. Def entre Pokémon Legendarios y No-Legendarios.\n", + "\n", + "Speed: T-statistic = 9.7652, P-value = 0.0000\n", + "Rechazamos la hipótesis nula para Speed. Hay una diferencia significativa en Speed entre Pokémon Legendarios y No-Legendarios.\n", + "\n" + ] + } + ], "source": [ - "#code here" + "\n", + "# Supón que 'df' es tu DataFrame con las estadísticas de Pokémon\n", + "# Filtrar Pokémon Legendarios y No Legendarios\n", + "legendary_stats = df[df['Legendary'] == True][['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']]\n", + "non_legendary_stats = df[df['Legendary'] == False][['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']]\n", + "\n", + "# Resultados de las pruebas t\n", + "for stat in legendary_stats.columns:\n", + " t_stat, p_value = ttest_ind(legendary_stats[stat], non_legendary_stats[stat])\n", + " print(f\"{stat}: T-statistic = {t_stat:.4f}, P-value = {p_value:.4f}\")\n", + " \n", + " if p_value < 0.05:\n", + " print(f\"Rechazamos la hipótesis nula para {stat}. Hay una diferencia significativa en {stat} entre Pokémon Legendarios y No-Legendarios.\\n\")\n", + " else:\n", + " print(f\"No podemos rechazar la hipótesis nula para {stat}. No hay evidencia suficiente de una diferencia en {stat} entre estos grupos.\\n\")" ] }, { @@ -337,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -453,7 +574,7 @@ "4 624.0 262.0 1.9250 65500.0 " ] }, - "execution_count": 5, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -481,24 +602,253 @@ " " ] }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "close_to_school_or_hospital\n", + "False 207334.699029\n", + "True 92460.000000\n", + "Name: median_house_value, dtype: float64\n" + ] + } + ], + "source": [ + "#Write a function to calculate euclidean distance from each house (neighborhood) to the school and to the hospital.\n", + "#Crear funcion\n", + "import numpy as np\n", + "\n", + "def euclidean_distance(x1, y1, x2, y2):\n", + " return np.sqrt((x1 - x2)**2 + (y1 - y2)**2)\n", + "\n", + "#Paso 2: Aplicar la Distancia a cada Casa\n", + "# Coordenadas de la escuela y el hospital\n", + "school_coords = (-118, 37)\n", + "hospital_coords = (-122, 34)\n", + "\n", + "# Calcular distancia a la escuela y al hospital\n", + "df['distance_to_school'] = df.apply(lambda row: euclidean_distance(row['longitude'], row['latitude'], *school_coords), axis=1)\n", + "df['distance_to_hospital'] = df.apply(lambda row: euclidean_distance(row['longitude'], row['latitude'], *hospital_coords), axis=1)\n", + "\n", + "#Paso 3: Determinar las Casas \"Cercanas\"\n", + "#Define una columna booleana que indique si una casa está cerca de la escuela o el hospital con una distancia menor a 0.50.\n", + "# Determinar si una casa es 'cercana'\n", + "df['close_to_school_or_hospital'] = (df['distance_to_school'] < 0.50) | (df['distance_to_hospital'] < 0.50)\n", + "# Comparar precios medios\n", + "print(df.groupby('close_to_school_or_hospital')['median_house_value'].mean())\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#Los resultados que has compartido sugieren que, en promedio, las casas cercanas (clasificadas como True) a una escuela o un hospital tienen un valor de mercado más bajo comparado con aquellas que no están cerca (clasificadas como False). Aquí está una interpretación general de los números que has proporcionado:\n", + "\n", + "#Interpretación de los Promedios\n", + "#Casas No Cercanas (close_to_school_or_hospital = False):\n", + "\n", + "#Valor Promedio: 207,334.699029\n", + "#Interpretación: Las casas que no están consideradas \"cercanas\" a una escuela o hospital tienen, en promedio, un valor de mercado mayor que aquellas que sí lo están.\n", + "#Casas Cercanas (close_to_school_or_hospital = True):\n", + "\n", + "#Valor Promedio: 92,460.000000\n", + "#Interpretación: Las casas que están dentro de la proximidad definida a una escuela o hospital tienen un valor medio significativamente más bajo.\n", + "#Consideraciones\n", + "#Contexto Local: La diferencia en valores puede estar influenciada por factores específicos del mercado o contexto local, como la percepción de tráfico, ruido, o accesibilidad que influencian de manera diferente los valores del mercado.\n", + "\n", + "#Datos Adicionales: Podría considerarse analizar otros factores que pudieran afectar el valor de las viviendas, tales como accesibilidad, calidad de infraestructuras públicas, factores socioeconómicos, etc.\n", + "\n", + "#Causalidad vs Correlación: Asegúrate de distinguir que los datos muestran correlaciones y \n", + "#no necesariamente implican causalidad directa. Las regiones donde casas valen menos pueden \n", + "#tener más infraestructura pública colocada para ayudar al desarrollo local, no necesariamente \n", + "#que ser vecino a estas instalaciones devalúe la propiedad." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Casas cercanas (primeras 5 filas):\n", + " longitude latitude housing_median_age total_rooms total_bedrooms \\\n", + "4523 -118.05 36.64 34.0 2090.0 478.0 \n", + "5596 -118.18 37.35 16.0 3806.0 794.0 \n", + "5597 -118.18 36.63 23.0 2311.0 487.0 \n", + "6776 -118.30 37.17 22.0 3480.0 673.0 \n", + "6904 -118.31 36.94 35.0 2563.0 530.0 \n", + "\n", + " population households median_income median_house_value \\\n", + "4523 896.0 426.0 2.0357 74200.0 \n", + "5596 1501.0 714.0 2.1212 108300.0 \n", + "5597 1019.0 384.0 2.2574 104700.0 \n", + "6776 1541.0 636.0 2.7500 94500.0 \n", + "6904 861.0 371.0 2.3250 80600.0 \n", + "\n", + " distance_to_school distance_to_hospital close_to_school_or_hospital \n", + "4523 0.363456 4.751010 True \n", + "5596 0.393573 5.080837 True \n", + "5597 0.411461 4.637812 True \n", + "6776 0.344819 4.872258 True \n", + "6904 0.315753 4.718019 True \n", + "\n", + "Casas lejos (primeras 5 filas):\n", + " longitude latitude housing_median_age total_rooms total_bedrooms \\\n", + "0 -114.31 34.19 15.0 5612.0 1283.0 \n", + "1 -114.47 34.40 19.0 7650.0 1901.0 \n", + "2 -114.56 33.69 17.0 720.0 174.0 \n", + "3 -114.57 33.64 14.0 1501.0 337.0 \n", + "4 -114.57 33.57 20.0 1454.0 326.0 \n", + "\n", + " population households median_income median_house_value \\\n", + "0 1015.0 472.0 1.4936 66900.0 \n", + "1 1129.0 463.0 1.8200 80100.0 \n", + "2 333.0 117.0 1.6509 85700.0 \n", + "3 515.0 226.0 3.1917 73400.0 \n", + "4 624.0 262.0 1.9250 65500.0 \n", + "\n", + " distance_to_school distance_to_hospital close_to_school_or_hospital \n", + "0 4.638125 7.692347 False \n", + "1 4.384165 7.540617 False \n", + "2 4.773856 7.446456 False \n", + "3 4.801510 7.438716 False \n", + "4 4.850753 7.442432 False \n" + ] + } + ], + "source": [ + "# Suponiendo que la columna 'close_to_school_or_hospital' ya está en el DataFrame\n", + "# Dividir el DataFrame en dos partes según la proximidad\n", + "houses_close = df[df['close_to_school_or_hospital'] == True]\n", + "houses_far = df[df['close_to_school_or_hospital'] == False]\n", + "\n", + "# Mostrar algunos resultados para validación\n", + "print(\"Casas cercanas (primeras 5 filas):\")\n", + "print(houses_close.head())\n", + "\n", + "print(\"\\nCasas lejos (primeras 5 filas):\")\n", + "print(houses_far.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Choose the propper test and, with 5% significance, comment your findings." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Para elegir un test adecuado y con un nivel de significancia del 5% para investigar \n", + "#si las casas cercanas a escuelas u hospitales son significativamente diferentes en \n", + "#términos de su valor medio en comparación con las casas lejanas, podemos utilizar \n", + "#un t-test de dos muestras independientes. \n", + "#Este test se utiliza cuando queremos comparar las medias de dos grupos independientes \n", + "#y verificar si la diferencia observada es estadísticamente significativa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Vamos a comparar la media de median_house_value entre dos grupos:\n", + "\n", + "#Casas Cercanas (houses_close)\n", + "#Casas Lejanas (houses_far)\n", + "#Procedimiento\n", + "#Hipótesis:\n", + "\n", + "#Hipótesis Nula (( H_0 )): No hay diferencia significativa en median_house_value entre casas cercanas y lejanas.\n", + "#Hipótesis Alternativa (( H_a )): Hay una diferencia significativa en median_house_value entre casas cercanas y lejanas.\n", + "\n", + "#Nivel de Significancia:\n", + "\n", + "#Usaremos un nivel de significancia ((\\alpha)) de 0.05.\n", + "#Realizar el T-test usando scipy.stats:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T-statistic: -2.2146, P-value: 0.0268\n", + "Rechazamos la hipótesis nula. Hay una diferencia significativa en el valor promedio de casas cercanas versus lejanas.\n" + ] + } + ], + "source": [ + "\n", + "from scipy.stats import ttest_ind\n", + "\n", + "# Filtrado, si no se ha hecho\n", + "houses_close = df[df['close_to_school_or_hospital'] == True]\n", + "houses_far = df[df['close_to_school_or_hospital'] == False]\n", + "\n", + "# Realizar el t-test de dos muestras independientes\n", + "t_stat, p_value = ttest_ind(houses_close['median_house_value'], houses_far['median_house_value'])\n", + "\n", + "# Imprimir resultados\n", + "print(f\"T-statistic: {t_stat:.4f}, P-value: {p_value:.4f}\")\n", + "\n", + "# Inferencia\n", + "if p_value < 0.05:\n", + " print(\"Rechazamos la hipótesis nula. Hay una diferencia significativa en el valor promedio de casas cercanas versus lejanas.\")\n", + "else:\n", + " print(\"No se puede rechazar la hipótesis nula. No hay evidencia suficiente para afirmar que hay una diferencia en el valor promedio de casas cercanas versus lejanas.\")" + ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#Interpretación Resultados\n", + "#T-statistic y P-value:\n", + "\n", + "#El valor del T-statistic proporciona la magnitud de la diferencia relativa entre las medias de ambos grupos.\n", + "#El P-value mide la probabilidad de observar la diferencia entre las medias, suponiendo que no hay diferencia real (hipótesis nula)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Conclusión basada en P-value:\n", + "\n", + "#Si el P-value es inferior a 0.05, hay evidencia suficiente para rechazar la hipótesis nula y afirmar que las casas cercanas difieren significativamente en su valor medio respecto a aquellas más lejanas.\n", + "#Si el P-value es igual o superior a 0.05, no puedes concluir que haya una diferencia significativa." + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -512,9 +862,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.12.7" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 }