diff --git a/README.md b/README.md index bee93b5..0f03ddb 100644 --- a/README.md +++ b/README.md @@ -1 +1,108 @@ -# machine-learning-studies \ No newline at end of file +# Vem cá pra eu te explicar tudo que tá rolando nesse código 😄 😆 😊 😃 ☺️ + +As primeiras 4 linhas são de importações. + +Vamos entender o que essa função abaixo faz: Esta função é responsável pela limpeza e preparação dos dados. Ela se encaixa na parte de limpeza/padronização dos dados. Ela filtra os dados, reformula a tabela e combina duas fontes de dados diferentes em uma única tabela. + + +```python +def prepare_country_stats(oecd_bli, gdp_per_capita): + oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"] + oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value") + gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True) + gdp_per_capita.set_index("Country", inplace=True) + full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita, + left_index=True, right_index=True) + full_country_stats.sort_values(by="GDP per capita", inplace=True) + remove_indices = [0, 1, 6, 8, 33, 34, 35] + keep_indices = list(set(range(36)) - set(remove_indices)) + return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices] + +``` + +Agora, esta próxima parte: + +```python +import os +datapath = os.path.join("datasets", "lifesat", "") +``` + +Eu estou apenas definindo o caminho para os datasets que serão utilizados. Basicamente definindo onde os arquivos estão localizados. + +```python +%matplotlib inline +import matplotlib as mpl +mpl.rc('axes', labelsize=14) +mpl.rc('xtick', labelsize=12) +mpl.rc('ytick', labelsize=12) +``` + +Essas linhas de código configuram o ambiente para a visualização de gráficos. O %matplotlib inline é um comando específico do Jupyter Notebook que permite que os gráficos sejam exibidos diretamente no notebook. + +```python +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import sklearn.linear_model + + +oecd_bli = pd.read_csv(datapath + "oecd_bli_2015.csv", thousands=',') +gdp_per_capita = pd.read_csv(datapath + "gdp_per_capita.csv",thousands=',',delimiter='\t', + encoding='latin1', na_values="n/a") +``` + +Aqui estou importando as bibliotecas necessárias e lendo os dados dos arquivos CSV. Os parâmetros adicionais na leitura dos arquivos ajudam a tratar os dados corretamente, como o thousands=',' que define o separador de milhares e na_values="n/a" que define o que deve ser considerado como valor ausente. + +```python + +country_stats = prepare_country_stats(oecd_bli, gdp_per_capita) +X = np.c_[country_stats["GDP per capita"]] +y = np.c_[country_stats["Life satisfaction"]] + +``` + +Chamo a função `prepare_country_stats` para preparar os dados e, em seguida, cria as variáveis `X` e `y`, que serão usadas no modelo de regressão linear. X contém os dados de PIB per capita e y contém os dados de satisfação com a vida. + + +```python +country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction') +plt.show() +``` + +Criando um gráfico de dispersão para visualizar a relação entre o PIB per capita e a satisfação com a vida. + +```python +model = sklearn.linear_model.LinearRegression() +``` +Definindo modelo de regressão linear, que será usado para entender a relação entre as variáveis e fazer previsões. (vou explicar melhor isso no final, fica d boas) + +```python +model.fit(X, y) + +X_new = [[22587]] # Cyprus' GDP per capita +print(model.predict(X_new)) # outputs [[ 5.96242338]] + +``` + +FINALMENTE!Treino meu modelito com os dados (model.fit(X, y)) e faz uma previsão (model.predict(X_new)) para o PIB per capita de Chipre.( Poderia ser outro mas o querido do Livro que eu to lendo fez com esse testei com outros tbm) + +O PIB per capita pode ser interpretado como a “grana que a pessoa tem”, ou seja, é uma medida da riqueza econômica de um país dividida pelo número de habitantes. + + +## Um pouco bem pouco quase nada sobre regressão linear 🚎 + + +Em um modelo de regressão linear, a variável dependente é aquela que você tenta prever ou explicar, e a variável independente é aquela que você usa para fazer a previsão. No contexto do que estamos fazendo ficaria algo assim: + +A variável dependente é a ‘Life satisfaction’ (satisfação com a vida), pois é o que o modelo tentará prever. +A variável independente é o ‘GDP per capita’ (PIB per capita), pois é o preditor que você está usando para explicar as variações na satisfação com a vida. + +A ideia é que, ao analisar os dados, podemos usar o PIB per capita para prever a satisfação com a vida das pessoas em diferentes países. O modelo de regressão linear tentará encontrar a melhor linha reta (ou seja, a relação linear) que se ajusta aos dados de PIB per capita e satisfação com a vida, permitindo fazer previsões sobre a satisfação com a vida com base em novos valores de PIB per capita. + + + +### conclusao + +A linha no gráfico é chamada de linha de regressão. Ela é usada para mostrar a tendência geral dos dados. Neste caso, a linha de regressão mostra que, em geral, à medida que o PIB per capita aumenta, a satisfação com a vida também aumenta. + +tchauuu ateh o prox capitulo 🚕 diff --git a/aprendizado-online.png b/aprendizado-online.png new file mode 100644 index 0000000..aaf1429 Binary files /dev/null and b/aprendizado-online.png differ diff --git a/life-satis.ipynb b/life-satis.ipynb new file mode 100644 index 0000000..4592c1a --- /dev/null +++ b/life-satis.ipynb @@ -0,0 +1,158 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "36269cd4-d4d7-4893-87a0-de89e81f9d58", + "metadata": {}, + "outputs": [], + "source": [ + "# Python ≥3.5 is required\n", + "import sys\n", + "assert sys.version_info >= (3, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d440b64c-e639-4632-830f-d451bf335b91", + "metadata": {}, + "outputs": [], + "source": [ + "# Scikit-Learn ≥0.20 is required\n", + "import sklearn\n", + "assert sklearn.__version__ >= \"0.20\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "51471b9f-2d2a-468c-95a0-addf6ce53676", + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_country_stats(oecd_bli, gdp_per_capita): \n", + " oecd_bli = oecd_bli[oecd_bli[\"INEQUALITY\"]==\"TOT\"]\n", + " oecd_bli = oecd_bli.pivot(index=\"Country\", columns=\"Indicator\", values=\"Value\")\n", + " gdp_per_capita.rename(columns={\"2015\": \"GDP per capita\"}, inplace=True)\n", + " gdp_per_capita.set_index(\"Country\", inplace=True)\n", + " full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita,\n", + " left_index=True, right_index=True)\n", + " full_country_stats.sort_values(by=\"GDP per capita\", inplace=True)\n", + " remove_indices = [0, 1, 6, 8, 33, 34, 35]\n", + " keep_indices = list(set(range(36)) - set(remove_indices))\n", + " return full_country_stats[[\"GDP per capita\", 'Life satisfaction']].iloc[keep_indices]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "290d168a-3079-4de0-8335-9ffbe71a0355", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "datapath = os.path.join(\"datasets\", \"lifesat\", \"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "130e9302-144d-45c1-96d4-49b94967e073", + "metadata": {}, + "outputs": [], + "source": [ + "# To plot pretty figures directly within Jupyter\n", + "%matplotlib inline\n", + "import matplotlib as mpl\n", + "mpl.rc('axes', labelsize=14)\n", + "mpl.rc('xtick', labelsize=12)\n", + "mpl.rc('ytick', labelsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e43964ec-2840-43e1-83a1-1159c5fd949e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAG5CAYAAABm74t6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFyElEQVR4nO3deXxU9b3/8fdkYZIQJkASVkMWgoCKEGqgwGUVWVTEShQBRVFbtBWsSq3UW0ERua1FqlRRbAW1Ciq2br2iYgmbIFAIKAqGQABZE5ZMSEhCku/vD3+Zy5CFyTCTTHJez8djHj7me77nm885kzBvz/a1GWOMAAAALCSovgsAAACoawQgAABgOQQgAABgOQQgAABgOQQgAABgOQQgAABgOQQgAABgOSH1XUCgKi8v16FDh9SsWTPZbLb6LgcAAHjAGKP8/Hy1a9dOQUHVH+chAFXj0KFDiouLq+8yAACAFw4cOKBLLrmk2uUEoGo0a9ZM0o870OFw1HM1AADAE06nU3Fxca7v8eoQgKpRcdrL4XAQgAAAaGAudPkKF0EDAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLCbgAdOedd8pms1X7OnjwYLXrzpw5s8p1wsLC6nALAABAoAu4qTAmT56soUOHurUZY3TvvfcqISFB7du3v+AYCxYsUGRkpOt9cHCwz+sEAKC+7Mk5rX0nCpUQ3VSJMU193t8KAi4A9enTR3369HFrW7t2rQoLCzVhwgSPxkhLS1NMTIw/ygMAoN6cKizR1CUZWp2Z42ob0ClW88elKCoi9KL7W0nAnQKryltvvSWbzabx48d71N8YI6fTKWOMnysDAKDuTF2SoXW7c93a1u3O1ZQlW33S30oCPgCdPXtW77zzjvr27auEhASP1klKSlJUVJSaNWum2267TUePHr3gOsXFxXI6nW4vAAACxZ6c01qdmaOy8/7nvswYrc7M0d7cgovqbzUBdwrsfJ9++qmOHz/u0emvFi1a6P7771efPn1kt9u1Zs0avfDCC9q4caM2b94sh8NR7bpz5szRE0884cvSAQDwmX0nCmtcnn28wO36ntr2t5qAD0BvvfWWQkNDdcstt1yw7wMPPOD2fsyYMerVq5cmTJigF198UY8++mi1606fPl0PPfSQ673T6VRcXJz3hQMA4EPxLSNqXJ4Q7R5matvfagL6FNjp06f1wQcfaPjw4YqOjvZqjPHjx6tNmzZasWJFjf3sdrscDofbCwCAQJEUG6kBnWIVbLO5tQfbbBrQKbbS0Zza9reagA5A77//fq3u/qpOXFycTpw44aOqAACoH/PHpahfsvtdzv2SYzR/XIpP+luJzQTwrVIjR47U2rVrdfToUUVE1HworzrGGLVu3VopKSn69NNPPV7P6XQqKipKeXl5HA0CAASUvbkFyj5e4PFzfWrbvyHz9Ps7YK8BysnJ0YoVKzRu3Lgqw8/+/ftVWFioLl26uK0TGxvr1m/BggXKycnRiBEj/F4zAAB1ITGmdkGmtv2tIGAD0Ntvv63S0tJqT39NnDhRq1atcnvWT3x8vMaOHatu3bopLCxMa9eu1dKlS9WjRw9Nnjy5rkoHAAABLmAD0JtvvqlWrVpVmhajJhMmTNCXX36p9957T0VFRYqPj9cjjzyixx57zOtTaAAAoPEJ6GuA6hPXAAHwFavPw2T17UfdavDXAAFAQ2f1eZisvv0IbAF9GzwANGRWn4fJ6tuPwEYAAgA/sPo8TFbffgQ+AhAA+IEn8zA1ZlbffgQ+AhAA+IHV52Gy+vYj8BGAAMAPrD4Pk9W3H4GPAAQAfmL1eZisvv0IbDwHqBo8BwiAr1hpHqaqWH37Ubd4DhAABAirz8Nk9e1HYOIUGAAAsBwCEAAAsBwCEAAAsByuAQKAAGfFyUQrtjnYZlOZMZbadk9Z8ffClwhAABCgrDiZaFXbXKGxb7unrPh74Q+cAgOAAGXFyUSr2uYKjX3bPWXF3wt/IAABQACy4mSi1W1zhca87Z6y4u+FvxCAACAAWXEy0Qttc4XGuO2esuLvhb8QgAAgAFlxMtELbXOFxrjtnrLi74W/EIAAIABZcTLR6ra5QmPedk9Z8ffCXwhAABCgrDiZaFXbXKGxb7unrPh74Q9MhloNJkMFECisOJloxTaHBNlUWs5zgKpixd8LT3j6/U0AqgYBCACAhsfT729OgQEAAMshAAEAAMthKgwAAAKIFeb4CoRtJAABABAArDDHVyBtI6fAAAAIAFaY4yuQtpEABABAPbPCHF+Bto0EIAAA6pkV5vgKtG0kAAEAUM+sMMdXoG0jAQgAgHpmhTm+Am0bCUAAAAQAK8zxFUjbyFQY1WAqDABAfbDCHF/+3EZPv795DhAAAAEkMabxBp8KgbCNnAIDAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWQwACAACWE3AB6M4775TNZqv2dfDgwRrXP3jwoG655RY1b95cDodDo0eP1p49e+qoegAA0BDYjDGmvos41/r165WVleXWZozRvffeq4SEBO3YsaPadU+fPq2ePXsqLy9PDz/8sEJDQzVv3jwZY5SRkaHo6GiP63A6nYqKilJeXp4cDofX2wMAjdWenNPad6JQCdFNlRjTtL7LsTw+jx95+v0dUoc1eaRPnz7q06ePW9vatWtVWFioCRMm1Ljuiy++qMzMTG3cuFGpqamSpJEjR+qKK67Q3Llz9fTTT/utbgCwilOFJZq6JEOrM3NcbQM6xWr+uBRFRYTWY2XWxOfhnYA7BVaVt956SzabTePHj6+x37Jly5SamuoKP5LUpUsXXX311XrnnXf8XSYAWMLUJRlatzvXrW3d7lxNWbK1niqyNj4P7wR8ADp79qzeeecd9e3bVwkJCdX2Ky8v1/bt23XVVVdVWtarVy9lZWUpPz+/2vWLi4vldDrdXgAAd3tyTmt1Zo7Kzrt6oswYrc7M0d7cgnqqzJr4PLwX8AHo008/1fHjxy94+uvEiRMqLi5W27ZtKy2raDt06FC168+ZM0dRUVGuV1xc3MUVDgCN0L4ThTUuzz7OF25d4vPwXsAHoLfeekuhoaG65ZZbaux35swZSZLdbq+0LCwszK1PVaZPn668vDzX68CBAxdRNQA0TvEtI2pcnhBt3Ytv6wOfh/cCOgCdPn1aH3zwgYYPH37BO7jCw8Ml/Xgq63xFRUVufapit9vlcDjcXgAAd0mxkRrQKVbBNptbe7DNpgGdYi1991F94PPwXkAHoPfff9+ju78kqWXLlrLb7Tp8+HClZRVt7dq183mNAGA188elqF9yjFtbv+QYzR+XUk8VWRufh3cC7jlA5xo5cqTWrl2ro0ePKiKi5sN8kpSamiqbzaaNGze6tQ8bNkxZWVmVni9UE54DBAA125tboOzjBZZ/7kyg4PP4kaff3wF7BCgnJ0crVqzQz372syrDz/79+7Vz5063trS0NG3atEmbN292te3atUv//ve/dfPNN/u9ZgCwksSYphrcuZWlv2wDCZ9H7QRsAHr77bdVWlpa7emviRMnqmvXrm5tv/zlL9WxY0ddd911euaZZ/TnP/9Z11xzjVq3bq2HH364LsoGAAANQMA9CbrCm2++qVatWmno0KEer9OsWTOlp6frwQcf1FNPPaXy8nINGjRI8+bNU2xsrB+rBQAADUlAXwNUn7gGCACAhqfBzgUGAAgMgTK5ZqDUgcaFAAQAcBMok2sGSh1onAL2ImgAQP0IlMk1A6UONE4EIACAS6BMrhkodaDxIgABAFwCZXLNQKkDjRcBCADgEiiTawZKHWi8CEAAAJdAmVwzUOpA40UAAgC4CZTJNQOlDjROPAixGjwIEYDVBcrkmoFSBxoGHoQIALgoiTGBETgCpQ40LpwCAwAAlkMAAgAAlsMpMABAwGM+MPgaAQgAELCYDwz+wikwAEDAYj4w+AsBCAAQkJgPDP5EAAIABCTmA4M/EYAAAAGJ+cDgTwQgAEBAYj4w+BMBCAAQsJgPDP7CbfAAgIAVFRGq1+/uxXxg8DkCEAAg4DEfGHyNU2AAAMByLuoIUGlpqXbt2qVTp06prKysyj4DBgy4mB8BAADgc14FIGOMHn/8cc2fP1/5+fk19q0uGAEAANQXrwLQrFmzNHv2bDVv3lwTJ07UJZdcopAQLicCAAANg1ep5dVXX1V8fLw2b96s6OhoX9cEAADgV15dBH3kyBHdeOONhB8AANAgeRWAEhMT5XQ6fV0LAABAnfAqAN133336+OOPdezYMV/XAwAA4HdeXQM0evRorVmzRn379tXjjz+unj17yuFwVNm3Q4cOF1UgAACAr9mMMaa2KwUFBclms8kYI9t5k9S5DW6zqbS09KIKrC9Op1NRUVHKy8urNtwBAIDA4un3t1dHgCZOnFhj8AEAAAhkXgWgxYsX+7gMAACAusNcYAAAwHIu+vHN69atU0ZGhpxOpxwOh3r06KF+/fr5ojYAAAC/8DoAffnll5o0aZJ2794tSW4XRHfq1EmLFi1Snz59fFMlAACAD3kVgHbs2KFhw4apsLBQ11xzjQYPHqy2bdvqyJEjWrlypT777DMNHz5cGzZs0GWXXebrmgEAAC6KV7fBjx07Vv/85z/14YcfasSIEZWWL1++XDfccINuuukmLV261CeF1jVugwcAoOHx9Pvbq4ug09PTlZaWVmX4kaQRI0YoLS1NK1eu9GZ4AAAAv/IqAOXl5SkxMbHGPomJicrLy/OqKAAAAH/yKgC1a9dOGzZsqLHPV199pXbt2nlVFAAAgD95FYBuuOEGpaen6/e//72KiorclhUVFWnGjBlauXKlRo8e7ZMiAQAAfMmri6CPHz+u3r17a+/evYqOjlavXr3UunVrHT16VJs2bVJOTo6SkpK0ceNGtWzZ0h91+x0XQQMA0PB4+v3tVQCSpNzcXD3yyCNaunSp21GgsLAwjRs3Tn/4wx8UExPjzdABgQAEAEDD4/cAVOHs2bPauXOn60nQXbp0UWho6MUMGRAIQAAANDx+nQ3+XKGhoerWrdvFDgMAAFBnmAwVAABYjkdHgIYMGSKbzabXXntNl1xyiYYMGeLR4DabTV988YVXhW3ZskUzZ87U2rVrVVRUpKSkJP3iF7/Q1KlTq11n5syZeuKJJyq12+32SnerAQAA6/IoAKWnp8tms6mwsND13hMVk6PW1meffaZRo0YpJSVFv//97xUZGamsrCz98MMPHq2/YMECRUZGut4HBwd7VQfQWO3JOa19JwqVEN1UiTFN67sceInPEfCeRwGovLy8xve+5HQ6NXHiRF133XVatmyZgoJqf5YuLS2tQd+BBvjLqcISTV2SodWZOa62AZ1iNX9ciqIiGv7NC1bB5whcvIC7Buitt97S0aNHNXv2bAUFBamgoKDWgcsYI6fTqYu8wQ1odKYuydC63blubet252rKkq31VBG8wecIXDyvAtBdd92lDz/8sMY+H3/8se66665aj71ixQo5HA4dPHhQnTt3VmRkpBwOh+677z6Pr+NJSkpSVFSUmjVrpttuu01Hjx694DrFxcVyOp1uL6Ax2ZNzWqszc1R23v8YlBmj1Zk52ptbUE+VoTb4HAHf8CoALV68WBkZGTX22bZtm1577bVaj52ZmanS0lKNHj1aw4cP13vvvae77rpLL730kiZNmlTjui1atND999+vl19+WcuWLdM999yjt99+W/37979goJkzZ46ioqJcr7i4uFrXDgSyfScKa1yefZwvzoaAzxHwjYt+DlB1ioqKFBJS++FPnz6twsJC3XvvvXr++eclSTfddJNKSkr08ssv68knn1SnTp2qXPeBBx5wez9mzBj16tVLEyZM0IsvvqhHH3202p87ffp0PfTQQ673TqeTEIRGJb5l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vj4CxASgQM34GwHgC55+f3v9JOj8/HzNmTNHV199tbp27aqkpKRKr44dO9Z63BUrVsjhcOjgwYPq3LmzIiMj5XA4dN9996moqKja9crLy7V9+3ZdddVVlZb16tVLWVlZys/Pr3U9vlLTBKAA+BsBULe8OgWWk5Ojvn37KisrSw6Hw5W2SkpKdObMGUlSu3btvHoOUGZmpkpLSzV69GjdfffdmjNnjtLT0zV//nydOnVKS5YsqXK9EydOqLi4WG3btq20rKLt0KFD6ty5c5XrFxcXq7i42PXe6XTWuvbqVEwAer5zJwDlUD+sjL8RAHXNqyNAM2fOVFZWll5//XWdPHlSkvTggw+qoKBAX331lXr16qWEhATt2LGj1mOfPn1ahYWFmjhxop5//nnddNNNev755zV58mQtXbpUmZmZVa5XEbzsdnulZWFhYW59qjJnzhxFRUW5XnFxcbWuvTqeTAAKWBl/IwDqmlcB6H//93919dVX67bbbqv0bKDU1FR98sknys7O1hNPPFHrscPDwyVJ48aNc2sfP368JGn9+vU1rnfuUZwKFafOKvpUZfr06crLy3O9Dhw4UOvaq8MEoEDN+BsBUNe8CkCHDx9WSsr/zdsUHBzsdnSlRYsWGjlypN55551aj92uXTtJUuvWrd3aW7VqJUmuI07na9mypex2uw4fPlxlveeOXRW73S6Hw+H28hUmAAVqxt8IgLrmVQCKiorS2bNnXe9btGihH374wa2Pw+HQ0aNHaz32T37yE0k/PtDwXIcOHZIkxcbGVrleUFCQunXrps2bN1da9tVXXykpKUnNmjWrdT2+wgSgQM34GwFQl7y6CDopKcltNviUlBR9/vnnOn78uKKjo3XmzBl99NFH6tChQ63HvuWWW/Q///M/+tvf/qYhQ4a42v/6178qJCREgwYNkvTj3GSFhYXq0qWLq09aWpoeffRRbd682XU32K5du/Tvf/9b06ZN82ZTfYYJQIGa8TcCoC55FYCGDRumefPmqbCwUBEREZo8ebLS0tLUvXt39enTR1u2bFF2drZmz55d67FTUlJ011136dVXX1VpaakGDhyo9PR0vfvuu5o+fbrrNNbEiRO1atUqnfsYo1/+8pd65ZVXdN1112natGkKDQ3Vs88+q9atWwfMnGRMAArUjL8RAHXCeOHQoUNm6dKlJicnx9X2pz/9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+utaFwMAAFAXPA5Ay5cvr/XgtvPu3PFEenq6Bg8eXOWy9evX66c//Wm1686cOVNPPPFEpXa73a6ioqJa1wIAABonjwPQ3r17/VlHJVOnTlVqaqpbW3JyskfrLliwQJGRka73wcHBPq0NAAA0bB4HoPj4eH/WUUn//v2Vlpbm1bppaWmKiYm5cEcAAGBJAX0RdH5+vkpLS2u9njFGTqdTHkx0DwAALChgA9CkSZPkcDgUFhamwYMHa/PmzR6vm5SUpKioKDVr1ky33Xabjh49esF1iouL5XQ63V4AAKBxCrjnADVp0kRjxozRtddeq5iYGH377bf605/+pP79++vLL79USkr1T/9t0aKF7r//fvXp00d2u11r1qzRCy+8oI0bN2rz5s1yOBzVrjtnzpwqL6AGAACNj800gPNEu3fv1pVXXqkBAwbU+m60t956SxMmTNCcOXP06KOPVtuvuLhYxcXFrvdOp1NxcXHKy8urMTgBAIDA4XQ6FRUVdcHv74A9BXau5ORkjR49WitXrlRZWVmt1h0/frzatGmjFStW1NjPbrfL4XC4vQAAQOPUIAKQJMXFxamkpEQFBQVerXvixAk/VAUAABqiBhOA9uzZo7CwMLfn+3jCGKPs7GzFxsb6qTIAANDQBFwAysnJqdS2bds2ffjhhxo2bJiCgn4sef/+/dq5c+cF112wYIFycnI0YsQI/xQMAAAanIC7CHrIkCEKDw9X37591apVK3377bdauHChQkNDtX79enXt2lWSNGjQIK1atcrtWT8REREaO3asunXrprCwMK1du1ZLly5V9+7dtW7dOkVERHhch6cXUQEAgMDh6fd3wN0Gf+ONN+rNN9/Us88+K6fTqdjYWN10002aMWPGBafCmDBhgr788ku99957KioqUnx8vB555BE99thjtQo/AACgcQu4I0CBgiNAAAA0PI3qNngAAABfIgABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADLIQABAADL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/Xx/jNnQHDt2rFJbRkaGCQ0NNTfccIOrjf0fuAhAF2H+/Plm1qxZ5r777jOSzE033WRmzZplZs2aZU6dOmWMMWb//v0mOjradOzY0Tz//PPm6aefNi1atDDdunUzRUVFbuP95je/MZLML37xC/PKK6+4nlr75ptvuvXzx5gNzQMPPGAkmVGjRlV6Cusbb7zh6sf+948bb7zRDBkyxMycOdP1JO4uXboYSWbu3Lmufuz/ulXVgxD/85//GLvd7vbU4LCwMDNs2LBK6998882uZ8y8/PLLpm/fviYkJMSsWrXK72M2NIMHDzbXXnuteeqpp8zChQvNr3/9axMREWGioqLMt99+6+rH/g9cBKCLEB8fbyRV+dq7d6+r3zfffGOGDRtmIiIiTPPmzc2ECRPMkSNHKo1XVlZmnn76aRMfH2+aNGliLr/8cvP3v/+9yp/tjzEbkoEDB1a7788/sMn+970lS5aYoUOHmtatW5uQkBDTokULM3ToUPPBBx9U6sv+rztVBSBjjFmzZo3p27evCQsLM7GxseZXv/qV29GDCmfOnDHTpk0zbdq0MXa73aSmpprly5dX+bP8MWZD8txzz5levXqZli1bmpCQENO2bVtz2223mczMzEp92f+ByWbMeVcIAgAANHJcBA0AACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQADdTMmTNls9mUnp5e36UADQ4BCGjkMjIydO+99+qyyy6Tw+FQkyZN1KZNG11zzTWaO3eucnJyKq1js9ncXuHh4WrTpo3+67/+S9OmTdO2bduq/FnZ2dmV1m3SpIni4uI0fvx4bd++3d+ba3kVn8Gdd95Z36UAAY25wIBGqry8XI888ojmzp2r4OBgDRgwQFdeeaWaNm2qY8eOaf369dqxY4eaNm2qXbt2qX379q51bTaboqOjdf/990uSzp49q9zcXG3dulWbNm2SJN1111168cUXZbfbXetlZ2crMTFRHTt21G233SZJOn36tDZs2KB169bJbrfriy++UL9+/epwTzReubm5ys3NVYcOHRQRESHp/z6DO+64Q4sXL67fAoEAFlLfBQDwj8cee0xz585Vz5499fbbbys5OblSny1btui3v/2tzpw5U2lZTEyMZs6cWan9m2++0e23365XX31VJSUleuONNyr1SU5OrrTuf//3f2v27Nl67LHHOGXjIzExMYqJianvMoAGiVNgQCP0/fff65lnnlFsbKyWL19eZfiRpJ49e+rzzz9XQkKCx2NfccUV+uyzzxQbG6u///3v2rhxo0frTZkyRZJcR5BqsnjxYtlsNi1evFgffPCBevXqpYiICMXGxuquu+7S0aNHq1xv7969uueee9ShQwfZ7Xa1bdtWd955p/bt21epr81m06BBg3Tw4EFNnDhRbdq0UVBQkEfhrKSkRPPmzVNqaqqaNWumyMhIXXbZZXrooYd08uRJV7+VK1fqrrvuUufOnRUZGanIyEhdddVVWrhwYZXjVtT0ww8/aNy4cYqJiVFERIT69eunFStWVOp//jVAixcvVmJioiTptddeczsVWdHn0KFDmjFjhn7605+qVatWstvtSkhI0C9/+UsdO3bsgtsONBYcAQIaoddee01lZWWaPHmyYmNjL9g/JKR2/xTExsbq3nvv1axZs/T222+rV69eHq9rs9k87vvee+/p008/VVpamoYOHaoNGzZo0aJFWrNmjTZu3KgWLVq4+n711VcaPny4CgoKdP3116tTp07Kzs7Wm2++qU8++UTr169XUlKS2/jHjx9Xnz591LJlS916660qKiqSw+GosaYzZ87ommuu0bp169SpUydNmjRJdrtdmZmZevnllzVx4kRXXX/4wx+0e/du/fSnP9XPfvYznTp1SsuXL9fkyZO1a9cuzZ07t9L4J0+eVL9+/RQbG6t77rlHOTk5evvttzVixAgtW7ZMN954Y7W19ejRQw888ICee+45de/e3a1vRchdvXq15s6dq6uvvlq9e/dWaGiotm7dqgULFujTTz/Vli1bFBUVdYFPBmgEDIBGZ/DgwUaS+eKLL7xaX5Lp3LlzjX2++OILI8n079/f1bZ3714jyQwfPrxS/8cff9xIMoMHD77gz1+0aJGRZCSZ5cuXuy179NFHjSRz//33u9pKSkpMQkKCadasmdmyZYtb/zVr1pjg4GBz/fXXV9pGSWbSpEmmtLT0gjVVePjhh40kc/vtt1da79SpUyY/P9/1fs+ePZXWP3v2rLnmmmtMcHCw2bdvX5U1jR8/3pSXl7vat23bZpo0aWJiY2NNYWGhq33GjBlGklm5cqWrreIzuOOOO6qs/+jRo241VnjttdeMJPPUU0/VuP1A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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[5.96242338]]\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import sklearn.linear_model\n", + "\n", + "# Load the data\n", + "oecd_bli = pd.read_csv(datapath + \"oecd_bli_2015.csv\", thousands=',')\n", + "gdp_per_capita = pd.read_csv(datapath + \"gdp_per_capita.csv\",thousands=',',delimiter='\\t',\n", + " encoding='latin1', na_values=\"n/a\")\n", + "\n", + "# Prepare the data\n", + "country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)\n", + "X = np.c_[country_stats[\"GDP per capita\"]]\n", + "y = np.c_[country_stats[\"Life satisfaction\"]]\n", + "\n", + "# Visualize the data\n", + "country_stats.plot(kind='scatter', x=\"GDP per capita\", y='Life satisfaction')\n", + "plt.show()\n", + "\n", + "# Select a linear model\n", + "model = sklearn.linear_model.LinearRegression()\n", + "\n", + "# Train the model\n", + "model.fit(X, y)\n", + "\n", + "# Make a prediction for Cyprus\n", + "X_new = [[22587]] # Cyprus' GDP per capita\n", + "print(model.predict(X_new)) # outputs [[ 5.96242338]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5419dd5b-3959-4bfb-a56f-cf31352a7056", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}