From 77fd327c729929a9056a931a6eb194b29a20dabc Mon Sep 17 00:00:00 2001 From: Deeksha1-Shet Date: Sun, 14 Jul 2024 20:42:22 +0530 Subject: [PATCH] Update Customer Churn Analysis.ipynb --- Customer Churn Analysis.ipynb | 41738 +------------------------------- 1 file changed, 1 insertion(+), 41737 deletions(-) diff --git a/Customer Churn Analysis.ipynb b/Customer Churn Analysis.ipynb index 7650a1f..f0abfbc 100644 --- a/Customer Churn Analysis.ipynb +++ b/Customer Churn Analysis.ipynb @@ -1,41737 +1 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "a9ee639c", - "metadata": {}, - "outputs": [], - "source": [ - "#importing libraries to retrieve data and read csv and to perform EDa tasks\n", - "import pandas as pd\n", - "import numpy as np\n", - "#importing for visualisation\n", - "import seaborn as sns\n", - "#sklearn for converting catagorical values to Numeric data" - ] - }, - { - "cell_type": "markdown", - "id": "902edb01", - "metadata": {}, - "source": [ - "# Real time use case\n", - "\n", - "Customer churn analysis helps businesses understand \n", - "why customers don't return for repeat business. Churn rate tells you\n", - "what portion of your customers leave over a period of time\n", - "\n", - "A company's churn rate, or employee churn rate, refers to both the attrition rate and the turnover rate. All of these terms refer to the number of employees who leave the organization during a specified period of time, generally a year. (Note that the term 'churn' used generically can also apply to customers.)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "56002c49", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "#import dataset\n", - "data = pd.read_csv(\"C://Users//Lenovo//Downloads//Customer_Churn-1.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a48f5f33", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
customerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurity...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
07590-VHVEGFemale0YesNo1NoNo phone serviceDSLNo...NoNoNoNoMonth-to-monthYesElectronic check29.8529.85No
15575-GNVDEMale0NoNo34YesNoDSLYes...YesNoNoNoOne yearNoMailed check56.951889.5No
23668-QPYBKMale0NoNo2YesNoDSLYes...NoNoNoNoMonth-to-monthYesMailed check53.85108.15Yes
37795-CFOCWMale0NoNo45NoNo phone serviceDSLYes...YesYesNoNoOne yearNoBank transfer (automatic)42.301840.75No
49237-HQITUFemale0NoNo2YesNoFiber opticNo...NoNoNoNoMonth-to-monthYesElectronic check70.70151.65Yes
59305-CDSKCFemale0NoNo8YesYesFiber opticNo...YesNoYesYesMonth-to-monthYesElectronic check99.65820.5Yes
61452-KIOVKMale0NoYes22YesYesFiber opticNo...NoNoYesNoMonth-to-monthYesCredit card (automatic)89.101949.4No
76713-OKOMCFemale0NoNo10NoNo phone serviceDSLYes...NoNoNoNoMonth-to-monthNoMailed check29.75301.9No
87892-POOKPFemale0YesNo28YesYesFiber opticNo...YesYesYesYesMonth-to-monthYesElectronic check104.803046.05Yes
96388-TABGUMale0NoYes62YesNoDSLYes...NoNoNoNoOne yearNoBank transfer (automatic)56.153487.95No
\n", - "

10 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " customerID gender SeniorCitizen Partner Dependents tenure PhoneService \\\n", - "0 7590-VHVEG Female 0 Yes No 1 No \n", - "1 5575-GNVDE Male 0 No No 34 Yes \n", - "2 3668-QPYBK Male 0 No No 2 Yes \n", - "3 7795-CFOCW Male 0 No No 45 No \n", - "4 9237-HQITU Female 0 No No 2 Yes \n", - "5 9305-CDSKC Female 0 No No 8 Yes \n", - "6 1452-KIOVK Male 0 No Yes 22 Yes \n", - "7 6713-OKOMC Female 0 No No 10 No \n", - "8 7892-POOKP Female 0 Yes No 28 Yes \n", - "9 6388-TABGU Male 0 No Yes 62 Yes \n", - "\n", - " MultipleLines InternetService OnlineSecurity ... DeviceProtection \\\n", - "0 No phone service DSL No ... No \n", - "1 No DSL Yes ... Yes \n", - "2 No DSL Yes ... No \n", - "3 No phone service DSL Yes ... Yes \n", - "4 No Fiber optic No ... No \n", - "5 Yes Fiber optic No ... Yes \n", - "6 Yes Fiber optic No ... No \n", - "7 No phone service DSL Yes ... No \n", - "8 Yes Fiber optic No ... Yes \n", - "9 No DSL Yes ... No \n", - "\n", - " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "0 No No No Month-to-month Yes \n", - "1 No No No One year No \n", - "2 No No No Month-to-month Yes \n", - "3 Yes No No One year No \n", - "4 No No No Month-to-month Yes \n", - "5 No Yes Yes Month-to-month Yes \n", - "6 No Yes No Month-to-month Yes \n", - "7 No No No Month-to-month No \n", - "8 Yes Yes Yes Month-to-month Yes \n", - "9 No No No One year No \n", - "\n", - " PaymentMethod MonthlyCharges TotalCharges Churn \n", - "0 Electronic check 29.85 29.85 No \n", - "1 Mailed check 56.95 1889.5 No \n", - "2 Mailed check 53.85 108.15 Yes \n", - "3 Bank transfer (automatic) 42.30 1840.75 No \n", - "4 Electronic check 70.70 151.65 Yes \n", - "5 Electronic check 99.65 820.5 Yes \n", - "6 Credit card (automatic) 89.10 1949.4 No \n", - "7 Mailed check 29.75 301.9 No \n", - "8 Electronic check 104.80 3046.05 Yes \n", - "9 Bank transfer (automatic) 56.15 3487.95 No \n", - "\n", - "[10 rows x 21 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# After importing : Immediate step is to get the friendship with the data.\n", - "\n", - "#Top 10 recordings\n", - "data.head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "12cdffa9", - "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", - "
countmeanstdmin25%50%75%max
SeniorCitizen7043.00.1621470.3686120.000.00.000.001.00
tenure7043.032.37114924.5594810.009.029.0055.0072.00
MonthlyCharges7043.064.76169230.09004718.2535.570.3589.85118.75
\n", - "
" - ], - "text/plain": [ - " count mean std min 25% 50% 75% \\\n", - "SeniorCitizen 7043.0 0.162147 0.368612 0.00 0.0 0.00 0.00 \n", - "tenure 7043.0 32.371149 24.559481 0.00 9.0 29.00 55.00 \n", - "MonthlyCharges 7043.0 64.761692 30.090047 18.25 35.5 70.35 89.85 \n", - "\n", - " max \n", - "SeniorCitizen 1.00 \n", - "tenure 72.00 \n", - "MonthlyCharges 118.75 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#descriptive stats for numeric columns\n", - "data.describe().T" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "512a42bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "customerID 0\n", - "gender 0\n", - "SeniorCitizen 0\n", - "Partner 0\n", - "Dependents 0\n", - "tenure 0\n", - "PhoneService 0\n", - "MultipleLines 0\n", - "InternetService 0\n", - "OnlineSecurity 0\n", - "OnlineBackup 0\n", - "DeviceProtection 0\n", - "TechSupport 0\n", - "StreamingTV 0\n", - "StreamingMovies 0\n", - "Contract 0\n", - "PaperlessBilling 0\n", - "PaymentMethod 0\n", - "MonthlyCharges 0\n", - "TotalCharges 0\n", - "Churn 0\n", - "dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#$checking null Values in the data\n", - "data.isnull().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "3182c4a4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 7043 entries, 0 to 7042\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 customerID 7043 non-null object \n", - " 1 gender 7043 non-null object \n", - " 2 SeniorCitizen 7043 non-null int64 \n", - " 3 Partner 7043 non-null object \n", - " 4 Dependents 7043 non-null object \n", - " 5 tenure 7043 non-null int64 \n", - " 6 PhoneService 7043 non-null object \n", - " 7 MultipleLines 7043 non-null object \n", - " 8 InternetService 7043 non-null object \n", - " 9 OnlineSecurity 7043 non-null object \n", - " 10 OnlineBackup 7043 non-null object \n", - " 11 DeviceProtection 7043 non-null object \n", - " 12 TechSupport 7043 non-null object \n", - " 13 StreamingTV 7043 non-null object \n", - " 14 StreamingMovies 7043 non-null object \n", - " 15 Contract 7043 non-null object \n", - " 16 PaperlessBilling 7043 non-null object \n", - " 17 PaymentMethod 7043 non-null object \n", - " 18 MonthlyCharges 7043 non-null float64\n", - " 19 TotalCharges 7043 non-null object \n", - " 20 Churn 7043 non-null object \n", - "dtypes: float64(1), int64(2), object(18)\n", - "memory usage: 1.1+ MB\n" - ] - } - ], - "source": [ - "data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "12040083", - "metadata": {}, - "outputs": [], - "source": [ - "#changing total charges to numeric as it is continuos variable\n", - "data['TotalCharges'] = pd.to_numeric(data['TotalCharges'], errors = 'coerce')\n", - "\n", - "#errors = 'coerce' : It will ignore all non-numeric values.It will replace all non-numeric values with NaN." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "f31e0524", - "metadata": {}, - "outputs": [], - "source": [ - "#drop nan values\n", - "data = data.dropna(how='any', axis = 0)\n", - "\n", - "# axis=0 will be removing rows from dataset.\n", - "# axis=1 will be removing columns" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "7a25184d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Int64Index: 7032 entries, 0 to 7042\n", - "Data columns (total 21 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 customerID 7032 non-null object \n", - " 1 gender 7032 non-null object \n", - " 2 SeniorCitizen 7032 non-null int64 \n", - " 3 Partner 7032 non-null object \n", - " 4 Dependents 7032 non-null object \n", - " 5 tenure 7032 non-null int64 \n", - " 6 PhoneService 7032 non-null object \n", - " 7 MultipleLines 7032 non-null object \n", - " 8 InternetService 7032 non-null object \n", - " 9 OnlineSecurity 7032 non-null object \n", - " 10 OnlineBackup 7032 non-null object \n", - " 11 DeviceProtection 7032 non-null object \n", - " 12 TechSupport 7032 non-null object \n", - " 13 StreamingTV 7032 non-null object \n", - " 14 StreamingMovies 7032 non-null object \n", - " 15 Contract 7032 non-null object \n", - " 16 PaperlessBilling 7032 non-null object \n", - " 17 PaymentMethod 7032 non-null object \n", - " 18 MonthlyCharges 7032 non-null float64\n", - " 19 TotalCharges 7032 non-null float64\n", - " 20 Churn 7032 non-null object \n", - "dtypes: float64(2), int64(2), object(17)\n", - "memory usage: 1.2+ MB\n" - ] - } - ], - "source": [ - "data.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "7fbf471f", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
indexcustomerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetService...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
007590-VHVEGFemale0YesNo1NoNo phone serviceDSL...NoNoNoNoMonth-to-monthYesElectronic check29.8529.85No
115575-GNVDEMale0NoNo34YesNoDSL...YesNoNoNoOne yearNoMailed check56.951889.50No
223668-QPYBKMale0NoNo2YesNoDSL...NoNoNoNoMonth-to-monthYesMailed check53.85108.15Yes
337795-CFOCWMale0NoNo45NoNo phone serviceDSL...YesYesNoNoOne yearNoBank transfer (automatic)42.301840.75No
449237-HQITUFemale0NoNo2YesNoFiber optic...NoNoNoNoMonth-to-monthYesElectronic check70.70151.65Yes
..................................................................
702770386840-RESVBMale0YesYes24YesYesDSL...YesYesYesYesOne yearYesMailed check84.801990.50No
702870392234-XADUHFemale0YesYes72YesYesFiber optic...YesNoYesYesOne yearYesCredit card (automatic)103.207362.90No
702970404801-JZAZLFemale0YesYes11NoNo phone serviceDSL...NoNoNoNoMonth-to-monthYesElectronic check29.60346.45No
703070418361-LTMKDMale1YesNo4YesYesFiber optic...NoNoNoNoMonth-to-monthYesMailed check74.40306.60Yes
703170423186-AJIEKMale0NoNo66YesNoFiber optic...YesYesYesYesTwo yearYesBank transfer (automatic)105.656844.50No
\n", - "

7032 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " index customerID gender SeniorCitizen Partner Dependents tenure \\\n", - "0 0 7590-VHVEG Female 0 Yes No 1 \n", - "1 1 5575-GNVDE Male 0 No No 34 \n", - "2 2 3668-QPYBK Male 0 No No 2 \n", - "3 3 7795-CFOCW Male 0 No No 45 \n", - "4 4 9237-HQITU Female 0 No No 2 \n", - "... ... ... ... ... ... ... ... \n", - "7027 7038 6840-RESVB Male 0 Yes Yes 24 \n", - "7028 7039 2234-XADUH Female 0 Yes Yes 72 \n", - "7029 7040 4801-JZAZL Female 0 Yes Yes 11 \n", - "7030 7041 8361-LTMKD Male 1 Yes No 4 \n", - "7031 7042 3186-AJIEK Male 0 No No 66 \n", - "\n", - " PhoneService MultipleLines InternetService ... DeviceProtection \\\n", - "0 No No phone service DSL ... No \n", - "1 Yes No DSL ... Yes \n", - "2 Yes No DSL ... No \n", - "3 No No phone service DSL ... Yes \n", - "4 Yes No Fiber optic ... No \n", - "... ... ... ... ... ... \n", - "7027 Yes Yes DSL ... Yes \n", - "7028 Yes Yes Fiber optic ... Yes \n", - "7029 No No phone service DSL ... No \n", - "7030 Yes Yes Fiber optic ... No \n", - "7031 Yes No Fiber optic ... Yes \n", - "\n", - " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "0 No No No Month-to-month Yes \n", - "1 No No No One year No \n", - "2 No No No Month-to-month Yes \n", - "3 Yes No No One year No \n", - "4 No No No Month-to-month Yes \n", - "... ... ... ... ... ... \n", - "7027 Yes Yes Yes One year Yes \n", - "7028 No Yes Yes One year Yes \n", - "7029 No No No Month-to-month Yes \n", - "7030 No No No Month-to-month Yes \n", - "7031 Yes Yes Yes Two year Yes \n", - "\n", - " PaymentMethod MonthlyCharges TotalCharges Churn \n", - "0 Electronic check 29.85 29.85 No \n", - "1 Mailed check 56.95 1889.50 No \n", - "2 Mailed check 53.85 108.15 Yes \n", - "3 Bank transfer (automatic) 42.30 1840.75 No \n", - "4 Electronic check 70.70 151.65 Yes \n", - "... ... ... ... ... \n", - "7027 Mailed check 84.80 1990.50 No \n", - "7028 Credit card (automatic) 103.20 7362.90 No \n", - "7029 Electronic check 29.60 346.45 No \n", - "7030 Mailed check 74.40 306.60 Yes \n", - "7031 Bank transfer (automatic) 105.65 6844.50 No \n", - "\n", - "[7032 rows x 22 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = data.reset_index()\n", - "data\n", - "\n", - "#Pandas reset_index() is a method to reset index of a Data Frame. \n", - "#reset_index() method sets a list of integer ranging from 0 to length of data as index." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "8b145d67", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['customerID', 'gender', 'Partner', 'Dependents', 'PhoneService',\n", - " 'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup',\n", - " 'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies',\n", - " 'Contract', 'PaperlessBilling', 'PaymentMethod', 'Churn'],\n", - " dtype='object')" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#extratcing columns names with \"object\" Datatype\n", - "cols = data.select_dtypes(include=['object']).columns\n", - "cols\n", - "# 17 object data types are present" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "f0b567d6", - "metadata": {}, - "outputs": [], - "source": [ - "#copying datset\n", - "data2 = data.copy()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "b6e27dc6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "RangeIndex: 7032 entries, 0 to 7031\n", - "Data columns (total 22 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 index 7032 non-null int64 \n", - " 1 customerID 7032 non-null int32 \n", - " 2 gender 7032 non-null int32 \n", - " 3 SeniorCitizen 7032 non-null int64 \n", - " 4 Partner 7032 non-null int32 \n", - " 5 Dependents 7032 non-null int32 \n", - " 6 tenure 7032 non-null int64 \n", - " 7 PhoneService 7032 non-null int32 \n", - " 8 MultipleLines 7032 non-null int32 \n", - " 9 InternetService 7032 non-null int32 \n", - " 10 OnlineSecurity 7032 non-null int32 \n", - " 11 OnlineBackup 7032 non-null int32 \n", - " 12 DeviceProtection 7032 non-null int32 \n", - " 13 TechSupport 7032 non-null int32 \n", - " 14 StreamingTV 7032 non-null int32 \n", - " 15 StreamingMovies 7032 non-null int32 \n", - " 16 Contract 7032 non-null int32 \n", - " 17 PaperlessBilling 7032 non-null int32 \n", - " 18 PaymentMethod 7032 non-null int32 \n", - " 19 MonthlyCharges 7032 non-null float64\n", - " 20 TotalCharges 7032 non-null float64\n", - " 21 Churn 7032 non-null int32 \n", - "dtypes: float64(2), int32(17), int64(3)\n", - "memory usage: 741.8 KB\n", - "None\n" - ] - } - ], - "source": [ - "#import the LabelEncoder class from the sklearn library,\n", - "from sklearn.preprocessing import LabelEncoder\n", - "\n", - "#making instance of labelnecoder\n", - "le = LabelEncoder()\n", - "\n", - "\n", - "#Label Encoding is a popular encoding technique for handling categorical variables.\n", - "#In this technique, each label is assigned a unique integer based on alphabetical ordering\n", - "#It can also be used to transform non-numerical labels to numerical labels.\n", - "\n", - "\n", - "for i in cols:\n", - " data2[i] = le.fit_transform(data2[i])\n", - " \n", - "#fit and transform the object data, and then replace the existing text data with the new encoded data.\n", - "\n", - "# checking the datatypes chnges or not\n", - "print (data2.info())" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "2051b0f0", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
indexcustomerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetService...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
00536500101010...000001229.8529.850
113953100034100...200010356.951889.500
22255810002100...000001353.85108.151
335524100045010...220010042.301840.750
44650000002101...000001270.70151.651
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " index customerID gender SeniorCitizen Partner Dependents tenure \\\n", - "0 0 5365 0 0 1 0 1 \n", - "1 1 3953 1 0 0 0 34 \n", - "2 2 2558 1 0 0 0 2 \n", - "3 3 5524 1 0 0 0 45 \n", - "4 4 6500 0 0 0 0 2 \n", - "\n", - " PhoneService MultipleLines InternetService ... DeviceProtection \\\n", - "0 0 1 0 ... 0 \n", - "1 1 0 0 ... 2 \n", - "2 1 0 0 ... 0 \n", - "3 0 1 0 ... 2 \n", - "4 1 0 1 ... 0 \n", - "\n", - " TechSupport StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "0 0 0 0 0 1 \n", - "1 0 0 0 1 0 \n", - "2 0 0 0 0 1 \n", - "3 2 0 0 1 0 \n", - "4 0 0 0 0 1 \n", - "\n", - " PaymentMethod MonthlyCharges TotalCharges Churn \n", - "0 2 29.85 29.85 0 \n", - "1 3 56.95 1889.50 0 \n", - "2 3 53.85 108.15 1 \n", - "3 0 42.30 1840.75 0 \n", - "4 2 70.70 151.65 1 \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data2.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "694b1ab5", - "metadata": {}, - "outputs": [], - "source": [ - "#Pandas profiling is an open source Python module with which we can quickly do an\n", - "#exploratory data analysis with just a few lines of code.\n", - "\n", - "\n", - "import pandas_profiling\n", - "\n", - "# SweetViz\n", - "# Pandas-Profiling\n", - "# Sweetviz\n", - "# Autoviz\n", - "# D-Tale" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "8f03c4a7", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ed2a3f58d6234b028179f208a2d34cae", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Summarize dataset: 0%| | 0/35 [00:00" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pandas_profiling.ProfileReport(data2)\n", - "\n", - "#The main disadvantage of pandas profiling is its use with large datasets.\n", - "#With the increase in the size of the data the time to generate the report also increases a lot." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "c12ed8cf", - "metadata": {}, - "outputs": [], - "source": [ - "def var_summary(x):\n", - " uc = x.mean()+(2*x.std())\n", - " lc = x.mean()-(2*x.std())\n", - " \n", - " for i in x:\n", - " if iuc:\n", - " count = 1\n", - " else:\n", - " count = 0\n", - " outlier_flag = count\n", - " return pd.Series([x.count(), x.isnull().sum(), x.sum(), x.mean(), x.median(), x.std(), x.var(), x.min(), x.quantile(0.01), x.quantile(0.05),x.quantile(0.10),x.quantile(0.25),x.quantile(0.50),x.quantile(0.75), x.quantile(0.90),x.quantile(0.95), x.quantile(0.99),x.max() , lc , uc,outlier_flag],\n", - " index=['N', 'NMISS', 'SUM', 'MEAN','MEDIAN', 'STD', 'VAR', 'MIN', 'P1' , 'P5' ,'P10' ,'P25' ,'P50' ,'P75' ,'P90' ,'P95' ,'P99' ,'MAX','LC','UC','outlier_flag'])\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "eb5ff419", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
NNMISSSUMMEANMEDIANSTDVARMINP1P5...P25P50P75P90P95P99MAXLCUCoutlier_flag
df_index7032.00.024763625.03521.5621443521.5002032.8324484.132408e+060.0070.31351.550...1762.75003521.5005282.25006336.9006689.45006971.69007042.00-544.1027527587.2270410.0
customerID7032.00.024720996.03515.5000003515.5002030.1078794.121338e+060.0070.31351.550...1757.75003515.5005273.25006327.9006679.45006960.69007031.00-544.7157587575.7157580.0
gender7032.00.03549.00.5046931.0000.5000142.500135e-010.000.000.000...0.00001.0001.00001.0001.00001.00001.00-0.4953341.5047200.0
SeniorCitizen7032.00.01142.00.1624000.0000.3688441.360459e-010.000.000.000...0.00000.0000.00001.0001.00001.00001.00-0.5752880.9000880.0
Partner7032.00.03393.00.4825090.0000.4997292.497296e-010.000.000.000...0.00000.0001.00001.0001.00001.00001.00-0.5169501.4819680.0
Dependents7032.00.02099.00.2984930.0000.4576292.094246e-010.000.000.000...0.00000.0001.00001.0001.00001.00001.00-0.6167661.2137510.0
tenure7032.00.0227990.032.42178629.00024.5452606.024698e+021.001.001.000...9.000029.00055.000069.00072.000072.000072.00-16.66873381.5123060.0
PhoneService7032.00.06352.00.9032991.0000.2955718.736218e-020.000.000.000...1.00001.0001.00001.0001.00001.00001.000.3121571.4944410.0
MultipleLines7032.00.06614.00.9405571.0000.9486278.998938e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.9566972.8378120.0
InternetService7032.00.06136.00.8725821.0000.7372715.435690e-010.000.000.000...0.00001.0001.00002.0002.00002.00002.00-0.6019602.3471250.0
OnlineSecurity7032.00.05550.00.7892491.0000.8599627.395345e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.9306752.5091730.0
OnlineBackup7032.00.06370.00.9058591.0000.8803947.750930e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.8549282.6666460.0
DeviceProtection7032.00.06356.00.9038681.0000.8801787.747141e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.8564892.6642250.0
TechSupport7032.00.05600.00.7963591.0000.8616747.424814e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.9269882.5197070.0
StreamingTV7032.00.06926.00.9849261.0000.8852857.837295e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.7856442.7554960.0
StreamingMovies7032.00.06982.00.9928901.0000.8853857.839062e-010.000.000.000...0.00001.0002.00002.0002.00002.00002.00-0.7778802.7636590.0
Contract7032.00.04842.00.6885670.0000.8329346.937791e-010.000.000.000...0.00000.0001.00002.0002.00002.00002.00-0.9773012.3544350.0
PaperlessBilling7032.00.04168.00.5927191.0000.4913632.414375e-010.000.000.000...0.00001.0001.00001.0001.00001.00001.00-0.3900071.5754450.0
PaymentMethod7032.00.011063.01.5732372.0001.0675041.139565e+000.000.000.000...1.00002.0002.00003.0003.00003.00003.00-0.5617723.7082450.0
MonthlyCharges7032.00.0455661.064.79820870.35030.0859749.051658e+0218.2519.2019.650...35.587570.35089.8625102.645107.4225114.7345118.754.626260124.9701560.0
TotalCharges7032.00.016056168.72283.3004411397.4752266.7713625.138252e+0618.8019.9049.605...401.45001397.4753794.73755976.6406923.59008039.88308684.80-2250.2422836816.8431651.0
Churn7032.00.01869.00.2657850.0000.4417821.951711e-010.000.000.000...0.00000.0001.00001.0001.00001.00001.00-0.6177781.1493480.0
\n", - "

22 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " N NMISS SUM MEAN MEDIAN \\\n", - "df_index 7032.0 0.0 24763625.0 3521.562144 3521.500 \n", - "customerID 7032.0 0.0 24720996.0 3515.500000 3515.500 \n", - "gender 7032.0 0.0 3549.0 0.504693 1.000 \n", - "SeniorCitizen 7032.0 0.0 1142.0 0.162400 0.000 \n", - "Partner 7032.0 0.0 3393.0 0.482509 0.000 \n", - "Dependents 7032.0 0.0 2099.0 0.298493 0.000 \n", - "tenure 7032.0 0.0 227990.0 32.421786 29.000 \n", - "PhoneService 7032.0 0.0 6352.0 0.903299 1.000 \n", - "MultipleLines 7032.0 0.0 6614.0 0.940557 1.000 \n", - "InternetService 7032.0 0.0 6136.0 0.872582 1.000 \n", - "OnlineSecurity 7032.0 0.0 5550.0 0.789249 1.000 \n", - "OnlineBackup 7032.0 0.0 6370.0 0.905859 1.000 \n", - "DeviceProtection 7032.0 0.0 6356.0 0.903868 1.000 \n", - "TechSupport 7032.0 0.0 5600.0 0.796359 1.000 \n", - "StreamingTV 7032.0 0.0 6926.0 0.984926 1.000 \n", - "StreamingMovies 7032.0 0.0 6982.0 0.992890 1.000 \n", - "Contract 7032.0 0.0 4842.0 0.688567 0.000 \n", - "PaperlessBilling 7032.0 0.0 4168.0 0.592719 1.000 \n", - "PaymentMethod 7032.0 0.0 11063.0 1.573237 2.000 \n", - "MonthlyCharges 7032.0 0.0 455661.0 64.798208 70.350 \n", - "TotalCharges 7032.0 0.0 16056168.7 2283.300441 1397.475 \n", - "Churn 7032.0 0.0 1869.0 0.265785 0.000 \n", - "\n", - " STD VAR MIN P1 P5 ... \\\n", - "df_index 2032.832448 4.132408e+06 0.00 70.31 351.550 ... \n", - "customerID 2030.107879 4.121338e+06 0.00 70.31 351.550 ... \n", - "gender 0.500014 2.500135e-01 0.00 0.00 0.000 ... \n", - "SeniorCitizen 0.368844 1.360459e-01 0.00 0.00 0.000 ... \n", - "Partner 0.499729 2.497296e-01 0.00 0.00 0.000 ... \n", - "Dependents 0.457629 2.094246e-01 0.00 0.00 0.000 ... \n", - "tenure 24.545260 6.024698e+02 1.00 1.00 1.000 ... \n", - "PhoneService 0.295571 8.736218e-02 0.00 0.00 0.000 ... \n", - "MultipleLines 0.948627 8.998938e-01 0.00 0.00 0.000 ... \n", - "InternetService 0.737271 5.435690e-01 0.00 0.00 0.000 ... \n", - "OnlineSecurity 0.859962 7.395345e-01 0.00 0.00 0.000 ... \n", - "OnlineBackup 0.880394 7.750930e-01 0.00 0.00 0.000 ... \n", - "DeviceProtection 0.880178 7.747141e-01 0.00 0.00 0.000 ... \n", - "TechSupport 0.861674 7.424814e-01 0.00 0.00 0.000 ... \n", - "StreamingTV 0.885285 7.837295e-01 0.00 0.00 0.000 ... \n", - "StreamingMovies 0.885385 7.839062e-01 0.00 0.00 0.000 ... \n", - "Contract 0.832934 6.937791e-01 0.00 0.00 0.000 ... \n", - "PaperlessBilling 0.491363 2.414375e-01 0.00 0.00 0.000 ... \n", - "PaymentMethod 1.067504 1.139565e+00 0.00 0.00 0.000 ... \n", - "MonthlyCharges 30.085974 9.051658e+02 18.25 19.20 19.650 ... \n", - "TotalCharges 2266.771362 5.138252e+06 18.80 19.90 49.605 ... \n", - "Churn 0.441782 1.951711e-01 0.00 0.00 0.000 ... \n", - "\n", - " P25 P50 P75 P90 P95 \\\n", - "df_index 1762.7500 3521.500 5282.2500 6336.900 6689.4500 \n", - "customerID 1757.7500 3515.500 5273.2500 6327.900 6679.4500 \n", - "gender 0.0000 1.000 1.0000 1.000 1.0000 \n", - "SeniorCitizen 0.0000 0.000 0.0000 1.000 1.0000 \n", - "Partner 0.0000 0.000 1.0000 1.000 1.0000 \n", - "Dependents 0.0000 0.000 1.0000 1.000 1.0000 \n", - "tenure 9.0000 29.000 55.0000 69.000 72.0000 \n", - "PhoneService 1.0000 1.000 1.0000 1.000 1.0000 \n", - "MultipleLines 0.0000 1.000 2.0000 2.000 2.0000 \n", - "InternetService 0.0000 1.000 1.0000 2.000 2.0000 \n", - "OnlineSecurity 0.0000 1.000 2.0000 2.000 2.0000 \n", - "OnlineBackup 0.0000 1.000 2.0000 2.000 2.0000 \n", - "DeviceProtection 0.0000 1.000 2.0000 2.000 2.0000 \n", - "TechSupport 0.0000 1.000 2.0000 2.000 2.0000 \n", - "StreamingTV 0.0000 1.000 2.0000 2.000 2.0000 \n", - "StreamingMovies 0.0000 1.000 2.0000 2.000 2.0000 \n", - "Contract 0.0000 0.000 1.0000 2.000 2.0000 \n", - "PaperlessBilling 0.0000 1.000 1.0000 1.000 1.0000 \n", - "PaymentMethod 1.0000 2.000 2.0000 3.000 3.0000 \n", - "MonthlyCharges 35.5875 70.350 89.8625 102.645 107.4225 \n", - "TotalCharges 401.4500 1397.475 3794.7375 5976.640 6923.5900 \n", - "Churn 0.0000 0.000 1.0000 1.000 1.0000 \n", - "\n", - " P99 MAX LC UC outlier_flag \n", - "df_index 6971.6900 7042.00 -544.102752 7587.227041 0.0 \n", - "customerID 6960.6900 7031.00 -544.715758 7575.715758 0.0 \n", - "gender 1.0000 1.00 -0.495334 1.504720 0.0 \n", - "SeniorCitizen 1.0000 1.00 -0.575288 0.900088 0.0 \n", - "Partner 1.0000 1.00 -0.516950 1.481968 0.0 \n", - "Dependents 1.0000 1.00 -0.616766 1.213751 0.0 \n", - "tenure 72.0000 72.00 -16.668733 81.512306 0.0 \n", - "PhoneService 1.0000 1.00 0.312157 1.494441 0.0 \n", - "MultipleLines 2.0000 2.00 -0.956697 2.837812 0.0 \n", - "InternetService 2.0000 2.00 -0.601960 2.347125 0.0 \n", - "OnlineSecurity 2.0000 2.00 -0.930675 2.509173 0.0 \n", - "OnlineBackup 2.0000 2.00 -0.854928 2.666646 0.0 \n", - "DeviceProtection 2.0000 2.00 -0.856489 2.664225 0.0 \n", - "TechSupport 2.0000 2.00 -0.926988 2.519707 0.0 \n", - "StreamingTV 2.0000 2.00 -0.785644 2.755496 0.0 \n", - "StreamingMovies 2.0000 2.00 -0.777880 2.763659 0.0 \n", - "Contract 2.0000 2.00 -0.977301 2.354435 0.0 \n", - "PaperlessBilling 1.0000 1.00 -0.390007 1.575445 0.0 \n", - "PaymentMethod 3.0000 3.00 -0.561772 3.708245 0.0 \n", - "MonthlyCharges 114.7345 118.75 4.626260 124.970156 0.0 \n", - "TotalCharges 8039.8830 8684.80 -2250.242283 6816.843165 1.0 \n", - "Churn 1.0000 1.00 -0.617778 1.149348 0.0 \n", - "\n", - "[22 rows x 21 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data2.apply(lambda x: var_summary(x)).T" - ] - }, - { - "cell_type": "markdown", - "id": "ac7d7dec", - "metadata": {}, - "source": [ - "# Linear Regression" - ] - }, - { - "cell_type": "markdown", - "id": "21f26774", - "metadata": {}, - "source": [ - "\n", - "> Linear regression is an approach for modeling the relationship between a scalar dependent variable y and one or more explanatory variables (or independent variables) denoted X. The case of one explanatory variable is called simple linear regression. For more than one explanatory variable, the process is called multiple linear regression
\n", - "> A simple linear regression model is given by Y=mX+b
\n", - "> where m is the slope and b is the y-intercept. Y is the dependent variable and X is the explanatory variable.
\n", - "> Very briefly and simplistically, Linear Regression is a class of techniques for fitting a straight line to a set of data points.\n", - "Linear Regression has dependent variables that have continuous values" - ] - }, - { - "cell_type": "markdown", - "id": "a6f253da", - "metadata": {}, - "source": [ - "A linear regression line has an equation of the form Y = a + bX, where X is the explanatory variable and Y is the dependent variable. The slope of the line is b, and a is the intercept (the value of y when x = 0)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7a0c5ae7", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "96840e52", - "metadata": {}, - "outputs": [], - "source": [ - "X_1 = data2.drop('TotalCharges', axis = 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "519b7e27", - "metadata": {}, - "outputs": [], - "source": [ - "y_1 = data2['TotalCharges']" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "5d6fde32", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
df_indexcustomerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetService...DeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalChargesChurn
df_index1.000000-0.006309-0.0084630.0080570.000162-0.0047620.006801-0.028257-0.006518-0.007689...-0.0063530.008621-0.000675-0.0172010.0039490.0021430.021046-0.0129380.0018200.010133
customerID-0.0063091.0000000.006235-0.002368-0.026509-0.0118710.007209-0.0069870.004497-0.012335...-0.0067260.001763-0.007650-0.0172070.015949-0.0022250.011754-0.004445-0.000263-0.017858
gender-0.0084630.0062351.000000-0.001819-0.0013790.0103490.005285-0.007515-0.006908-0.002236...0.001348-0.006695-0.005624-0.0089200.000095-0.0119020.016942-0.0137790.000048-0.008545
SeniorCitizen0.008057-0.002368-0.0018191.0000000.016957-0.2105500.0156830.0083920.146287-0.032160...-0.021124-0.1510070.0310190.047088-0.1418200.156258-0.0381580.2198740.1024110.150541
Partner0.000162-0.026509-0.0013790.0169571.0000000.4522690.3819120.0183970.1427170.000513...0.1656140.1264880.1366790.1299070.294094-0.013957-0.1562320.0978250.319072-0.149982
Dependents-0.004762-0.0118710.010349-0.2105500.4522691.0000000.163386-0.001078-0.0249750.044030...0.0797230.1325300.0462140.0220880.240556-0.110131-0.041989-0.1123430.064653-0.163128
tenure0.0068010.0072090.0052850.0156830.3819120.1633861.0000000.0078770.343673-0.029835...0.3726690.3247290.2905720.2967850.6767340.004823-0.3700870.2468620.825880-0.354049
PhoneService-0.028257-0.006987-0.0075150.0083920.018397-0.0010780.0078771.000000-0.0205040.387266...0.004718-0.0181360.0563930.0430250.0030190.016696-0.0054990.2480330.1130080.011691
MultipleLines-0.0065180.004497-0.0069080.1462870.142717-0.0249750.343673-0.0205041.000000-0.108849...0.1226140.0109410.1754030.1817050.1110290.165306-0.1765980.4339050.4532020.038043
InternetService-0.007689-0.012335-0.002236-0.0321600.0005130.044030-0.0298350.387266-0.1088491.000000...0.045558-0.0256260.1081900.0979670.099579-0.1381660.084504-0.322173-0.175691-0.047097
OnlineSecurity-0.0010530.013740-0.014899-0.1279370.1506100.1511980.327283-0.0141630.007306-0.028003...0.1757890.2848750.0443990.0563130.373980-0.157723-0.096593-0.0535760.254473-0.289050
OnlineBackup0.004099-0.002960-0.011920-0.0133550.1530450.0902310.3724340.0240400.1172760.036735...0.1876460.1955810.1470850.1370830.280617-0.012697-0.1255340.1199430.375556-0.195290
DeviceProtection-0.006353-0.0067260.001348-0.0211240.1656140.0797230.3726690.0047180.1226140.045558...1.0000000.2404760.2759470.2893090.350067-0.037596-0.1364600.1639840.389066-0.177883
TechSupport0.0086210.001763-0.006695-0.1510070.1264880.1325300.324729-0.0181360.010941-0.025626...0.2404761.0000000.1611680.1625300.425072-0.113617-0.104544-0.0082370.276890-0.282232
StreamingTV-0.000675-0.007650-0.0056240.0310190.1366790.0462140.2905720.0563930.1754030.108190...0.2759470.1611681.0000000.4353540.2268260.097379-0.1047820.3371560.392472-0.036303
StreamingMovies-0.017201-0.017207-0.0089200.0470880.1299070.0220880.2967850.0430250.1817050.097967...0.2893090.1625300.4353541.0000000.2324780.083901-0.1120090.3357610.398088-0.038802
Contract0.0039490.0159490.000095-0.1418200.2940940.2405560.6767340.0030190.1110290.099579...0.3500670.4250720.2268260.2324781.000000-0.175475-0.229636-0.0727390.450306-0.396150
PaperlessBilling0.002143-0.002225-0.0119020.156258-0.013957-0.1101310.0048230.0166960.165306-0.138166...-0.037596-0.1136170.0973790.083901-0.1754751.000000-0.0613480.3519300.1578300.191454
PaymentMethod0.0210460.0117540.016942-0.038158-0.156232-0.041989-0.370087-0.005499-0.1765980.084504...-0.136460-0.104544-0.104782-0.112009-0.229636-0.0613481.000000-0.192500-0.3305940.107852
MonthlyCharges-0.012938-0.004445-0.0137790.2198740.097825-0.1123430.2468620.2480330.433905-0.322173...0.163984-0.0082370.3371560.335761-0.0727390.351930-0.1925001.0000000.6510650.192858
TotalCharges0.001820-0.0002630.0000480.1024110.3190720.0646530.8258800.1130080.453202-0.175691...0.3890660.2768900.3924720.3980880.4503060.157830-0.3305940.6510651.000000-0.199484
Churn0.010133-0.017858-0.0085450.150541-0.149982-0.163128-0.3540490.0116910.038043-0.047097...-0.177883-0.282232-0.036303-0.038802-0.3961500.1914540.1078520.192858-0.1994841.000000
\n", - "

22 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " df_index customerID gender SeniorCitizen Partner \\\n", - "df_index 1.000000 -0.006309 -0.008463 0.008057 0.000162 \n", - "customerID -0.006309 1.000000 0.006235 -0.002368 -0.026509 \n", - "gender -0.008463 0.006235 1.000000 -0.001819 -0.001379 \n", - "SeniorCitizen 0.008057 -0.002368 -0.001819 1.000000 0.016957 \n", - "Partner 0.000162 -0.026509 -0.001379 0.016957 1.000000 \n", - "Dependents -0.004762 -0.011871 0.010349 -0.210550 0.452269 \n", - "tenure 0.006801 0.007209 0.005285 0.015683 0.381912 \n", - "PhoneService -0.028257 -0.006987 -0.007515 0.008392 0.018397 \n", - "MultipleLines -0.006518 0.004497 -0.006908 0.146287 0.142717 \n", - "InternetService -0.007689 -0.012335 -0.002236 -0.032160 0.000513 \n", - "OnlineSecurity -0.001053 0.013740 -0.014899 -0.127937 0.150610 \n", - "OnlineBackup 0.004099 -0.002960 -0.011920 -0.013355 0.153045 \n", - "DeviceProtection -0.006353 -0.006726 0.001348 -0.021124 0.165614 \n", - "TechSupport 0.008621 0.001763 -0.006695 -0.151007 0.126488 \n", - "StreamingTV -0.000675 -0.007650 -0.005624 0.031019 0.136679 \n", - "StreamingMovies -0.017201 -0.017207 -0.008920 0.047088 0.129907 \n", - "Contract 0.003949 0.015949 0.000095 -0.141820 0.294094 \n", - "PaperlessBilling 0.002143 -0.002225 -0.011902 0.156258 -0.013957 \n", - "PaymentMethod 0.021046 0.011754 0.016942 -0.038158 -0.156232 \n", - "MonthlyCharges -0.012938 -0.004445 -0.013779 0.219874 0.097825 \n", - "TotalCharges 0.001820 -0.000263 0.000048 0.102411 0.319072 \n", - "Churn 0.010133 -0.017858 -0.008545 0.150541 -0.149982 \n", - "\n", - " Dependents tenure PhoneService MultipleLines \\\n", - "df_index -0.004762 0.006801 -0.028257 -0.006518 \n", - "customerID -0.011871 0.007209 -0.006987 0.004497 \n", - "gender 0.010349 0.005285 -0.007515 -0.006908 \n", - "SeniorCitizen -0.210550 0.015683 0.008392 0.146287 \n", - "Partner 0.452269 0.381912 0.018397 0.142717 \n", - "Dependents 1.000000 0.163386 -0.001078 -0.024975 \n", - "tenure 0.163386 1.000000 0.007877 0.343673 \n", - "PhoneService -0.001078 0.007877 1.000000 -0.020504 \n", - "MultipleLines -0.024975 0.343673 -0.020504 1.000000 \n", - "InternetService 0.044030 -0.029835 0.387266 -0.108849 \n", - "OnlineSecurity 0.151198 0.327283 -0.014163 0.007306 \n", - "OnlineBackup 0.090231 0.372434 0.024040 0.117276 \n", - "DeviceProtection 0.079723 0.372669 0.004718 0.122614 \n", - "TechSupport 0.132530 0.324729 -0.018136 0.010941 \n", - "StreamingTV 0.046214 0.290572 0.056393 0.175403 \n", - "StreamingMovies 0.022088 0.296785 0.043025 0.181705 \n", - "Contract 0.240556 0.676734 0.003019 0.111029 \n", - "PaperlessBilling -0.110131 0.004823 0.016696 0.165306 \n", - "PaymentMethod -0.041989 -0.370087 -0.005499 -0.176598 \n", - "MonthlyCharges -0.112343 0.246862 0.248033 0.433905 \n", - "TotalCharges 0.064653 0.825880 0.113008 0.453202 \n", - "Churn -0.163128 -0.354049 0.011691 0.038043 \n", - "\n", - " InternetService ... DeviceProtection TechSupport \\\n", - "df_index -0.007689 ... -0.006353 0.008621 \n", - "customerID -0.012335 ... -0.006726 0.001763 \n", - "gender -0.002236 ... 0.001348 -0.006695 \n", - "SeniorCitizen -0.032160 ... -0.021124 -0.151007 \n", - "Partner 0.000513 ... 0.165614 0.126488 \n", - "Dependents 0.044030 ... 0.079723 0.132530 \n", - "tenure -0.029835 ... 0.372669 0.324729 \n", - "PhoneService 0.387266 ... 0.004718 -0.018136 \n", - "MultipleLines -0.108849 ... 0.122614 0.010941 \n", - "InternetService 1.000000 ... 0.045558 -0.025626 \n", - "OnlineSecurity -0.028003 ... 0.175789 0.284875 \n", - "OnlineBackup 0.036735 ... 0.187646 0.195581 \n", - "DeviceProtection 0.045558 ... 1.000000 0.240476 \n", - "TechSupport -0.025626 ... 0.240476 1.000000 \n", - "StreamingTV 0.108190 ... 0.275947 0.161168 \n", - "StreamingMovies 0.097967 ... 0.289309 0.162530 \n", - "Contract 0.099579 ... 0.350067 0.425072 \n", - "PaperlessBilling -0.138166 ... -0.037596 -0.113617 \n", - "PaymentMethod 0.084504 ... -0.136460 -0.104544 \n", - "MonthlyCharges -0.322173 ... 0.163984 -0.008237 \n", - "TotalCharges -0.175691 ... 0.389066 0.276890 \n", - "Churn -0.047097 ... -0.177883 -0.282232 \n", - "\n", - " StreamingTV StreamingMovies Contract PaperlessBilling \\\n", - "df_index -0.000675 -0.017201 0.003949 0.002143 \n", - "customerID -0.007650 -0.017207 0.015949 -0.002225 \n", - "gender -0.005624 -0.008920 0.000095 -0.011902 \n", - "SeniorCitizen 0.031019 0.047088 -0.141820 0.156258 \n", - "Partner 0.136679 0.129907 0.294094 -0.013957 \n", - "Dependents 0.046214 0.022088 0.240556 -0.110131 \n", - "tenure 0.290572 0.296785 0.676734 0.004823 \n", - "PhoneService 0.056393 0.043025 0.003019 0.016696 \n", - "MultipleLines 0.175403 0.181705 0.111029 0.165306 \n", - "InternetService 0.108190 0.097967 0.099579 -0.138166 \n", - "OnlineSecurity 0.044399 0.056313 0.373980 -0.157723 \n", - "OnlineBackup 0.147085 0.137083 0.280617 -0.012697 \n", - "DeviceProtection 0.275947 0.289309 0.350067 -0.037596 \n", - "TechSupport 0.161168 0.162530 0.425072 -0.113617 \n", - "StreamingTV 1.000000 0.435354 0.226826 0.097379 \n", - "StreamingMovies 0.435354 1.000000 0.232478 0.083901 \n", - "Contract 0.226826 0.232478 1.000000 -0.175475 \n", - "PaperlessBilling 0.097379 0.083901 -0.175475 1.000000 \n", - "PaymentMethod -0.104782 -0.112009 -0.229636 -0.061348 \n", - "MonthlyCharges 0.337156 0.335761 -0.072739 0.351930 \n", - "TotalCharges 0.392472 0.398088 0.450306 0.157830 \n", - "Churn -0.036303 -0.038802 -0.396150 0.191454 \n", - "\n", - " PaymentMethod MonthlyCharges TotalCharges Churn \n", - "df_index 0.021046 -0.012938 0.001820 0.010133 \n", - "customerID 0.011754 -0.004445 -0.000263 -0.017858 \n", - "gender 0.016942 -0.013779 0.000048 -0.008545 \n", - "SeniorCitizen -0.038158 0.219874 0.102411 0.150541 \n", - "Partner -0.156232 0.097825 0.319072 -0.149982 \n", - "Dependents -0.041989 -0.112343 0.064653 -0.163128 \n", - "tenure -0.370087 0.246862 0.825880 -0.354049 \n", - "PhoneService -0.005499 0.248033 0.113008 0.011691 \n", - "MultipleLines -0.176598 0.433905 0.453202 0.038043 \n", - "InternetService 0.084504 -0.322173 -0.175691 -0.047097 \n", - "OnlineSecurity -0.096593 -0.053576 0.254473 -0.289050 \n", - "OnlineBackup -0.125534 0.119943 0.375556 -0.195290 \n", - "DeviceProtection -0.136460 0.163984 0.389066 -0.177883 \n", - "TechSupport -0.104544 -0.008237 0.276890 -0.282232 \n", - "StreamingTV -0.104782 0.337156 0.392472 -0.036303 \n", - "StreamingMovies -0.112009 0.335761 0.398088 -0.038802 \n", - "Contract -0.229636 -0.072739 0.450306 -0.396150 \n", - "PaperlessBilling -0.061348 0.351930 0.157830 0.191454 \n", - "PaymentMethod 1.000000 -0.192500 -0.330594 0.107852 \n", - "MonthlyCharges -0.192500 1.000000 0.651065 0.192858 \n", - "TotalCharges -0.330594 0.651065 1.000000 -0.199484 \n", - "Churn 0.107852 0.192858 -0.199484 1.000000 \n", - "\n", - "[22 rows x 22 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data2.corr()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "0cc6ad35", - "metadata": {}, - "outputs": [], - "source": [ - "# improting library for splitting the data for training and testing\n", - "from sklearn.model_selection import train_test_split\n", - "X_train_1, X_test_1, y_train_1, y_test_1 = train_test_split(X_1, y_1, test_size = 0.25, random_state = 1111)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "5605adb1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(5274, 21)\n", - "(1758, 21)\n", - "(5274,)\n", - "(1758,)\n" - ] - } - ], - "source": [ - "#checking the shape of training and testing data\n", - "print(X_train_1.shape)\n", - "print(X_test_1.shape)\n", - "print(y_train_1.shape)\n", - "print(y_test_1.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "bdd8c777", - "metadata": {}, - "outputs": [], - "source": [ - "# * Feature Scaling | Scaling the variables | standardizign the variable | Z - score | Mean = 0 and STD = 1\n", - "# To get all the variables on same scale [towards ZERO]\n", - "from sklearn.preprocessing import StandardScaler\n", - "sc = StandardScaler()\n", - "\n", - "\n", - "\n", - "#The fit method is calculating the mean and variance of each of the features present in our train data.\n", - "#The transform method is transforming all the features using the respective mean and variance. \n", - "\n", - "X_train_1 = sc.fit_transform(X_train_1)# you are finding the MEan and STD{with the fit()\n", - "# }on training data and aslo transforming that\n", - "\n", - "X_test_1= sc.transform(X_test_1) # Only tranforming now\n", - "\n", - "\n", - "#transform method we can use the same mean and variance as it is calculated from our training data to transform our test data." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "76616edb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "LinearRegression()" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.linear_model import LinearRegression\n", - "lm = LinearRegression() \n", - "lm.fit(X_train_1, y_train_1)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3aca06f9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2277.7827645051198\n" - ] - } - ], - "source": [ - "print(lm.intercept_)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "6ffbfadc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Coefficients [ 1.67435056e+00 -1.21592576e+00 9.36384978e+00 7.47791487e-01\n", - " 8.75532709e+00 -1.64395198e+01 1.49795207e+03 -1.32435809e+01\n", - " 3.52073262e+01 -1.32013722e+01 9.14191335e+01 1.14980710e+02\n", - " 8.41858741e+01 8.09522416e+01 4.15371148e+01 4.78567718e+01\n", - " -8.67741524e+01 -8.33581430e+00 5.43558008e+01 1.04663509e+03\n", - " -8.03192908e+01]\n" - ] - } - ], - "source": [ - "# The coefficients\n", - "print('Coefficients', lm.coef_)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "0e5f32ff", - "metadata": {}, - "outputs": [], - "source": [ - "#Testing\n", - "y_pred = lm.predict(X_test_1)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "feb5edc3", - "metadata": {}, - "outputs": [], - "source": [ - "y_pred = pd.DataFrame(y_pred, columns=['Predicted'])" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "b0bd8cad", - "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", - "
Predicted
03305.856021
1-1200.141076
22628.853682
33062.706854
42994.841653
......
17532052.786703
17545089.259245
17551658.150121
17563140.118481
17573199.745140
\n", - "

1758 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " Predicted\n", - "0 3305.856021\n", - "1 -1200.141076\n", - "2 2628.853682\n", - "3 3062.706854\n", - "4 2994.841653\n", - "... ...\n", - "1753 2052.786703\n", - "1754 5089.259245\n", - "1755 1658.150121\n", - "1756 3140.118481\n", - "1757 3199.745140\n", - "\n", - "[1758 rows x 1 columns]" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "6403ce1b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3906 1874.30\n", - "5978 20.35\n", - "5738 2333.05\n", - "5743 1796.55\n", - "5271 2531.40\n", - " ... \n", - "1826 1381.80\n", - "2785 5551.15\n", - "1766 1201.15\n", - "5872 2727.30\n", - "1382 1643.25\n", - "Name: TotalCharges, Length: 1758, dtype: float64" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_test_1" - ] - }, - { - "cell_type": "markdown", - "id": "2431f6e6", - "metadata": {}, - "source": [ - "### Calculating mean square error ... RMSE\n", - "> RMSE calculate the difference between the actual value and predicted value of the response(dependant) variable
\n", - "> The square root of the mean/average of the square of all of the error.
\n", - "> Compared to the similar Mean Absolute Error, RMSE amplifies and severely punishes large errors.
\n", - "> The lesser the RMSE value, the better is the model." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "1fee6c37", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean Absolute Error: 555.1405460192393\n", - "Mean Squared Error: 478817.97456224787\n", - "Root Mean Squared Error: 691.9667438267882\n" - ] - } - ], - "source": [ - "from sklearn import metrics \n", - "import numpy as np\n", - "\n", - "#Absolute Error is the amount of error in your measurements.\n", - "print('Mean Absolute Error:', metrics.mean_absolute_error(y_test_1, y_pred)) \n", - "print('Mean Squared Error:', metrics.mean_squared_error(y_test_1, y_pred)) \n", - "print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test_1, y_pred)))" - ] - }, - { - "cell_type": "markdown", - "id": "bf2dfe8d", - "metadata": {}, - "source": [ - "### Evaluating Model Accuracy\n", - "> R-squared is a statistical measure of how close the data are to the fitted regression line.
\n", - "> R-square signifies percentage of variations in the reponse variable that can be explained by the model.
\n", - "> R-squared = Explained variation / Total variation
\n", - "> Total variation is variation of response variable around it's mean.
\n", - "> R-squared value varies between 0 and 100%. 0% signifies that the model explains none of the variability,
\n", - "> while 100% signifies that the model explains all the variability of the response.
\n", - "> The closer the r-square to 100%, the better is the model.
" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "c87d1815", - "metadata": {}, - "outputs": [], - "source": [ - "#finding R-squared value\n", - "from sklearn.metrics import r2_score\n" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "33f16e28", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.9067679081449613\n" - ] - } - ], - "source": [ - "print(r2_score(y_test_1, y_pred))" - ] - }, - { - "cell_type": "markdown", - "id": "68e0476f", - "metadata": {}, - "source": [ - "# Logistic Regression\n" - ] - }, - { - "cell_type": "markdown", - "id": "5ea47ebf", - "metadata": {}, - "source": [ - "Logistic Regression is used when the dependent variable(target) is categorical. logistic regression is a predictive analysis.\n", - "Logistic regression is used to describe data and to explain the relationship between one dependent binary variable and one or more independent variables." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "e2cad95c", - "metadata": {}, - "outputs": [], - "source": [ - "#dividing independent and dependent variables\n", - "X = data2.iloc[:,:21]\n", - "y = data2.iloc[:,21:]" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "ed78c027", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
df_indexcustomerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetService...OnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalCharges
00536500101010...2000001229.8529.85
113953100034100...0200010356.951889.50
22255810002100...2000001353.85108.15
335524100045010...0220010042.301840.75
44650000002101...0000001270.70151.65
\n", - "

5 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " df_index customerID gender SeniorCitizen Partner Dependents tenure \\\n", - "0 0 5365 0 0 1 0 1 \n", - "1 1 3953 1 0 0 0 34 \n", - "2 2 2558 1 0 0 0 2 \n", - "3 3 5524 1 0 0 0 45 \n", - "4 4 6500 0 0 0 0 2 \n", - "\n", - " PhoneService MultipleLines InternetService ... OnlineBackup \\\n", - "0 0 1 0 ... 2 \n", - "1 1 0 0 ... 0 \n", - "2 1 0 0 ... 2 \n", - "3 0 1 0 ... 0 \n", - "4 1 0 1 ... 0 \n", - "\n", - " DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n", - "0 0 0 0 0 0 \n", - "1 2 0 0 0 1 \n", - "2 0 0 0 0 0 \n", - "3 2 2 0 0 1 \n", - "4 0 0 0 0 0 \n", - "\n", - " PaperlessBilling PaymentMethod MonthlyCharges TotalCharges \n", - "0 1 2 29.85 29.85 \n", - "1 0 3 56.95 1889.50 \n", - "2 1 3 53.85 108.15 \n", - "3 0 0 42.30 1840.75 \n", - "4 1 2 70.70 151.65 \n", - "\n", - "[5 rows x 21 columns]" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "a65e377e", - "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", - "
Churn
00
10
21
30
41
\n", - "
" - ], - "text/plain": [ - " Churn\n", - "0 0\n", - "1 0\n", - "2 1\n", - "3 0\n", - "4 1" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "233ff9e9", - "metadata": {}, - "outputs": [], - "source": [ - "# improting library for splitting the data for training and testing\n", - "from sklearn.model_selection import train_test_split\n", - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 1111)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "a850482e", - "metadata": {}, - "outputs": [], - "source": [ - "#importing lib for data to be align in standard scaling manner\n", - "from sklearn.preprocessing import StandardScaler\n", - "sc = StandardScaler()\n", - "\n", - "X_train = sc.fit_transform(X_train)\n", - "X_test = sc.transform(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "806e70da", - "metadata": {}, - "outputs": [], - "source": [ - "#importing library for logistic regression\n", - "from sklearn.linear_model import LogisticRegression " - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "e95406b8", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", - " return f(*args, **kwargs)\n" - ] - }, - { - "data": { - "text/plain": [ - "LogisticRegression()" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Creating intsnce of logistic regression and then fitting the data\n", - "logistic_reg= LogisticRegression()\n", - "logistic_reg.fit(X_train,y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "c58ac14e", - "metadata": {}, - "outputs": [], - "source": [ - "#predicting the test data.....\n", - "y_pred=logistic_reg.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "271ab74f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 0, 0, ..., 1, 0, 0])" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "7ae64f67", - "metadata": {}, - "outputs": [], - "source": [ - "#predcition on train data\n", - "y_pred_train = logistic_reg.predict(X_train)" - ] - }, - { - "cell_type": "markdown", - "id": "afb9a422", - "metadata": {}, - "source": [ - "# Confusion matrix\n", - "A Confusion matrix is an N x N matrix used for evaluating the performance of a classification model, where N is the number of target classes. The matrix compares the actual target values with those predicted by the machine learning model. This gives us a holistic view of how well our classification model is performing and what kinds of errors it is making." - ] - }, - { - "cell_type": "markdown", - "id": "ffc7557b", - "metadata": {}, - "source": [ - "Sklearn has two great functions: confusion_matrix() and classification_report().\n", - "\n", - "Sklearn confusion_matrix() returns the values of the Confusion matrix.\n", - "The output is, however, slightly different from what we have studied so far.\n", - "It takes the rows as Actual values and the columns as Predicted values. \n", - "The rest of the concept remains the same.\n", - "Sklearn classification_report() outputs precision, recall and f1-score for each target class. \n", - "In addition to this, it also has some extra values: micro avg, macro avg, and weighted avg" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "f95277b8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1165, 138],\n", - " [ 206, 249]], dtype=int64)" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#importing library for confusion matrix\n", - "from sklearn import metrics\n", - "cnf_matrix = metrics.confusion_matrix(y_test, y_pred)\n", - "cnf_matrix" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "aca39196", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Accuracy: 0.8043230944254836\n" - ] - } - ], - "source": [ - "#finding accuracy of model\n", - "log_acc = metrics.accuracy_score(y_test, y_pred)\n", - "print('Accuracy: ',log_acc)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "734ff962", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "sns.heatmap(cnf_matrix, annot=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "4831e0e1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " 0 0.85 0.89 0.87 1303\n", - " 1 0.64 0.55 0.59 455\n", - "\n", - " accuracy 0.80 1758\n", - " macro avg 0.75 0.72 0.73 1758\n", - "weighted avg 0.80 0.80 0.80 1758\n", - "\n" - ] - } - ], - "source": [ - "#importing library for classification_report and finding report\n", - "from sklearn.metrics import classification_report\n", - "print(classification_report(y_test,y_pred))" - ] - }, - { - "cell_type": "markdown", - "id": "8f60be40", - "metadata": {}, - "source": [ - "# Desicion Tree" - ] - }, - { - "cell_type": "markdown", - "id": "2b6101db", - "metadata": {}, - "source": [ - "A decision tree is a tree-like graph with nodes representing the place where we pick an attribute and ask a question; edges represent the answers the to the question; and the leaves represent the actual output or class label. They are used in non-linear decision making with simple linear decision surface." - ] - }, - { - "cell_type": "markdown", - "id": "adac44fc", - "metadata": {}, - "source": [ - "**Advantages of decision trees:**\n", - "\n", - "- Can be used for regression or classification\n", - "- Can be displayed graphically\n", - "- Highly interpretable\n", - "- Can be specified as a series of rules, and more closely approximate human decision-making than other models\n", - "- Prediction is fast\n", - "- Features don't need scaling\n", - "- Automatically learns feature interactions\n", - "- Tends to ignore irrelevant features\n", - "- Non-parametric (will outperform linear models if relationship between features and response is highly non-linear)\n", - "- Robust to the outliers\n", - "- Impact of Missing values is Minimal" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "4aa06922", - "metadata": {}, - "outputs": [], - "source": [ - "# Decision Tree Classification\n", - "\n", - "# Importing the libraries\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "a4136018", - "metadata": {}, - "outputs": [], - "source": [ - "# Spliting the overall data into X and Y [this is what required in ML]\n", - "\n", - "X = data2.iloc[:, :21]\n", - "\n", - "y = data2.iloc[:, 21:]" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "c2b22324", - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
df_indexcustomerIDgenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetService...OnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodMonthlyChargesTotalCharges
00536500101010...2000001229.8529.85
113953100034100...0200010356.951889.50
22255810002100...2000001353.85108.15
335524100045010...0220010042.301840.75
44650000002101...0000001270.70151.65
..................................................................
702770384843101124120...0222211384.801990.50
702870391524001172121...22022111103.207362.90
702970403358001111010...0000001229.60346.45
70307041592311104121...0000001374.40306.60
703170422221100066101...02222210105.656844.50
\n", - "

7032 rows × 21 columns

\n", - "
" - ], - "text/plain": [ - " df_index customerID gender SeniorCitizen Partner Dependents \\\n", - "0 0 5365 0 0 1 0 \n", - "1 1 3953 1 0 0 0 \n", - "2 2 2558 1 0 0 0 \n", - "3 3 5524 1 0 0 0 \n", - "4 4 6500 0 0 0 0 \n", - "... ... ... ... ... ... ... \n", - "7027 7038 4843 1 0 1 1 \n", - "7028 7039 1524 0 0 1 1 \n", - "7029 7040 3358 0 0 1 1 \n", - "7030 7041 5923 1 1 1 0 \n", - "7031 7042 2221 1 0 0 0 \n", - "\n", - " tenure PhoneService MultipleLines InternetService ... OnlineBackup \\\n", - "0 1 0 1 0 ... 2 \n", - "1 34 1 0 0 ... 0 \n", - "2 2 1 0 0 ... 2 \n", - "3 45 0 1 0 ... 0 \n", - "4 2 1 0 1 ... 0 \n", - "... ... ... ... ... ... ... \n", - "7027 24 1 2 0 ... 0 \n", - "7028 72 1 2 1 ... 2 \n", - "7029 11 0 1 0 ... 0 \n", - "7030 4 1 2 1 ... 0 \n", - "7031 66 1 0 1 ... 0 \n", - "\n", - " DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n", - "0 0 0 0 0 0 \n", - "1 2 0 0 0 1 \n", - "2 0 0 0 0 0 \n", - "3 2 2 0 0 1 \n", - "4 0 0 0 0 0 \n", - "... ... ... ... ... ... \n", - "7027 2 2 2 2 1 \n", - "7028 2 0 2 2 1 \n", - "7029 0 0 0 0 0 \n", - "7030 0 0 0 0 0 \n", - "7031 2 2 2 2 2 \n", - "\n", - " PaperlessBilling PaymentMethod MonthlyCharges TotalCharges \n", - "0 1 2 29.85 29.85 \n", - "1 0 3 56.95 1889.50 \n", - "2 1 3 53.85 108.15 \n", - "3 0 0 42.30 1840.75 \n", - "4 1 2 70.70 151.65 \n", - "... ... ... ... ... \n", - "7027 1 3 84.80 1990.50 \n", - "7028 1 1 103.20 7362.90 \n", - "7029 1 2 29.60 346.45 \n", - "7030 1 3 74.40 306.60 \n", - "7031 1 0 105.65 6844.50 \n", - "\n", - "[7032 rows x 21 columns]" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "b75e77b9", - "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", - "
Churn
00
10
21
30
41
......
70270
70280
70290
70301
70310
\n", - "

7032 rows × 1 columns

\n", - "
" - ], - "text/plain": [ - " Churn\n", - "0 0\n", - "1 0\n", - "2 1\n", - "3 0\n", - "4 1\n", - "... ...\n", - "7027 0\n", - "7028 0\n", - "7029 0\n", - "7030 1\n", - "7031 0\n", - "\n", - "[7032 rows x 1 columns]" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "801d9d1f", - "metadata": {}, - "outputs": [], - "source": [ - "# Splitting the dataset into the Training set and Test set\n", - "from sklearn.model_selection import train_test_split\n", - "\n", - "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 1111)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "335e2530", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.tree import DecisionTreeClassifier\n" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "94c8f8ba", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DecisionTreeClassifier(max_depth=2, min_samples_leaf=10, min_samples_split=20,\n", - " random_state=0)" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#importing library for Descision Tree and we have two criterion for DT 'gini' and 'Entropy'\n", - "# you can use gini when there is binary classification otherwise use entropy\n", - "\n", - "from sklearn.tree import DecisionTreeClassifier\n", - "\n", - "#max_depth - the maximum height upto which the trees inside the forest can grow(to avoid overfitting)\n", - "#min_samples_split- minimum amount of samples an internal node must hold in order to split into further nodes(default value -2.)\n", - "#min_samples_leaf - minimum amount of samples that a node must hold after getting split(default value -1.)\n", - "\n", - "#making instance of DT\n", - "classifier = DecisionTreeClassifier(criterion = 'gini', random_state = 0,\n", - " max_depth = 2, min_samples_leaf = 10, min_samples_split = 20\n", - " )\n", - "#fitting the training data\n", - "classifier.fit(X_train, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "6189a89b", - "metadata": {}, - "outputs": [], - "source": [ - "#prediction using 'testing' data\n", - "y_pred = classifier.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "9af2cc14", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 0, 0, ..., 1, 0, 0])" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y_pred" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "419ee81f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.7468714448236633" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#checking score via importing library\n", - "from sklearn.metrics import accuracy_score\n", - "DT_acc = accuracy_score(y_pred,y_test)\n", - "DT_acc" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "4a5dad9a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[985, 318],\n", - " [127, 328]], dtype=int64)" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "from sklearn.metrics import confusion_matrix\n", - "\n", - "cm = confusion_matrix(y_test, y_pred)\n", - "cm" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "de8d0b01", - "metadata": {}, - "outputs": [], - "source": [ - "#checking Auc_Roc_Score via importing library\n", - "from sklearn.metrics import roc_auc_score" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "c1ee3c9e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.7384134668094761" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "roc_auc_score(y_test,y_pred)" - ] - }, - { - "cell_type": "markdown", - "id": "fd76fbed", - "metadata": {}, - "source": [ - "# Hypertuning\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "id": "710cfaff", - "metadata": {}, - "source": [ - "it is used to increases the performance of a model via providing best parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "aeadf4e2", - "metadata": {}, - "outputs": [], - "source": [ - "#importing library for hypertuning\n", - "from sklearn.model_selection import GridSearchCV" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "f42a1258", - "metadata": {}, - "outputs": [], - "source": [ - "pGrid = {'max_depth': range(2, 10), # 8\n", - " 'min_samples_leaf': range(10, 51, 10), # 5\n", - " 'min_samples_split': range(20, 81, 20)} # 4\n", - "#intance of GScv\n", - "gscv = GridSearchCV(estimator = DecisionTreeClassifier(), param_grid = pGrid, cv = 5,\n", - " scoring = 'recall', n_jobs = -1, verbose = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "92c9ddce", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting 5 folds for each of 160 candidates, totalling 800 fits\n" - ] - }, - { - "data": { - "text/plain": [ - "GridSearchCV(cv=5, estimator=DecisionTreeClassifier(), n_jobs=-1,\n", - " param_grid={'max_depth': range(2, 10),\n", - " 'min_samples_leaf': range(10, 51, 10),\n", - " 'min_samples_split': range(20, 81, 20)},\n", - " scoring='recall', verbose=True)" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#fitiing the data\n", - "gscv.fit(X,y)" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "da422896", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_depth': 2, 'min_samples_leaf': 10, 'min_samples_split': 20}" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#finding best params for model\n", - "gscv.best_params_" - ] - }, - { - "cell_type": "markdown", - "id": "7d584d80", - "metadata": {}, - "source": [ - "**Disadvantages of decision trees:**\n", - " \n", - "- Performance is (generally) not competitive with the best supervised learning methods\n", - " - Use Ensembles \n", - "- Can easily overfit the training data (tuning is required / PRUNING standard concept )\n", - "\n", - "- Small variations in the data can result in a completely different tree (high variance)\n", - " - Use Ensembles to reduce the variance\n", - " \n", - "- Recursive binary splitting makes \"locally optimal\" decisions that may not result in a globally optimal tree\n", - "- Doesn't tend to work well if the classes are highly unbalanced\n", - "- Doesn't tend to work well with very small datasets" - ] - }, - { - "cell_type": "markdown", - "id": "0fc68484", - "metadata": {}, - "source": [ - "# RANDOM FOREST" - ] - }, - { - "cell_type": "markdown", - "id": "008226d8", - "metadata": {}, - "source": [ - "Random forests or random decision forests are an ensemble learning method for classification, regression and other tasks that operate by constructing a multitude of decision trees at training time and outputting the class that is the mode of the classes or mean/average prediction of the individual trees. " - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "cd472afa", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - ":4: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n", - " classifier2.fit(X_train, y_train)\n" - ] - }, - { - "data": { - "text/plain": [ - "RandomForestClassifier(n_estimators=70, random_state=0)" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.ensemble import RandomForestClassifier\n", - "\n", - "classifier2 = RandomForestClassifier(n_estimators = 70, criterion = 'gini', random_state = 0)\n", - "classifier2.fit(X_train, y_train)" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "576a4b1d", - "metadata": {}, - "outputs": [], - "source": [ - "y_pred = classifier2.predict(X_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "74301722", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8037542662116041" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.metrics import accuracy_score\n", - "RF_acc = accuracy_score(y_test,y_pred)\n", - "RF_acc" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "c4942c23", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.7052693277558972" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.metrics import roc_auc_score\n", - "roc_auc_score(y_test,y_pred)" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "b314ec0b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1185, 118],\n", - " [ 227, 228]], dtype=int64)" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.metrics import confusion_matrix\n", - "cm = confusion_matrix(y_test, y_pred)\n", - "cm" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "9db435c7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting 5 folds for each of 25 candidates, totalling 125 fits\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:918: UserWarning: One or more of the test scores are non-finite: [0.79209177 0.79337159 0.79237576 0.7928022 0.78995826 0.79066919\n", - " 0.78313331 0.78711502 0.78967457 0.78981591 0.7807154 0.78099858\n", - " 0.78555 0.78554929 0.78839465 0.78199432 0.78270576 0.78412904\n", - " 0.78597694 0.7825627 nan nan nan nan\n", - " nan]\n", - " warnings.warn(\n", - "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:880: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n", - " self.best_estimator_.fit(X, y, **fit_params)\n" - ] - }, - { - "data": { - "text/plain": [ - "GridSearchCV(cv=5, estimator=RandomForestClassifier(), n_jobs=-1,\n", - " param_grid={'max_features': [5, 10, 15, 20, 25],\n", - " 'n_estimators': [70, 80, 90, 100, 120]},\n", - " verbose=True)" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#n_estimators :- int, default=100\n", - "#The number of trees in the forest- the n_estimator parameter controls the number of trees inside the classifier.\n", - "#max_features helps to find the number of features to take into account in order to make the best split\n", - "\n", - "\n", - "pargrid_rf = {'n_estimators': [70, 80, 90, 100, 120],\n", - " 'max_features': [5,10,15,20,25]}\n", - "\n", - "gscv_rf = GridSearchCV(estimator = RandomForestClassifier(), \n", - " param_grid = pargrid_rf, \n", - " cv = 5,\n", - " verbose = True, \n", - " n_jobs = -1)\n", - "\n", - "gscv_rf.fit(X, y)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "6e4b32fb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'max_features': 5, 'n_estimators': 80}" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gscv_rf.best_params_" - ] - }, - { - "cell_type": "markdown", - "id": "dd76d339", - "metadata": {}, - "source": [ - "Importing libraries to draw tree structre" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "ebd9cc40", - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib import pyplot as plt\n", - "from sklearn import tree" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "cf12c14e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Text(418.5, 453.0, 'X[16] <= 0.5\\ngini = 0.392\\nsamples = 5274\\nvalue = [3860, 1414]'),\n", - " Text(209.25, 271.8, 'X[10] <= 0.5\\ngini = 0.49\\nsamples = 2931\\nvalue = [1669, 1262]'),\n", - " Text(104.625, 90.59999999999997, 'gini = 0.5\\nsamples = 1985\\nvalue = [970, 1015]'),\n", - " Text(313.875, 90.59999999999997, 'gini = 0.386\\nsamples = 946\\nvalue = [699, 247]'),\n", - " Text(627.75, 271.8, 'X[19] <= 99.85\\ngini = 0.121\\nsamples = 2343\\nvalue = [2191, 152]'),\n", - " Text(523.125, 90.59999999999997, 'gini = 0.077\\nsamples = 1912\\nvalue = [1835, 77]'),\n", - " Text(732.375, 90.59999999999997, 'gini = 0.287\\nsamples = 431\\nvalue = [356, 75]')]" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAAIuCAYAAABac1I3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOzddXxV9R/H8ddZB+tgDAaju7tbUhQREAERQVQM7PopdreoYGCBICDd3Q3S3QzYqHXX+f2xMbxssGDjEu/n47GH2/d87/d8zpXHPfdzvmWYpomIiIiIiIjkj421AxAREREREbkVKZkSEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSAEqmRERERERECkDJlIiIiIiISAEomRIRERERESkAJVMiIiIiIiIFoGRKRERERESkAJRMiYiIiIiIFICSKRERERERkQJQMiUiIiIiIlIASqZEREREREQKQMmUiIiIiIhIASiZEhERERERKQAlUyIiIiIiIgWgZEpERERERKQAlEyJiIiIiIgUgJIpERERERGRAlAyJSIiIiIiUgBKpkRERERERApAyZSIiIiIiEgBKJkSEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSAEqmRERERERECkDJlIiIiIiISAEomRIRERERESkAJVMiIiIiIiIFoGRKRERERESkAJRMiYiIiIiIFICSKRERERERkQJQMiUiIiIiIlIASqZEREREREQKQMmUiIiIiIhIASiZEhERERERKQAlUyIiIiIiIgWgZEpERERERKQAlEyJiIiIiIgUgJIpERERERGRAlAyJSIiIiIiUgBKpkRERERERApAyZSIiIiIiEgB2Fk7ABERa3J2tA9LTE4tbu04RG5VTg52ZxOSUgKsHYeIiDUYpmlaOwYREasxDMOMmP6utcMQuWV59RyJaZqGteMQEbEGDfMTEREREREpACVTIiIiIiIiBaBkSkREREREpACUTImIiIiIiBSAkikREREREZECUDIlIiIiIiJSANpnSkTkDuHVc2TW782rBzPn/UduyHm7v/Era/ccz/pbS9GLiMjtQsmUiMgt6L3xS/hy6io+G9adoV0aZTs+6NO/mb1hHzPeHkSrWuWy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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize = (15,10))\n", - "tree.plot_tree(classifier, filled = True)" - ] - }, - { - "cell_type": "markdown", - "id": "d9452db6", - "metadata": {}, - "source": [ - "# KNN" - ] - }, - { - "cell_type": "markdown", - "id": "f16bc237", - "metadata": {}, - "source": [ - "1.Supervised Learning technique.\n", - "2.K-NN algorithm can be used for Regression & Classification - mostly Classification problems.\n", - "3.K-NN is a non-parametric algoritham- which means it does not make any assumption on underlying data.\n", - "4.It is also called a lazy learner algorithm because it does not learn from the training set immediately instead it stores the dataset.\n", - "5.At the time of classification, it performs an action on the dataset.\n", - "6.Example: Suppose, we have an image of a creature that looks similar to cat and dog, but we want to know either it is a cat or dog. So for this identification, we can use the KNN algorithm," - ] - }, - { - "cell_type": "markdown", - "id": "a6f49184", - "metadata": {}, - "source": [ - "Step-1: Select the number K of the neighbors\n", - "Step-2: Calculate the Euclidean distance of K number of neighbors\n", - "Step-3: Take the K nearest neighbors as per the calculated Euclidean distance.\n", - "Step-4: Among these k neighbors, count the number of the data points in each category.\n", - "Step-5: Assign the new data points to that category for which the number of the neighbor is maximum.\n", - "Step-6: Our model is ready." - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "240ea111", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\neighbors\\_classification.py:179: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n", - " return self._fit(X, y)\n" - ] - }, - { - "data": { - "text/plain": [ - "KNeighborsClassifier(n_neighbors=11)" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Fitting K-NN to the Training set\n", - "from sklearn.neighbors import KNeighborsClassifier\n", - "classifier = KNeighborsClassifier(n_neighbors = 11, metric = 'minkowski', p = 2)\n", - "classifier.fit(X_train, y_train)\n", - "\n", - "\n", - "\n", - "\n", - "#p : integer, optional (default = 2)\n", - "#Power parameter for the Minkowski metric. \n", - "#When p = 1, this is equivalent to using manhattan_distance (l1), \n", - "# and euclidean_distance (l2) for p = 2.\n", - "\n", - "#metric : string or callable, default ‘minkowski’\n", - "\n", - "#The Minkowski distance is a metric in a normed vector space which can be considered as a \n", - "# generalization of both the Euclidean distance and the Manhattan distance.\n", - "\n", - "#the distance metric to use for the tree. The default metric is minkowski, \n", - "#and with p=2 is equivalent to the standard Euclidean metric." - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "669eae48", - "metadata": {}, - "outputs": [], - "source": [ - "# Predicting the Test set results\n", - "y_pred = classifier.predict(X_test)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "5122b9e8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[1215, 88],\n", - " [ 392, 63]], dtype=int64)" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "# Making the Confusion Matrix\n", - "from sklearn.metrics import confusion_matrix\n", - "cm = confusion_matrix(y_test, y_pred)\n", - "cm" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "4c6f892a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.726962457337884" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.metrics import accuracy_score\n", - "KNN_acc = accuracy_score(y_pred,y_test)\n", - "KNN_acc" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "d0df133e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.5866428745101111" - ] - }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sklearn.metrics import roc_auc_score\n", - "roc_auc_score(y_pred,y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "9dd24d51", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import seaborn as sns\n", - "sns.heatmap(cm, annot = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "ebece630", - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.model_selection import GridSearchCV" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "61072235", - "metadata": {}, - "outputs": [], - "source": [ - "pGrid = {'n_neighbors': range(10,200),\n", - " 'leaf_size': range(10, 51, 10), }\n", - "\n", - "\n", - "gscv = GridSearchCV(estimator = KNeighborsClassifier(), param_grid = pGrid, cv = 5,\n", - " scoring = 'recall', n_jobs = -1, verbose = True)" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "509a2400", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fitting 5 folds for each of 950 candidates, totalling 4750 fits\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Lenovo\\anaconda3\\lib\\site-packages\\sklearn\\neighbors\\_classification.py:179: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().\n", - " return self._fit(X, y)\n" - ] - }, - { - "data": { - "text/plain": [ - "GridSearchCV(cv=5, estimator=KNeighborsClassifier(), n_jobs=-1,\n", - " param_grid={'leaf_size': range(10, 51, 10),\n", - " 'n_neighbors': range(10, 200)},\n", - " scoring='recall', verbose=True)" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gscv.fit(X,y)" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "599febe0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'leaf_size': 10, 'n_neighbors': 11}" - ] - }, - "execution_count": 84, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gscv.best_params_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c4066319", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.8.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} +done