Dự báo bán hàng với hiệu ứng giá & khuyến mãi

0
25

Phân tích quảng cáo, dự báo chuỗi thời gian, phân tích can thiệp

Susan Li

Nhiều doanh nghiệp rất thời vụ và một số trong số họ kiếm tiền trong các ngày lễ như Super Bowl, Ngày Lao động, Lễ Tạ ơn và Giáng sinh. Ngoài ra, họ sử dụng các chương trình khuyến mãi bán hàng để tăng nhu cầu hoặc khả năng hiển thị của sản phẩm hoặc dịch vụ trong vài tuần trong năm.

Trong bài đăng này, chúng tôi sẽ phân tích dữ liệu lịch sử bằng cách sử dụng các kỹ thuật phân tích chuỗi thời gian, với hiệu quả quảng bá.

Dữ liệu chúng tôi sẽ sử dụng là dữ liệu bán hàng và giá hàng tuần cho 9 cửa hàng và 3 sản phẩm. Cuối cùng, chúng tôi sẽ dự báo doanh số trong 50 tuần tới cho một trong ba sản phẩm tại một trong các cửa hàng. Bạn có thể tìm thấy tập dữ liệu đây.


  • Cửa hàng: mã cửa hàng. Chúng tôi có tổng cộng 9 cửa hàng.
  • Sản phẩm: mã sản phẩm. Chúng tôi có tổng cộng 3 sản phẩm.
  • Is_Holiday: một chỉ số cho biết liệu tuần đó có chứa kỳ nghỉ hay không: 0 = không, 1 = có.
  • Giá cơ sở: giá cơ sở hoặc hàng ngày mà không giảm giá.
  • Giá: Giá thực tế cho mỗi tuần. Chúng là giá khuyến mãi khi chương trình khuyến mãi đang diễn ra hoặc giá hàng ngày khác.
  • Weekly_Units_Sold: Đơn vị hàng tuần được bán.

new_features.py

Trong quá trình tiền xử lý dữ liệu trên, chúng tôi đã thêm tính năng mới như số tiền bán hàng hàng tuần bằng đô la, năm, tháng, ngày, tuần trong năm.

Để có ấn tượng đầu tiên về các biến liên tục trong dữ liệu, chúng ta sẽ vẽ đồ thị ECDF.

ECDF.pyHình 1

  • Mặc dù trong tuần tốt nhất, một cửa hàng đã bán được hơn 2500 đơn vị, khoảng 80% thời gian, số đơn vị hàng tuần được bán không vượt quá 500.
  • Mặc dù doanh số hàng tuần cao nhất vượt quá 25 nghìn đô la, nhưng hơn 90% dữ liệu có doanh số hàng tuần dưới 5 nghìn đô la.

df.groupby (‘Cửa hàng’)[‘weekly_sales’].describe () Hình 2df.groupby (‘Store’)[‘Weekly_Units_Sold’].sum () Hình 3

  • Dễ dàng thấy rằng Cửa hàng 10 có doanh số trung bình hàng tuần cao nhất trong số tất cả 9 cửa hàng, và Cửa hàng 10 có tổng số đơn vị hàng tuần được bán nhiều nhất.
  • Và Cửa hàng 5 có doanh số trung bình hàng tuần thấp nhất.
  • Rõ ràng, Cửa hàng 10 là cửa hàng bán chạy nhất và đông khách nhất.

g = sns.FacetGrid (df, col = “Is_Holiday”, height = 4, khía cạnh = .8) g.map (sns.barplot, “Sản phẩm”, “Giá”); Hình 4g = sns.FacetGrid (df, col = “Is_Holiday”, height = 4, khía cạnh = .8) g.map (sns.barplot, “Sản phẩm”, “Weekly_Units_Sold”); Hình 5

  • Sản phẩm 2 là sản phẩm rẻ nhất trong số ba sản phẩm và được bán nhiều nhất.
  • Sản phẩm 3 là sản phẩm đắt nhất trong số cả ba sản phẩm.
  • Ngoài ra, giá sản phẩm không thay đổi trong ngày lễ.

g = sns.FacetGrid (df, row = “Is_Holiday”, height = 1.7, fac = 4,) g.map (sns.distplot, “Weekly_Units_Sold”, hist = false, rug = True); Hình 6sns.factorplot (dữ liệu = df, x = ‘Is_Holiday’, y = ‘Weekly_Units_Sold’, hue = ‘Store’); Hình 7sns.factorplot (data = df, x = ‘Is_Holiday’, y = ‘Weekly_Units_Sold’, hue = ‘ Hình 8

  • Dường như các ngày lễ không có tác động tích cực cho doanh nghiệp. Đối với hầu hết các cửa hàng, đơn vị hàng tuần được bán trong kỳ nghỉ cũng giống như những ngày bình thường, trong khi cửa hàng 10 có mức giảm trong các ngày lễ.
  • Các đơn vị hàng tuần được bán cho sản phẩm 1 có mức tăng nhẹ trong các ngày lễ, trong khi sản phẩm 2 và sản phẩm 3 có mức giảm trong các ngày lễ.

g = sns.FacetGrid (df, col = “Sản phẩm”, row = “Is_Holiday”, margin_title = True, height = 3) g.map (plt.scatter, “Price”, “Weekly_Units_Sold”, color = “# 338844” , edgecolor = “trắng”, s = 50, lw = 1) g.set (xlim = (0, 30), ylim = (0, 2600)); Hình 9

  • Mỗi sản phẩm có nhiều hơn một mức giá, cả vào ngày lễ và ngày bình thường. Tôi đoán một là giá thông thường, một là giá khuyến mại.
  • Khoảng cách giá cho sản phẩm 3 là rất lớn, nó đã bị cắt giảm tới gần 50% trong các chương trình khuyến mãi.
  • Sản phẩm 3 có doanh số cao nhất trong những ngày không nghỉ lễ.

g = sns.FacetGrid (df, col = “Store”, hue = “Product”, margin_title = True, col_wrap = 3) g.map (plt.scatter, ‘Price’, ‘Weekly_Units_Sold’, alpha = .7) g .add_legend (); Hình 10

Tất cả 9 cửa hàng này đều mang 3 sản phẩm này. Tất cả họ dường như có loại khuyến mãi giảm giá tương tự. Tuy nhiên, sản phẩm 3 bán được nhiều đơn vị nhất trong các chương trình khuyến mãi tại cửa hàng 10.

g = sns.FacetGrid (df, col = “Store”, col_wrap = 3, height = 3, ylim = (0, 1000)) g.map (sns.pointplot, “tháng”, “Weekly_Units_Sold”, color = “. 3 “, ci = Không, đặt hàng = [1,2,3,4,5,6,7,8,9,10,11,12]); Hình 11

Mỗi cửa hàng có một phần thời vụ, cửa hàng 10 có mô hình theo mùa rõ ràng nhất.

g = sns.FacetGrid (df, col = “Sản phẩm”, col_wrap = 3, height = 3, ylim = (0, 1000)) g.map (sns.pointplot, “tháng”, “Weekly_Units_Sold”, color = “. 3 “, ci = Không, đặt hàng = [1,2,3,4,5,6,7,8,9,10,11,12]); Hình 12

Mỗi sản phẩm có một phần thời vụ, sản phẩm 2 có hai mùa cao điểm mỗi năm và sản phẩm 3 có một.

g = sns.FacetGrid (df, col = “Store”, col_wrap = 3, height = 3, ylim = (0, 2000), hue = ‘Sản phẩm’, palette = “Set1”) g.map (sns.pointplot, “tháng”, “Weekly_Units_Sold”, ci = Không, đặt hàng = [1,2,3,4,5,6,7,8,9,10,11,12], alpha = .7) g.add_legend (); Hình 13

  • Nhìn chung, sản phẩm 2 bán được nhiều đơn vị mỗi tuần hơn các sản phẩm khác trong mỗi cửa hàng.
  • Thỉnh thoảng, sản phẩm 3 sẽ vượt quá sản phẩm 2 tại cửa hàng 10.

g = sns.PairGrid (df, y_vars =[“Weekly_Units_Sold”], xvars =[“Price”, “Is_Holiday”], height = 4) g.map (sns.regplot, color = “. 3”); Hình 14

  • Giá càng rẻ, các đơn vị hàng tuần đã được bán.
  • Là kỳ nghỉ hay không không liên quan gì đến đơn vị bán.

Ở đây, chúng tôi đang thêm một cột mới có tên là khuyến mãi ăn, được lấy từ cơ sở giá cơ bản và giá cơ bản.

Promotion.pysns.factorplot (data = df, x = ‘Promotion’, y = ‘Weekly_Units_Sold’, hue = ‘Store’); Hình 15

Mỗi cửa hàng bán nhiều hơn trong các chương trình khuyến mãi, không có ngoại lệ.

sns.factorplot (data = df, x = ‘Promotion’, y = ‘Weekly_Units_Sold’, hue = ‘Product’); Hình 16

Mỗi sản phẩm bán nhiều hơn trong các chương trình khuyến mãi, đặc biệt, sản phẩm 2 và sản phẩm 3.

g = sns.FacetGrid (df, col = “Store”, hue = “Promotion”, palette = ‘plasma’, row = ‘Promotion’) g = (g.map (plt.scatter, “Price”, “Weekly_Units_Sold” ) .add_legend ()) Hình 17

Tất cả các cửa hàng đều có mô hình khuyến mãi giá tương tự, vì một số lý do, cửa hàng 10 bán nhiều nhất trong các chương trình khuyến mãi.

g = sns.FacetGrid (df, hue = “Promotion”, col = “Product”, height = 4) g.map (qqplot, “Price”, “Weekly_Units_Sold”) g.add_legend (); Hình 18

Mỗi sản phẩm có giá thường xuyên và giá khuyến mãi. Sản phẩm 3 có mức chiết khấu cao nhất và bán nhiều nhất trong các chương trình khuyến mãi.

Quan sát

  • Cửa hàng bán chạy và đông khách nhất là Cửa hàng 10 và cửa hàng ít đông đúc nhất là Cửa hàng 5.
  • Xét về số lượng đơn vị bán ra, sản phẩm bán chạy nhất là sản phẩm 2 trong suốt cả năm.
  • Các cửa hàng không nhất thiết phải chạy chương trình khuyến mãi trong các ngày lễ. Ngày lễ dường như không có tác động đến hiệu suất của các cửa hàng hoặc sản phẩm.
  • Sản phẩm 2 dường như là sản phẩm rẻ nhất và Sản phẩm 3 là sản phẩm đắt nhất.
  • Hầu hết các cửa hàng có một số loại thời vụ và họ có hai mùa cao điểm mỗi năm.
  • Sản phẩm 1 bán nhiều hơn một chút vào tháng 2 so với các tháng khác, Sản phẩm 2 bán nhiều nhất vào khoảng tháng 4 và tháng 7 và Sản phẩm 3 bán nhiều nhất vào khoảng tháng 7 đến tháng 9.
  • Mỗi sản phẩm có giá thường xuyên và giá khuyến mãi. Có khoảng cách đáng kể giữa giá thông thường và giá khuyến mại trên Sản phẩm 1 và Sản phẩm 2, tuy nhiên, giá khuyến mại của Sản phẩm 3 có thể giảm xuống 50% so với giá ban đầu. Mặc dù mọi cửa hàng đều thực hiện loại giảm giá này cho sản phẩm 3, nhưng cửa hàng 10 là cửa hàng có doanh số cao nhất trong quá trình giảm giá.
  • Không có gì bất thường để bán nhiều hơn trong thời gian khuyến mãi hơn những ngày bình thường. Cửa hàng 10 Sản phẩm làm cho 3 sản phẩm bán chạy nhất vào khoảng tháng 7 đến tháng 9.

Chúng tôi sẽ xây dựng một phân tích chuỗi thời gian cho sản phẩm 3 tại cửa hàng 10 và chúng tôi sẽ dự báo doanh số hàng tuần bằng đô la.

timeseries_viz.pyHình 19

Sản phẩm 2 mùa vụ tại cửa hàng 10 là rõ ràng. Doanh số luôn đạt mức cao nhất trong khoảng từ tháng 7 đến tháng 9 trong kỳ nghỉ học.

Dưới đây chúng tôi đang thực hiện nhà tiên tri mô hình, dự báo doanh số hàng tuần trong 50 tuần tới.

Hình 20

Các mô hình đã có thể nắm bắt tính thời vụ.

model.plot_components (dự báo); Hình 21metric_df = dự báo.set_index (‘ds’)[[‘yhat’]].join (store_10_pro_3.set_index (‘ds’). y) .reset_index () metric_df.dropna (inplace = True) error = mean_squared_error (metric_df.y, metric_df.yhat) print (‘RMSE sqrt (lỗi)))

Một điều tuyệt vời về Tiên tri là chúng ta có thể thêm các mùa tùy chỉnh của riêng mình. Ở đây chúng tôi sẽ thêm mùa nghỉ hè kéo dài từ đầu tháng Bảy đến đầu tháng Chín.

add_soryality.pyHình 22metric_df = dự báo.set_index (‘ds’)[[‘yhat’]].join (store_10_pro_3.set_index (‘ds’). y) .reset_index () metric_df.dropna (inplace = True) error = mean_squared_error (metric_df.y, metric_df.yhat) print (‘RMSE sqrt (lỗi)))

RMSE giảm một chút.

model.plot_components (dự báo); Hình 23

Máy tính xách tay Jupyter có thể được tìm thấy trên Github. Tận hưởng nốt tuần này đi!

Người giới thiệu:

https://seaborn.pydata.org/generated/seaborn.FacetGrid.html



Nguồn Medium


BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây

Comment moderation is enabled. Your comment may take some time to appear.