सार्वजनिक रूप से ईडीए (भाग 1): पंडों के साथ बिक्री डेटा की सफाई और अन्वेषण
Latest Technology, (लेटेस्ट टेक न्यूज़) Gadget (गैजेट्स) …
! एक प्रमुख डेटा यात्रा की शुरुआत में आपका स्वागत है जिसे मैं “ईडीए इन पब्लिक” कह रहा हूं। जो लोग मुझे जानते हैं, उनके लिए मेरा मानना है कि कुछ भी सीखने का सबसे अच्छा तरीका वास्तविक दुनिया की समस्या से निपटना और पूरी गड़बड़ प्रक्रिया को साझा करना है – जिसमें गलतियाँ, जीत और बीच में सब कुछ शामिल है। यदि आप अपने पांडा और डेटा विश्लेषण कौशल को उन्नत करना चाह रहे हैं, तो यह श्रृंखला आपके लिए है।
हम एक काल्पनिक, मध्यम आकार की ई-कॉमर्स कंपनी के लिए डेटा विश्लेषक के रूप में कार्य करने जा रहे हैं जिसे मैं कॉल करूंगा नोवाशॉप. उन्होंने हमें एक कच्ची, अव्यवस्थित बिक्री सीएसवी सौंपी और एक सरल प्रश्न पूछा: “हम कैसे कर रहे हैं?”
का लक्ष्य भाग —- पहला मूलभूत है: हम इस चुनौतीपूर्ण ई-कॉमर्स डेटासेट को साफ करेंगे, इसकी मूल संरचना का पता लगाएंगे, और पांडा में मुख्य ईडीए कौशल में महारत हासिल करेंगे जो प्रत्येक डेटा वैज्ञानिक दैनिक आधार पर उपयोग करता है। यह श्रृंखला आपको एक से ले जाने के लिए संरचित की गई है शुरुआत (भाग 1) से ए विकसित डेटा विश्लेषक (भाग 3), इसलिए आप जहां भी हों, बेझिझक इसमें शामिल हो जाएं।
इससे पहले कि हम कोड में कूदें, आइए अपनी मूल प्रेरणा को स्पष्ट करें। नोवाशॉप के लिए, हमें कुछ सरल, फिर भी शक्तिशाली प्रश्नों का उत्तर देने की आवश्यकता है: कौन से उत्पाद सबसे अधिक राजस्व लाते हैं? कौन से देश सबसे अधिक बिक्री उत्पन्न करते हैं? आइए जानें.
डेटासेट अवलोकन: बिक्री डेटा को अनपैक करना
नोवाशॉप के लिए अपना विश्लेषण शुरू करने के लिए, हम इसका उपयोग करेंगे यूसीआई ऑनलाइन रिटेल डेटासेट. यह एक बेहतरीन, अत्यधिक यथार्थवादी, गैर-सुव्यवस्थित डेटासेट है जो 2010 के अंत और 2011 के अंत के बीच यूके-आधारित गैर-स्टोर ऑनलाइन खुदरा कंपनी के सभी लेनदेन को कैप्चर करता है।
यह डेटासेट एक के तहत लाइसेंस प्राप्त है क्रिएटिव कॉमन्स एट्रिब्यूशन 4.0 इंटरनेशनल (सीसी बाय 4.0) लाइसेंस।
यह किसी भी उद्देश्य के लिए डेटासेट को साझा करने और अनुकूलित करने की अनुमति देता है, बशर्ते कि उचित क्रेडिट दिया गया हो।
डेटासेट में पाँच लाख से अधिक पंक्तियाँ हैं, और यह उन प्रकार की विसंगतियों से भरा है जिनका आप वास्तविक दुनिया में सामना करते हैं – गायब मान, नकारात्मक संख्याएँ और असंगत पाठ स्वरूपण। यह वही है जो हम चाहते हैं!
यहां वे आठ प्रमुख स्तंभ हैं जिनके साथ हम काम करेंगे, और व्यावसायिक दृष्टिकोण से वे हमें क्या बताते हैं:
- चालान नंबर: ये है चालान संख्या. प्रत्येक लेन-देन के लिए एक अद्वितीय 6-अंकीय संख्या निर्दिष्ट की गई है। यदि कोड ‘C’ से शुरू होता है, तो यह a को इंगित करता है रद्द (एक वापसी).
- स्टॉककोड/उत्पाद कोड: प्रत्येक विशिष्ट उत्पाद को एक अद्वितीय 5-अंकीय कोड सौंपा गया है।
- विवरण: वस्तु का नाम. इसके लिए अक्सर सफाई की आवश्यकता होती है (अतिरिक्त स्थान, असंगत मामले)।
- मात्रा: खरीदी गई वस्तुओं की संख्या. प्रति लेनदेन कितनी इकाइयाँ शामिल थीं? हो सकता है नकारात्मक रिटर्न के लिए.
- चालान की तारीख: लेन-देन की तारीख और समय. यह बाद में समय-श्रृंखला विश्लेषण के लिए आवश्यक है।
- यूनिट मूल्य: स्टर्लिंग (जीबीपी) में प्रति यूनिट उत्पाद की कीमत। एक वस्तु की कीमत. त्रुटियों/मुक्त आइटमों के कारण यह कभी-कभी 0 या नकारात्मक हो सकता है।
- ग्राहक आईडी: प्रत्येक पंजीकृत ग्राहक को एक अद्वितीय 5-अंकीय नंबर सौंपा गया है। महत्वपूर्ण बात यह है कि यह अक्सर गायब रहता है, जिसका अर्थ है कि हमारे पास मेहमानों से कई लेन-देन होते हैं।
- देश: उस देश का नाम जहां ग्राहक रहता है. यह अंतर्राष्ट्रीय बिक्री को विभाजित करने के लिए बहुत अच्छा होगा।
आइए पहली कुछ पंक्तियों पर एक नज़र डालें और देखें कि हम किसके साथ काम कर रहे हैं। यह का आउटपुट है df.head():
आइए डेटासेट को पांडा में आयात करें और देखें कि हम कितनी पंक्तियों से निपट रहे हैं।
import pandas as pd
import numpy as np
df = pd.read_csv(‘Online Retail.csv’)
df.shapeआउटपुट:
(541909, 8)यह काफी सारी पंक्तियाँ हैं। मुझे पंक्तियों को थोड़ा काटना पड़ सकता है।
डेटा लोडिंग और स्लाइसिंग: वॉल्यूम से निपटना
भाग 1 के लिए, हम एक लेने जा रहे हैं 10% यादृच्छिक नमूना संपूर्ण डेटासेट का. यह हमें मूल डेटा की विशेषताओं को बनाए रखते हुए अधिक प्रबंधनीय आकार – लगभग 54,000 पंक्तियाँ – देता है। बड़े डेटा वातावरण से निपटने या प्रोटोटाइप पर ध्यान केंद्रित करते समय यह एक सामान्य और व्यावहारिक तकनीक है।
# Data Loading and Slicing
FILE_PATH = ‘Online Retail.csv’
SAMPLE_FRACTION = 0.1 # We will sample 10% of the data
full_df = pd.read_csv(FILE_PATH, encoding=’unicode_escape’)
# Take a random 10% sample for faster processing in Part 1
df = full_df.sample(frac=SAMPLE_FRACTION, random_state=42).reset_index(drop=True)अब, आइए इसका उपयोग करके आकृति को फिर से जांचें df.shape
आउटपुट:
(54191, 8)उत्तम! अब हम शुरू कर सकते हैं.
प्रारंभिक डेटा निरीक्षण: हमारे हाथ गंदे हो रहे हैं
मेरा पहला कदम यह पता लगाना होगा कि हम क्या साफ़ कर रहे हैं। मुझे इन सवालों का जवाब देना होगा
- डेटासेट में क्या शामिल है?
- डेटा प्रकार और गैर-शून्य गणनाएँ क्या हैं?
- संख्याएँ कैसी दिखती हैं?
दृश्य जांच: df.head() और df.tail()
पहली और आखिरी कुछ पंक्तियों को देखकर, मैं कुछ बातों की पुष्टि कर सकता हूँ:
- रद्दीकरण एवं रिटर्न: मुझे कुछ नोटिस करने का मौका मिला
InvoiceNoसे प्रारंभ होने वाले मान ‘सी’और संगतQuantityनकारात्मक है. यह पुष्टि करता है कि रिटर्न शामिल हैं, और राजस्व विश्लेषण के लिए, मुझे उन्हें अलग करना होगा या बाहर करना होगा। - गुमपन: मैं प्रत्यक्ष रूप से देख सकता था
NaNमूल्यों मेंCustomerIDकॉलम, अतिथि लेनदेन के द्रव्यमान की पुष्टि करता है। - असंगत पाठ: मैंने रिक्त स्थानों के लिए विवरण कॉलम की जाँच की। मुझे जो छोटा सा नमूना मिला, उसके आधार पर मैं वास्तव में नहीं बता सका। लेकिन जब मैं डेटा सफाई में जाता हूं तो उन्हें संबोधित करने में कोई हर्ज नहीं है। मैं पूंजीकरण को भी सुसंगत रख सकता हूं। यह सदैव सर्वोत्तम अभ्यास है सभी अग्रणी/अनुगामी रिक्त स्थान हटा दें समूहीकरण करते समय सूक्ष्म त्रुटियों को रोकने के लिए सभी स्ट्रिंग स्तंभों से।
- मैंने देश कॉलम में कुछ पूंजीकरण संबंधी विसंगतियां भी देखीं। मैंने EIRE नाम का एक देश देखा। शायद इसका मतलब यह है कि आयरलैंड को इसे बदलने की आवश्यकता हो सकती है।
डेटा प्रकार और गैर-शून्य गणना क्या हैं? (.info())
अगला आवश्यक कदम का उपयोग करके संरचना की जांच करना है .info() तरीका। यह मुझे प्रत्येक कॉलम का डेटा प्रकार बताता है और, सबसे महत्वपूर्ण बात यह है कि हमारे पास कितने गैर-शून्य (लापता नहीं) मान हैं।
मुख्य निष्कर्ष
- लुप्त मान: हमारा 10% नमूना लेने के बाद, मुझे इसमें भारी अंतर दिखाई दिया
CustomerID. लगभग 25% ग्राहक आईडी गायब हैं। मैंने इसमें कुछ सौ लुप्त मान भी देखेDescriptionजिसे मुझे संबोधित करना होगा। - डेटा के प्रकार:
InvoiceDateकॉलम अभी भी एक के रूप में सूचीबद्ध हैobject(स्ट्रिंग) प्रकार. इसे एक उचित पांडा में परिवर्तित करना होगाdatetimeवस्तु।CustomerIDवर्तमान में भी एक है तैरनासंभवतः इसलिए क्योंकि इसमें वे शामिल हैंNaNमूल्य! यदि मैं इसे कभी भी एक वास्तविक पूर्णांक आईडी के रूप में उपयोग करना चाहूँ तो यह एक छोटा सा विवरण मुझे याद रखना होगा।
संख्याएँ कैसी दिखती हैं? (.describe())
अगला, मैंने प्रयोग किया .describe() सभी संख्यात्मक स्तंभों का त्वरित सांख्यिकीय सारांश प्राप्त करने के लिए (Quantity और UnitPrice).
- मात्रा (
Quantity): न्यूनतम मात्रा है -2472. यह पुष्टि करता है कि रिटर्न मौजूद है, लेकिन उन न्यूनतम बिंदुओं का पैमाना अत्यधिक बाहरी लेनदेन का सुझाव देता है। बुनियादी बिक्री विश्लेषण के लिए, मुझे इन नकारात्मक संख्याओं और संभावित रूप से अत्यधिक सकारात्मक और नकारात्मक आउटलेर्स को फ़िल्टर करने की आवश्यकता हो सकती है। - यूनिट मूल्य (
UnitPrice): न्यूनतम कीमत है 0. इसका मतलब है कि कुछ उत्पाद मुफ़्त में दिए गए थे या प्लेसहोल्डर प्रविष्टियाँ हैं। चूँकि किसी उत्पाद की सामान्य बिक्री में सकारात्मक कीमत होनी चाहिए, इसलिए किसी भी पंक्ति को फ़िल्टर कर दिया जाएUnitPriceराजस्व की सटीक गणना करने के लिए शून्य या उससे कम होना हमेशा सबसे अच्छा अभ्यास है।
इनके आधार पर त्वरित निरीक्षण किया गया। यह डेटा साफ़-सुथरा नहीं है. हमारे मुख्य संख्यात्मक कॉलमों में बड़े पैमाने पर गुमशुदगी, गलत डेटा प्रकार, अत्यधिक समस्याग्रस्त नकारात्मक/शून्य मान और पाठ विसंगतियों से निपटना है।
लुप्त मूल्यों को संभालना
अब जब हम जानते हैं कि हमारा डेटा कहां गायब है, तो हम शून्य मानों को संभालने के लिए रणनीतियों पर चर्चा शुरू कर सकते हैं। मैं सबसे ज्यादा चिंतित हूं Description और CustomerID.
अनुपलब्ध विवरण
Description हमें बताता है कि कौन सा उत्पाद बेचा गया था, इसलिए इसे खोने से लेनदेन अर्थहीन हो जाता है। हमारे नमूने में, 1% से भी कम पंक्तियों में विवरण गायब हैं। उन पंक्तियों को पूरी तरह से हटा देना ही उचित है, क्योंकि वे उत्पाद स्तर पर विश्लेषण के लिए बेकार हैं।
# Drop rows where the Description is missing
df.dropna(subset=('Description'), inplace=True)
# checking for null counts
df('Description').isnull().sum()आउटपुट:
np.int64(0)ठीक है, उत्तम! सभी शून्य मान ख़त्म हो गए हैं.
ग्राहक आईडी गुम
लापता CustomerID(हमारे नमूने का लगभग 25%) बहुत बड़ी बात है। यदि मैं उन सभी को छोड़ देता हूं, तो मैं अपने बिक्री डेटा का लगभग एक चौथाई हिस्सा खो दूंगा, जिससे नोवाशॉप को अपने कुल राजस्व का खतरनाक रूप से तिरछा दृश्य मिलेगा।
सरल राजस्व और उत्पाद विश्लेषण (भाग 1 का लक्ष्य) के लिए, मुझे वास्तव में इसकी आवश्यकता नहीं है CustomerID. हम सभी पंक्तियों पर विश्लेषण के साथ आगे बढ़ सकते हैं इसके बिना ईवेंट एक आईडी. यदि हम ग्राहक विभाजन (जैसे आरएफएम विश्लेषण) करने की योजना बना रहे हैं तो हमें केवल आईडी की आवश्यकता है, जिसे मैं भाग 2 के लिए सहेज कर रखूंगा!
डेटा प्रकार रूपांतरण और डुप्लिकेट निष्कासन
अब जब हमने लुप्त विवरणों को संभाल लिया है, तो अगले दो तात्कालिक मुद्दे पूरी तरह से डुप्लिकेट की गई पंक्तियों से निपटना और हमारे आवश्यक को ठीक करना है InvoiceDate स्तंभ।
चालान दिनांक प्रकार को ठीक करना
याद रखें कैसे .info() दिखाया InvoiceDate एक स्ट्रिंग के रूप में (object)? हमें इसे तुरंत ठीक करने की आवश्यकता है ताकि पांडा जान सकें कि हमारे डेटा को कालानुक्रमिक रूप से कैसे क्रमबद्ध और एकत्रित किया जाए।
# Convert InvoiceDate from object (string) to datetime
df(‘InvoiceDate’) = pd.to_datetime(df(‘InvoiceDate’))डुप्लिकेट हटाना
यदि दो पंक्तियाँ एक समान हों सभी कॉलम, वे डुप्लिकेट हैं और कृत्रिम रूप से हमारी बिक्री संख्या बढ़ा देंगे। आइए उनकी जांच करें और उन्हें हटा दें।
# Remove Duplicates
num_duplicates = df.duplicated().sum()
print(f”Found {num_duplicates} fully duplicated rows.”)आउटपुट:
Found 62 fully duplicated rowsआइए उन्हें छोड़ दें
# Remove duplicates, keeping the first instance
df.drop_duplicates(inplace=True)
print(f”Dataframe size after removing duplicates: {len(df)} rows.”)आउटपुट:
Dataframe size after removing duplicates: 53980 rows.रिटर्न और त्रुटियों को फ़िल्टर करना
हमारा .describe() विधि ने हमें कुछ गंभीर लाल झंडे दिखाए: नकारात्मक मात्रा (रिटर्न) और शून्य/नकारात्मक इकाई मूल्य (त्रुटियां/मुक्त आइटम)। भाग 1 के लिए, हम गणना करना चाहते हैं बिक्री से शुद्ध राजस्वइसलिए हमें इस शोर को फ़िल्टर करना होगा।
नकारात्मक मात्राओं और कीमतों को संभालना
हम केवल वहीं लेन-देन रखेंगे जहां:
Quantityशून्य से अधिक है (सभी रिटर्न और रद्दीकरण को फ़िल्टर करते हुए)।UnitPriceपूरी तरह से शून्य से अधिक है (त्रुटियों और मुक्त वस्तुओं को फ़िल्टर करना)।
# Filter: Keep only transactions where Quantity is positive (i.e., sales, not returns)
df = df(df(‘Quantity’) > 0)
# Filter: Keep only transactions where UnitPrice is positive (i.e., not free or an error)
df = df(df(‘UnitPrice’) > 0)
print(f”Dataframe size after filtering: {len(df)} rows.”)उत्पादन
Dataframe size after filtering: 52933 rows.टेक्स्ट कॉलम साफ़ करना
अंत में, आइए उन पाठ मानकीकरण मुद्दों से निपटें जिन्हें हमने दृष्टिगत रूप से देखा, जैसे EIRE देश कोड और कोई भी संभावित छिपा हुआ रिक्त स्थान Description.
- स्ट्रिप व्हाईटस्पेस: हम उपयोग करते हैं
.str.strip()दोनों से अग्रणी/पिछली जगहों को हटाने के लिएDescriptionऔरCountry. - देश का मानकीकरण करें: हम ‘ईआईआरई’ से ‘आयरलैंड’ जैसी विसंगतियों को मैन्युअल रूप से मैप करते हैं।
# Cleaning Text Columns
# Clean Description and Country columns
df(‘Description’) = df(‘Description’).str.strip()
df(‘Country’) = df(‘Country’).str.strip()
# Handle specific country name inconsistencies
# EIRE is a common inconsistency in this dataset for Ireland
df(‘Country’).replace(‘EIRE’, ‘Ireland’, inplace=True)
print(“Text columns cleaned and standardized.”)फ़ीचर इंजीनियरिंग और प्रथम अंतर्दृष्टि
डेटा अब साफ़ है. अब हम अंततः मज़ेदार प्रश्न पूछना शुरू कर सकते हैं। किसी भी बिक्री डेटासेट के लिए सबसे महत्वपूर्ण मीट्रिक राजस्व है। चूंकि हमारा मूल डेटा ही है Quantity और UnitPriceहमें इंजीनियर करने की जरूरत है आय स्वयं कॉलम करें।
फ़ीचर इंजीनियरिंग: बनाना Revenue स्तंभ
किसी लेन-देन के लिए राजस्व केवल बेची गई वस्तुओं की संख्या को प्रत्येक वस्तु की कीमत से गुणा किया जाता है।
df(‘Revenue’) = df(‘Quantity’) * df(‘UnitPrice’)पहली जानकारी: कौन से देश राजस्व बढ़ाते हैं?
आइए नोवाशॉप के प्रश्न का उत्तर देने के लिए अपने स्वच्छ डेटा का उपयोग करें: “कौन से देश हमारी बिक्री बढ़ा रहे हैं?”
हम एक शक्तिशाली तीन-चरणीय संयोजन का उपयोग करेंगे:
- समूह से
Countryस्तंभ। - सकल (योग) द
Revenueप्रत्येक समूह के भीतर. - क्रम से लगाना उच्चतम राजस्व से न्यूनतम तक के परिणाम।
# Group by Country, sum the Revenue, and sort for the top 10
top_countries = df.groupby(‘Country’)(‘Revenue’).sum().sort_values(ascending=False).head(10)
print(“\n — — Top 10 Countries by Revenue (GBP) — -”)
print(top_countries)आउटपुट:
--- Top 10 Countries by Revenue (GBP) ---
Country
United Kingdom 941268.661
Netherlands 27435.830
EIRE 26066.000
France 23645.330
Germany 22389.510
Australia 12429.990
Spain 5600.900
Switzerland 5483.890
Hong Kong 3597.850
Belgium 3593.510
Name: Revenue, dtype: float64इसके लिए आउटपुट आम तौर पर बड़े पैमाने पर प्रभुत्व दर्शाता है यूनाइटेड किंगडम. यह अपेक्षित है क्योंकि कंपनी यूके स्थित है। अगले कई देश हमें एक त्वरित रोडमैप देते हैं कि नोवाशॉप का अंतर्राष्ट्रीय फोकस कहाँ होना चाहिए।
निष्कर्ष
हमने यह किया। हमने एक कच्चा, आधा मिलियन-पंक्ति वाला डेटासेट लिया, इसे प्रबंधनीयता के लिए काटा, लापता मानों से जूझते हुए, डेटा प्रकारों को ठीक किया, त्रुटियों को फ़िल्टर किया, और हमारी पहली प्रमुख व्यावसायिक मीट्रिक की गणना की। कठिन, मूलभूत कार्य पूरा हो गया है।
भाग 1 में हमने जो हासिल किया उसका संक्षिप्त विवरण यहां दिया गया है:
- डेटा जांच: हमने प्रयोग किया
.head(),.info()और ।describe()नकारात्मक कीमतों/मात्राओं, गुम ग्राहक आईडी और गलत डेटाटाइम प्रारूप जैसे महत्वपूर्ण मुद्दों की पहचान करने के लिए। - डेटा सफ़ाई: हमने व्यवस्थित रूप से शून्य और डुप्लिकेट को हटा दिया, परिवर्तित कर दिया
InvoiceDateएक उचित के लिएdatetimeऑब्जेक्ट, और गैर-बिक्री लेनदेन (रिटर्न और मुफ़्त आइटम) को फ़िल्टर कर दिया गया। - फ़ीचर इंजीनियरिंग: हमने क्रिटिकल बनाया
Revenueस्तंभ। - पहली अंतर्दृष्टि: हमने नोवाशॉप के लिए राजस्व के आधार पर शीर्ष 10 देशों को तैयार किया, जिससे उन्हें स्वच्छ सेट से उनका पहला कार्रवाई योग्य डेटा बिंदु मिला।
स्वच्छ डेटासेट अब अधिक परिष्कृत विश्लेषण के लिए तैयार किया गया है। भाग 2 में, हम गहराई से जानेंगे उत्पाद विश्लेषण और समय-श्रृंखला अपघटन। हम यह पता लगाएंगे कि कौन सी वस्तुएं वास्तव में पैसा बनाती हैं और विश्लेषण करेंगी कि बिक्री की मात्रा घंटे-दर-घंटे और महीने-दर-महीने कैसे बदलती है।
मैं आगे बढ़ने के लिए उत्साहित हूं! यदि आपको यह लेख अच्छा लगा हो. बेझिझक मुझे इनमें से किसी भी चैनल पर बताएं। आपकी प्रतिक्रिया मेरे लिए बहुत मायने रखेगी.
(टैग्सटूट्रांसलेट)डेटा एनालिटिक्स(टी)डेटा साइंस(टी)एडा इन पायथन(टी)एक्सप्लोरेटरी डेटा एनालिसिस(टी)पायथन
Latest Technology, (लेटेस्ट टेक न्यूज़) Gadget (गैजेट्स) …
Source link
