از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تجزیه و تحلیل روند خرید جمعه سیاه از طریق یادگیری ماشینی
سرفصلهای مطلب
معرفی
ویکی پدیا جمعه سیاه را اینگونه تعریف می کند “نامی غیر رسمی برای جمعه پس از روز شکرگزاری در ایالات متحده که جشن گرفته می شود روی چهارمین پنجشنبه آبان ماه (جمعه سیاه) به عنوان آغاز فصل خرید کریسمس آمریکا در نظر گرفته می شود (…)».
در این مقاله سعی می کنیم روندهای مختلف را از مجموعه داده خرید جمعه سیاه بررسی کنیم. ما اطلاعات مفیدی را استخراج خواهیم کرد که به سوالاتی مانند: چه جنسیتی بیشتر میفروشد پاسخ میدهد روی جمعه سیاه؟ آیا مشاغل مردم تاثیری دارد؟ روی حراجی؟ کدام گروه سنی بیشترین هزینه را دارد؟
در پایان، ما یک الگوریتم یادگیری ماشینی ساده ایجاد خواهیم کرد که مقدار پولی را که فرد احتمالاً خرج میکند را پیشبینی میکند. روی جمعه سیاه بسته به روی ویژگی هایی مانند جنسیت، سن و شغل.
مجموعه داده ای که در این مقاله استفاده خواهیم کرد شامل 550000 مشاهدات در مورد جمعه سیاه است که در یک فروشگاه خرده فروشی انجام شده است. فایل را می توانید از اینجا دانلود کنید: Black Friday Dataset.
تحلیل داده ها
اولین قدم این است که import کتابخانه هایی که در این بخش به آنها نیاز خواهیم داشت:
import pandas as pd
import numpy as np
import matplotlib as pyplot
%matplotlib inline
import seaborn as sns
بعد، ما نیاز داریم import داده های ما
data = pd.read_csv('E:/Datasets/BlackFriday.csv')
بیایید برخی از اطلاعات اولیه در مورد داده های خود را ببینیم!
data.info()
خروجی:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 12 columns):
User_ID 537577 non-null int64
Product_ID 537577 non-null object
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 370591 non-null float64
Product_Category_3 164278 non-null float64
Purchase 537577 non-null int64
dtypes: float64(2), int64(5), object(5)
memory usage: 49.2+ MB
با نگاهی به داده ها، می توان نتیجه گرفت که مجموعه ما دارای 12 پارامتر مختلف است: 7 متغیر عددی (عدد صحیح و شناور) و 5 متغیر شی. علاوه بر این، مجموعه داده شامل دو متغیر نوع کوتاه است: Product_Category_2
و Product_Category_3
. در ادامه خواهیم دید که چگونه با این مشکل برخورد کنیم.
خوب، حالا یک تصویر کلی از داده ها داریم، بیایید print اطلاعات مربوط به پنج مشتری اول (پنج ردیف اول DataFrame ما):
data.head()
اولین سوالی که از ابتدای این مطالعه می خواهم بپرسم، آیا این درست است که مشتریان زن در مقایسه با مشتریان مرد بسیار مسلط هستند؟ ما استفاده خواهیم کرد seaborn
کتابخانه و countplot
تابعی برای رسم تعداد مشتریان زن و مرد.
sns.countplot(data('Gender'))
وای! نمودار نشان می دهد که مشتریان مرد تقریبا 3 برابر بیشتر از مشتریان زن هستند! چرا اینطور است؟ شاید بازدیدکنندگان مرد در صورت وجود معاملات بیشتر به احتمال زیاد بیرون بروند و چیزی برای خانم های خود بخرند.
بیایید بررسی کنیم Gender
دسته بندی کمی بیشتر اکنون می خواهیم توزیع متغیر جنسیت را ببینیم، اما با در نظر گرفتن این Age
دسته بندی. یک بار دیگر countplot
تابع استفاده خواهد شد، اما در حال حاضر با تعریف شده است hue
پارامتر.
sns.countplot(data('Age'), hue=data('Gender'))
از شکل بالا به راحتی می توان نتیجه گرفت که بیشترین تعداد مشتریان مربوط به گروه سنی 26 تا 35 سال برای هر دو جنس است. جمعیت جوان تر و مسن تر به مراتب کمتر نماینده دارند روی جمعه سیاه. مستقر روی این نتایج، فروشگاههای خردهفروشی باید بیشتر محصولاتی را بفروشند که افراد در اواخر دهه بیست تا اوایل سی سالگی را هدف قرار میدهند. برای افزایش سود، می توان تعداد محصولاتی را که افراد حدوداً سی ساله را هدف قرار می دهند، افزایش داد، در حالی که تعداد محصولاتی را که جمعیت مسن یا جوان را هدف قرار می دهند، کاهش داد.
در مرحله بعد، از تابع توصیف برای تجزیه و تحلیل دسته بندی های خود، از نظر مقادیر میانگین، مقادیر حداقل و حداکثر، انحرافات استاندارد و غیره استفاده می کنیم.
data.describe()
علاوه بر این، در زیر به تجزیه و تحلیل میپردازیم User_ID
ستون با استفاده از nunique
روش. از این می توان نتیجه گرفت که در این فروشگاه خرده فروشی خاص، در جمعه سیاه، 5891 مشتری مختلف چیزی از فروشگاه خریداری کرده اند. همچنین، از Product_ID
ما می توانیم اطلاعاتی را استخراج کنیم که 3623 محصول مختلف فروخته شده است.
data('User_ID').nunique()
خروجی:
5891
data('User_ID').nunique()
خروجی:
3623
حالا بیایید بررسی کنیم Occupation
دسته بندی. این Occupation
شماره، شماره شناسه نوع شغل هر مشتری است. می بینیم که حدود 20 شغل مختلف وجود دارد. اما بیایید تجزیه و تحلیل دقیق انجام دهیم. ابتدا باید تابعی را ایجاد کنیم که تمام عناصر منحصر به فرد را از یک ستون استخراج کند (برای استخراج همه مشاغل مختلف).
ما استفاده خواهیم کرد unique
تابع برای آن، از numpy
کتابخانه پایتون
def unique(column):
x = np.array(column)
print(np.unique(x))
print("The unique ID numbers of customers occupations:")
unique(data('Occupation'))
خروجی:
The unique ID numbers of costumers occupations:
( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)
همانطور که می بینیم، 21 شناسه شغلی مختلف در طول روز خرید ثبت می شود.
شماره شغل می تواند نشان دهنده حرفه های مختلف مشتریان باشد: به عنوان مثال، شماره 1 می تواند یک مهندس، شماره 2 – یک پزشک، شماره 3 یک هنرمند و غیره باشد.
همچنین جالب است که ببینیم هر گروه مشتری (گروه بندی شده بر اساس شناسه شغلی) چقدر پول خرج کرده است. برای انجام این کار، می توانیم از یک حلقه for استفاده کنیم و پول خرج شده را برای هر شناسه شغلی مجزا جمع کنیم:
occupations_id = list(range(0, 21))
spent_money = ()
for oid in occupations_id:
spent_money.append(data(data('Occupation') == oid)('Purchase').sum())
spent_money
خروجی:
(625814811,
414552829,
233275393,
160428450,
657530393,
112525355,
185065697,
549282744,
14594599,
53619309,
114273954,
105437359,
300672105,
71135744,
255594745,
116540026,
234442330,
387240355,
60249706,
73115489,
292276985)
ما لیست را ایجاد کرده ایم spent_money
، که شامل مقادیر مجموع دلار برای Occupations
شناسه ها – از 0 تا 20. ممکن است در نتایج عجیب به نظر برسد که صدها میلیون دلار خرج شده است. اما، به خاطر داشته باشید که مجموعه داده ما شامل 500000 مشاهده است، بنابراین این در واقع بسیار محتمل است. یا شاید فروشگاه خرده فروشی در واقع یک مرکز خرید بزرگ باشد. توضیح دیگر برای مبالغ هنگفتی که توسط هر شغل خرج می شود این است که این داده ها ممکن است نشان دهنده تراکنش های چند شب جمعه سیاه باشد و نه فقط یک شب.
اکنون، ما اطلاعاتی در مورد میزان هزینه صرف شده برای هر طبقه شغلی داریم. بیایید اکنون این اطلاعات را به صورت گرافیکی ترسیم کنیم.
import matplotlib.pyplot as plt; plt.rcdefaults()
import matplotlib.pyplot as plt
objects = ('0', '1', '2', '3', '4', '5','6','7','8','9','10', '11','12', '13', '14', '15', '16', '17', '18', '19', '20')
y_pos = np.arange(len(objects))
plt.bar(y_pos, spent_money, align='center', alpha=0.5)
plt.xticks(y_pos, objects)
plt.ylabel('Money spent')
plt.title('Occupation ID')
plt.show()
به راحتی می توان مشاهده کرد که افراد دارای مشاغل 0 و 4 بیشترین پول را در فروش جمعه سیاه خرج کردند. از سوی دیگر، افراد وابسته به مشاغل با شناسه 18، 19 و به ویژه شغل 8، هزینه های خود را صرف کرده اند. کمترین مقدار پول. این می تواند به این معنی باشد که این گروه ها فقیرترین یا برعکس، ثروتمندترین افراد هستند که دوست ندارند در این نوع خرده فروشی ها خرید کنند. ما برای پاسخ به این سوال کمبود اطلاعات داریم و به همین دلیل، در اینجا با تجزیه و تحلیل آن متوقف می شویم Occupation
دسته بندی.
City_Category
متغیر بعدی است. این دسته اطلاعاتی در مورد شهرهایی که مشتریان ما از آنها هستند به ما می دهد. ابتدا بیایید ببینیم چند شهر مختلف داریم.
data('City_Category').nunique()
خروجی:
3
حال جالب خواهد بود که ببینیم بر حسب درصد نسبت مشتریان از هر شهر چقدر است. این اطلاعات در قالب یک نمودار دایره ای رنگی ارائه می شود. ما می توانیم این کار را در 5 خط کد انجام دهیم. Python قادر متعال، متشکرم! 🙂
explode = (0.1, 0, 0)
fig1, ax1 = plt.subplots(figsize=(11,6))
ax1.pie(data('City_Category').value_counts(), explode=explode, labels=data('City_Category').unique(), autopct='%1.1f%%')
plt.legend()
plt.show()
از نمودار دایره ای مشخص است که هر سه شهر تقریباً به طور مساوی در فروشگاه های خرده فروشی در روزهای جمعه سیاه حضور دارند. شاید فروشگاه جایی بین این سه شهر باشد، به راحتی در دسترس باشد و از این شهرها ارتباطات جاده ای خوبی داشته باشد.
پیش پردازش داده ها برای الگوریتم های ML
ما تاکنون چند تکنیک اساسی برای تجزیه و تحلیل داده های خام را پوشش داده ایم. قبل از اینکه بتوانیم الگوریتمهای یادگیری ماشینی را در مجموعه داده خود اعمال کنیم، باید آن را به شکل خاصی تبدیل کنیم که الگوریتمهای یادگیری ماشین بتوانند کار کنند. روی. وظیفه الگوریتم های یادگیری پیش بینی مقدار است Purchase
متغیر، با توجه به اطلاعات مشتری به عنوان ورودی.
اولین کاری که باید انجام دهیم این است که با داده های از دست رفته در ستون ها مقابله کنیم Product_Category_2
و Product_Category_3
. ما فقط 30 درصد از داده ها را در داخل داریم Product_Category_3
و 69 درصد از داده های داخل Product_Category_2
. 30 درصد دادههای واقعی نسبت کمی است، ما میتوانیم مقادیر گمشده در این دسته را با میانگین مقادیر موجود پر کنیم، اما این بدان معناست که 70 درصد دادهها مصنوعی خواهند بود که میتواند مدل یادگیری ماشینی آینده ما را خراب کند. بهترین جایگزین برای این مشکل حذف این ستون از تجزیه و تحلیل بیشتر است. ما استفاده خواهیم کرد drop
عملکرد برای انجام آن:
data = data.drop(('Product_Category_3'), axis=1)
ستون Product_Category_2
حدود 30 درصد از داده های از دست رفته را در اختیار دارد. در اینجا پر کردن مقادیر گمشده و استفاده از این ستون برای برازش مدل یادگیری ماشین منطقی است. ما این مشکل را با درج یک مقدار متوسط از مقادیر موجود در این ستون به فیلدهای گم شده حل خواهیم کرد:
data('Product_Category_2').fillna((data('Product_Category_2').mean()), inplace=True)
بیایید اکنون دوباره چارچوب داده خود را بررسی کنیم:
data.info()
خروجی:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 11 columns):
User_ID 537577 non-null int64
Product_ID 537577 non-null object
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 537577 non-null float64
Purchase 537577 non-null int64
dtypes: float64(1), int64(5), object(5)
memory usage: 45.1+ MB
مشکل مقادیر از دست رفته حل شده است. در مرحله بعد، ستون هایی را که در پیش بینی کمکی نمی کنند حذف می کنیم.
User_ID
is عددی است که به طور خودکار به هر مشتری اختصاص داده می شود و برای اهداف پیش بینی مفید نیست.
این Product_ID
ستون حاوی اطلاعاتی در مورد محصول خریداری شده است. از ویژگی های مشتری نیست. بنابراین، ما آن را نیز حذف خواهیم کرد.
data = data.drop(('User_ID','Product_ID'), axis=1)
data.info()
خروجی:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 537577 entries, 0 to 537576
Data columns (total 9 columns):
Gender 537577 non-null object
Age 537577 non-null object
Occupation 537577 non-null int64
City_Category 537577 non-null object
Stay_In_Current_City_Years 537577 non-null object
Marital_Status 537577 non-null int64
Product_Category_1 537577 non-null int64
Product_Category_2 537577 non-null float64
Purchase 537577 non-null int64
dtypes: float64(1), int64(4), object(4)
memory usage: 36.9+ MB
انتخاب نهایی ما مبتنی است روی 9 ستون – یک متغیر که می خواهیم پیش بینی کنیم (the Purchase
ستون) و 8 متغیر که برای آموزش مدل یادگیری ماشین خود استفاده خواهیم کرد.
همانطور که از جدول اطلاعات می بینیم، با 4 ستون طبقه بندی روبرو هستیم. با این حال، مدلهای یادگیری ماشین پایه قادر به پردازش مقادیر عددی هستند. بنابراین، باید ستون های دسته بندی را به عددی تبدیل کنیم.
می توانیم از a استفاده کنیم get_dummies
تابع پایتون که مقادیر طبقه بندی شده را به بردارهای کدگذاری شده یک داغ تبدیل می کند. چگونه کار می کند؟ ما در مجموعه داده خود 3 شهر داریم: A، B، و C. فرض کنید یک مشتری از شهر B است. get_dummies
تابع یک بردار رمزگذاری شده یک داغ برای آن رکورد برمی گرداند که به شکل زیر است: (0 1 0)
. برای یک مشتری از شهر A: (1 0 0)
و از C: (0 0 1)
. به طور خلاصه، برای هر شهر یک ستون جدید ایجاد می شود که با تمام صفرها به جز ردیف هایی که مشتری به آن شهر خاص تعلق دارد، پر می شود. چنین ردیف هایی حاوی 1 خواهند بود.
اسکریپت زیر بردارهای کدگذاری شده تک داغ برای ایجاد می کند Gender
، Age
، City
، و Stay_In_Current_City_Years
ستون
df_Gender = pd.get_dummies(data('Gender'))
df_Age = pd.get_dummies(data('Age'))
df_City_Category = pd.get_dummies(data('City_Category'))
df_Stay_In_Current_City_Years = pd.get_dummies(data('Stay_In_Current_City_Years'))
data_final = pd.concat((data, df_Gender, df_Age, df_City_Category, df_Stay_In_Current_City_Years), axis=1)
data_final.head()
در تصویر زیر، ستون های ساختگی جدید ایجاد شده ارائه شده است. همانطور که می بینید، همه متغیرهای دسته بندی به عددی تبدیل می شوند. بنابراین، اگر مشتری بین 0 تا 17 سال سن داشته باشد (مثلاً)، فقط آن مقدار ستون برابر با 1 خواهد بود، سایر ستونهای گروه سنی دیگر دارای مقدار 0 خواهند بود. به همین ترتیب، اگر مشتری مرد باشد، ستون با نام ‘M’ برابر با 1 و ستون ‘F’ 0 خواهد بود.
اکنون دادههایی داریم که میتوان به راحتی از آنها برای آموزش یک مدل یادگیری ماشین استفاده کرد.
پیش بینی میزان هزینه شده
در این مقاله از یکی از ساده ترین مدل های یادگیری ماشین یعنی مدل رگرسیون خطی برای پیش بینی میزان هزینه شده توسط مشتری استفاده خواهیم کرد. روی جمعه سیاه.
رگرسیون خطی یک روش بسیار ساده برای یادگیری نظارت شده است و ابزاری موثر برای پیشبینی پاسخهای کمی است. شما می توانید اطلاعات اولیه در مورد آن را در اینجا پیدا کنید: رگرسیون خطی در پایتون
این مدل، مانند بسیاری از الگوریتمهای یادگیری ماشینی تحت نظارت، یک پیشبینی مبتنی بر انجام میدهد روی ویژگی های ورودی مقادیر خروجی پیش بینی شده برای مقایسه با خروجی های مورد نظر استفاده می شود و خطا محاسبه می شود. سیگنال خطا از طریق مدل منتشر می شود و پارامترهای مدل به گونه ای به روز می شوند تا خطا را به حداقل برسانند. در نهایت، اگر خطا به اندازه کافی کوچک باشد، مدل کاملاً آموزش دیده در نظر گرفته می شود. این یک توضیح بسیار ابتدایی است و ما در مقالات بعدی قصد داریم تمام این فرآیندها را با جزئیات تجزیه و تحلیل کنیم.
با تئوری بس است، بیایید یک سیستم ML واقعی بسازیم! ابتدا باید بردارهای ورودی و خروجی را برای مدل خود ایجاد کنیم:
X = data_final(('Occupation', 'Marital_Status', 'Product_Category_2', 'F', 'M', '0-17', '18-25', '26-35', '36-45', '46-50', '51-55', '55+', 'A', 'B', 'C', '0', '1', '2', '3', '4+'))
y = data_final('Purchase')
در حال حاضر، ما import را train_test_split
عملکردی برای تقسیم تمام داده های ما به دو مجموعه: مجموعه آموزشی و آزمایشی. مجموعه آموزشی متناسب با مدل ما استفاده خواهد شد. داده های آموزشی همیشه برای یادگیری، تنظیم پارامترهای یک مدل و به حداقل رساندن خطا استفاده می شود روی خروجی. بقیه داده ها (مجموعه تست) برای ارزیابی عملکرد استفاده خواهد شد.
اسکریپت زیر مجموعه داده ما را به 60٪ مجموعه آموزشی و 40٪ مجموعه آزمایشی تقسیم می کند:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
اکنون زمان آن فرا رسیده است import مدل رگرسیون خطی ما و آموزش آن روی مجموعه آموزشی ما:
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train, y_train)
print(lm.fit(X_train, y_train))
خروجی:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
تبریک به مردم! مدل ما آموزش دیده است. اکنون می توانیم print مقدار پارامتر رهگیری و مقادیر تمام ضرایب مدل ما، پس از روش یادگیری:
print('Intercept parameter:', lm.intercept_)
coeff_df = pd.DataFrame(lm.coef_, X.columns, columns=('Coefficient'))
print(coeff_df)
خروجی:
Intercept parameter: 11224.23064289564
Coefficient
Occupation 8.110850
Marital_Status -79.970182
Product_Category_2 -215.239359
F -309.477333
M 309.477333
0-17 -439.382101
18-25 -126.919625
26-35 67.617548
36-45 104.096403
46-50 14.953497
51-55 342.248438
55+ 37.385839
A -376.683205
B -130.046924
C 506.730129
0 -46.230577
1 4.006429
2 32.627696
3 11.786731
4+ -2.190279
همانطور که می بینید، هر دسته از مجموعه داده های ما اکنون با یک ضریب رگرسیون تعریف می شود. تمرین process به دنبال بهترین مقادیر این ضرایب در مرحله یادگیری بود. مقادیر ارائه شده در خروجی بالا بهینه ترین مقادیر برای ضرایب مدل یادگیری ماشین ما هستند.
زمان آن فرا رسیده است که از داده های تست به عنوان ورودی مدل استفاده کنیم تا ببینیم مدل ما چقدر خوب عمل می کند.
predictions = lm.predict(X_test)
print("Predicted purchases (in dollars) for new costumers:", predictions)
خروجی:
Predicted purchases (in dollars) for new costumers: (10115.30806914 8422.51807746 9976.05377826 ... 9089.65372668
9435.81550922 8806.79394589)
برآورد عملکرد مدل ML
در پایان، همیشه خوب است که نتایج خود را با یافتن میانگین خطای مطلق تخمین بزنیم (MAE) و میانگین مربعات خطا (MSE) از پیش بینی های ما. روش محاسبه این خطاها را می توانید در اینجا بیابید: روش انتخاب معیار ارزیابی مناسب برای مدلهای یادگیری ماشین.
برای یافتن این مقادیر، میتوانیم از روشهایی استفاده کنیم metrics
کلاس از sklearn
کتابخانه
from sklearn import metrics
print('MAE:', metrics.mean_absolute_error(y_test, predictions))
print('MSE:', metrics.mean_squared_error(y_test, predictions))
خروجی:
MAE: 3874.1898429849575
MSE: 23810661.195583127
نتیجه
یادگیری ماشینی می تواند برای کارهای مختلفی استفاده شود. در این مقاله، ما از یک الگوریتم یادگیری ماشین برای پیشبینی مبلغی که مشتری احتمالاً خرج میکند، استفاده کردیم روی جمعه سیاه. ما همچنین تجزیه و تحلیل داده های اکتشافی را برای یافتن روندهای جالب از مجموعه داده انجام دادیم. برای تمرین، پیشنهاد میکنم بسته به جنسیت، سن و شغل مشتری، سعی کنید محصولی را که احتمال خرید آن توسط مشتری بیشتر است را پیشبینی کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-23 09:16:02