analyse van Telco Customer Churn Dataset
OK! Laten we dit doen..
dus heb ik dit verhaal voorbereid om mezelf wat meer vertrouwd te maken met onbalans gegevens.
de dataset is beschikbaar in de volgende link:
dus laten we er meteen in duiken.
het uiteindelijke doel is het evalueren van verschillende modellen om te voorspellen of een klant zal “Churn” of niet.
voor niet vertrouwd churn wordt meestal uitgedrukt als het percentage (of aantal) dienstabonnees die hun abonnementen binnen een bepaalde periode stopzetten.
laten we beginnen met het doen van onze Eda (explorative Data Analysis)
de datatypes leken ok, met uitzondering van senioren zou dat ook een factor moeten zijn. (In geval van twijfel controleert de dataset link en bibliotheek)
Laten we visualiseren de samenvatting van de dataset
Er zijn een aantal Oma ‘ s in de TotalCharges kolom, dus graven we een beetje verder op die rijen
Aangezien het aantal rijen met NaN waarden zijn zeer klein (1,5% van de gegevens), en rekening houdend met alle van ze zijn churn = “NO”, wat oververtegenwoordigd is in de gegevens. Zullen We het gewoon verwijderen die rijen uit de werken van gegevens
Laat zien dat de barplots voor de verdeling van de categorische kolommen
laten we Nu het perceel voor de afhankelijke variabele
Zoals eerder vermeld kunnen we zien nu de onbalans van de gegevens voor de afhankelijke variabele. Daar zullen we later mee te maken krijgen voordat we modelleren.
laten we nu de boxplots plotten voor de kwantitatieve variabelen.
de boxplot toont geen uitschieters in de distributie.
laten we nu eens kijken naar de correlatie voor de kwantitatieve variabelen:
er is een hoge positieve correlatie tussen de totale kosten en de maandelijkse kosten en de totale kosten en Tenure.
laten we Nu het perceel sommige histogrammen gezien de ‘churn’ – functie voor de kwantitatieve kenmerken:
De afbeelding hierboven laat zien dat de churn rate daalt als de ambtsperiode verhogen, dat is een goede indicatie dat het bedrijf te kunnen blijven lange tijd bij de klanten.👏👏👏
De percelen bovenstaande geeft ons een aantal tips van functies, zoals:
- Blijkbaar kenmerken zoals Geslacht, telefonie, en met Meerdere Lijnen niet echt veel effect op de Churn;
- lijkt Er niet veel verschil tussen de functies Streaming TV en Streaming Films;
- Online beveiliging, apparaatbeveiliging en technische ondersteuning hebben zeer vergelijkbare histogrammen en Churn x Non Churn relatie.
om verder te graven in een bi-variate analyse met inbegrip van de kwantitatieve kenmerken (Tenure, maandelijkse kosten, en totale kosten) laten we ze omzetten in factoren door te delen in 5 verschillende niveaus, voor elke kenmerken, volgens hun 20e percentiel.
Zoals eerder werd vermeld is het percentage van de churn vermindert met het aantal maanden, dat geeft aan dat oude klanten zijn minder moeilijk te onderhouden
Deze bar plot geven aan dat hoe hoger de totale kosten die worden gemaakt om een klant is er een daling in de churn percentage. Wat logisch is als je denkt dat klanten van lange tijd een hogere “totale Last” zullen hebben en zoals we eerder zagen, hebben klanten van lange tijd een lager churn percentage
dit barplot is een beetje meer intuïtief en laat zien dat hogere maandelijkse kosten hebben de neiging om een hoger churn percentage.
modellering
nu we een beter begrip van de gegevens hebben, kunnen we beginnen met de voorbereiding voor modellering om toekomstige klantverloop te voorspellen.
laten we dit proces opsplitsen in stappen, afhankelijk van de onmiddellijke problemen die we aanpakken:
- omgaan met de onbalans
- definiëren van onze algoritmen en Metrics
- testen van onze algoritmen
- omgaan met functieselectie
- eindresultaten
omgaan met de onbalans ⚖ ️
zoals we eerder hebben gezien is onze afhankelijke variabele onevenwichtig. We hebben veel alternatieven om dit probleem aan te pakken:
- Overbemonstering
- Underbemonstering
- waarbij gebruik wordt gemaakt van verschillende gewichtskosten
- enz.
hier zullen we proberen onder, over-sampling en SMOTE techniek.
het Definiëren van onze Algoritmen en Statistieken
Goed, omdat we te maken hebben met een classificatie probleem, dat wil zeggen aan het eind van de dag kunnen we alleen maar “Churn” of “not Churn” voorspellen, daarom moeten we een algoritme kiezen onder dit specifieke “rijk”. Dat laat ons met een aantal opties, zoals:
- Naive-Bayes
- Logistic Regression
- Decision Trees (or Random Forest)
- SVM
- GBM
om de metriek te kiezen moeten we het probleem begrijpen. Bijvoorbeeld:,
- ” hebben valse positieven of valse negatieven meer schadelijke gevolgen?”🤔
In ons geval lijken er geen verschillende gewichten te zijn voor valse positieven of valse negatieven, daarom zullen we nauwkeurigheid gebruiken als onze vergelijkingsmetrie.
het testen van onze algoritmen
we zullen 5 algoritmen implementeren (Naive-Bayes, Logistic regression, Random Forest, SVM en LightGBM). We zullen 10-cross fold validatie gebruiken en elk algoritme 10 keer uitvoeren en de resultaten berekenen.
we zullen deze methodologie voor alle drie de gegevens herhalen (gebalanceerd met onder-Sampling, Over-sampling en SMOTE).
Met de resultaten van de algoritmes die we construeren een enkele Juistheid Dataframe
Wij nu project boxplots voor elk Algoritme en elke evenwichtige gegevens
bovenstaande afbeelding laat zien dat zowel Random Forest voor de over-steekproef gebalanceerde gegevens als voor de SMOTE gebalanceerde gegevens de beste resultaten opleverden: 87% nauwkeurigheid.
omgaan met functie selectie
nu we de algoritmen en gebalanceerde gegevens die de beste resultaten toonden, laten we proberen om de nauwkeurigheid te verbeteren of het algoritme te vereenvoudigen door het doen van functie selectie.
dus kies ik om te werken met de SMOTE balance data.
laten we de varImp-functie gebruiken om de functies te zien die het best churn vertegenwoordigen in het algoritme voor random forest
de eerste vier functies leken vrij intuïtief gezien de visualisaties die we hebben gezien tijdens EDA.
dus we zullen 2 andere dataframes maken, één met de eerste 4 functies en één met alle topfuncties tot Sreaming TV.
laten we nu het willekeurige forest draaien met 10-cv 10 keer herhaald.
laten we nu een nieuw boxplot maken met de nauwkeurigheidsverdeling voor elk van de 3 dataframes.
dus de resultaten voor mid_features en volledige gegevens lijken beter. Laten we testen of ze significant verschillen
dus de statistische test verwerpt de nulhypothese, dus de nauwkeurigheidsverdeling van de full_data en van de mid_features_data zijn significant verschillend.
dus we beëindigen deze functieselectie met behoud van alle kolommen. Aangezien er nog steeds een aanzienlijk verlies van nauwkeurigheid door het verwijderen van de functies.
eindresultaten
laten we ons uiteindelijke voorspellingsmodel samenvatten. We verkregen een gemiddelde nauwkeurigheid van 87%, met behulp van SMOTE als een manier om de gegevens te balanceren en het uitvoeren van herhaalde 10 cross-fold validaties voor 10 keer, met behulp van Random Forest als ons algoritme.
ook hebben we enkele interessante aspecten uit onze klantgegevens vastgelegd, zoals:
- het bedrijf lijkt te doen “ok” met het houden van oude klanten. Energie moet meer aandacht krijgen bij de implementatie van strategieën voor de nieuwe klanten.
- maand – tot-maand type contract hebben een hogere churn rate, zelfs voor hoge maandelijkse lasten, in vergelijking met andere soorten contracten.
- glasvezel hebben hogere karnen tarieven dan DSL voor de klanten die internet service hebben.
- terwijl glasvezel, hebben hogere karnen tarieven, ze levert ook de hogere totale lading tellingen. Daarom is een beter onderzoek naar waarom de klanten niet tevreden zijn met de glasvezeldienst belangrijk.
Ja, we hebben het gehaald! Ik hoop dat je genoten hebt van de rit en ik ben blij om je gedachten te horen.
toekomstige stappen
als herinnering er zijn nog veel andere dingen die u in deze dataset kunt doen, zoals:
- probeer nieuwe algoritmen
- optimaliseer enkele tunningparameters om te zien of u de nauwkeurigheid kunt verbeteren.
Nogmaals bedankt!