{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "Mtf5REmBrcZS" }, "source": [ "#**Activity 4 - Part 2 and Part 3**\n", "Part #2: Linear Regression\n", "\n", "Part #3: Model Dumping \n", "\n", "***Group 4***\n", "\n", "*Fagarita, Dave*\n", "\n", "*Servandil, Jimuel*\n", "\n", "*Magno, Jannica Mae*\n", "\n", "*Catanus, Jeziah Lois*" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "id": "v802SOLmrGxk" }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import re" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 904 }, "id": "92o5soHO1opT", "outputId": "651119c6-496e-4612-f6ff-2df415a98cc2" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
JobLocationSalaryExperienceJob_Pos
0Junior Graphics DesignerRemotePhp20,000.00 -Php30,000.00At least 1 yearJunior
1Junior Product DesignerPhilippinesPHP30K1-2 yearsJunior
2Junior Services Developer - Javascript (100% R...RemotePHP 32,000 - PHP 57,00020 yearsJunior
3Junior Software EngineersRemote in MakatiNaNMinimum 1-2 yearsJunior
4Junior Enterprise Growth Consultant (Work From...RemotePhp50,000.00 -Php70,000.00Minimum 1-2 yearsJunior
..................
295Chief Technology Officer | Flexible Shift - Pe...Remote in MakatiPhp150,000.00 -Php200,000.005 yearsCTO
296Senior Web DeveloperRemote in ManilaPhp80,000.00 -Php100,000.00NaNCTO
297HEAD OF THE SOFTWARE DEVELOPMENT TEAMTaguigPhp150,000.00 -Php200,000.007 yearsCTO
298Chief Technology OfficerTaguigNaNNaNCTO
299Chief Technology Officer (CTO)MakatiP160K5 yearsCTO
\n", "

300 rows × 5 columns

\n", "
" ], "text/plain": [ " Job Location \\\n", "0 Junior Graphics Designer Remote \n", "1 Junior Product Designer Philippines \n", "2 Junior Services Developer - Javascript (100% R... Remote \n", "3 Junior Software Engineers Remote in Makati \n", "4 Junior Enterprise Growth Consultant (Work From... Remote \n", ".. ... ... \n", "295 Chief Technology Officer | Flexible Shift - Pe... Remote in Makati \n", "296 Senior Web Developer Remote in Manila \n", "297 HEAD OF THE SOFTWARE DEVELOPMENT TEAM Taguig \n", "298 Chief Technology Officer Taguig \n", "299 Chief Technology Officer (CTO) Makati \n", "\n", " Salary Experience Job_Pos \n", "0 Php20,000.00 -Php30,000.00 At least 1 year Junior \n", "1 PHP30K 1-2 years Junior \n", "2 PHP 32,000 - PHP 57,000 20 years Junior \n", "3 NaN Minimum 1-2 years Junior \n", "4 Php50,000.00 -Php70,000.00 Minimum 1-2 years Junior \n", ".. ... ... ... \n", "295 Php150,000.00 -Php200,000.00 5 years CTO \n", "296 Php80,000.00 -Php100,000.00 NaN CTO \n", "297 Php150,000.00 -Php200,000.00 7 years CTO \n", "298 NaN NaN CTO \n", "299 P160K 5 years CTO \n", "\n", "[300 rows x 5 columns]" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Read the CSV file that was scraped from indeed page \n", "df = pd.read_csv('Job_data.csv')\n", "df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "7eXdXcMGK8cn" }, "source": [ "# **Data Preprocessing**\n", "Employing data cleaning process in data mining for normalizing and making the scraped data consistent, and makit it free from noise, outliers, and null values." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "zP-nhCjILBAX" }, "source": [ "**Salary data preprocessing**" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "-o_2Ku4_rMRR", "outputId": "2e63b336-9839-4bec-86d9-8c9346b396fd" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Ayooo\\AppData\\Local\\Temp\\ipykernel_14828\\2756910847.py:3: FutureWarning: The default value of regex will change from True to False in a future version.\n", " df['Salary'] = df['Salary'].str.replace('K.*', 'K')\n", "C:\\Users\\Ayooo\\AppData\\Local\\Temp\\ipykernel_14828\\2756910847.py:8: FutureWarning: The default value of regex will change from True to False in a future version.\n", " df['Salary'] = df['Salary'].str.replace(r'(\\d+)(\\d{6})', r'\\1-\\2')\n" ] } ], "source": [ "# Since the scraped data have inconsistent currency indicator, there is a need for transformation.\n", "# Scraped Salaries are in monthly format and luckily, all data are set by monthly.\n", "df['Salary'] = df['Salary'].str.replace('K.*', 'K')\n", "df['Salary'] = df['Salary'].str.replace('K', '000')\n", "df['Salary'] = df['Salary'].str.replace(r'(Php.*?){3}', r'\\1', regex=True)\n", "df['Salary'] = df['Salary'].str.replace('[^-\\d,.]', '', regex=True)\n", "df['Salary'] = df['Salary'].str.replace(',', '')\n", "df['Salary'] = df['Salary'].str.replace(r'(\\d+)(\\d{6})', r'\\1-\\2')\n", "\n", "# Split the Salary column into two separate columns for extracting the range values\n", "df[['Lower Salary', 'Upper Salary']] = df['Salary'].str.split('-', expand=True)\n", "\n", "# Convert the Lower Salary and Upper Salary columns to float data type for consistent data type\n", "df['Lower Salary'] = df['Lower Salary'].str.strip().replace('', 0).astype(float)\n", "df['Upper Salary'] = df['Upper Salary'].str.strip().replace('', 0).astype(float)\n", "\n", "# Filling null values with temporary placeholder in order to get the average of ranged values\n", "df['Lower Salary'] = df['Lower Salary'].fillna(0)\n", "df['Upper Salary'] = df['Upper Salary'].fillna(0)\n", "\n", "# Check if either Lower Salary or Upper Salary is 0\n", "mask = (df['Lower Salary'] == 0) | (df['Upper Salary'] == 0)\n", "\n", "# Create new column named new salary to calculate the ranged values\n", "df['New Salary'] = np.where(mask, df['Lower Salary'] + df['Upper Salary'], (df['Lower Salary'] + df['Upper Salary']) / 2)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 921 }, "id": "L7Y_99NIjAZC", "outputId": "78ec8ac7-0765-4c17-97b1-8b01524c9453" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
JobLocationSalaryExperienceJob_PosLower SalaryUpper SalaryNew Salary
0Junior Graphics DesignerRemote20000.00-30000.00At least 1 yearJunior20000.030000.025000.0
1Junior Product DesignerPhilippines300001-2 yearsJunior30000.00.030000.0
2Junior Services Developer - Javascript (100% R...Remote32000-5700020 yearsJunior32000.057000.044500.0
3Junior Software EngineersRemote in MakatiNaNMinimum 1-2 yearsJunior0.00.00.0
4Junior Enterprise Growth Consultant (Work From...Remote50000.00-70000.00Minimum 1-2 yearsJunior50000.070000.060000.0
...........................
295Chief Technology Officer | Flexible Shift - Pe...Remote in Makati150000.00-200000.005 yearsCTO150000.0200000.0175000.0
296Senior Web DeveloperRemote in Manila80000.00-100000.00NaNCTO80000.0100000.090000.0
297HEAD OF THE SOFTWARE DEVELOPMENT TEAMTaguig150000.00-200000.007 yearsCTO150000.0200000.0175000.0
298Chief Technology OfficerTaguigNaNNaNCTO0.00.00.0
299Chief Technology Officer (CTO)Makati1600005 yearsCTO160000.00.0160000.0
\n", "

300 rows × 8 columns

\n", "
" ], "text/plain": [ " Job Location \\\n", "0 Junior Graphics Designer Remote \n", "1 Junior Product Designer Philippines \n", "2 Junior Services Developer - Javascript (100% R... Remote \n", "3 Junior Software Engineers Remote in Makati \n", "4 Junior Enterprise Growth Consultant (Work From... Remote \n", ".. ... ... \n", "295 Chief Technology Officer | Flexible Shift - Pe... Remote in Makati \n", "296 Senior Web Developer Remote in Manila \n", "297 HEAD OF THE SOFTWARE DEVELOPMENT TEAM Taguig \n", "298 Chief Technology Officer Taguig \n", "299 Chief Technology Officer (CTO) Makati \n", "\n", " Salary Experience Job_Pos Lower Salary \\\n", "0 20000.00-30000.00 At least 1 year Junior 20000.0 \n", "1 30000 1-2 years Junior 30000.0 \n", "2 32000-57000 20 years Junior 32000.0 \n", "3 NaN Minimum 1-2 years Junior 0.0 \n", "4 50000.00-70000.00 Minimum 1-2 years Junior 50000.0 \n", ".. ... ... ... ... \n", "295 150000.00-200000.00 5 years CTO 150000.0 \n", "296 80000.00-100000.00 NaN CTO 80000.0 \n", "297 150000.00-200000.00 7 years CTO 150000.0 \n", "298 NaN NaN CTO 0.0 \n", "299 160000 5 years CTO 160000.0 \n", "\n", " Upper Salary New Salary \n", "0 30000.0 25000.0 \n", "1 0.0 30000.0 \n", "2 57000.0 44500.0 \n", "3 0.0 0.0 \n", "4 70000.0 60000.0 \n", ".. ... ... \n", "295 200000.0 175000.0 \n", "296 100000.0 90000.0 \n", "297 200000.0 175000.0 \n", "298 0.0 0.0 \n", "299 0.0 160000.0 \n", "\n", "[300 rows x 8 columns]" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "lL4ff-0mLK10" }, "source": [ "**Experience data preprocessing**" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "id": "0T7xt6wer4D-" }, "outputs": [], "source": [ "# We will remove non-numeric characters from the 'Experience' column\n", "df['Experience'] = df['Experience'].str.replace('[^-\\d,.]', '', regex=True)\n", "\n", "# Then, calculate the average of the minimum and maximum values\n", "df['Experience'] = df['Experience'].str.split('-', expand=True).apply(pd.to_numeric).mean(axis=1)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "xj-JqVCDLTMb" }, "source": [ " **Position/Job Preprocessing**" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "id": "7u2CdG2vrU1P" }, "outputs": [], "source": [ "# Changing the categorical values in Position column into numerical format\n", "df['Job_Pos'] = df['Job_Pos'].map({'Junior': 1, 'Senior': 2, 'Project+Manager': 3, 'CTO': 4})" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 921 }, "id": "iPIyU3CK_UnO", "outputId": "aa1149dc-45a6-47d8-b981-d8b76dedbcd8" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
JobLocationSalaryExperienceJob_PosLower SalaryUpper SalaryNew Salary
0Junior Graphics DesignerRemote20000.00-30000.001.0120000.030000.025000.0
1Junior Product DesignerPhilippines300001.5130000.00.030000.0
2Junior Services Developer - Javascript (100% R...Remote32000-5700020.0132000.057000.044500.0
3Junior Software EngineersRemote in MakatiNaN1.510.00.00.0
4Junior Enterprise Growth Consultant (Work From...Remote50000.00-70000.001.5150000.070000.060000.0
...........................
295Chief Technology Officer | Flexible Shift - Pe...Remote in Makati150000.00-200000.005.04150000.0200000.0175000.0
296Senior Web DeveloperRemote in Manila80000.00-100000.00NaN480000.0100000.090000.0
297HEAD OF THE SOFTWARE DEVELOPMENT TEAMTaguig150000.00-200000.007.04150000.0200000.0175000.0
298Chief Technology OfficerTaguigNaNNaN40.00.00.0
299Chief Technology Officer (CTO)Makati1600005.04160000.00.0160000.0
\n", "

300 rows × 8 columns

\n", "
" ], "text/plain": [ " Job Location \\\n", "0 Junior Graphics Designer Remote \n", "1 Junior Product Designer Philippines \n", "2 Junior Services Developer - Javascript (100% R... Remote \n", "3 Junior Software Engineers Remote in Makati \n", "4 Junior Enterprise Growth Consultant (Work From... Remote \n", ".. ... ... \n", "295 Chief Technology Officer | Flexible Shift - Pe... Remote in Makati \n", "296 Senior Web Developer Remote in Manila \n", "297 HEAD OF THE SOFTWARE DEVELOPMENT TEAM Taguig \n", "298 Chief Technology Officer Taguig \n", "299 Chief Technology Officer (CTO) Makati \n", "\n", " Salary Experience Job_Pos Lower Salary Upper Salary \\\n", "0 20000.00-30000.00 1.0 1 20000.0 30000.0 \n", "1 30000 1.5 1 30000.0 0.0 \n", "2 32000-57000 20.0 1 32000.0 57000.0 \n", "3 NaN 1.5 1 0.0 0.0 \n", "4 50000.00-70000.00 1.5 1 50000.0 70000.0 \n", ".. ... ... ... ... ... \n", "295 150000.00-200000.00 5.0 4 150000.0 200000.0 \n", "296 80000.00-100000.00 NaN 4 80000.0 100000.0 \n", "297 150000.00-200000.00 7.0 4 150000.0 200000.0 \n", "298 NaN NaN 4 0.0 0.0 \n", "299 160000 5.0 4 160000.0 0.0 \n", "\n", " New Salary \n", "0 25000.0 \n", "1 30000.0 \n", "2 44500.0 \n", "3 0.0 \n", "4 60000.0 \n", ".. ... \n", "295 175000.0 \n", "296 90000.0 \n", "297 175000.0 \n", "298 0.0 \n", "299 160000.0 \n", "\n", "[300 rows x 8 columns]" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check the initial preprocessed data by displaying the columns\n", "slice_df = df\n", "slice_df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "92LDAMpbKSnz" }, "source": [ "## **Remove Outliers**" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "id": "cw0iTm3siIzF" }, "outputs": [], "source": [ "#Initial removal of outliers\n", "def remove_outliers(df, column_name):\n", " # Calculate the IQR and bounds for the specified column\n", " Q1 = df[column_name].quantile(0.25)\n", " Q3 = df[column_name].quantile(0.75)\n", " IQR = Q3 - Q1\n", " upper_bound = Q3 + 1.5 * IQR\n", " lower_bound = Q1 - 1.5 * IQR\n", "\n", " # Remove outliers from the specified column\n", " df = df[((df[column_name] >= lower_bound) & (df[column_name] <= upper_bound)) | (df[column_name].isnull())]\n", " \n", " return df" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "id": "_rcpmVcejfgJ" }, "outputs": [], "source": [ "slice_df = remove_outliers(slice_df, 'Experience')\n", "slice_df = remove_outliers(slice_df, 'New Salary')" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "id": "NkHNNMQRTov7" }, "outputs": [], "source": [ "slice_df = slice_df.dropna(subset=['Experience', 'New Salary'], how='all')" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "id": "G5m5vtW2JtYS" }, "outputs": [], "source": [ "# Replacing back from 0 to NaN so that it can be imputed using linear regression\n", "slice_df['New Salary'] = slice_df['New Salary'].replace(0.0, np.nan)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 904 }, "id": "7aYuCpf-ElR_", "outputId": "5a9bbc86-1a24-47e2-e90c-9b375f23f482" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
JobLocationSalaryExperienceJob_PosLower SalaryUpper SalaryNew Salary
0Junior Graphics DesignerRemote20000.00-30000.001.0120000.030000.025000.0
1Junior Product DesignerPhilippines300001.5130000.00.030000.0
3Junior Software EngineersRemote in MakatiNaN1.510.00.0NaN
4Junior Enterprise Growth Consultant (Work From...Remote50000.00-70000.001.5150000.070000.060000.0
5Junior Operations AssociateRemote in Manila28000-530001.5128000.053000.040500.0
...........................
295Chief Technology Officer | Flexible Shift - Pe...Remote in Makati150000.00-200000.005.04150000.0200000.0175000.0
296Senior Web DeveloperRemote in Manila80000.00-100000.00NaN480000.0100000.090000.0
297HEAD OF THE SOFTWARE DEVELOPMENT TEAMTaguig150000.00-200000.007.04150000.0200000.0175000.0
298Chief Technology OfficerTaguigNaNNaN40.00.0NaN
299Chief Technology Officer (CTO)Makati1600005.04160000.00.0160000.0
\n", "

284 rows × 8 columns

\n", "
" ], "text/plain": [ " Job Location \\\n", "0 Junior Graphics Designer Remote \n", "1 Junior Product Designer Philippines \n", "3 Junior Software Engineers Remote in Makati \n", "4 Junior Enterprise Growth Consultant (Work From... Remote \n", "5 Junior Operations Associate Remote in Manila \n", ".. ... ... \n", "295 Chief Technology Officer | Flexible Shift - Pe... Remote in Makati \n", "296 Senior Web Developer Remote in Manila \n", "297 HEAD OF THE SOFTWARE DEVELOPMENT TEAM Taguig \n", "298 Chief Technology Officer Taguig \n", "299 Chief Technology Officer (CTO) Makati \n", "\n", " Salary Experience Job_Pos Lower Salary Upper Salary \\\n", "0 20000.00-30000.00 1.0 1 20000.0 30000.0 \n", "1 30000 1.5 1 30000.0 0.0 \n", "3 NaN 1.5 1 0.0 0.0 \n", "4 50000.00-70000.00 1.5 1 50000.0 70000.0 \n", "5 28000-53000 1.5 1 28000.0 53000.0 \n", ".. ... ... ... ... ... \n", "295 150000.00-200000.00 5.0 4 150000.0 200000.0 \n", "296 80000.00-100000.00 NaN 4 80000.0 100000.0 \n", "297 150000.00-200000.00 7.0 4 150000.0 200000.0 \n", "298 NaN NaN 4 0.0 0.0 \n", "299 160000 5.0 4 160000.0 0.0 \n", "\n", " New Salary \n", "0 25000.0 \n", "1 30000.0 \n", "3 NaN \n", "4 60000.0 \n", "5 40500.0 \n", ".. ... \n", "295 175000.0 \n", "296 90000.0 \n", "297 175000.0 \n", "298 NaN \n", "299 160000.0 \n", "\n", "[284 rows x 8 columns]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "slice_df" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 467 }, "id": "TkNAwNo3oF6l", "outputId": "5c86b858-38e1-4b3e-f530-b85f8f0f265e" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExperienceJob_PosNew Salary
01.0125000.0
11.5130000.0
31.51NaN
41.5160000.0
51.5140500.0
............
2955.04175000.0
296NaN490000.0
2977.04175000.0
298NaN4NaN
2995.04160000.0
\n", "

284 rows × 3 columns

\n", "
" ], "text/plain": [ " Experience Job_Pos New Salary\n", "0 1.0 1 25000.0\n", "1 1.5 1 30000.0\n", "3 1.5 1 NaN\n", "4 1.5 1 60000.0\n", "5 1.5 1 40500.0\n", ".. ... ... ...\n", "295 5.0 4 175000.0\n", "296 NaN 4 90000.0\n", "297 7.0 4 175000.0\n", "298 NaN 4 NaN\n", "299 5.0 4 160000.0\n", "\n", "[284 rows x 3 columns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "slice_df = slice_df.drop(['Job', 'Location', 'Salary', 'Upper Salary', 'Lower Salary'], axis=1)\n", "slice_df" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "62GgjG9qKaEs" }, "source": [ "## **Missing Value Imputation using Linear Regression**" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "id": "8-zAOQRFC6C9" }, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "# Select the required columns to impute values with null value present\n", "df = slice_df\n", "\n", "# Impute missing values for 'New Salary' column\n", "new_salary_missing = df['New Salary'].isnull()\n", "if new_salary_missing.sum() > 0:\n", " # Separate the rows with valid 'New Salary' values\n", " df_valid = df.loc[~new_salary_missing]\n", " # Train a linear regression model for 'New Salary' column\n", " regressor_new_salary = LinearRegression()\n", " regressor_new_salary.fit(df_valid[['Job_Pos']], df_valid['New Salary'])\n", " # Impute missing 'New Salary' values using the trained model\n", " df.loc[new_salary_missing, 'New Salary'] = regressor_new_salary.predict(df.loc[new_salary_missing, ['Job_Pos']])\n", "\n", "# Impute missing values for 'Experience' column\n", "experience_missing = df['Experience'].isnull()\n", "if experience_missing.sum() > 0:\n", " df_valid = df.loc[~experience_missing]\n", " regressor_experience = LinearRegression()\n", " regressor_experience.fit(df_valid[['Job_Pos']], df_valid['Experience'])\n", " df.loc[experience_missing, 'Experience'] = regressor_experience.predict(df.loc[experience_missing, ['Job_Pos']])\n", " df['Experience'] = df['Experience'].round(1)\n", "\n", "# Update the original DataFrame with imputed values\n", "slice_df[['New Salary', 'Experience']] = df[['New Salary', 'Experience']]" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 467 }, "id": "PPCfCoG9J5c5", "outputId": "ff387508-cb12-4791-dd5a-725b8d49a5d9" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExperienceJob_PosNew Salary
01.0125000.000000
11.5130000.000000
31.5149804.276271
41.5160000.000000
51.5140500.000000
............
2955.04175000.000000
2966.2490000.000000
2977.04175000.000000
2986.24133952.238342
2995.04160000.000000
\n", "

284 rows × 3 columns

\n", "
" ], "text/plain": [ " Experience Job_Pos New Salary\n", "0 1.0 1 25000.000000\n", "1 1.5 1 30000.000000\n", "3 1.5 1 49804.276271\n", "4 1.5 1 60000.000000\n", "5 1.5 1 40500.000000\n", ".. ... ... ...\n", "295 5.0 4 175000.000000\n", "296 6.2 4 90000.000000\n", "297 7.0 4 175000.000000\n", "298 6.2 4 133952.238342\n", "299 5.0 4 160000.000000\n", "\n", "[284 rows x 3 columns]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "slice_df" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "id": "7DnTjMugI7gv" }, "outputs": [], "source": [ "# Saving our preprocessed dataset into csv for further analysis and prediction purposes \n", "slice_df.to_csv('Clean_Job_data.csv', index = False)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "TpIrexdCKm_P" }, "source": [ "# **Linear Regression with Cleaned Scraped Dataset from Indeed Website**" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "id": "zO2axE7VKAxu" }, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "id": "opgzAjNsLPjK" }, "outputs": [], "source": [ "df1 = pd.read_csv('Clean_Job_data.csv')" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "id": "MQa2mKudLBKE" }, "outputs": [], "source": [ "#Remove outliers again\n", "df1 = remove_outliers(df1, 'Experience')\n", "df1 = remove_outliers(df1, 'New Salary')" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "# from sklearn.preprocessing import MinMaxScaler\n", "# import pandas as pd\n", "\n", "# # Create a MinMaxScaler object\n", "# scaler = MinMaxScaler()\n", "\n", "# # Apply the scaler to the 'New Salary' column\n", "# df1['New Salary'] = scaler.fit_transform(df1['New Salary'].values.reshape(-1, 1))\n", "\n", "# # Print the normalized data\n", "# print(df1)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 467 }, "id": "S8LPADiwWZOG", "outputId": "8eac3f65-482e-4da2-f177-47051806978a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExperienceJob_PosNew Salary
01.0125000.000000
11.5130000.000000
21.5149804.276271
31.5160000.000000
41.5140500.000000
............
2795.04175000.000000
2806.2490000.000000
2817.04175000.000000
2826.24133952.238342
2835.04160000.000000
\n", "

275 rows × 3 columns

\n", "
" ], "text/plain": [ " Experience Job_Pos New Salary\n", "0 1.0 1 25000.000000\n", "1 1.5 1 30000.000000\n", "2 1.5 1 49804.276271\n", "3 1.5 1 60000.000000\n", "4 1.5 1 40500.000000\n", ".. ... ... ...\n", "279 5.0 4 175000.000000\n", "280 6.2 4 90000.000000\n", "281 7.0 4 175000.000000\n", "282 6.2 4 133952.238342\n", "283 5.0 4 160000.000000\n", "\n", "[275 rows x 3 columns]" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "id": "i_CNb9wUJ8NK" }, "outputs": [], "source": [ "X = df1.iloc[:, :2]\n", "y = df1.iloc[:,-1]" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "id": "OLdWpwagKYj1" }, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=88)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "id": "Fwiw2Q25Keq8" }, "outputs": [], "source": [ "X_train = np.array(X_train).reshape((len(X_train), 2))\n", "y_train = np.array(y_train).reshape((len(y_train), 1))\n", "\n", "X_test = np.array(X_test).reshape(len(X_test), 2)\n", "y_test = np.array(y_test).reshape(len(y_test), 1)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "id": "KnBj03qiKiPg" }, "outputs": [], "source": [ "from sklearn import linear_model" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 75 }, "id": "VbJkzicNKmAE", "outputId": "d9b09594-3fda-4936-aa60-2765f54b77bc" }, "outputs": [ { "data": { "text/html": [ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LinearRegression()" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = linear_model.LinearRegression()\n", "model.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "uGCYuReOKrWk", "outputId": "72100a46-57eb-433f-9b39-257559d9099c" }, "outputs": [ { "data": { "text/plain": [ "array([21234.22091612])" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.intercept_" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "PlHd6pi8Ktxa", "outputId": "37892bb4-f1d3-49ae-ba2a-9c2c3db48239" }, "outputs": [ { "data": { "text/plain": [ "array([[-1803.76984575, 31691.25412924]])" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.coef_" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "J6u4SrpqKwrL", "outputId": "42b528bc-de8d-48cd-a890-90dc98378d8c" }, "outputs": [ { "data": { "text/plain": [ "0.8034612959926593" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.score(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "id": "cQptfyL9KzVM" }, "outputs": [], "source": [ "y_pred = model.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExperienceJob_PosNew Salary
01.0125000.000000
11.5130000.000000
21.5149804.276271
31.5160000.000000
41.5140500.000000
............
2795.04175000.000000
2806.2490000.000000
2817.04175000.000000
2826.24133952.238342
2835.04160000.000000
\n", "

275 rows × 3 columns

\n", "
" ], "text/plain": [ " Experience Job_Pos New Salary\n", "0 1.0 1 25000.000000\n", "1 1.5 1 30000.000000\n", "2 1.5 1 49804.276271\n", "3 1.5 1 60000.000000\n", "4 1.5 1 40500.000000\n", ".. ... ... ...\n", "279 5.0 4 175000.000000\n", "280 6.2 4 90000.000000\n", "281 7.0 4 175000.000000\n", "282 6.2 4 133952.238342\n", "283 5.0 4 160000.000000\n", "\n", "[275 rows x 3 columns]" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "RSNpovInK110", "outputId": "46ac0637-95fa-4b28-958e-34933bb761bc" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: y R-squared: 0.643\n", "Model: OLS Adj. R-squared: 0.632\n", "Method: Least Squares F-statistic: 59.33\n", "Date: Thu, 18 May 2023 Prob (F-statistic): 1.80e-15\n", "Time: 21:31:06 Log-Likelihood: -784.02\n", "No. Observations: 69 AIC: 1574.\n", "Df Residuals: 66 BIC: 1581.\n", "Df Model: 2 \n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "const 2.802e+04 6225.661 4.501 0.000 1.56e+04 4.05e+04\n", "x1 -4645.0794 2002.243 -2.320 0.023 -8642.686 -647.473\n", "x2 3.107e+04 3612.606 8.599 0.000 2.39e+04 3.83e+04\n", "==============================================================================\n", "Omnibus: 53.239 Durbin-Watson: 2.176\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 280.668\n", "Skew: -2.192 Prob(JB): 1.13e-61\n", "Kurtosis: 11.854 Cond. No. 13.0\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n" ] } ], "source": [ "# Analysis Variance of the model\n", "import statsmodels.api as sm\n", "\n", "# Using ANOVA to analyse the model variance \n", "X_tests = sm.add_constant(X_test)\n", "anova_model = sm.OLS(y_test, X_tests)\n", "results = anova_model.fit()\n", "\n", "print(results.summary())" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "id": "zBlg2rM1K5Zk" }, "outputs": [], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 229 }, "id": "3OzQFz3NK8JI", "outputId": "27475279-4611-45da-ee3e-f9a5b1b5edf9" }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(10.5)\n", "sns.regplot(x=X_test[:, 1], y=y_pred, scatter_kws={'color': 'red'})\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "id": "2InmVn7MLo_O" }, "source": [ "# **Model Dumping using Pickle**" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "id": "nuOTfEhQp__N" }, "outputs": [], "source": [ "import pickle" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "id": "LixJkVgzqC-e" }, "outputs": [], "source": [ "pickle.dump(model, open('linreg_model.pkl', 'wb'))" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "id": "LjLX-CDpqDoa" }, "outputs": [], "source": [ "model_dump = pickle.load(open('linreg_model.pkl', 'rb'))" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "G3fvAd4KqJh6", "outputId": "4c9d9921-0894-4f28-8d1d-8993af46780a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3188195.11002543]]\n" ] } ], "source": [ "print(model.predict([[1.2, 100]]))" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.2.2\n" ] } ], "source": [ "import sklearn\n", "print(sklearn.__version__)" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.11.2" } }, "nbformat": 4, "nbformat_minor": 0 }