{ "cells": [ { "cell_type": "markdown", "source": [ "\"Open" ], "metadata": { "colab_type": "text", "id": "view-in-github" } }, { "cell_type": "markdown", "source": [ "# Challenge Alura - Data Science\n", "\n", "**Boas-vindas!**\n", "\n", "Você foi contratado(a) como cientista de dados pela operadora de telecomunicações **Alura Voz**. Na reunião inicial com as pessoas responsáveis pela área de vendas da empresa, foi explicada a importância de se **reduzir a Taxa de Evasão** de Clientes, conhecido como **Churn Rate**. Basicamente, o Churn Rate indica o quanto a empresa perdeu de receita ou clientes em um período de tempo.\n", "\n", "Com sua experiência, você sugere, como passo inicial, a identificação de clientes que teriam uma maior chance de deixar a empresa. Para isso, você explica que é interessante investigar algumas características de clientes ou dos planos de clientes para tentar **CLASSIFICAR** estas pessoas como potenciais candidatas a deixar a empresa ou não.\n", "\n", "Assim, você solicita o conjunto de dados para começar a explorar, tratar e modelar a partir de agora. Em seguida, o foco será na otimização de cada um dos modelos com a finalidade de obter o melhor resultado para a tomada de decisão da **Alura Voz**. \n", "\n", "Por fim, você vai utilizar o **GitHub** e desenvolverá um **portfólio** focado em Data Science e Machine Learning." ], "metadata": { "id": "kfkbGUp1i0dm" } }, { "cell_type": "markdown", "source": [ "# Semana 1" ], "metadata": { "id": "461dXVhAi4Rx" } }, { "cell_type": "markdown", "source": [ "Na semana 1 o foco será em conhecer a base dados originada da API da **Alura Voz**, explorando as variáveis e corrigindo possíveis inconsistências. Para isso, é importante visualizar o dicionário das variáveis que iremos trabalhar.\n", "\n", "#### Dicionário de dados\n", "\n", "* `customerID`: número de identificação único de cada cliente\n", "* `Churn`: se o cliente deixou ou não a empresa \n", "* `gender`: gênero (masculino e feminino) \n", "* `SeniorCitizen`: informação sobre um cliente ter ou não idade igual ou maior que 65 anos \n", "* `Partner`: se o cliente possui ou não um parceiro ou parceira\n", "* `Dependents`: se o cliente possui ou não dependentes\n", "* `tenure`: meses de contrato do cliente\n", "* `PhoneService`: assinatura de serviço telefônico \n", "* `MultipleLines`: assisnatura de mais de uma linha de telefone \n", "* `InternetService`: assinatura de um provedor internet \n", "* `OnlineSecurity`: assinatura adicional de segurança online \n", "* `OnlineBackup`: assinatura adicional de backup online \n", "* `DeviceProtection`: assinatura adicional de proteção no dispositivo \n", "* `TechSupport`: assinatura adicional de suporte técnico, menos tempo de espera\n", "* `StreamingTV`: assinatura de TV a cabo \n", "* `StreamingMovies`: assinatura de streaming de filmes \n", "* `Contract`: tipo de contrato\n", "* `PaperlessBilling`: se o cliente prefere receber online a fatura\n", "* `PaymentMethod`: forma de pagamento\n", "* `Charges.Monthly`: total de todos os serviços do cliente por mês\n", "* `Charges.Total`: total gasto pelo cliente" ], "metadata": {} }, { "cell_type": "code", "execution_count": 19, "source": [ "# importando pacotes e lendo base de dados\n", "import pandas as pd\n", "pd.set_option('display.max_columns', 100)\n", "\n", "raw_data = pd.read_json('https://raw.githubusercontent.com/jackson-simionato/challenge_alura_DS01/main/alura-voz/Dados/Telco-Customer-Churn.json')\n", "raw_data" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " customerID Churn customer \\\n", "0 0002-ORFBO No {'gender': 'Female', 'SeniorCitizen': 0, 'Part... \n", "1 0003-MKNFE No {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "2 0004-TLHLJ Yes {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "3 0011-IGKFF Yes {'gender': 'Male', 'SeniorCitizen': 1, 'Partne... \n", "4 0013-EXCHZ Yes {'gender': 'Female', 'SeniorCitizen': 1, 'Part... \n", "... ... ... ... \n", "7262 9987-LUTYD No {'gender': 'Female', 'SeniorCitizen': 0, 'Part... \n", "7263 9992-RRAMN Yes {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "7264 9992-UJOEL No {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "7265 9993-LHIEB No {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "7266 9995-HOTOH No {'gender': 'Male', 'SeniorCitizen': 0, 'Partne... \n", "\n", " phone \\\n", "0 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "1 {'PhoneService': 'Yes', 'MultipleLines': 'Yes'} \n", "2 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "3 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "4 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "... ... \n", "7262 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "7263 {'PhoneService': 'Yes', 'MultipleLines': 'Yes'} \n", "7264 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "7265 {'PhoneService': 'Yes', 'MultipleLines': 'No'} \n", "7266 {'PhoneService': 'No', 'MultipleLines': 'No ph... \n", "\n", " internet \\\n", "0 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "1 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "2 {'InternetService': 'Fiber optic', 'OnlineSecu... \n", "3 {'InternetService': 'Fiber optic', 'OnlineSecu... \n", "4 {'InternetService': 'Fiber optic', 'OnlineSecu... \n", "... ... \n", "7262 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "7263 {'InternetService': 'Fiber optic', 'OnlineSecu... \n", "7264 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "7265 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "7266 {'InternetService': 'DSL', 'OnlineSecurity': '... \n", "\n", " account \n", "0 {'Contract': 'One year', 'PaperlessBilling': '... \n", "1 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "2 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "3 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "4 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "... ... \n", "7262 {'Contract': 'One year', 'PaperlessBilling': '... \n", "7263 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "7264 {'Contract': 'Month-to-month', 'PaperlessBilli... \n", "7265 {'Contract': 'Two year', 'PaperlessBilling': '... \n", "7266 {'Contract': 'Two year', 'PaperlessBilling': '... \n", "\n", "[7267 rows x 6 columns]" ], "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", "
customerIDChurncustomerphoneinternetaccount
00002-ORFBONo{'gender': 'Female', 'SeniorCitizen': 0, 'Part...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'One year', 'PaperlessBilling': '...
10003-MKNFENo{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'Yes'}{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'Month-to-month', 'PaperlessBilli...
20004-TLHLJYes{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'Fiber optic', 'OnlineSecu...{'Contract': 'Month-to-month', 'PaperlessBilli...
30011-IGKFFYes{'gender': 'Male', 'SeniorCitizen': 1, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'Fiber optic', 'OnlineSecu...{'Contract': 'Month-to-month', 'PaperlessBilli...
40013-EXCHZYes{'gender': 'Female', 'SeniorCitizen': 1, 'Part...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'Fiber optic', 'OnlineSecu...{'Contract': 'Month-to-month', 'PaperlessBilli...
.....................
72629987-LUTYDNo{'gender': 'Female', 'SeniorCitizen': 0, 'Part...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'One year', 'PaperlessBilling': '...
72639992-RRAMNYes{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'Yes'}{'InternetService': 'Fiber optic', 'OnlineSecu...{'Contract': 'Month-to-month', 'PaperlessBilli...
72649992-UJOELNo{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'Month-to-month', 'PaperlessBilli...
72659993-LHIEBNo{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'Yes', 'MultipleLines': 'No'}{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'Two year', 'PaperlessBilling': '...
72669995-HOTOHNo{'gender': 'Male', 'SeniorCitizen': 0, 'Partne...{'PhoneService': 'No', 'MultipleLines': 'No ph...{'InternetService': 'DSL', 'OnlineSecurity': '...{'Contract': 'Two year', 'PaperlessBilling': '...
\n", "

7267 rows × 6 columns

\n", "
" ] }, "metadata": {}, "execution_count": 19 } ], "metadata": { "id": "XD5qhAByi7zP" } }, { "cell_type": "markdown", "source": [ "Como foi possível observar acima, uma série de variáveis foi agrupada em subcategorias: *customer*, *phone*, *internet* e *account*.\n", "\n", "Nesse caso, precisamos desagregar tais variáveis em dataframes separados, para então concatenar tudo em um dataframe final." ], "metadata": {} }, { "cell_type": "markdown", "source": [ "# Desagregar as colunas da base de dados" ], "metadata": {} }, { "cell_type": "code", "execution_count": 20, "source": [ "# Dataframes individuais\n", "customer_data = pd.json_normalize(raw_data.customer)\n", "phone_data = pd.json_normalize(raw_data.phone)\n", "internet_data = pd.json_normalize(raw_data.internet)\n", "account_data = pd.json_normalize(raw_data.account)\n", "\n", "# Concatenação de todos os dataframes\n", "dados = pd.concat([raw_data[['customerID','Churn']], customer_data, phone_data, internet_data, account_data], axis=1)\n", "print(dados.shape)\n", "display(dados.head())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(7267, 21)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ " customerID Churn gender SeniorCitizen Partner Dependents tenure \\\n", "0 0002-ORFBO No Female 0 Yes Yes 9 \n", "1 0003-MKNFE No Male 0 No No 9 \n", "2 0004-TLHLJ Yes Male 0 No No 4 \n", "3 0011-IGKFF Yes Male 1 Yes No 13 \n", "4 0013-EXCHZ Yes Female 1 Yes No 3 \n", "\n", " PhoneService MultipleLines InternetService OnlineSecurity OnlineBackup \\\n", "0 Yes No DSL No Yes \n", "1 Yes Yes DSL No No \n", "2 Yes No Fiber optic No No \n", "3 Yes No Fiber optic No Yes \n", "4 Yes No Fiber optic No No \n", "\n", " DeviceProtection TechSupport StreamingTV StreamingMovies Contract \\\n", "0 No Yes Yes No One year \n", "1 No No No Yes Month-to-month \n", "2 Yes No No No Month-to-month \n", "3 Yes No Yes Yes Month-to-month \n", "4 No Yes Yes No Month-to-month \n", "\n", " PaperlessBilling PaymentMethod Charges.Monthly Charges.Total \n", "0 Yes Mailed check 65.6 593.3 \n", "1 No Mailed check 59.9 542.4 \n", "2 Yes Electronic check 73.9 280.85 \n", "3 Yes Electronic check 98.0 1237.85 \n", "4 Yes Mailed check 83.9 267.4 " ], "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", "
customerIDChurngenderSeniorCitizenPartnerDependentstenurePhoneServiceMultipleLinesInternetServiceOnlineSecurityOnlineBackupDeviceProtectionTechSupportStreamingTVStreamingMoviesContractPaperlessBillingPaymentMethodCharges.MonthlyCharges.Total
00002-ORFBONoFemale0YesYes9YesNoDSLNoYesNoYesYesNoOne yearYesMailed check65.6593.3
10003-MKNFENoMale0NoNo9YesYesDSLNoNoNoNoNoYesMonth-to-monthNoMailed check59.9542.4
20004-TLHLJYesMale0NoNo4YesNoFiber opticNoNoYesNoNoNoMonth-to-monthYesElectronic check73.9280.85
30011-IGKFFYesMale1YesNo13YesNoFiber opticNoYesYesNoYesYesMonth-to-monthYesElectronic check98.01237.85
40013-EXCHZYesFemale1YesNo3YesNoFiber opticNoNoNoYesYesNoMonth-to-monthYesMailed check83.9267.4
\n", "
" ] }, "metadata": {} } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Com todas as variáveis sendo apresentadas corretamente no nosso DataFrame, podemos começar a conhecer e entender melhor nossos dados." ], "metadata": {} }, { "cell_type": "markdown", "source": [ "# Conhecendo e entendendo os dados" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Para facilitar a compreensão das variáveis e suas informações, vamos traduzir o nome das colunas de acordo com o dicionário disponibilizado\n", "\n", "#### Dicionário de dados\n", "\n", "* `customerID`: número de identificação único de cada cliente\n", "* `Churn`: se o cliente deixou ou não a empresa \n", "* `gender`: gênero (masculino e feminino) \n", "* `SeniorCitizen`: informação sobre um cliente ter ou não idade igual ou maior que 65 anos \n", "* `Partner`: se o cliente possui ou não um parceiro ou parceira\n", "* `Dependents`: se o cliente possui ou não dependentes\n", "* `tenure`: meses de contrato do cliente\n", "* `PhoneService`: assinatura de serviço telefônico \n", "* `MultipleLines`: assisnatura de mais de uma linha de telefone \n", "* `InternetService`: assinatura de um provedor internet \n", "* `OnlineSecurity`: assinatura adicional de segurança online \n", "* `OnlineBackup`: assinatura adicional de backup online \n", "* `DeviceProtection`: assinatura adicional de proteção no dispositivo \n", "* `TechSupport`: assinatura adicional de suporte técnico, menos tempo de espera\n", "* `StreamingTV`: assinatura de TV a cabo \n", "* `StreamingMovies`: assinatura de streaming de filmes \n", "* `Contract`: tipo de contrato\n", "* `PaperlessBilling`: se o cliente prefere receber online a fatura\n", "* `PaymentMethod`: forma de pagamento\n", "* `Charges.Monthly`: total de todos os serviços do cliente por mês\n", "* `Charges.Total`: total gasto pelo cliente" ], "metadata": {} }, { "cell_type": "code", "execution_count": 21, "source": [ "# Criação das listas com nomes antigos e novos das colunas\n", "old_columns = dados.columns\n", "new_columns =['id_cliente','churn','genero','idoso','parceiro','dependentes','meses_contrato','servico_telefone','multiplas_linhas','servico_internet','seguranca_online','backup_online',\n", "'protecao_dispositivo','suporte','streaming_tv','streaming_filmes','contrato','fatura_online','forma_pagamento','cobranca_mensal','cobranca_total']\n", "\n", "print(len(old_columns) == len(new_columns))\n", "\n", "# Criação dicionário que irá renomear as colunas\n", "dict_rename_columns = dict(zip(old_columns,new_columns))\n", "\n", "# Renomeação das colunas\n", "dados.rename(columns=dict_rename_columns, inplace=True)" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "True\n" ] } ], "metadata": {} }, { "cell_type": "code", "execution_count": 22, "source": [ "#Tradução dos valores do dataset, padrozinando para PT-BR\n", "\n", "dados = dados.replace({'No':'Não','Yes':'Sim','Male':'Masculino','Female':'Feminino','Fiber optic':'Fibra ótica','Month-to-month':'Mensal','One year':'Anual','Two year':'Bienal',\n", "'Mailed check':'Cheque por correio', 'Electronic check': 'Cheque eletrônico', 'Credit card (automatic)':'Cartão de crédito (automático)','Bank transfer (automatic)':'Transferência bancária (automático)',\n", "'No phone service':'Sem serviço telefônico','No internet service':'Sem serviço de internet'})\n", "\n", "dados" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id_cliente churn genero idoso parceiro dependentes meses_contrato \\\n", "0 0002-ORFBO Não Feminino 0 Sim Sim 9 \n", "1 0003-MKNFE Não Masculino 0 Não Não 9 \n", "2 0004-TLHLJ Sim Masculino 0 Não Não 4 \n", "3 0011-IGKFF Sim Masculino 1 Sim Não 13 \n", "4 0013-EXCHZ Sim Feminino 1 Sim Não 3 \n", "... ... ... ... ... ... ... ... \n", "7262 9987-LUTYD Não Feminino 0 Não Não 13 \n", "7263 9992-RRAMN Sim Masculino 0 Sim Não 22 \n", "7264 9992-UJOEL Não Masculino 0 Não Não 2 \n", "7265 9993-LHIEB Não Masculino 0 Sim Sim 67 \n", "7266 9995-HOTOH Não Masculino 0 Sim Sim 63 \n", "\n", " servico_telefone multiplas_linhas servico_internet \\\n", "0 Sim Não DSL \n", "1 Sim Sim DSL \n", "2 Sim Não Fibra ótica \n", "3 Sim Não Fibra ótica \n", "4 Sim Não Fibra ótica \n", "... ... ... ... \n", "7262 Sim Não DSL \n", "7263 Sim Sim Fibra ótica \n", "7264 Sim Não DSL \n", "7265 Sim Não DSL \n", "7266 Não Sem serviço telefônico DSL \n", "\n", " seguranca_online backup_online protecao_dispositivo suporte streaming_tv \\\n", "0 Não Sim Não Sim Sim \n", "1 Não Não Não Não Não \n", "2 Não Não Sim Não Não \n", "3 Não Sim Sim Não Sim \n", "4 Não Não Não Sim Sim \n", "... ... ... ... ... ... \n", "7262 Sim Não Não Sim Não \n", "7263 Não Não Não Não Não \n", "7264 Não Sim Não Não Não \n", "7265 Sim Não Sim Sim Não \n", "7266 Sim Sim Sim Não Sim \n", "\n", " streaming_filmes contrato fatura_online forma_pagamento \\\n", "0 Não Anual Sim Cheque por correio \n", "1 Sim Mensal Não Cheque por correio \n", "2 Não Mensal Sim Cheque eletrônico \n", "3 Sim Mensal Sim Cheque eletrônico \n", "4 Não Mensal Sim Cheque por correio \n", "... ... ... ... ... \n", "7262 Não Anual Não Cheque por correio \n", "7263 Sim Mensal Sim Cheque eletrônico \n", "7264 Não Mensal Sim Cheque por correio \n", "7265 Sim Bienal Não Cheque por correio \n", "7266 Sim Bienal Não Cheque eletrônico \n", "\n", " cobranca_mensal cobranca_total \n", "0 65.60 593.3 \n", "1 59.90 542.4 \n", "2 73.90 280.85 \n", "3 98.00 1237.85 \n", "4 83.90 267.4 \n", "... ... ... \n", "7262 55.15 742.9 \n", "7263 85.10 1873.7 \n", "7264 50.30 92.75 \n", "7265 67.85 4627.65 \n", "7266 59.00 3707.6 \n", "\n", "[7267 rows x 21 columns]" ], "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", "
id_clientechurngeneroidosoparceirodependentesmeses_contratoservico_telefonemultiplas_linhasservico_internetseguranca_onlinebackup_onlineprotecao_dispositivosuportestreaming_tvstreaming_filmescontratofatura_onlineforma_pagamentocobranca_mensalcobranca_total
00002-ORFBONãoFeminino0SimSim9SimNãoDSLNãoSimNãoSimSimNãoAnualSimCheque por correio65.60593.3
10003-MKNFENãoMasculino0NãoNão9SimSimDSLNãoNãoNãoNãoNãoSimMensalNãoCheque por correio59.90542.4
20004-TLHLJSimMasculino0NãoNão4SimNãoFibra óticaNãoNãoSimNãoNãoNãoMensalSimCheque eletrônico73.90280.85
30011-IGKFFSimMasculino1SimNão13SimNãoFibra óticaNãoSimSimNãoSimSimMensalSimCheque eletrônico98.001237.85
40013-EXCHZSimFeminino1SimNão3SimNãoFibra óticaNãoNãoNãoSimSimNãoMensalSimCheque por correio83.90267.4
..................................................................
72629987-LUTYDNãoFeminino0NãoNão13SimNãoDSLSimNãoNãoSimNãoNãoAnualNãoCheque por correio55.15742.9
72639992-RRAMNSimMasculino0SimNão22SimSimFibra óticaNãoNãoNãoNãoNãoSimMensalSimCheque eletrônico85.101873.7
72649992-UJOELNãoMasculino0NãoNão2SimNãoDSLNãoSimNãoNãoNãoNãoMensalSimCheque por correio50.3092.75
72659993-LHIEBNãoMasculino0SimSim67SimNãoDSLSimNãoSimSimNãoSimBienalNãoCheque por correio67.854627.65
72669995-HOTOHNãoMasculino0SimSim63NãoSem serviço telefônicoDSLSimSimSimNãoSimSimBienalNãoCheque eletrônico59.003707.6
\n", "

7267 rows × 21 columns

\n", "
" ] }, "metadata": {}, "execution_count": 22 } ], "metadata": {} }, { "cell_type": "code", "execution_count": 23, "source": [ "# Visualização das colunas renomeadas e respectivos tipos de dados\n", "dados.info()" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "RangeIndex: 7267 entries, 0 to 7266\n", "Data columns (total 21 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id_cliente 7267 non-null object \n", " 1 churn 7267 non-null object \n", " 2 genero 7267 non-null object \n", " 3 idoso 7267 non-null int64 \n", " 4 parceiro 7267 non-null object \n", " 5 dependentes 7267 non-null object \n", " 6 meses_contrato 7267 non-null int64 \n", " 7 servico_telefone 7267 non-null object \n", " 8 multiplas_linhas 7267 non-null object \n", " 9 servico_internet 7267 non-null object \n", " 10 seguranca_online 7267 non-null object \n", " 11 backup_online 7267 non-null object \n", " 12 protecao_dispositivo 7267 non-null object \n", " 13 suporte 7267 non-null object \n", " 14 streaming_tv 7267 non-null object \n", " 15 streaming_filmes 7267 non-null object \n", " 16 contrato 7267 non-null object \n", " 17 fatura_online 7267 non-null object \n", " 18 forma_pagamento 7267 non-null object \n", " 19 cobranca_mensal 7267 non-null float64\n", " 20 cobranca_total 7267 non-null object \n", "dtypes: float64(1), int64(2), object(18)\n", "memory usage: 1.2+ MB\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Percebe-se que não existem valores NaN no nosso dataset e ainda que ocorrem apenas três variáveis numéricas. Vamos analisá-las primeiro" ], "metadata": {} }, { "cell_type": "code", "execution_count": 24, "source": [ "# Apesar de ser numérica, a variável \"idoso\" representa uma classificação dos usuários quanto à idade (0 = idade menor que 65 anos; 1 = idade maior que 65 anos). \n", "# Neste caso de variável categórica, o mais indicado seria usar tipo string (\"Yes\" e \"No\").\n", "print(dados.idoso.value_counts())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "0 6085\n", "1 1182\n", "Name: idoso, dtype: int64\n" ] } ], "metadata": {} }, { "cell_type": "code", "execution_count": 25, "source": [ "# Já os valores das variáveis \"meses_contrato\" e \"cobranca_mensal\" representam efetivamente números.\n", "print(f'Média de meses de contrato: {round(dados.meses_contrato.mean(),2)} meses')\n", "print(f\"Mediana do valor de cobrança mensal: {round(dados.cobranca_mensal.median(),2)}\")" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Média de meses de contrato: 32.35 meses\n", "Mediana do valor de cobrança mensal: 70.3\n" ] } ], "metadata": {} }, { "cell_type": "code", "execution_count": 26, "source": [ "# A outra variável que traz informação do preço cobrado de cada cliente não está com tipo de dado numérico\n", "print(dados.cobranca_total.dtypes)\n", "\n", "# Analisando com mais detalhe é possível identificar uma nova inconsistência: os números estão sendo lidos como strings\n", "print(type(dados.loc[0,'cobranca_total']))" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "object\n", "\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Com isso vimos duas inconsistências relacionadas às categorias numéricas. Mais à frente vamos trabalhar na correção destes erros.\n", "\n", "Agora vamos olhar para as variáveis categóricas presentes no nosso dataset." ], "metadata": {} }, { "cell_type": "code", "execution_count": 27, "source": [ "colunas_categoricas = [i for i in list(dados.columns) if i not in ['idoso','meses_contrato','cobranca_mensal','cobranca_total']]\n", "\n", "for coluna in colunas_categoricas:\n", " print(dados[coluna].unique())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['0002-ORFBO' '0003-MKNFE' '0004-TLHLJ' ... '9992-UJOEL' '9993-LHIEB'\n", " '9995-HOTOH']\n", "['Não' 'Sim' '']\n", "['Feminino' 'Masculino']\n", "['Sim' 'Não']\n", "['Sim' 'Não']\n", "['Sim' 'Não']\n", "['Não' 'Sim' 'Sem serviço telefônico']\n", "['DSL' 'Fibra ótica' 'Não']\n", "['Não' 'Sim' 'Sem serviço de internet']\n", "['Sim' 'Não' 'Sem serviço de internet']\n", "['Não' 'Sim' 'Sem serviço de internet']\n", "['Sim' 'Não' 'Sem serviço de internet']\n", "['Sim' 'Não' 'Sem serviço de internet']\n", "['Não' 'Sim' 'Sem serviço de internet']\n", "['Anual' 'Mensal' 'Bienal']\n", "['Sim' 'Não']\n", "['Cheque por correio' 'Cheque eletrônico' 'Cartão de crédito (automático)'\n", " 'Transferência bancária (automático)']\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Na celula acima é possível ver apenas uma inconsistência nos valores dos atributos, presente justamente na variável \"churn\".\n", "\n", "\"Churn\" é a nossa variável principal, chamada de atributo classe, e está com alguns valores vazios que precisarão ser corrigidos." ], "metadata": {} }, { "cell_type": "code", "execution_count": 28, "source": [ "# Identificação de valores nulos no atributo \"churn\"\n", "print(dados.churn.unique())\n", "print(dados.churn.value_counts())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "['Não' 'Sim' '']\n", "Não 5174\n", "Sim 1869\n", " 224\n", "Name: churn, dtype: int64\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "# Corrigindo as incosistências" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Corrigindo as inconsistências: `idoso`" ], "metadata": {} }, { "cell_type": "code", "execution_count": 29, "source": [ "# Neste caso vamos fazer uma simples conversão de 0/1 para \"No\"/\"Yes\"\n", "dados.loc[dados.idoso == 0, 'idoso'] = \"Não\"\n", "dados.loc[dados.idoso == 1, 'idoso'] = \"Sim\"\n", "\n", "print(dados.idoso.value_counts())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Não 6085\n", "Sim 1182\n", "Name: idoso, dtype: int64\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Corrigindo as inconsistências: `cobranca_total`" ], "metadata": {} }, { "cell_type": "code", "execution_count": 30, "source": [ "# Primeiro vamos tentar uma conversão direta da coluna de string para float\n", "dados.cobranca_total == dados.cobranca_total.astype(float)" ], "outputs": [ { "output_type": "error", "ename": "ValueError", "evalue": "could not convert string to float: ", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_6061/49781835.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Primeiro vamos tentar uma conversão direta da coluna de string para float\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdados\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcobranca_total\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mdados\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcobranca_total\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m 5813\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5814\u001b[0m \u001b[0;31m# else, only a single dtype is given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5815\u001b[0;31m \u001b[0mnew_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5816\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__finalize__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"astype\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5817\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 417\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"raise\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 418\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"astype\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 420\u001b[0m def convert(\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, align_keys, ignore_failures, **kwargs)\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 327\u001b[0;31m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 328\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mTypeError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mignore_failures\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 591\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 592\u001b[0;31m \u001b[0mnew_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mastype_array_safe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 593\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 594\u001b[0m \u001b[0mnew_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmaybe_coerce_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mastype_array_safe\u001b[0;34m(values, dtype, copy, errors)\u001b[0m\n\u001b[1;32m 1307\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1309\u001b[0;31m \u001b[0mnew_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mastype_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1310\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mValueError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1311\u001b[0m \u001b[0;31m# e.g. astype_nansafe can fail on object-dtype of strings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mastype_array\u001b[0;34m(values, dtype, copy)\u001b[0m\n\u001b[1;32m 1255\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1256\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1257\u001b[0;31m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mastype_nansafe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1259\u001b[0m \u001b[0;31m# in pandas we don't store numpy str dtypes, so convert to object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mastype_nansafe\u001b[0;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[1;32m 1199\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_object_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_object_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1200\u001b[0m \u001b[0;31m# Explicit copy, or required since NumPy can't view from / to object.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1201\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1202\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1203\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: could not convert string to float: " ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Vimos que não é possível a conversão direta, possivelmente por conta da presença de valores não numéricos na coluna \"cobranca_total\"" ], "metadata": {} }, { "cell_type": "code", "execution_count": 31, "source": [ "# Para converter a coluna para numerico vamos usar a função pandas.to_numeric. Nela é possível tratar os valores impossíveis de serem convertidos para número (caracteres especiais, espaços em branco, etc.)\n", "# Vamos utilizar o parâmetro que preenche tais casos com NaN\n", "dados.cobranca_total = pd.to_numeric(dados['cobranca_total'], errors='coerce')\n", "\n", "# Agora temos mais uma coluna numérica\n", "dados.cobranca_total.dtypes\n", "\n", "display(dados.query('cobranca_total.isnull()', engine='python'))" ], "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ " id_cliente churn genero idoso parceiro dependentes meses_contrato \\\n", "975 1371-DWPAZ Não Feminino Não Sim Sim 0 \n", "1775 2520-SGTTA Não Feminino Não Sim Sim 0 \n", "1955 2775-SEFEE Não Masculino Não Não Sim 0 \n", "2075 2923-ARZLG Não Masculino Não Sim Sim 0 \n", "2232 3115-CZMZD Não Masculino Não Não Sim 0 \n", "2308 3213-VVOLG Não Masculino Não Sim Sim 0 \n", "2930 4075-WKNIU Não Feminino Não Sim Sim 0 \n", "3134 4367-NUYAO Não Masculino Não Sim Sim 0 \n", "3203 4472-LVYGI Não Feminino Não Sim Sim 0 \n", "4169 5709-LVOEQ Não Feminino Não Sim Sim 0 \n", "5599 7644-OMVMY Não Masculino Não Sim Sim 0 \n", "\n", " servico_telefone multiplas_linhas servico_internet \\\n", "975 Não Sem serviço telefônico DSL \n", "1775 Sim Não Não \n", "1955 Sim Sim DSL \n", "2075 Sim Não Não \n", "2232 Sim Não Não \n", "2308 Sim Sim Não \n", "2930 Sim Sim DSL \n", "3134 Sim Sim Não \n", "3203 Não Sem serviço telefônico DSL \n", "4169 Sim Não DSL \n", "5599 Sim Não Não \n", "\n", " seguranca_online backup_online \\\n", "975 Sim Sim \n", "1775 Sem serviço de internet Sem serviço de internet \n", "1955 Sim Sim \n", "2075 Sem serviço de internet Sem serviço de internet \n", "2232 Sem serviço de internet Sem serviço de internet \n", "2308 Sem serviço de internet Sem serviço de internet \n", "2930 Não Sim \n", "3134 Sem serviço de internet Sem serviço de internet \n", "3203 Sim Não \n", "4169 Sim Sim \n", "5599 Sem serviço de internet Sem serviço de internet \n", "\n", " protecao_dispositivo suporte \\\n", "975 Sim Sim \n", "1775 Sem serviço de internet Sem serviço de internet \n", "1955 Não Sim \n", "2075 Sem serviço de internet Sem serviço de internet \n", "2232 Sem serviço de internet Sem serviço de internet \n", "2308 Sem serviço de internet Sem serviço de internet \n", "2930 Sim Sim \n", "3134 Sem serviço de internet Sem serviço de internet \n", "3203 Sim Sim \n", "4169 Sim Não \n", "5599 Sem serviço de internet Sem serviço de internet \n", "\n", " streaming_tv streaming_filmes contrato fatura_online \\\n", "975 Sim Não Bienal Não \n", "1775 Sem serviço de internet Sem serviço de internet Bienal Não \n", "1955 Não Não Bienal Sim \n", "2075 Sem serviço de internet Sem serviço de internet Anual Sim \n", "2232 Sem serviço de internet Sem serviço de internet Bienal Não \n", "2308 Sem serviço de internet Sem serviço de internet Bienal Não \n", "2930 Sim Não Bienal Não \n", "3134 Sem serviço de internet Sem serviço de internet Bienal Não \n", "3203 Sim Não Bienal Sim \n", "4169 Sim Sim Bienal Não \n", "5599 Sem serviço de internet Sem serviço de internet Bienal Não \n", "\n", " forma_pagamento cobranca_mensal cobranca_total \n", "975 Cartão de crédito (automático) 56.05 NaN \n", "1775 Cheque por correio 20.00 NaN \n", "1955 Transferência bancária (automático) 61.90 NaN \n", "2075 Cheque por correio 19.70 NaN \n", "2232 Cheque por correio 20.25 NaN \n", "2308 Cheque por correio 25.35 NaN \n", "2930 Cheque por correio 73.35 NaN \n", "3134 Cheque por correio 25.75 NaN \n", "3203 Transferência bancária (automático) 52.55 NaN \n", "4169 Cheque por correio 80.85 NaN \n", "5599 Cheque por correio 19.85 NaN " ], "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", "
id_clientechurngeneroidosoparceirodependentesmeses_contratoservico_telefonemultiplas_linhasservico_internetseguranca_onlinebackup_onlineprotecao_dispositivosuportestreaming_tvstreaming_filmescontratofatura_onlineforma_pagamentocobranca_mensalcobranca_total
9751371-DWPAZNãoFemininoNãoSimSim0NãoSem serviço telefônicoDSLSimSimSimSimSimNãoBienalNãoCartão de crédito (automático)56.05NaN
17752520-SGTTANãoFemininoNãoSimSim0SimNãoNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetBienalNãoCheque por correio20.00NaN
19552775-SEFEENãoMasculinoNãoNãoSim0SimSimDSLSimSimNãoSimNãoNãoBienalSimTransferência bancária (automático)61.90NaN
20752923-ARZLGNãoMasculinoNãoSimSim0SimNãoNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetAnualSimCheque por correio19.70NaN
22323115-CZMZDNãoMasculinoNãoNãoSim0SimNãoNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetBienalNãoCheque por correio20.25NaN
23083213-VVOLGNãoMasculinoNãoSimSim0SimSimNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetBienalNãoCheque por correio25.35NaN
29304075-WKNIUNãoFemininoNãoSimSim0SimSimDSLNãoSimSimSimSimNãoBienalNãoCheque por correio73.35NaN
31344367-NUYAONãoMasculinoNãoSimSim0SimSimNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetBienalNãoCheque por correio25.75NaN
32034472-LVYGINãoFemininoNãoSimSim0NãoSem serviço telefônicoDSLSimNãoSimSimSimNãoBienalSimTransferência bancária (automático)52.55NaN
41695709-LVOEQNãoFemininoNãoSimSim0SimNãoDSLSimSimSimNãoSimSimBienalNãoCheque por correio80.85NaN
55997644-OMVMYNãoMasculinoNãoSimSim0SimNãoNãoSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetSem serviço de internetBienalNãoCheque por correio19.85NaN
\n", "
" ] }, "metadata": {} } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Vemos acima que no total 11 linhas do dataset estavam com valores incosistentes na coluna `cobranca_total` e agora estão com valores nulos.\n", "\n", "Analisando a coluna `meses_contrato`, percebe-se que o valor é 0 para todos os casos, por esse motivo a cobrança total ainda não tem nenhum valor.\n", "\n", "Como medida de correção para esta nova insconsistência, vamos considerar que o valor mínimo de cobrança é o valor de cobrança mensal de cada cliente." ], "metadata": {} }, { "cell_type": "code", "execution_count": 37, "source": [ "query = dados.query('cobranca_total.isnull()', engine='python').index\n", "dados.loc[query, 'cobranca_total'] = dados.loc[query, 'cobranca_mensal']\n", "\n", "display(dados.query('cobranca_total.isnull()', engine='python'))" ], "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Empty DataFrame\n", "Columns: [id_cliente, churn, genero, idoso, parceiro, dependentes, meses_contrato, servico_telefone, multiplas_linhas, servico_internet, seguranca_online, backup_online, protecao_dispositivo, suporte, streaming_tv, streaming_filmes, contrato, fatura_online, forma_pagamento, cobranca_mensal, cobranca_total]\n", "Index: []" ], "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", "
id_clientechurngeneroidosoparceirodependentesmeses_contratoservico_telefonemultiplas_linhasservico_internetseguranca_onlinebackup_onlineprotecao_dispositivosuportestreaming_tvstreaming_filmescontratofatura_onlineforma_pagamentocobranca_mensalcobranca_total
\n", "
" ] }, "metadata": {} } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Corrigindo inconsistências: `churn`" ], "metadata": {} }, { "cell_type": "code", "execution_count": 38, "source": [ "print(dados.churn.value_counts())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Não 5174\n", "Sim 1869\n", " 224\n", "Name: churn, dtype: int64\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Para evitar a perda de informações, nesta análise vamos tratar os valores em branco como uma nova classe chamada 'undefined'.\n", "\n", "Desta forma não vamos perder informações de mais de 224 clientes na nossa análise e poderemos, inclusive, tentar encontrar um padrão nos clientes que estão sem informação de churn" ], "metadata": {} }, { "cell_type": "code", "execution_count": 39, "source": [ "dados.loc[dados.churn == '', 'churn'] = 'Indefinido'\n", "\n", "print(dados.churn.value_counts())" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Não 5174\n", "Sim 1869\n", "Indefinido 224\n", "Name: churn, dtype: int64\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "# Cálculo do atributo de cobrança diária" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Através do atributo `cobranca_mensal` podemos chegar facilmente ao novo atributo `cobranca_diaria`.\n", "\n", "Esta nova variável indicará o quanto cada cliente gasta por dia." ], "metadata": {} }, { "cell_type": "code", "execution_count": 40, "source": [ "# Criação de pandas.Series com os valores do novo atributo\n", "cobranca_diaria = round((dados.cobranca_mensal / 30), 2)\n", "print(type(cobranca_diaria))\n", "print(cobranca_diaria[0:5])" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "0 2.19\n", "1 2.00\n", "2 2.46\n", "3 3.27\n", "4 2.80\n", "Name: cobranca_mensal, dtype: float64\n" ] } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Agora basta inserir a pandas.Series na posição desejada. Aqui vamos inserir na posição *19* para que o atributo fique próximo das outras variáveis de cobrança" ], "metadata": {} }, { "cell_type": "code", "execution_count": 41, "source": [ "dados.insert(19,'cobranca_diaria', cobranca_diaria)\n", "dados" ], "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " id_cliente churn genero idoso parceiro dependentes meses_contrato \\\n", "0 0002-ORFBO Não Feminino Não Sim Sim 9 \n", "1 0003-MKNFE Não Masculino Não Não Não 9 \n", "2 0004-TLHLJ Sim Masculino Não Não Não 4 \n", "3 0011-IGKFF Sim Masculino Sim Sim Não 13 \n", "4 0013-EXCHZ Sim Feminino Sim Sim Não 3 \n", "... ... ... ... ... ... ... ... \n", "7262 9987-LUTYD Não Feminino Não Não Não 13 \n", "7263 9992-RRAMN Sim Masculino Não Sim Não 22 \n", "7264 9992-UJOEL Não Masculino Não Não Não 2 \n", "7265 9993-LHIEB Não Masculino Não Sim Sim 67 \n", "7266 9995-HOTOH Não Masculino Não Sim Sim 63 \n", "\n", " servico_telefone multiplas_linhas servico_internet \\\n", "0 Sim Não DSL \n", "1 Sim Sim DSL \n", "2 Sim Não Fibra ótica \n", "3 Sim Não Fibra ótica \n", "4 Sim Não Fibra ótica \n", "... ... ... ... \n", "7262 Sim Não DSL \n", "7263 Sim Sim Fibra ótica \n", "7264 Sim Não DSL \n", "7265 Sim Não DSL \n", "7266 Não Sem serviço telefônico DSL \n", "\n", " seguranca_online backup_online protecao_dispositivo suporte streaming_tv \\\n", "0 Não Sim Não Sim Sim \n", "1 Não Não Não Não Não \n", "2 Não Não Sim Não Não \n", "3 Não Sim Sim Não Sim \n", "4 Não Não Não Sim Sim \n", "... ... ... ... ... ... \n", "7262 Sim Não Não Sim Não \n", "7263 Não Não Não Não Não \n", "7264 Não Sim Não Não Não \n", "7265 Sim Não Sim Sim Não \n", "7266 Sim Sim Sim Não Sim \n", "\n", " streaming_filmes contrato fatura_online forma_pagamento \\\n", "0 Não Anual Sim Cheque por correio \n", "1 Sim Mensal Não Cheque por correio \n", "2 Não Mensal Sim Cheque eletrônico \n", "3 Sim Mensal Sim Cheque eletrônico \n", "4 Não Mensal Sim Cheque por correio \n", "... ... ... ... ... \n", "7262 Não Anual Não Cheque por correio \n", "7263 Sim Mensal Sim Cheque eletrônico \n", "7264 Não Mensal Sim Cheque por correio \n", "7265 Sim Bienal Não Cheque por correio \n", "7266 Sim Bienal Não Cheque eletrônico \n", "\n", " cobranca_diaria cobranca_mensal cobranca_total \n", "0 2.19 65.60 593.30 \n", "1 2.00 59.90 542.40 \n", "2 2.46 73.90 280.85 \n", "3 3.27 98.00 1237.85 \n", "4 2.80 83.90 267.40 \n", "... ... ... ... \n", "7262 1.84 55.15 742.90 \n", "7263 2.84 85.10 1873.70 \n", "7264 1.68 50.30 92.75 \n", "7265 2.26 67.85 4627.65 \n", "7266 1.97 59.00 3707.60 \n", "\n", "[7267 rows x 22 columns]" ], "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", "
id_clientechurngeneroidosoparceirodependentesmeses_contratoservico_telefonemultiplas_linhasservico_internetseguranca_onlinebackup_onlineprotecao_dispositivosuportestreaming_tvstreaming_filmescontratofatura_onlineforma_pagamentocobranca_diariacobranca_mensalcobranca_total
00002-ORFBONãoFemininoNãoSimSim9SimNãoDSLNãoSimNãoSimSimNãoAnualSimCheque por correio2.1965.60593.30
10003-MKNFENãoMasculinoNãoNãoNão9SimSimDSLNãoNãoNãoNãoNãoSimMensalNãoCheque por correio2.0059.90542.40
20004-TLHLJSimMasculinoNãoNãoNão4SimNãoFibra óticaNãoNãoSimNãoNãoNãoMensalSimCheque eletrônico2.4673.90280.85
30011-IGKFFSimMasculinoSimSimNão13SimNãoFibra óticaNãoSimSimNãoSimSimMensalSimCheque eletrônico3.2798.001237.85
40013-EXCHZSimFemininoSimSimNão3SimNãoFibra óticaNãoNãoNãoSimSimNãoMensalSimCheque por correio2.8083.90267.40
.....................................................................
72629987-LUTYDNãoFemininoNãoNãoNão13SimNãoDSLSimNãoNãoSimNãoNãoAnualNãoCheque por correio1.8455.15742.90
72639992-RRAMNSimMasculinoNãoSimNão22SimSimFibra óticaNãoNãoNãoNãoNãoSimMensalSimCheque eletrônico2.8485.101873.70
72649992-UJOELNãoMasculinoNãoNãoNão2SimNãoDSLNãoSimNãoNãoNãoNãoMensalSimCheque por correio1.6850.3092.75
72659993-LHIEBNãoMasculinoNãoSimSim67SimNãoDSLSimNãoSimSimNãoSimBienalNãoCheque por correio2.2667.854627.65
72669995-HOTOHNãoMasculinoNãoSimSim63NãoSem serviço telefônicoDSLSimSimSimNãoSimSimBienalNãoCheque eletrônico1.9759.003707.60
\n", "

7267 rows × 22 columns

\n", "
" ] }, "metadata": {}, "execution_count": 41 } ], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Exportando base de dados processada" ], "metadata": {} }, { "cell_type": "code", "execution_count": 42, "source": [ "dados.to_csv('./data_churn_rate_processed.csv', index=False)" ], "outputs": [], "metadata": {} } ], "metadata": { "colab": { "authorship_tag": "ABX9TyNK3WxzmHeMSs2hhkLfXJRb", "include_colab_link": true, "name": "challenge_alura_DS_2022_05.ipynb", "provenance": [], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3.7.6 64-bit ('base': conda)" }, "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.7.6" }, "interpreter": { "hash": "2cc6d379ee40ae12f58f3d17d7eb75516b9e0982802113dcfca2674b79e8027d" } }, "nbformat": 4, "nbformat_minor": 1 }