{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<p style=\"text-align:center\">\n",
    "    <a href=\"https://skills.network\" target=\"_blank\">\n",
    "    <img src=\"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/assets/logos/SN_web_lightmode.png\" width=\"200\" alt=\"Skills Network Logo\"  />\n",
    "    </a>\n",
    "</p>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Data Wrangling Lab**\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Estimated time needed: **45** minutes\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this lab, you will perform data wrangling tasks to prepare raw data for analysis. Data wrangling involves cleaning, transforming, and organizing data into a structured format suitable for analysis. This lab focuses on tasks like identifying inconsistencies, encoding categorical variables, and feature transformation.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Objectives\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After completing this lab, you will be able to:\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Identify and remove inconsistent data entries.\n",
    "\n",
    "- Encode categorical variables for analysis.\n",
    "\n",
    "- Handle missing values using multiple imputation strategies.\n",
    "\n",
    "- Apply feature scaling and transformation techniques.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Intsall the required libraries\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: pandas in /opt/conda/lib/python3.12/site-packages (3.0.0)\n",
      "Requirement already satisfied: numpy>=1.26.0 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.4.1)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.12/site-packages (from pandas) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n",
      "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.12/site-packages (3.10.8)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (1.3.3)\n",
      "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (4.61.1)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (1.4.9)\n",
      "Requirement already satisfied: numpy>=1.23 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (2.4.1)\n",
      "Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (24.2)\n",
      "Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (12.1.0)\n",
      "Requirement already satisfied: pyparsing>=3 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (3.3.2)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.12/site-packages (from matplotlib) (2.9.0.post0)\n",
      "Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install pandas\n",
    "!pip install matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tasks\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 1: Import the necessary module.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Load the Dataset\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>1.1 Import necessary libraries and load the dataset.</h5>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ensure the dataset is loaded correctly by displaying the first few rows.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   ResponseId                      MainBranch                 Age  \\\n",
      "0           1  I am a developer by profession  Under 18 years old   \n",
      "1           2  I am a developer by profession     35-44 years old   \n",
      "2           3  I am a developer by profession     45-54 years old   \n",
      "3           4           I am learning to code     18-24 years old   \n",
      "4           5  I am a developer by profession     18-24 years old   \n",
      "\n",
      "            Employment RemoteWork   Check  \\\n",
      "0  Employed, full-time     Remote  Apples   \n",
      "1  Employed, full-time     Remote  Apples   \n",
      "2  Employed, full-time     Remote  Apples   \n",
      "3   Student, full-time        NaN  Apples   \n",
      "4   Student, full-time        NaN  Apples   \n",
      "\n",
      "                                    CodingActivities  \\\n",
      "0                                              Hobby   \n",
      "1  Hobby;Contribute to open-source projects;Other...   \n",
      "2  Hobby;Contribute to open-source projects;Other...   \n",
      "3                                                NaN   \n",
      "4                                                NaN   \n",
      "\n",
      "                                             EdLevel  \\\n",
      "0                          Primary/elementary school   \n",
      "1       Bachelor’s degree (B.A., B.S., B.Eng., etc.)   \n",
      "2    Master’s degree (M.A., M.S., M.Eng., MBA, etc.)   \n",
      "3  Some college/university study without earning ...   \n",
      "4  Secondary school (e.g. American high school, G...   \n",
      "\n",
      "                                           LearnCode  \\\n",
      "0                             Books / Physical media   \n",
      "1  Books / Physical media;Colleague;On the job tr...   \n",
      "2  Books / Physical media;Colleague;On the job tr...   \n",
      "3  Other online resources (e.g., videos, blogs, f...   \n",
      "4  Other online resources (e.g., videos, blogs, f...   \n",
      "\n",
      "                                     LearnCodeOnline  ... JobSatPoints_6  \\\n",
      "0                                                NaN  ...            NaN   \n",
      "1  Technical documentation;Blogs;Books;Written Tu...  ...            0.0   \n",
      "2  Technical documentation;Blogs;Books;Written Tu...  ...            NaN   \n",
      "3  Stack Overflow;How-to videos;Interactive tutorial  ...            NaN   \n",
      "4  Technical documentation;Blogs;Written Tutorial...  ...            NaN   \n",
      "\n",
      "  JobSatPoints_7 JobSatPoints_8 JobSatPoints_9 JobSatPoints_10  \\\n",
      "0            NaN            NaN            NaN             NaN   \n",
      "1            0.0            0.0            0.0             0.0   \n",
      "2            NaN            NaN            NaN             NaN   \n",
      "3            NaN            NaN            NaN             NaN   \n",
      "4            NaN            NaN            NaN             NaN   \n",
      "\n",
      "  JobSatPoints_11           SurveyLength SurveyEase ConvertedCompYearly JobSat  \n",
      "0             NaN                    NaN        NaN                 NaN    NaN  \n",
      "1             0.0                    NaN        NaN                 NaN    NaN  \n",
      "2             NaN  Appropriate in length       Easy                 NaN    NaN  \n",
      "3             NaN               Too long       Easy                 NaN    NaN  \n",
      "4             NaN              Too short       Easy                 NaN    NaN  \n",
      "\n",
      "[5 rows x 114 columns]\n",
      "Initial dataframe: (65437, 114)\n"
     ]
    }
   ],
   "source": [
    "# Import necessary libraries\n",
    "import pandas as pd\n",
    "\n",
    "# Load the Stack Overflow survey data\n",
    "dataset_url = \"https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/n01PQ9pSmiRX6520flujwQ/survey-data.csv\"\n",
    "df = pd.read_csv(dataset_url)\n",
    "\n",
    "# Display the first few rows\n",
    "print(df.head())\n",
    "print('Initial dataframe:', df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. Explore the Dataset\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>2.1 Summarize the dataset by displaying the column data types, counts, and missing values.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                             Column Data type  Counts  Missing values  Unique values\n",
      "66                            AIAcc       str   37302           28135              5\n",
      "65                            AIBen       str   36894           28543            113\n",
      "78                     AIChallenges       str   37531           27906            232\n",
      "67                        AIComplex       str   37021           28416              5\n",
      "77                         AIEthics       str   41548           23889            126\n",
      "74            AINextLess integrated       str    2355           63082            249\n",
      "73            AINextMore integrated       str   24428           41009            884\n",
      "75       AINextMuch less integrated       str    1148           64289            286\n",
      "71       AINextMuch more integrated       str   13438           51999            700\n",
      "72                  AINextNo change       str   12498           52939            539\n",
      "56               AISearchDevAdmired       str   35543           29894           1488\n",
      "54        AISearchDevHaveWorkedWith       str   44453           20984           2663\n",
      "55        AISearchDevWantToWorkWith       str   36701           28736           2361\n",
      "63                         AISelect       str   60907            4530              3\n",
      "64                           AISent       str   45873           19564              6\n",
      "76                         AIThreat       str   44689           20748              3\n",
      "68            AIToolCurrently Using       str   35072           30365           1310\n",
      "69        AIToolInterested in Using       str   30691           34746           1949\n",
      "70    AIToolNot interested in Using       str   24414           41023           1531\n",
      "2                               Age       str   65437               0              8\n",
      "17                       BuildvsBuy       str   43358           22079              3\n",
      "16                       BuyNewTool       str   45181           20256            215\n",
      "5                             Check       str   65437               0              1\n",
      "6                  CodingActivities       str   54466           10971            118\n",
      "21                        CompTotal   float64   33740           31697           3337\n",
      "112             ConvertedCompYearly   float64   23435           42002           6113\n",
      "19                          Country       str   58930            6507            185\n",
      "20                         Currency       str   46684           18753            142\n",
      "27                  DatabaseAdmired       str   38557           26880           4051\n",
      "25           DatabaseHaveWorkedWith       str   50254           15183           9050\n",
      "26           DatabaseWantToWorkWith       str   42558           22879           8478\n",
      "13                          DevType       str   59445            5992             34\n",
      "7                           EdLevel       str   60784            4653              8\n",
      "36                  EmbeddedAdmired       str   16733           48704           1053\n",
      "34           EmbeddedHaveWorkedWith       str   22214           43223           1630\n",
      "35           EmbeddedWantToWorkWith       str   17600           47837           1471\n",
      "3                        Employment       str   65437               0            110\n",
      "91                      Frequency_1       str   28369           37068              5\n",
      "92                      Frequency_2       str   28364           37073              5\n",
      "93                      Frequency_3       str   27710           37727              5\n",
      "96                      Frustration       str   28251           37186            954\n",
      "80                           ICorPM       str   29801           35636              2\n",
      "100                        Industry       str   28858           36579             15\n",
      "113                          JobSat   float64   29126           36311             11\n",
      "101                  JobSatPoints_1   float64   29324           36113             91\n",
      "108                 JobSatPoints_10   float64   29450           35987             75\n",
      "109                 JobSatPoints_11   float64   29445           35992             79\n",
      "102                  JobSatPoints_4   float64   29393           36044             72\n",
      "103                  JobSatPoints_5   float64   29411           36026             78\n",
      "104                  JobSatPoints_6   float64   29450           35987             93\n",
      "105                  JobSatPoints_7   float64   29448           35989             91\n",
      "106                  JobSatPoints_8   float64   29456           35981             89\n",
      "107                  JobSatPoints_9   float64   29456           35981             85\n",
      "82                      Knowledge_1       str   28664           36773              5\n",
      "83                      Knowledge_2       str   28021           37416              5\n",
      "84                      Knowledge_3       str   28095           37342              5\n",
      "85                      Knowledge_4       str   28030           37407              5\n",
      "86                      Knowledge_5       str   27880           37557              5\n",
      "87                      Knowledge_6       str   27864           37573              5\n",
      "88                      Knowledge_7       str   27778           37659              5\n",
      "89                      Knowledge_8       str   27758           37679              5\n",
      "90                      Knowledge_9       str   27635           37802              5\n",
      "24                  LanguageAdmired       str   50872           14565          12335\n",
      "22           LanguageHaveWorkedWith       str   59745            5692          23864\n",
      "23           LanguageWantToWorkWith       str   55752            9685          22769\n",
      "8                         LearnCode       str   60488            4949            418\n",
      "9                   LearnCodeOnline       str   49237           16200          10853\n",
      "1                        MainBranch       str   65437               0              5\n",
      "39                  MiscTechAdmired       str   29596           35841           4917\n",
      "37           MiscTechHaveWorkedWith       str   39443           25994           9288\n",
      "38           MiscTechWantToWorkWith       str   32964           32473          10263\n",
      "45            NEWCollabToolsAdmired       str   50711           14726           7545\n",
      "43     NEWCollabToolsHaveWorkedWith       str   57592            7845          14168\n",
      "44     NEWCollabToolsWantToWorkWith       str   52087           13350           9751\n",
      "57                       NEWSOSites       str   60286            5151             32\n",
      "50          OfficeStackAsyncAdmired       str   37204           28233           2661\n",
      "48   OfficeStackAsyncHaveWorkedWith       str   48093           17344           6014\n",
      "49   OfficeStackAsyncWantToWorkWith       str   38966           26471           3801\n",
      "53           OfficeStackSyncAdmired       str   44712           20725           2555\n",
      "51    OfficeStackSyncHaveWorkedWith       str   55545            9892           5049\n",
      "52    OfficeStackSyncWantToWorkWith       str   46711           18726           3205\n",
      "46                OpSysPersonal use       str   58174            7263           2488\n",
      "47            OpSysProfessional use       str   52973           12464           2032\n",
      "14                          OrgSize       str   47480           17957             10\n",
      "30                  PlatformAdmired       str   31377           34060           2556\n",
      "28           PlatformHaveWorkedWith       str   42366           23071           5467\n",
      "29           PlatformWantToWorkWith       str   34532           30905           4784\n",
      "98                ProfessionalCloud       str   28491           36946              3\n",
      "99             ProfessionalQuestion       str   28807           36630              9\n",
      "97                 ProfessionalTech       str   27764           37673            514\n",
      "15                PurchaseInfluence       str   47406           18031              3\n",
      "4                        RemoteWork       str   54806           10631              3\n",
      "0                        ResponseId     int64   65437               0          65437\n",
      "59                        SOAccount       str   59560            5877              3\n",
      "62                           SOComm       str   59163            6274              6\n",
      "61                            SOHow       str   58962            6475            111\n",
      "60                       SOPartFreq       str   45237           20200              6\n",
      "58                      SOVisitFreq       str   59536            5901              5\n",
      "111                      SurveyEase       str   56238            9199              3\n",
      "110                    SurveyLength       str   56182            9255              3\n",
      "79                          TBranch       str   44477           20960              2\n",
      "10                          TechDoc       str   40897           24540            113\n",
      "18                      TechEndorse       str   43668           21769            386\n",
      "95                    TimeAnswering       str   28844           36593              5\n",
      "94                    TimeSearching       str   28911           36526              5\n",
      "42                 ToolsTechAdmired       str   43997           21440          11804\n",
      "40          ToolsTechHaveWorkedWith       str   52482           12955          19883\n",
      "41          ToolsTechWantToWorkWith       str   46084           19353          16549\n",
      "33                  WebframeAdmired       str   34943           30494           5460\n",
      "31           WebframeHaveWorkedWith       str   45161           20276          12235\n",
      "32           WebframeWantToWorkWith       str   38535           26902          11654\n",
      "81                          WorkExp   float64   29658           35779             51\n",
      "11                        YearsCode       str   59869            5568             52\n",
      "12                     YearsCodePro       str   51610           13827             52\n"
     ]
    }
   ],
   "source": [
    "# Write your code here\n",
    "#print(df.info(verbose=True, show_counts=True))\n",
    "df_info = pd.DataFrame({\n",
    "    'Data type': df.dtypes,\n",
    "    'Counts': df.count(),\n",
    "    'Missing values': df.isna().sum(),\n",
    "    'Unique values': df.nunique()\n",
    "}).reset_index(names='Column')\n",
    "\n",
    "df_info = df_info.sort_values(by=['Column'])\n",
    "print(df_info.to_string())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>2.2 Generate basic statistics for numerical columns.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         ResponseId      CompTotal       WorkExp  JobSatPoints_1  \\\n",
      "count  65437.000000   3.374000e+04  29658.000000    29324.000000   \n",
      "mean   32719.000000  2.963841e+145     11.466957       18.581094   \n",
      "std    18890.179119  5.444117e+147      9.168709       25.966221   \n",
      "min        1.000000   0.000000e+00      0.000000        0.000000   \n",
      "25%    16360.000000   6.000000e+04      4.000000        0.000000   \n",
      "50%    32719.000000   1.100000e+05      9.000000       10.000000   \n",
      "75%    49078.000000   2.500000e+05     16.000000       22.000000   \n",
      "max    65437.000000  1.000000e+150     50.000000      100.000000   \n",
      "\n",
      "       JobSatPoints_4  JobSatPoints_5  JobSatPoints_6  JobSatPoints_7  \\\n",
      "count    29393.000000    29411.000000    29450.000000     29448.00000   \n",
      "mean         7.522140       10.060857       24.343232        22.96522   \n",
      "std         18.422661       21.833836       27.089360        27.01774   \n",
      "min          0.000000        0.000000        0.000000         0.00000   \n",
      "25%          0.000000        0.000000        0.000000         0.00000   \n",
      "50%          0.000000        0.000000       20.000000        15.00000   \n",
      "75%          5.000000       10.000000       30.000000        30.00000   \n",
      "max        100.000000      100.000000      100.000000       100.00000   \n",
      "\n",
      "       JobSatPoints_8  JobSatPoints_9  JobSatPoints_10  JobSatPoints_11  \\\n",
      "count    29456.000000    29456.000000     29450.000000     29445.000000   \n",
      "mean        20.278165       16.169432        10.955713         9.953948   \n",
      "std         26.108110       24.845032        22.906263        21.775652   \n",
      "min          0.000000        0.000000         0.000000         0.000000   \n",
      "25%          0.000000        0.000000         0.000000         0.000000   \n",
      "50%         10.000000        5.000000         0.000000         0.000000   \n",
      "75%         25.000000       20.000000        10.000000        10.000000   \n",
      "max        100.000000      100.000000       100.000000       100.000000   \n",
      "\n",
      "       ConvertedCompYearly        JobSat  \n",
      "count         2.343500e+04  29126.000000  \n",
      "mean          8.615529e+04      6.935041  \n",
      "std           1.867570e+05      2.088259  \n",
      "min           1.000000e+00      0.000000  \n",
      "25%           3.271200e+04      6.000000  \n",
      "50%           6.500000e+04      7.000000  \n",
      "75%           1.079715e+05      8.000000  \n",
      "max           1.625660e+07     10.000000  \n"
     ]
    }
   ],
   "source": [
    "# Write your code here\n",
    "print(df.describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Identifying and Removing Inconsistencies\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>3.1 Identify inconsistent or irrelevant entries in specific columns (e.g., Country).</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Brazil', 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Central African Republic', 'Chad', 'Chile', 'China', 'Colombia', 'Congo, Republic of the...', 'Costa Rica', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', \"Côte d'Ivoire\", \"Democratic People's Republic of Korea\", 'Democratic Republic of the Congo', 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Estonia', 'Ethiopia', 'Fiji', 'Finland', 'France', 'Gabon', 'Georgia', 'Germany', 'Ghana', 'Greece', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', 'Hong Kong (S.A.R.)', 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran, Islamic Republic of...', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jordan', 'Kazakhstan', 'Kenya', 'Kosovo', 'Kuwait', 'Kyrgyzstan', \"Lao People's Democratic Republic\", 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Mauritania', 'Mauritius', 'Mexico', 'Micronesia, Federated States of...', 'Monaco', 'Mongolia', 'Montenegro', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'Netherlands', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Nomadic', 'North Korea', 'Norway', 'Oman', 'Pakistan', 'Palestine', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Qatar', 'Republic of Korea', 'Republic of Moldova', 'Republic of North Macedonia', 'Romania', 'Russian Federation', 'Rwanda', 'Saint Kitts and Nevis', 'Samoa', 'San Marino', 'Saudi Arabia', 'Senegal', 'Serbia', 'Sierra Leone', 'Singapore', 'Slovakia', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Korea', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic', 'Taiwan', 'Tajikistan', 'Thailand', 'Togo', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom of Great Britain and Northern Ireland', 'United Republic of Tanzania', 'United States of America', 'Unknown', 'Uruguay', 'Uzbekistan', 'Venezuela, Bolivarian Republic of...', 'Viet Nam', 'Yemen', 'Zambia', 'Zimbabwe']\n"
     ]
    }
   ],
   "source": [
    "# Write your code here\n",
    "print(sorted(df.Country.fillna('Unknown').unique()))  # There are missing values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Associate degree (A.A., A.S., etc.)', 'Bachelor’s degree (B.A., B.S., B.Eng., etc.)', 'Master’s degree (M.A., M.S., M.Eng., MBA, etc.)', 'Primary/elementary school', 'Professional degree (JD, MD, Ph.D, Ed.D, etc.)', 'Secondary school (e.g. American high school, German Realschule or Gymnasium, etc.)', 'Some college/university study without earning a degree', 'Something else', 'Unknown']\n"
     ]
    }
   ],
   "source": [
    "print(sorted(df.EdLevel.fillna('Unknown').unique()))  # There are missing values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>3.2 Standardize entries in columns like Country or EdLevel by mapping inconsistent values to a consistent format.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 0\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "df_i = df.copy()\n",
    "df_i.Country = df_i.Country.fillna('Unknown')\n",
    "df_i.EdLevel = df_i.EdLevel.fillna('Unknown')\n",
    "print(df_i.Country.isna().sum(), df_i.EdLevel.isna().sum())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Encoding Categorical Variables\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>4.1 Encode the Employment column using one-hot encoding.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Employed, full-time', 'Employed, part-time', 'I prefer not to say', 'Independent contractor, freelancer, or self-employed', 'Not employed, and not looking for work', 'Not employed, but looking for work', 'Retired', 'Student, full-time', 'Student, part-time'] 9\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "## One Hot Encoding is a method for converting categorical variables into a binary format.\n",
    "#print(sorted(df_i.Employment.unique()))\n",
    "#employment_dummies = pd.get_dummies(df_i['Employment'])\n",
    "cat = set()\n",
    "empl = df_i.Employment.unique()\n",
    "for el in empl:\n",
    "    if ';' in el:\n",
    "        cat = cat | set(el.split(';'))\n",
    "    else:\n",
    "        cat.add(el)\n",
    "cat = sorted(cat)\n",
    "print(cat, len(cat))  # Columns that should be added to the dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            Employment  Employed, full-time  Employed, part-time  \\\n",
      "0  Employed, full-time                 True                False   \n",
      "1  Employed, full-time                 True                False   \n",
      "2  Employed, full-time                 True                False   \n",
      "3   Student, full-time                False                False   \n",
      "4   Student, full-time                False                False   \n",
      "\n",
      "   I prefer not to say  Independent contractor, freelancer, or self-employed  \\\n",
      "0                False                                              False      \n",
      "1                False                                              False      \n",
      "2                False                                              False      \n",
      "3                False                                              False      \n",
      "4                False                                              False      \n",
      "\n",
      "   Not employed, and not looking for work  Not employed, but looking for work  \\\n",
      "0                                   False                               False   \n",
      "1                                   False                               False   \n",
      "2                                   False                               False   \n",
      "3                                   False                               False   \n",
      "4                                   False                               False   \n",
      "\n",
      "   Retired  Student, full-time  Student, part-time  \n",
      "0    False               False               False  \n",
      "1    False               False               False  \n",
      "2    False               False               False  \n",
      "3    False                True               False  \n",
      "4    False                True               False  \n",
      "(65437, 123)\n"
     ]
    }
   ],
   "source": [
    "df_ie = df_i.copy()\n",
    "dummies = df_ie['Employment'].str.get_dummies(sep=';').astype(bool)\n",
    "df_ie = pd.concat([df_ie, dummies], axis=1)\n",
    "print(df_ie[['Employment', *cat]].head())\n",
    "print(df_ie.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Handling Missing Values\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>5.1 Identify columns with the highest number of missing values.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fraction of missing values in each column\n",
      "AINextMuch less integrated    0.9825\n",
      "AINextLess integrated         0.9640\n",
      "AINextNo change               0.8090\n",
      "AINextMuch more integrated    0.7946\n",
      "EmbeddedAdmired               0.7443\n",
      "dtype: float64\n",
      "RemoteWork: 0.1625\n",
      "ConvertedCompYearly: 0.6419\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "frnan = df_ie.isna().mean().sort_values(ascending=False).round(decimals=4)\n",
    "print('Fraction of missing values in each column')\n",
    "print(frnan.head())\n",
    "print('RemoteWork:', frnan.RemoteWork)\n",
    "print('ConvertedCompYearly:', frnan.ConvertedCompYearly)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>5.2 Impute missing values in numerical columns (e.g., `ConvertedCompYearly`) with the mean or median.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of unique values: 6114\n"
     ]
    },
    {
     "data": {
      "image/png": "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L09/93d/p9///vdRmtaejo4OVVVVKTc3Vy6XS3v37p3yNocOHdKf/dmfye1260//9E/V2to663OGw262H/zgB1q9erX+5E/+RJmZmSorK9Obb74ZnWHDEM5jN+qdd95RSkqKioqKZm2+mQgnm8/n01NPPaUbbrhBbrdbixcv1tatW2d/2CtIqHKya9cueTweNTY26sSJEyosLFRFRYUuXLgw4frvvvuuvvSlL+mRRx7RyZMnVV1drerqar3//vtRnnxqdrMdOnRIX/rSl/T222/r8OHDysvL05o1a/TJJ59EefLpsZtv1EcffaQNGzborrvuitKk9tnNNjIyotWrV+ujjz7Snj17dObMGb388stasGBBlCefmt1s27dvV0NDgxobG/XBBx/o1Vdf1a5du/QP//APUZ58eoaGhlRYWCiv1zut9bu6urR27VqVl5ers7NTX/va1/Too48a+UfcbraOjg6tXr1ab7zxho4fP67y8nJVVVXp5MmTszxpeOzmG9XX16eHH35Yf/7nfz5Lk81cONkefPBBtbe369VXX9WZM2e0Y8cOLVmyZBannIKVQEpKSqy6urrQ5UAgYOXm5lrf+ta3Jlz/wQcftNauXTtmWWlpqfU3f/M3szpnOOxm+7TLly9bc+bMsb773e/O1ogzEk6+y5cvW7fffrv1yiuvWLW1tdZf/dVfRWFS++xm+7d/+zfrxhtvtEZGRqI1YtjsZqurq7O+8IUvjFnm8XisO+64Y1bnjARJVltb26TrfOMb37BuvfXWMcvWrVtnVVRUzOJkMzedbBMpKCiwmpubIz9QhNnJt27dOusf//EfrcbGRquwsHBW54qE6WT7j//4D+vaa6+1fvOb30RnqGlImFdORkZGdPz4ca1atSq0LCkpSatWrdLhw4cnvM3hw4fHrC9JFRUVV1w/VsLJ9mnDw8Py+/2aO3fubI0ZtnDz/dM//ZPmzZunRx55JBpjhiWcbK+//rrKyspUV1en7OxsLV26VN/85jcVCASiNfa0hJPt9ttv1/Hjx0Nv/Zw7d05vvPGG7rnnnqjMPNuc8pwSCcFgUAMDA0Y+p4Rr27ZtOnfunBobG2M9SkS9/vrrWr58uV544QUtWLBA+fn52rBhg373u9/FbCbHffFfuHp7exUIBJSdnT1meXZ2tk6fPj3hbbq7uydcv7u7e9bmDEc42T7t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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "## Write your code here\n",
    "print('Number of unique values:', df_ie.ConvertedCompYearly.nunique(dropna=False))\n",
    "df_ie.ConvertedCompYearly.hist(log=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count       65437\n",
      "mean        72576\n",
      "std        112220\n",
      "min             1\n",
      "25%         65000\n",
      "50%         65000\n",
      "75%         65000\n",
      "max      16256603\n",
      "Name: ConvertedCompYearly, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "# The data in the ConvertedCompYearly column has 64% outliers and it is skewed.\n",
    "# Hence, it is better to use a median value.\n",
    "MedianValue = df_ie['ConvertedCompYearly'].median()\n",
    "df_ie['ConvertedCompYearly'] = df_ie['ConvertedCompYearly'].fillna(MedianValue)\n",
    "print(df_ie['ConvertedCompYearly'].describe().astype(int))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>5.3 Impute missing values in categorical columns (e.g., `RemoteWork`) with the most frequent value.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count                                    54806\n",
      "unique                                       3\n",
      "top       Hybrid (some remote, some in-person)\n",
      "freq                                     23015\n",
      "Name: RemoteWork, dtype: object\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "print(df_ie.RemoteWork.describe())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count                                    65437\n",
      "unique                                       3\n",
      "top       Hybrid (some remote, some in-person)\n",
      "freq                                     33646\n",
      "Name: RemoteWork, dtype: object\n"
     ]
    }
   ],
   "source": [
    "common_RemoteWork = df_ie.RemoteWork.value_counts().idxmax()\n",
    "df_ie.RemoteWork = df_ie.RemoteWork.fillna(common_RemoteWork)\n",
    "print(df_ie['RemoteWork'].describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Feature Scaling and Transformation\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>6.1 Apply Min-Max Scaling to normalize the `ConvertedCompYearly` column.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "count    65437.000000\n",
      "mean         0.004464\n",
      "std          0.006903\n",
      "min          0.000000\n",
      "25%          0.003998\n",
      "50%          0.003998\n",
      "75%          0.003998\n",
      "max          1.000000\n",
      "Name: ConvertedCompYearly_MinMax, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "df_ie['ConvertedCompYearly_MinMax'] = (df_ie['ConvertedCompYearly'] - df_ie['ConvertedCompYearly'].min()) / (df_ie['ConvertedCompYearly'].max() - df_ie['ConvertedCompYearly'].min())\n",
    "print(df_ie['ConvertedCompYearly_MinMax'].describe())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>6.2 Log-transform the ConvertedCompYearly column to reduce skewness.</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Write your code here\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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87FOr7S0tCET19XKyclx9Q50OfpxCb2IRT9i0Y9Y9CMW/ZDGjRt3ReMcc0AsAABwB8IJAACwCuHkS7xer+rq6uT1elNdihXoxyX0Ihb9iEU/YtGPWPQjfo47IBYAAIxuvHMCAACsQjgBAABWIZwAAACrEE4AAIBVXBdO/H6/ioqKlJWVpfLycu3bt2/Q8Zs3b9ZNN92krKwszZgxQ2+++eYIVZpca9euVWlpqcaOHauJEydqyZIlOnr06KDXaWhokMfjifmTlZU1QhUnV319fZ9tu+mmmwa9zmjdN4qKivr0wuPxyOfz9Tt+tO0Xe/bs0eLFi1VQUCCPx6OtW7fGXG6M0erVqzVp0iR95Stf0YIFC3Ts2LEh5433uccWg/UjFArp6aef1owZM3TNNdeooKBADz74oE6dOjXonMN5vNliqP3joYce6rNtt99++5DzOnX/SBZXhZNNmzappqZGdXV1amlpUUlJiSoqKnT69Ol+x//zn//UAw88oEceeUQHDx7UkiVLtGTJEh0+fHiEK0+8d955Rz6fT++9954aGxsVCoW0aNEidXV1DXq9nJwcffrpp9E/J06cGKGKk+/mm2+O2bZ//OMfA44dzftGc3NzTB8aGxslST/60Y8GvM5o2i+6urpUUlIiv9/f7+XPPfecfve732nDhg16//33dc0116iiokJffPHFgHPG+9xjk8H60d3drZaWFq1atUotLS3661//qqNHj+quu+4act54Hm82GWr/kKTbb789ZtteffXVQed08v6RNMZFysrKjM/niy6Hw2FTUFBg1q5d2+/4++67z9x5550x68rLy83PfvazpNaZCqdPnzaSzDvvvDPgmBdffNGMGzdu5IoaQXV1daakpOSKx7tp33jiiSfMDTfcYCKRSL+Xj+b9QpLZsmVLdDkSiZj8/Hzzm9/8Jrru3Llzxuv1mldffXXAeeJ97rHV5f3oz759+4wkc+LEiQHHxPt4s1V//aiqqjJ33313XPOMlv0jkVzzzklPT48OHDigBQsWRNelpaVpwYIF2rt3b7/X2bt3b8x4SaqoqBhwvJN1dnZKkiZMmDDouAsXLmjq1KkqLCzU3XffrY8++mgkyhsRx44dU0FBga6//nr9+Mc/1n//+98Bx7pl3+jp6dHLL7+shx9+eNAf2hzN+8WXtbW1qb29Pea+HzdunMrLywe874fz3ONknZ2d8ng8Gj9+/KDj4nm8Oc3u3bs1ceJE3XjjjXrsscf02WefDTjWbfvHlXJNODl79qzC4bDy8vJi1ufl5am9vb3f67S3t8c13qkikYiefPJJffe739X06dMHHHfjjTdq48aN2rZtm15++WVFIhHdcsst+uSTT0aw2uQoLy9XQ0ODduzYoRdeeEFtbW36/ve/r/Pnz/c73i37xtatW3Xu3Dk99NBDA44ZzfvF5Xrv33ju++E89zjVF198oaeffloPPPDAoD9wF+/jzUluv/12vfTSS2pqatKvf/1rvfPOO6qsrFQ4HO53vJv2j3g47leJkXg+n0+HDx8e8jPfuXPnau7cudHlW265Rd/85jf1hz/8Qc8880yyy0yqysrK6L9nzpyp8vJyTZ06Va+//roeeeSRFFaWWn/+859VWVmpgoKCAceM5v0CVy4UCum+++6TMUYvvPDCoGNH8+Pt/vvvj/57xowZmjlzpm644Qbt3r1bt912WworcxbXvHOSm5ur9PR0dXR0xKzv6OhQfn5+v9fJz8+Pa7wTVVdX629/+5vefvttTZ48Oa7rZmRk6Fvf+paOHz+epOpSZ/z48Zo2bdqA2+aGfePEiRPatWuXfvrTn8Z1vdG8X/Tev/Hc98N57nGa3mBy4sQJNTY2DvquSX+Gerw52fXXX6/c3NwBt80N+8dwuCacZGZmavbs2Wpqaoqui0Qiampqivlf35fNnTs3ZrwkNTY2DjjeSYwxqq6u1pYtW/T3v/9d1113XdxzhMNhffjhh5o0aVISKkytCxcu6OOPPx5w20bzvtHrxRdf1MSJE3XnnXfGdb3RvF9cd911ys/Pj7nvA4GA3n///QHv++E89zhJbzA5duyYdu3apWuvvTbuOYZ6vDnZJ598os8++2zAbRvt+8ewpfqI3JH02muvGa/XaxoaGkxra6t59NFHzfjx4017e7sxxpif/OQnpra2Njr+3XffNWPGjDG//e1vzb///W9TV1dnMjIyzIcffpiqTUiYxx57zIwbN87s3r3bfPrpp9E/3d3d0TGX92PNmjVm586d5uOPPzYHDhww999/v8nKyjIfffRRKjYhoX7xi1+Y3bt3m7a2NvPuu++aBQsWmNzcXHP69GljjLv2DWMuni0wZcoU8/TTT/e5bLTvF+fPnzcHDx40Bw8eNJLMunXrzMGDB6Nnnzz77LNm/PjxZtu2beZf//qXufvuu811111n/ve//0XnuPXWW83zzz8fXR7qucdmg/Wjp6fH3HXXXWby5Mnm0KFDMc8lwWAwOsfl/Rjq8Wazwfpx/vx589RTT5m9e/eatrY2s2vXLvPtb3/bfOMb3zBffPFFdI7RtH8ki6vCiTHGPP/882bKlCkmMzPTlJWVmffeey962Q9+8ANTVVUVM/71118306ZNM5mZmebmm28227dvH+GKk0NSv39efPHF6JjL+/Hkk09Ge5eXl2fuuOMO09LSMvLFJ8HSpUvNpEmTTGZmpvn6179uli5dao4fPx693E37hjHG7Ny500gyR48e7XPZaN8v3n777X4fG73bHIlEzKpVq0xeXp7xer3mtttu69OnqVOnmrq6uph1gz332GywfrS1tQ34XPL2229H57i8H0M93mw2WD+6u7vNokWLzNe+9jWTkZFhpk6dalasWNEnZIym/SNZPMYYMwJv0AAAAFwR1xxzAgAAnIFwAgAArEI4AQAAViGcAAAAqxBOAACAVQgnAADAKoQTAABgFcIJAACwCuEEAABYhXACAACsQjgBAABWIZwAAACr/B8stLbzWZt1UAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_ie['ConvertedCompYearly_Log'] = np.log(df_ie['ConvertedCompYearly'])\n",
    "df_ie.ConvertedCompYearly_Log.hist(log=True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Feature Engineering\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h5>7.1 Create a new column `ExperienceLevel` based on the `YearsCodePro` column:</h5>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '3', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '4', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '5', '50', '6', '7', '8', '9', 'Less than 1 year', 'More than 50 years', 'Unknown']\n"
     ]
    }
   ],
   "source": [
    "## Write your code here\n",
    "print(sorted(df_ie.YearsCodePro.fillna('Unknown').unique()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(65437, 126)\n",
      "   ResponseId                      MainBranch                 Age  \\\n",
      "0           1  I am a developer by profession  Under 18 years old   \n",
      "1           2  I am a developer by profession     35-44 years old   \n",
      "2           3  I am a developer by profession     45-54 years old   \n",
      "3           4           I am learning to code     18-24 years old   \n",
      "4           5  I am a developer by profession     18-24 years old   \n",
      "\n",
      "            Employment                            RemoteWork   Check  \\\n",
      "0  Employed, full-time                                Remote  Apples   \n",
      "1  Employed, full-time                                Remote  Apples   \n",
      "2  Employed, full-time                                Remote  Apples   \n",
      "3   Student, full-time  Hybrid (some remote, some in-person)  Apples   \n",
      "4   Student, full-time  Hybrid (some remote, some in-person)  Apples   \n",
      "\n",
      "                                    CodingActivities  \\\n",
      "0                                              Hobby   \n",
      "1  Hobby;Contribute to open-source projects;Other...   \n",
      "2  Hobby;Contribute to open-source projects;Other...   \n",
      "3                                                NaN   \n",
      "4                                                NaN   \n",
      "\n",
      "                                             EdLevel  \\\n",
      "0                          Primary/elementary school   \n",
      "1       Bachelor’s degree (B.A., B.S., B.Eng., etc.)   \n",
      "2    Master’s degree (M.A., M.S., M.Eng., MBA, etc.)   \n",
      "3  Some college/university study without earning ...   \n",
      "4  Secondary school (e.g. American high school, G...   \n",
      "\n",
      "                                           LearnCode  \\\n",
      "0                             Books / Physical media   \n",
      "1  Books / Physical media;Colleague;On the job tr...   \n",
      "2  Books / Physical media;Colleague;On the job tr...   \n",
      "3  Other online resources (e.g., videos, blogs, f...   \n",
      "4  Other online resources (e.g., videos, blogs, f...   \n",
      "\n",
      "                                     LearnCodeOnline  ... I prefer not to say  \\\n",
      "0                                                NaN  ...               False   \n",
      "1  Technical documentation;Blogs;Books;Written Tu...  ...               False   \n",
      "2  Technical documentation;Blogs;Books;Written Tu...  ...               False   \n",
      "3  Stack Overflow;How-to videos;Interactive tutorial  ...               False   \n",
      "4  Technical documentation;Blogs;Written Tutorial...  ...               False   \n",
      "\n",
      "  Independent contractor, freelancer, or self-employed  \\\n",
      "0                                              False     \n",
      "1                                              False     \n",
      "2                                              False     \n",
      "3                                              False     \n",
      "4                                              False     \n",
      "\n",
      "  Not employed, and not looking for work Not employed, but looking for work  \\\n",
      "0                                  False                              False   \n",
      "1                                  False                              False   \n",
      "2                                  False                              False   \n",
      "3                                  False                              False   \n",
      "4                                  False                              False   \n",
      "\n",
      "  Retired Student, full-time Student, part-time ConvertedCompYearly_MinMax  \\\n",
      "0   False              False              False                   0.003998   \n",
      "1   False              False              False                   0.003998   \n",
      "2   False              False              False                   0.003998   \n",
      "3   False               True              False                   0.003998   \n",
      "4   False               True              False                   0.003998   \n",
      "\n",
      "  ConvertedCompYearly_Log ExperienceLevel  \n",
      "0               11.082143             NaN  \n",
      "1               11.082143             Low  \n",
      "2               11.082143          Medium  \n",
      "3               11.082143             NaN  \n",
      "4               11.082143             NaN  \n",
      "\n",
      "[5 rows x 126 columns]\n"
     ]
    }
   ],
   "source": [
    "df_fe = pd.DataFrame(df_ie.YearsCodePro)\n",
    "df_fe = df_fe.dropna()\n",
    "df_fe = df_fe.replace({'Less than 1 year': 0, 'More than 50 years': 51}).astype(int)\n",
    "\n",
    "bins = np.linspace(min(df_fe.YearsCodePro), max(df_fe.YearsCodePro), 4)\n",
    "group_names = ['Low', 'Medium', 'High']\n",
    "df_fe['ExperienceLevel'] = pd.cut(df_fe.YearsCodePro, bins, labels=group_names, include_lowest=True )\n",
    "\n",
    "df_iefe = pd.concat([df_ie, df_fe.ExperienceLevel], axis=1)\n",
    "print(df_iefe.shape)\n",
    "print(df_iefe.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Experience bins')"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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mWnOsXnzZqdfWLg5jB07VsuWLTPX33jjjQp/Aik5OVlvvvmmlixZoj179iguLk6PPvqoNm/eLEk6evSoBg0apAcffFA5OTnmL6aqsHz5cjVq1Ejbtm3TlClTNGnSJP3ud7/TXXfdpR07dqhfv34aOXKkzp49WyX7w41lxYoVeu655/THP/5R2dnZat68uV577bUKdZs2bdLBgwe1adMmLV++XCkpKUpJSbn+Dd+oDMAFYmJijIceeqjC9ieffNJo06aNUVZWZm5bvHixUbduXaO0tNQwDMPo3Lmz8eKLLxqGYRgDBw40nnvuOcPT09M4ffq08e233xqSjK+//vq6HAdcr/yzlJ+fb3h5eRmHDx82Dh8+bHh7exsnTpwwHnroISMmJsY4f/68UadOHWPr1q1Orx83bpwxfPhwwzAMIzEx0QgNDXUaT0hIMCQZp06dMgzDMJYtW2b4+flV2P+lHn/8caNXr17meq9evYwePXqY6xcvXjR8fX2NkSNHmtuOHz9uSDKysrJ+xbuBmiAmJsbw8PAwfH19nRZvb2/zs3b55ywiIsKIjY11mufuu+82OnXq5DRvixYtjIsXL5rbfve73xlDhw691od00+BME6qVr776SpGRkXJzczO33X333Tpz5oy+/fZbSVKvXr2UmZkpwzD00UcfadCgQWrXrp3+9a9/afPmzWratKluu+02Vx0CXKRx48aKjo5WSkqKli1bpujoaDVq1MgcP3DggM6ePav77rtPdevWNZc333xTBw8elPTj5y8iIsJp3sjIyCrpr2PHjubPHh4eatiwoTp06GBuK/8bl/n5+VWyP1Rvffr0UU5OjtOydOnSn6zft2+funXr5rTt8nVJuuOOO+Th4WGuN2nShM9UFeJvz6HG6d27t9544w198cUXql27ttq2bavevXsrMzNTp06dUq9evVzdIlxk7Nix5t+OXLx4sdPYmTNnJEmpqam65ZZbnMZ+zd/zcnd3l3HZX6Oq7BqS2rVrO627ubk5bSv/D4WysrKr7gU1h6+vr1q3bu20rfw/DH+Nyj5nfKaqDmeaUK20a9dOWVlZTr+EPv74Y9WrV0/NmjWT9J/rml5++WUzIJWHpszMTK5nuon1799fJSUlunDhgux2u9NYaGiovLy8dOTIEbVu3dppCQ4OlvTj52/btm1Or/vkk09+dp+NGzfW8ePH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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(group_names, df_iefe.ExperienceLevel.value_counts())\n",
    "plt.xlabel('Experience')\n",
    "plt.ylabel('Count')\n",
    "plt.title('Experience bins')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Summary\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this lab, you:\n",
    "\n",
    "- Explored the dataset to identify inconsistencies and missing values.\n",
    "\n",
    "- Encoded categorical variables for analysis.\n",
    "\n",
    "- Handled missing values using imputation techniques.\n",
    "\n",
    "- Normalized and transformed numerical data to prepare it for analysis.\n",
    "\n",
    "- Engineered a new feature to enhance data interpretation.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Copyright © IBM Corporation. All rights reserved.\n"
   ]
  }
 ],
 "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.13.5"
  },
  "prev_pub_hash": "1e8e234f19fd098e27b0518a87f18de690e1c51f1d3263d5690927d19971251e"
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
