Skip to content

Instantly share code, notes, and snippets.

@sachith-gunasekara
Last active March 9, 2023 15:51
Show Gist options
  • Save sachith-gunasekara/17ab7d1712a2885ce20dfd3fc5bbceb4 to your computer and use it in GitHub Desktop.
Save sachith-gunasekara/17ab7d1712a2885ce20dfd3fc5bbceb4 to your computer and use it in GitHub Desktop.
Introduction to Linear Regression.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyNrOqxYYvVJhf99a0T5t32X",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/sachith-gunasekara/17ab7d1712a2885ce20dfd3fc5bbceb4/01-com-towardsdatascience-intro-to-lr.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# Introduction to Linear Regression in Python\n",
"\n",
"## Overview\n",
"\n",
"This notebook is based on the article [\"Introduction to Linear Regression in Python\"](https://towardsdatascience.com/introduction-to-linear-regression-in-python-c12a072bedf0) by [Lorraine Li](https://medium.com/@lorrli), which provides an introduction to linear regression analysis in Python using the Scikit-learn library.\n",
"\n",
"The purpose of this notebook is to provide a step-by-step guide on implementing linear regression in Python, as well as to demonstrate some of the key concepts and techniques involved in the analysis.\n",
"\n",
"## About the Author\n",
"\n",
"[Lorraine Li](https://medium.com/@lorrli) is a data scientist and writer with several years of experience in the field.\n",
"\n",
"In addition to the article on linear regression, the author has written several other articles on data science and machine learning, and has contributed to a number of open-source projects.\n",
"\n",
"## About the Article\n",
"\n",
"The article \"Introduction to Linear Regression in Python\" provides a comprehensive overview of linear regression analysis in Python, covering topics such as:\n",
"\n",
"- Understanding linear regression\n",
"- Preparing data for analysis\n",
"- Building a linear regression model\n",
"- Evaluating model performance\n",
"\n",
"The article also includes code examples and visualizations to help readers understand the concepts and techniques involved in linear regression analysis.\n",
"\n",
"## Notebook Structure\n",
"\n",
"This notebook follows the structure of the article, with each section corresponding to a step in the linear regression analysis process. The code examples and visualizations in this notebook are based on the code provided in the article, with some additional explanations and commentary added for clarity.\n",
"\n",
"## Conclusion\n",
"\n",
"Linear regression is a fundamental technique in data science and machine learning, and is used to model the relationship between a dependent variable and one or more independent variables. By following the steps outlined in this notebook and the accompanying article, readers should be able to gain a solid understanding of linear regression analysis in Python, and be able to apply this technique to their own data analysis projects.\n"
],
"metadata": {
"id": "2khR6OUnnevD"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "h-g3LVQorjOZ"
},
"outputs": [],
"source": [
"# import required libraries\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"source": [
"# set random seed for reproducible data\n",
"\n",
"seed = 0\n",
"np.random.seed(seed)\n",
"\n",
"# Generate random data\n",
"\n",
"X = 2.5 * np.random.randn(100) + 1.5\n",
"res = 0.5 * np.random.randn(100)\n",
"\n",
"alpha, beta = 2, 0.3\n",
"y = alpha + beta * X + res"
],
"metadata": {
"id": "ruZExLDUsii-"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Create a pandas dataframe for the generated data\n",
"\n",
"df = pd.DataFrame({\n",
" 'X': X,\n",
" 'y': y\n",
"})"
],
"metadata": {
"id": "paEbsCSHt9iH"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# List the top rows of the dataframe\n",
"\n",
"df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "d9xrjONfuIpB",
"outputId": "eb3b63ea-4fcc-4517-e23e-c286793ee418"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" X y\n",
"0 5.910131 4.714615\n",
"1 2.500393 2.076238\n",
"2 3.946845 2.548811\n",
"3 7.102233 4.615368\n",
"4 6.168895 3.264107"
],
"text/html": [
"\n",
" <div id=\"df-d339340a-895e-483f-be33-0290fb05c503\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>X</th>\n",
" <th>y</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5.910131</td>\n",
" <td>4.714615</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2.500393</td>\n",
" <td>2.076238</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3.946845</td>\n",
" <td>2.548811</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>7.102233</td>\n",
" <td>4.615368</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6.168895</td>\n",
" <td>3.264107</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d339340a-895e-483f-be33-0290fb05c503')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-d339340a-895e-483f-be33-0290fb05c503 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-d339340a-895e-483f-be33-0290fb05c503');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 22
}
]
},
{
"cell_type": "markdown",
"source": [
"##Calculating the alpha and beta values manually without using any libraries"
],
"metadata": {
"id": "LCKNp-lrvDre"
}
},
{
"cell_type": "code",
"source": [
"# Calculate the mean of X and y\n",
"\n",
"X_mean = X.mean()\n",
"y_mean = y.mean()"
],
"metadata": {
"id": "wO8tQB7PuPvS"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Calculate the covariance and variance\n",
"\n",
"X_y_cov = ((df['X'] - X_mean) * (df['y'] - y_mean)).sum()\n",
"\n",
"X_var = ((df['X'] - X_mean) ** 2).sum()"
],
"metadata": {
"id": "1oqXUslsvr0N"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Calculate beta and alpha\n",
"\n",
"beta_est = X_y_cov / X_var\n",
"alpha_est = y_mean - beta * X_mean\n",
"\n",
"print(f\"alpha: {alpha_est}\")\n",
"print(f\"beta: {beta_est}\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "u9mDIl7LxMvn",
"outputId": "6b8c0585-196a-4d2e-d9e0-f06617e75eaf"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"alpha: 2.0410064853739187\n",
"beta: 0.3229396867092763\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"y_pred = alpha_est + beta_est * X\n",
"\n",
"y_pred"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZuERJoSfyhI8",
"outputId": "447f6fd2-91f5-4ad8-9306-db1f0c1e2c02"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([3.9496223 , 2.84848262, 3.31559936, 4.33459938, 4.0331875 ,\n",
" 1.73641148, 3.29246916, 2.40321789, 2.44208236, 2.85691239,\n",
" 2.64170948, 3.69952259, 3.13983923, 2.62365024, 2.88376865,\n",
" 2.79480772, 3.73165958, 2.35978165, 2.77817098, 1.83586249,\n",
" 0.46426169, 3.05311448, 3.2233179 , 1.92622967, 4.35790063,\n",
" 1.35123503, 2.56235912, 2.37429328, 3.76290411, 3.71170167,\n",
" 2.6505127 , 2.83072523, 1.80866289, 0.92622154, 2.24452941,\n",
" 2.65164423, 3.51869023, 3.49615644, 2.21270801, 2.28135213,\n",
" 1.6788676 , 1.37896565, 1.14786011, 4.100373 , 2.11394873,\n",
" 2.17173707, 1.51397266, 3.15312225, 1.22243685, 2.35366032,\n",
" 1.80246179, 2.83778144, 2.11301789, 1.57223355, 2.50266312,\n",
" 2.87122942, 2.57911864, 2.76961647, 2.01329657, 2.23255722,\n",
" 1.9825056 , 2.23513105, 1.868923 , 1.13170311, 2.66866087,\n",
" 2.20103849, 1.20927666, 2.89904291, 1.79290939, 2.56735409,\n",
" 3.11404671, 2.62955027, 3.44531027, 1.52848036, 2.85024622,\n",
" 1.97253512, 1.82237862, 2.05808219, 2.27388432, 2.57076106,\n",
" 1.5847332 , 3.25269757, 2.90136822, 1.28513088, 3.72695526,\n",
" 4.05606066, 3.47710278, 2.38015384, 1.66094473, 3.37672679,\n",
" 2.19991142, 3.51235609, 2.69356666, 3.31390478, 2.81312815,\n",
" 3.09586731, 2.5338932 , 3.96723716, 2.62787839, 2.84996181])"
]
},
"metadata": {},
"execution_count": 26
}
]
},
{
"cell_type": "code",
"source": [
"# Plot regression vs actual data\n",
"\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"plt.plot(X, y_pred)\n",
"plt.plot(X, y, \"ro\")\n",
"\n",
"plt.title(\"Actual vs Predicted\")\n",
"plt.xlabel(\"X\")\n",
"plt.ylabel(\"y\")\n",
"\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 404
},
"id": "X_f3ExgiyqN-",
"outputId": "a16f1bec-1b2e-4d44-b41b-6b48a540e68f"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"#Linear Regression with Statsmodels"
],
"metadata": {
"id": "sPBS42JzMCkm"
}
},
{
"cell_type": "code",
"source": [
"import os\n",
"from urllib.request import urlopen\n",
"\n",
"parentDir = \"/content\"\n",
"dataDir = os.path.join(parentDir, \"data\")\n",
"\n",
"if not os.path.exists(dataDir):\n",
" os.mkdir(dataDir)\n",
"\n",
"!wget https://raw.githubusercontent.com/justmarkham/scikit-learn-videos/master/data/Advertising.csv -O data/Advertising.csv"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "gk-dwkkwAk8j",
"outputId": "09723462-6767-460e-98cb-61682df6f8ea"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"--2023-02-22 08:08:03-- https://raw.githubusercontent.com/justmarkham/scikit-learn-videos/master/data/Advertising.csv\n",
"Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.109.133, ...\n",
"Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 4555 (4.4K) [text/plain]\n",
"Saving to: ‘data/Advertising.csv’\n",
"\n",
"\rdata/Advertising.cs 0%[ ] 0 --.-KB/s \rdata/Advertising.cs 100%[===================>] 4.45K --.-KB/s in 0s \n",
"\n",
"2023-02-22 08:08:03 (57.8 MB/s) - ‘data/Advertising.csv’ saved [4555/4555]\n",
"\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"data = pd.read_csv(os.path.join(dataDir, \"Advertising.csv\"))\n",
"\n",
"data.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "VZglfEUaI7Nb",
"outputId": "d4eec6fc-c65e-45e8-edcb-ed2a3ff8c319"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Unnamed: 0 TV Radio Newspaper Sales\n",
"0 1 230.1 37.8 69.2 22.1\n",
"1 2 44.5 39.3 45.1 10.4\n",
"2 3 17.2 45.9 69.3 9.3\n",
"3 4 151.5 41.3 58.5 18.5\n",
"4 5 180.8 10.8 58.4 12.9"
],
"text/html": [
"\n",
" <div id=\"df-211a1f45-0267-4ff6-8247-03b0ddb4cde0\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Unnamed: 0</th>\n",
" <th>TV</th>\n",
" <th>Radio</th>\n",
" <th>Newspaper</th>\n",
" <th>Sales</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>230.1</td>\n",
" <td>37.8</td>\n",
" <td>69.2</td>\n",
" <td>22.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>44.5</td>\n",
" <td>39.3</td>\n",
" <td>45.1</td>\n",
" <td>10.4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>17.2</td>\n",
" <td>45.9</td>\n",
" <td>69.3</td>\n",
" <td>9.3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>151.5</td>\n",
" <td>41.3</td>\n",
" <td>58.5</td>\n",
" <td>18.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>180.8</td>\n",
" <td>10.8</td>\n",
" <td>58.4</td>\n",
" <td>12.9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-211a1f45-0267-4ff6-8247-03b0ddb4cde0')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-211a1f45-0267-4ff6-8247-03b0ddb4cde0 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-211a1f45-0267-4ff6-8247-03b0ddb4cde0');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 29
}
]
},
{
"cell_type": "code",
"source": [
"import statsmodels.formula.api as smf\n",
"\n",
"model = smf.ols('Sales ~ TV', data=data)\n",
"model = model.fit()\n",
"\n",
"model.params"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bME4v3i2JNDk",
"outputId": "c3fab14e-266d-4983-b3e9-1f3117336faf"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Intercept 7.032594\n",
"TV 0.047537\n",
"dtype: float64"
]
},
"metadata": {},
"execution_count": 35
}
]
},
{
"cell_type": "code",
"source": [
"sales_pred = model.predict()\n",
"\n",
"plt.figure(figsize=(12, 6))\n",
"plt.plot(data['TV'], data['Sales'], 'o')\n",
"plt.plot(data['TV'], sales_pred, 'r')\n",
"plt.title(\"TV vs Sales\")\n",
"plt.xlabel(\"TV\")\n",
"plt.ylabel(\"Sales\")\n",
"\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 404
},
"id": "xlN7acS8NOTX",
"outputId": "ea913202-dfea-4f48-f5c2-27793375c0f4"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 864x432 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"new_X = 400\n",
"model.predict({\"TV\": new_X})"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ThTe-D23N5bP",
"outputId": "a47239ec-82ba-4aca-ef04-b6136b3a50cf"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 26.04725\n",
"dtype: float64"
]
},
"metadata": {},
"execution_count": 38
}
]
},
{
"cell_type": "markdown",
"source": [
"#Linear Regression with Scikit-Learn"
],
"metadata": {
"id": "a93mG4uZOKx0"
}
},
{
"cell_type": "code",
"source": [
"from sklearn.linear_model import LinearRegression\n",
"\n",
"predictors = [\"TV\", \"Radio\"]\n",
"\n",
"X = data[predictors]\n",
"y = data[\"Sales\"]\n",
"\n",
"lm = LinearRegression()\n",
"model = lm.fit(X, y)"
],
"metadata": {
"id": "OAmTTDuSOPcO"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(f\"alpha: {model.intercept_}\")\n",
"print(f\"beta: {model.coef_}\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "YOsNTPAXPHb9",
"outputId": "8d5865aa-623a-418f-d6d8-efa29c38a524"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"alpha: 2.9210999124051362\n",
"beta: [0.04575482 0.18799423]\n"
]
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment