شناخت معیارهای اصلی کسب و کار اولین قدم از تجزیه و تحلیل است. معیار هایی هدفشان تجزیه و تحلیل و ردیابی براساس با محصول، موقعیت، اهداف و موارد دیگر شرکت است. اکثر کسب و کارها همیشه شاخص های کلیدی عملکرد (KPI) خود را دنبال می کنند. در این مثال، KPI های اصلی که می توانند مربوط به حوزه درآمد باشند مانند درآمد، میانگین مقدار سفارش، فراوانی سفارش و ... بررسی خواهند شد.
دیتاست انتخاب شده مربوط به یک خردهفروشی آنلاین مستقر در بریتانیا است که از 541909 ردیف و 8 ویژگی تشکیل شده است. (لینک دیتاست)
path = "data.csv" df = pd.read_csv( path, encoding = "ISO-8859-1", parse_dates = ['InvoiceDate'] ) df.head()
معرفی ویژگی های داده:
# calculate Revenue for each row df['Revenue'] = df['UnitPrice'] * df['Quantity'] # we look at the revenue by country revenue_country = pd.DataFrame(df.groupby('Country')['Revenue'].agg(sum).sort_values(ascending=False)).reset_index() plt.figure(figsize=(15,13)) sns.set_theme(style="whitegrid") ax = sns.barplot(y="Country", x="Revenue", data=revenue_country) ax.set_title("Revenue Countries") plt.show()
بالای 90 درصد دیتای کاربران از کشور UK بوده است بنابراین برای دستیابی به اهدف این تجزیه و تحلیل، بر روی مشتریان همین کشور تمرکز خواهیم کرد.
# create a new dataframe with YearMonth and Revenue columns revenue = df_uk.groupby(['InvoiceYearMonth'])['Revenue'].sum().reset_index() revenue.head() # line chart showing the monthly revenue plt.figure(figsize=(15,13)) sns.set_theme(style="whitegrid") ax = sns.barplot(y="InvoiceYearMonth", x="Revenue", data=revenue) ax.set_title("Revenue") plt.show()
نمودار بالا روند صعودی درآمد تولید شده تا نوامبر 2011 را نشان می دهد (زیرا داده های دسامبر ناقص است). تا آگوست 2011، کسب و کار ماهیانه بین 400 تا 600 هزار درآمد داشت، از آن زمان تاکنون، درآمد کسب و کار به طور چشمگیری افزایش یافته و به بیش از 1.2 میلیون در نوامبر 2011 رسیده است.
حال برای دستیابی به کنکاش های بیشتر، نرخ رشد ماهانه را محاسبه می کنیم.
revenue['MonthlyGrowth'] = revenue['Revenue'].pct_change() revenue['positive'] = revenue['MonthlyGrowth'] > 0 plt.figure(figsize=(15,13)) clrs = revenue.positive.map({True: 'darkgreen', False: 'brown'}) ax = sns.barplot(x=revenue.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=round(revenue.query("InvoiceYearMonth < 201112")['MonthlyGrowth']*100,2), data=revenue, palette=clrs) ax.set_title("Revenue") plt.show()
ماه سپتامبر با رشد تقریبی 60 درصدی نسبت به ماه های قبل بوده است. همچنین نوامبر نیز با رشد 46.2 درصدی، ماه بسیار خوبی بوده است. ماه های مارس و می هر دو بیش از 30 درصد افزایش یافته اند، اما این ممکن است به دلیل عملکرد ضعیف ماه های قبل باشد.
ژانویه و آوریل 2011 عملکرد ضعیفی دارند.
monthly_active = df_uk.groupby('InvoiceYearMonth')['CustomerID'].nunique().reset_index() monthly_active.columns = ['InvoiceYearMonth','ActiveCustomers'] plt.figure(figsize=(13,7)) plot_data = sns.barplot(x=monthly_active.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=monthly_active.query("InvoiceYearMonth < 201112")['ActiveCustomers']) ax.set_title("Monthly Active Customers") plt.show()
monthly_active['ActiveCustomersRate'] = monthly_active['ActiveCustomers'].pct_change() monthly_active['positive'] = monthly_active['ActiveCustomersRate'] > 0 plt.figure(figsize=(13,7)) ax = sns.barplot(x=monthly_active.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=round(monthly_active.query("InvoiceYearMonth < 201112")['ActiveCustomersRate']*100,2), palette=monthly_active.positive.map({True: 'darkgreen', False: 'brown'})) ax.set_title("Monthly Active Customers Rate") plt.show()
در ژانویه، شرکت تقریباً 200 مشتری خود را از دست داد که از 871 در دسامبر به 684 در ژانویه رسید که نشان دهنده -21.47٪ کاهش است. به طور مشابه، در ماه آوریل کسب و کار از 923 مشتری به 817 رسید که نشان دهنده کاهش 11.48 درصدی است.
monthly_orders = df_uk.groupby('InvoiceYearMonth')['InvoiceNo'].nunique().reset_index() monthly_orders.columns = ['InvoiceYearMonth','Orders'] plt.figure(figsize=(13,7)) ax = sns.barplot(x=monthly_orders.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=monthly_orders.query("InvoiceYearMonth < 201112")['Orders']) ax.set_title("Monthly Orders") plt.show()
monthly_orders['OrdersRate'] = monthly_orders['Orders'].pct_change() monthly_orders['positive'] = monthly_orders['OrdersRate'] > 0 plt.figure(figsize=(13,7)) ax = sns.barplot(x=monthly_orders.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=round(monthly_orders.query("InvoiceYearMonth < 201112")['OrdersRate']*100,2), palette=monthly_orders.positive.map({True: 'darkgreen', False: 'brown'})) ax.set_title('Monthly Orders Rate') plt.show()
تعداد سفارش ها بین دسامبر و فوریه کاهش یافته است و از 1885 به 1259 سفارش رسیده است که نشان دهنده -33.21٪ کاهش است. سفارشات تا ماه می افزایش یافتند. سفارشات دوباره تا آگوست 27.72-% کاهش یافت و در نهایت تا نوامبر افزایش یافته است.
monthly_aov = monthly_aov.groupby('InvoiceYearMonth')['Revenue'].mean().reset_index() monthly_aov.columns = ['InvoiceYearMonth','AOV'] plt.figure(figsize=(13,7)) ax = sns.barplot(x=monthly_aov.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=round(monthly_aov.query("InvoiceYearMonth < 201112")['AOV'],2)) ax.set_title('Monthly AOV') plt.show()
# calculate the monthly orders rate monthly_aov['AOVRate'] = monthly_aov['AOV'].pct_change() # bar chart showing the monthly orders rate monthly_aov['positive'] = monthly_aov['AOVRate'] > 0 plt.figure(figsize=(13,7)) ax = sns.barplot(x=monthly_aov.query("InvoiceYearMonth < 201112")['InvoiceYearMonth'], y=round(monthly_aov.query("InvoiceYearMonth < 201112")['AOVRate']*100,2), palette=monthly_aov.positive.map({True: 'darkgreen', False: 'brown'})) ax.set_title('Monthly AOV Rate') plt.show()
مشتریان جدید یعنی کسانی که برای اولین بار در بازه زمانی تعیین شده خرید کرده اند. لازم به ذکر است اولین و آخرین ماه دیتاست را در نظر نمی گیریم.
first_order = df_uk.groupby('CustomerID').InvoiceDate.min().reset_index() first_order.columns = ['CustomerID','FirstOrder'] first_order['FirstOrder'] = first_order['FirstOrder'].map(lambda date: 100*date.year + date.month) # merge first purchase date column to our main dataframe (df_uk) df_uk = pd.merge(df_uk, first_order, on='CustomerID') df_uk['UserType'] = 'New' df_uk.loc[df_uk.InvoiceYearMonth != df_uk.FirstOrder,"UserType"] = 'Existing' new_customer_ratio = df_uk.query("UserType == 'New'").groupby(['InvoiceYearMonth'])['CustomerID'].nunique()/df_uk.query("UserType == 'Existing' or UserType == 'New'").groupby(['InvoiceYearMonth'])['CustomerID'].nunique() new_customer_ratio = new_customer_ratio.reset_index() new_customer_ratio = new_customer_ratio.dropna() new_customer_ratio.columns = ['InvoiceYearMonth','NewCustomerRatio'] customer_type_revenue = df_uk.groupby(['InvoiceYearMonth','UserType'])['Revenue'].sum().reset_index() plt.figure(figsize=(13,7)) data = customer_type_revenue.query("InvoiceYearMonth != 201112 and InvoiceYearMonth != 201012") ax = sns.barplot(x ="InvoiceYearMonth", y = 'Revenue', data = data, hue = "UserType") ax.set_title('Monthly New vs Existing Customer Revenue') plt.show()
در نمودار بالا میبینیم که درآمد مشتریان جدید با گذشت زمان کاهش مییابد، این ممکن است به این دلیل باشد که ما فقط برای یک سال داده داریم.
این تجزیه و تحلیل به درک میزان حفظ مشتریان پس از یک دوره زمانی مشخص کمک می کند.
def cohort_period(df): df['CohortPeriod'] = np.arange(len(df)) + 1 return df df_cohort = df_uk.groupby(['FirstOrder','InvoiceYearMonth']) df_cohort = df_cohort.agg({'CustomerID': pd.Series.nunique}) df_cohort.rename(columns={'CustomerID': 'Nb_Customers'}, inplace=True) df_cohort = df_cohort.groupby(level=0).apply(cohort_period) cohorts = df_cohort['Nb_Customers'].unstack(0) cohort_retention = df_cohort['Nb_Customers'].unstack(0).divide(cohort_group_size, axis=1) sns.set(style='white') plt.figure(figsize=(12, 8)) plt.title('Customers Cohorts Retention') sns.heatmap(cohort_retention.T, mask=cohort_retention.T.isnull(), annot=True, fmt='.0%')
در طول یک سال، این شرکت تنها 27 درصد از مشتریان خود را حفظ کرده است.
در این نوشته سعی شد با استفاده از ابزار های پایتونی تجزیه و تحلیل انجام شود، امید است که در آینده این تحلیل با استفاده SQL پیاده سازی شود.