翼度科技»论坛 编程开发 python 查看内容

kaggle数据集某咖啡店的营销数据分析

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
因为还处于数据分析的学习阶段(野生Python学者),所以在kaggle这个网站找了两个数据集来给自己练练手。
准备工作
  1. import pandas as pd
  2. import os
  3. import matplotlib.pyplot as plt
  4. import numpy as np
复制代码
获取数据

这里我下载了两个数据集第一个是关于咖啡的销售情况,第二个是关于Instagram这个网站1000名最受欢迎的博主的数据。
我就从咖啡的销售情况这个表入手,因为我看了第二个表实在是没有什么眉目去做T.T
数据集文件放在最下方有需要的可以自行下载。
  1. # 读取目录内的文件
  2. directory = r'C:\Users\Admin\Desktop\demo\练习'
  3. files = os.listdir(directory)
  4. print(files)
复制代码
  1. ['coffee_result.csv', 'Instagram-Data.csv']
复制代码
  1. # 存放文件
  2. files_list = []
  3. for file in files:
  4.     if file.endswith('.csv'):
  5.         directory_file = fr'{directory}\{file}'
  6.         files_list.append(directory_file)
  7. print(files_list)
复制代码
  1. ['C:\\Users\\Admin\\Desktop\\demo\\练习\\coffee_result.csv', 'C:\\Users\\Admin\\Desktop\\demo\\练习\\Instagram-Data.csv']
复制代码
  1. # 读取需要的文件
  2. df = pd.read_csv(files_list[0])
复制代码
查看一些必要信息
  1. df.info()
  2. df
复制代码
  1. <class 'pandas.core.frame.DataFrame'>
  2. RangeIndex: 1464 entries, 0 to 1463
  3. Data columns (total 6 columns):
  4. #   Column       Non-Null Count  Dtype  
  5. ---  ------       --------------  -----  
  6. 0   date         1464 non-null   object
  7. 1   datetime     1464 non-null   object
  8. 2   cash_type    1464 non-null   object
  9. 3   card         1375 non-null   object
  10. 4   money        1464 non-null   float64
  11. 5   coffee_name  1464 non-null   object
  12. dtypes: float64(1), object(5)
  13. memory usage: 68.8+ KB
复制代码
            date      datetime      cash_type      card      money      coffee_name                  0      2024-03-01      2024-03-01 10:15:50.520      card      ANON-0000-0000-0001      38.70      Latte              1      2024-03-01      2024-03-01 12:19:22.539      card      ANON-0000-0000-0002      38.70      Hot Chocolate              2      2024-03-01      2024-03-01 12:20:18.089      card      ANON-0000-0000-0002      38.70      Hot Chocolate              3      2024-03-01      2024-03-01 13:46:33.006      card      ANON-0000-0000-0003      28.90      Americano              4      2024-03-01      2024-03-01 13:48:14.626      card      ANON-0000-0000-0004      38.70      Latte              ...      ...      ...      ...      ...      ...      ...              1459      2024-09-05      2024-09-05 20:30:14.964      card      ANON-0000-0000-0587      32.82      Cappuccino              1460      2024-09-05      2024-09-05 20:54:24.429      card      ANON-0000-0000-0588      23.02      Americano              1461      2024-09-05      2024-09-05 20:55:31.429      card      ANON-0000-0000-0588      32.82      Cappuccino              1462      2024-09-05      2024-09-05 21:26:28.836      card      ANON-0000-0000-0040      27.92      Americano with Milk              1463      2024-09-05      2024-09-05 21:27:29.969      card      ANON-0000-0000-0040      27.92      Americano with Milk    1464 rows × 6 columns
  1. print(df['cash_type'].unique().tolist(),'\n',
  2. len(df['card'].unique().tolist()),'\n',
  3. df['coffee_name'].unique().tolist(),'\n',
  4. len(df['coffee_name'].unique().tolist()))
复制代码
  1. ['card', 'cash']
  2. 589
  3. ['Latte', 'Hot Chocolate', 'Americano', 'Americano with Milk', 'Cocoa', 'Cortado', 'Espresso', 'Cappuccino']
  4. 8
复制代码
通过info返回的信息可以看到card列存在一些空值,那我就把空值处理一下
  1. df[df['card'].isnull()]
复制代码
            date      datetime      cash_type      card      money      coffee_name                  12      2024-03-02      2024-03-02 10:30:35.668      cash      NaN      40.0      Latte              18      2024-03-03      2024-03-03 10:10:43.981      cash      NaN      40.0      Latte              41      2024-03-06      2024-03-06 12:30:27.089      cash      NaN      35.0      Americano with Milk              46      2024-03-07      2024-03-07 10:08:58.945      cash      NaN      40.0      Latte              49      2024-03-07      2024-03-07 11:25:43.977      cash      NaN      40.0      Latte              ...      ...      ...      ...      ...      ...      ...              657      2024-05-31      2024-05-31 09:23:58.791      cash      NaN      39.0      Latte              677      2024-06-01      2024-06-01 20:54:59.267      cash      NaN      39.0      Cocoa              685      2024-06-02      2024-06-02 22:43:10.636      cash      NaN      34.0      Americano with Milk              691      2024-06-03      2024-06-03 21:42:51.734      cash      NaN      34.0      Americano with Milk              692      2024-06-03      2024-06-03 21:43:37.471      cash      NaN      34.0      Americano with Milk    89 rows × 6 columns
空值是由支付类型为现金支付的那一列对应的行产生的
  1. df['card'] = df['card'].fillna("-1")
  2. df['card'].isnull().any()
复制代码
  1. np.False_
复制代码
对数据进行处理

在info返回的信息看到date这一列的数值类型是对象,我就把它变成日期类型方便我自己后续操作
  1. print(type(df.loc[1,'date']),type(df.loc[1,'datetime']))
  2. df.loc[1,'date']
复制代码
  1. <class 'str'> <class 'str'>
  2. '2024-03-01'
复制代码
  1. # 调整日期格式提取每行数据的月份
  2. df['date'] = pd.to_datetime(df['date'])
  3. df['datetime'] = pd.to_datetime(df['datetime'])
  4. df['month'] = df['date'].dt.month
  5. print(len(df['month'].unique()))
复制代码
  1. 7
复制代码
查看每月的销售情况

因为9月份的数据只有5天所以这个月就不纳入分析
  1. # 查看每月的销量以及金额
  2. df_six = df[df['month']!=9].copy()
  3. month = df_six['month'].unique()    # 把月份单独拎出
  4. month_sales = df_six.groupby('month')['money'].count()
  5. month_sum = df_six.groupby('month')['money'].sum()
  6. figure,axes = plt.subplots(1,2,figsize=[16,8])
  7. figure.suptitle("Month sales and sum",size=20)
  8. ax1 = axes[0].bar(month,month_sales)
  9. axes[0].set_xlabel('Month',size=16)
  10. axes[0].set_ylabel('Count',size=16)
  11. ax2 = axes[1].bar(month,month_sum)
  12. axes[1].set_xlabel('Month',size=16)
  13. axes[1].set_ylabel('Sum',size=16)
  14. axes[0].bar_label(ax1,fmt="%d",label_type="center")
  15. axes[1].bar_label(ax2,fmt="%d",label_type="center")
  16. plt.subplots_adjust(wspace=0.5)
复制代码

统计每款咖啡的营销情况

每款咖啡每月的营销额
  1. nrows,ncols = 2,4
  2. figure3,axes = plt.subplots(nrows,ncols,figsize=[16,8],sharex=True,sharey=True)
  3. coffee_month_sales = df_six.groupby(['month','coffee_name'])['money'].sum().reset_index(name='sum')
  4. coffee_names = coffee_month_sales['coffee_name'].unique().tolist()
  5. for idx,coffee_name in enumerate(coffee_names):
  6.     x,y = divmod(idx,ncols)
  7.     coffee_data = coffee_month_sales[coffee_month_sales['coffee_name']==coffee_name]
  8.     bars = axes[x,y].bar(coffee_data['month'],coffee_data['sum'])
  9.     axes[x,y].bar_label(bars,fmt="%d",label_type="center")
  10.     subtitle = f"{coffee_name} {int(coffee_data['sum'].sum())}"
  11.     axes[x,y].set_title(subtitle)
  12.     axes[x,y].set_xlabel('month',size=16)
  13.     axes[x,y].set_ylabel('sum',size=16)
  14.    
  15. figure3.suptitle('coffee month sales',size=20)
  16. plt.tight_layout()
  17. plt.subplots_adjust(wspace=0.5)
复制代码

查看不同咖啡的受众人数以及占比
  1. stati = df_six.groupby('coffee_name')['money'].count().reset_index(name='buyers')
  2. stati.sort_values(by='buyers',ascending=True,inplace=True,ignore_index=True)
  3. figure2,axes = plt.subplots(1,2,figsize=(16,8))
  4. figure2.suptitle("Coffee audience number and proportion",size=20)
  5. ax1 = axes[0].barh(stati.iloc[:,0],stati.iloc[:,1])
  6. axes[0].bar_label(ax1,fmt="%d",label_type="center")
  7. axes[0].set_ylabel("Kind",size=16)
  8. axes[0].set_xlabel("Sum",size=16)
  9. axes[1].pie(stati.iloc[:,1],labels=stati.iloc[:,0],autopct='%0.1f')
  10. plt.subplots_adjust(wspace=0.5)
复制代码

统计客户的实际消费情况
  1. cardholder = df_six[df_six['card']!='-1'].copy()
  2. cardholder['tag'] = 1
  3. cardholder.drop(columns=['date','datetime','cash_type'],inplace=True)
  4. cardholder['month_sum'] = cardholder.groupby('card')['tag'].transform('sum')
复制代码
  1. active_buyer = cardholder.groupby('card')['month_sum'].max().reset_index(name='buys')
  2. active_buyer.sort_values(by='buys',inplace=True,ignore_index=True,ascending=False)
  3. cardholder['money_sum'] = cardholder.groupby('card')['money'].transform('sum')
  4. money_sum = cardholder.drop_duplicates(subset='card',ignore_index=True).copy()
  5. money_sum.drop(columns=['money','coffee_name','month','tag','month_sum'],inplace=True)
  6. money_sum.sort_values(by='money_sum',inplace=True,ignore_index=True,ascending=False)
复制代码
  1. result = pd.merge(active_buyer,money_sum)
  2. print('总消费金额平均数:',result['money_sum'].mean(),'\n',
  3.       result.head(10))
复制代码
  1. 总消费金额平均数: 75.29034111310592
  2.                    card  buys  money_sum
  3. 0  ANON-0000-0000-0012    96    2772.44
  4. 1  ANON-0000-0000-0009    67    2343.98
  5. 2  ANON-0000-0000-0141    44    1101.08
  6. 3  ANON-0000-0000-0097    38    1189.34
  7. 4  ANON-0000-0000-0040    30     910.12
  8. 5  ANON-0000-0000-0003    27     744.04
  9. 6  ANON-0000-0000-0001    17     646.14
  10. 7  ANON-0000-0000-0134    13     470.76
  11. 8  ANON-0000-0000-0024    12     422.26
  12. 9  ANON-0000-0000-0059    12     337.00
复制代码
通过打印的数据可以看到这算是最活跃的一批用户了
程度大致就做到这种情况了,谢谢观看,如果有什么好的方法也可以在评论区评论!
本文的代码以及思路根据以下链接做过参考:
[https://tianchi.aliyun.com/notebook/464175?spm=a2c22.21852664.0.0.260f379cEBLg8w]
数据集下载链接:
https://storage.googleapis.com/kagglesdsdata/datasets/5328600/9620471/index.csv?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=gcp-kaggle-com%40kaggle-161607.iam.gserviceaccount.com%2F20241019%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20241019T074949Z&X-Goog-Expires=259200&X-Goog-SignedHeaders=host&X-Goog-Signature=b136263c03183c66881a72c1df4dcc4a2a1523e5ece138f7d060a718d58823e983c90e018217c2557ea03fb1a3a75e8436055e3f86b1b97a684e6a74699d74de6bebfccaa2e27bc9193b9eda676e236c848ad62085afc36d408755a06f8062bdd88d20cb42da5fa397b785a39ff7b0b4a01465a0de0c348d4c2ef0a3aa9be989e8e2a897963172ec51bbff461277ede44290b60f5942988fd64801b089d7557e648a4e740fe9d5a64f9c27877a36e25a1cc0e4f4a61e5f8caf6325e5bff8dc8f5a0496464dbc7cc0c257610940deb59c864b368e9eb32fed796fb12f790d5197fa255bdf8bf96a06bb3c0b9540eebafaa438874a026f1ae86e045a7cc44e60c0

来源:https://www.cnblogs.com/Xavier-Hsiang/p/18475833
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具