تحلیل کمپین‌های بازاریابی با استفاده از تحلیل اکتشافی داده‌ها و مصورسازی

هر فعالیت بازاریابی به منابع مالی نیاز دارد. زمانی که شما کمپین‌های بازاریابی را از طریق ارسال ایمیل اجرا می‌نمایید، ارسال هر ایمیل نیز منجر به هزینه می‌گردد. در صورت اجرای فعالیت‌های بازاریابی بر اساس سرویس‌های شبکه‌های اجتماعی یا مدیا(تلویزیون، رادیو و ...)، به منابع مالی نیاز دارید. با توجه به این که هر فعالیت بازاریابی اثرات مالی دارد لذا بررسی عملکرد و پرفورمنس هر کمپین بازاریابی از اهمیت زیادی برخوردار است. در واقع هدف اصلی هر فعالیت بازاریابی افزایش درآمد در سازمان می‌باشد و هیچ سازمانی تمایل ندارد بیش‌تر از ارزش و درآمدی که از فعالیت‌های بازاریابی ایجاد می‌گردد برای فعالیت‌های بازاریابی هزینه نماید.بررسی و تحلیل پرفورمنس فعالیت‌های بازاریابی با گسترش کانال‌های بازاریابی به فضاهای آنلاین مانند شبکه‌های اجتماعی، وبلاگ‌ها و موتورهای جستجو اهمیت فراوانی یافته است. یکی از شاخص‌های کلیدی عملکرد در تحلیل کمپین‌های دیجیتال مارکتینگ شاخص نرخ تبدیل(Conversion Rate) می‌باشد. مفهوم کلی این شاخص عبارتست از درصد سرنخ‌هایی(Leads) که به مشتریان فعال برای سازمان تغییر یافته‌اند. با توجه به اهداف بازاریابی می‌توان معیار نرخ تبدیل را به صورت مختلف تعریف نمود. اگر هدف معادل باشد با افزایش مشتریانی که بابت خرید محصولات و خدمات سازمان پرداخت مالی داشته باشند، می‌توان نرخ تبدیل را به صورت زیر تعریف نمود:Conversion Rate = تعداد سرنخ‌ها/ تعداد مشتریانی که بابت خرید محصولات و خدمات پرداختی داشته باشنداگر هدف افزایش تعداد مشتریانی باشد که در سایت تجاری سازمانی با ثبت کامل مشخصات ثبت‌نام می‌نمایند، می‌توان نرخ تبدیل را به صورت زیر محاسبه نمود:Conversion Rate = تعداد سرنخ‌ها / تعداد مشتریانی که ثبت نام نموده‌انددر ادامه این پست چگونگی محاسبه شاخص نرخ تبدیل با استفاده از دیتاست کمپین یک بانک تجاری با استفاده از زمان برنامه‌نویسی پایتون و کتابخانه‌های Pandas و Matplotlib شرح داده شده است. دیتای مورد استفاده مربوط به کمپین بازاریابی مستقیمی می‌باشد که بر اساس تماس تلفنی اجرا شده است که سرنخ‌ها(Leads) به افتتاح یک سپرده مدت‌دار تشویق شده‌اند که از این لینک قابل دسترسی است.در ابتدا کتابخانه‌های مدنظر برای اجرای محاسبات را ایمپورت می‌نماییم.import pandas as pdimport matplotlib.pyplot as plt%matplotlib inlineدیتاست مدنظر را با استفاده از تابع read_csv در محیط برنامه‌نویسی پایتون فراخوانی می‌نماییم.df = pd.read_csv("C:/Users/badriyan.mahdi/Desktop/bank-additional/bank-additional/bank-additional-full.csv" , sep= ";")با توجه به خروجی که در شکل فوق نیز نشان داده شده است، قابل مشاهده است که دیتاست مورد بررسی دارای 21 ستون و 41188 ردیف می‌باشد که اطلاعات ستون‌های آن به شرح ذیل می‌باشد:1 - age (numeric)2 - job : type of job (categorical: 'admin.','blue collar','entrepreneur','housemaid','management','retired','self employed', 'services',' student',' technician', 'unemployed','unknown')3 - marital : marital status (categorical: 'divorced','married','single','unknown'; note: 'divorced' means divorced or widowed)4 - education (categorical: 'basic.4y','basic.6y','basic.9y', 'high.school', 'illiterate', 'professional.course', 'university.degree', 'unknown')5 - default: has credit in default? (categorical: 'no','yes','unknown')6 - housing: has housing loan? (categorical: 'no','yes','unknown')7 - loan: has personal loan? (categorical: 'no','yes','unknown')8 - contact: contact communication type (categorical: 'cellular','telephone')9 - month: last contact month of year (categorical: 'jan', 'feb', 'mar', ..., 'nov', 'dec')10 - day_of_week: last contact day of the week (categorical: 'mon','tue','wed','thu','fri')11 - duration: last contact duration, in seconds (numeric).12 - campaign: number of contacts performed during this campaign and for this client (numeric, includes last contact)13 - pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric; 999 means client was not previously contacted)14 - previous: number of contacts performed before this campaign and for this client (numeric)15 - poutcome: outcome of the previous marketing campaign (categorical: 'failure', 'nonexistent',' success')# social and economic context attributes16 - emp.var.rate: employment variation rate - quarterly indicator (numeric)17 - cons.price.idx: consumer price index - monthly indicator (numeric)18 - cons.conf.idx: consumer confidence index - monthly indicator (numeric)19 - euribor3m: euribor 3 month rate - daily indicator (numeric)20- nr.employed: number of employees - quarterly indicator (numeric)21- y : target value: has the client subscribed a term deposit? (binary: 'yes','no')برای محاسبه‌ی نرخ تبدیل (Conversion Rate) لازم است که اطلاعات ستون y را Encodingنماییم و مقدار 1 را به “yes” و مقدار 0 را به “no” تخصیص دهیم تا بتوانیم تعداد مشتریان مدنظر را count نماییم. بدین منظور قطعه کد زیر را اجرا می‌نماییم:df["conversion"] = df["y"].apply(lambda x:1 if x == "yes" else 0)برای محاسبه‌ی نرخ تبدیل تجمیعی(Aggregate Conversion Rate) تنها کافی است تعداد مشتریانی که مشترک شده‌اند را به تعداد کل مشتریان تقسیم نماییم. بدین منظور قطعه کد ذیل را اجرا می‌نماییم:df["conversion"].sum() # total number of conversionsdf.shape[0] #total number of clients in the data (= number of rows in the data)print("conversion rate %0.2f %% " % (df["conversion"].sum()/df.shape[0]*100))با اجرای کد فوق، خروجی پایتون به صورت ذیل است:conversion rate 11.27 %عدد فوق بیانگر عملکرد کلی کمپین بازاریابی است و اطلاعات و بینش کافی را در اختیار ما قرار نمی‌دهد. در زمان ارزیابی و پیشرفت فعالیت‌‌های بازاریابی علاقه‌مندیم که داده‌ها را عمیق‌تر بررسی نماییم و با گروه‌بندی مشتریان در سگمنت‌های مختلف، شاخص‌های عملکردی را برای هر سگمنت به طور مستقل محاسبه نماییم.اکنون مشتریان را بر اساس اطلاعات ستون سن(age)سگمت‌بندی می‌نماییم و نرخ تبدیل را برای هر سگمنت به طور جداگانه محاسبه می‌نماییم. بدین منظور قطعه کد زیر را اجرا می‌نماییم:conversions_by_age = pd.DataFrame(df.groupby("age")["conversion"].sum())total_customer_by_age = pd.DataFrame(df.groupby("age")["conversion"].count())ax = conversion_rate_by_age.plot(grid=True, figsize=(10, 7),title='Conversion Rates by Number of Contacts')ax.set_xlabel('age')ax.set_ylabel('conversion rate (%)')با اجرای کد فوق، پایتون گراف ذیل را ایجاد می‌نماید:نمودار فوق نشان می‌دهد که برای گروه‌های سنی بزرگسال (بیش از 70 سال) نویز و واریانس قابل ملاحظه‌ای برای نرخ تبدیل(محور y) وجود دارد. علّت اصلی این موضوع این است که تعداد داده‌های این گروه سنی نسبت به سایر سال‌ها کمتر است. به منظور کاهش این نویز، می‌توان چند گروه سنی را در یک گروه تجمیع نمود. لذا داده‌ها را در 6 گروه مختلف 18 تا 30، 30 تا 40، 40 تا 50، 50 تا 60، 60 تا 70 و بزرگتر از 70 سال گروه‌بندی می‌نماییم و نرخ تبدیل را برای هر یک از این گروه‌ها محاسبه می‌نماییم. بدین منظور قطعه کد زیر را اجرا می‌نماییم:df['age_group'] = df['age'].apply(lambda x: '[18, 30)' if x < 30 else '[30, 40)' if x < 40 \else '[40, 50)' if x < 50 else '[50, 60)' if x < 60 \else '[60, 70)' if x < 70 else '70+')conversions_by_age_group = df.groupby(by='age_group')['conversion'].sum() / df.groupby(by='age_group')['conversion'].count() * 100.0ax = conversions_by_age_group.loc[['[18, 30)', '[30, 40)', '[40, 50)', '[50, 60)', '[60, 70)', '70+']].plot(kind='bar', color='skyblue', figsize=(10, 7), title='Conversion Rates by Age Groups')ax.set_xlabel('age')ax.set_ylabel('conversion rate (%)')plt.show()با اجرای کد فوق، پایتون گراف ذیل را ایجاد می‌نماید:تفاوت جمعیتی بین مشتریان Converted و Non-Converted یکی دیگر از موضوعاتی که می‌توان بررسی نمود. با این تحلیل می‌توان تفاوت‌های بین گروه مشتریان Converted و Non-Converted را شناسایی نمود که در نهایت منجر به این می‌شود که مشتریان تارگت و مشتریانی که به اقدامات بازاریابی بهتر واکنش نشان داده‌اند را شناسایی نمود. لذا در ابتدا مشتریان را بر اساس وضعیت تأهل گروه‌بندی می‌نماییم. بدین منظور قطعه کد زیر را اجرا می‌نماییم:conversions_by_marital_status_df = df.pivot_table(index = "marital", columns = "conversion", aggfunc = len, values='y')conversions_by_marital_status_df.columns = ['non_conversions', 'conversions']conversions_by_marital_status_df.plot(kind='pie', figsize=(15, 7), startangle=90, subplots=True, autopct=lambda x: '%0.1f%%' % x)plt.show()با اجرای کد فوق، پایتون گراف ذیل را ایجاد می‌نماید:از روی نمودار pie فوق می‌توان تشخیص داد که گروه مزدوجین دارای بیشترین فراوانی می‌باشند و اقدامات بازاریابی برای این گروه از جامعه بیشتر تاثیرگذار بوده است.اکنون برای بررسی موشکافانه تحلیل فوق را به طور همزمان برای دو ویژگی سن و وضعیت تأهل انجام می‌دهیم. بدین منظور قطعه کد زیر را اجرا می‌نماییم:age_marital_df = df.groupby(['age_group', 'marital'])['conversion'].sum().unstack('marital').fillna(0)age_marital_df = age_marital_df.divide(df.groupby(by='age_group')['conversion'].count(), axis=0)ax = age_marital_df.loc[['[18, 30)', '[30, 40)', '[40, 50)', '[50, 60)', '[60, 70)', '70+']].plot(kind='bar', grid=True, figsize=(10,7))ax.set_title('Conversion rates by Age & Marital Status')ax.set_xlabel('age group')ax.set_ylabel('conversion rate (%)')plt.show()در قطعه کد بالا، ابتدا مجموع نرخ تبدیل براساس شاخص‌های سن و وضعیت تأهل محاسبه و سپس بر تعداد کل مشتریان تقسیم شده است.با اجرای کد فوق، پایتون گراف ذیل را ایجاد می‌نماید:در گراف فوق، توزیع نرخ تبدیل بر اساس دو معیار سن و وضعیت تأهل قابل مشاهده است. به عنوان مثال نرخ تبدیل برای مشتریانی که 18 تا 30 سال سن دارند و وضعیت تأهل آن‌ها مجرد است برابر است با 13.25 و نرخ تبدیل برای مشتریان متاهل که 60 تا 70 سال سن دارند 30.11 درصد می‌باشد و بیانگر این است که این گروه پاسخ بهتری به اقدامات بازاریابی ارائه نموده‌اند.نوت بوک سورس کدهای این نوشته را از این لینک می توانید دانلود نمایید.