手机网站底部电话代码,建设总承包网站,代理加盟微信网站建设,建设网站过程第一阶段**文章说明#xff1a;**对coffee销售数据集的简单分析练习#xff08;时间趋势分析练习#xff09;#xff0c;主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注#xff1a;**这是我第一次使用md格式编辑博客文章#xff0c;排版上还是不是很…**文章说明**对coffee销售数据集的简单分析练习时间趋势分析练习主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注**这是我第一次使用md格式编辑博客文章排版上还是不是很熟悉害我尽量弄好看点。
分析过程
import pandas as pd
import matplotlib.pyplot as plt# 设置中文字体防止绘图时中文标题出现乱码
plt.rcParams[font.sans-serif] [Microsoft YaHei]# 导入数据
data pd.read_csv(rC:\Users\31049\Desktop\电商数据\coffee.csv)# 查看数据情况
print(data.shape)
data.head()(2623, 6)datedatetimecash_typecardmoneycoffee_name02024-03-012024-03-01 10:15:50.520cardANON-0000-0000-000138.7Latte12024-03-012024-03-01 12:19:22.539cardANON-0000-0000-000238.7Hot Chocolate22024-03-012024-03-01 12:20:18.089cardANON-0000-0000-000238.7Hot Chocolate32024-03-012024-03-01 13:46:33.006cardANON-0000-0000-000328.9Americano42024-03-012024-03-01 13:48:14.626cardANON-0000-0000-000438.7Latte
# 检查数据类型、检查是否有缺失值
print(data.info())# 输出缺失值数量
print(\n缺失值数量)
print( data.isnull().sum())class pandas.core.frame.DataFrame
RangeIndex: 2623 entries, 0 to 2622
Data columns (total 6 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 date 2623 non-null object 1 datetime 2623 non-null object 2 cash_type 2623 non-null object 3 card 2534 non-null object 4 money 2623 non-null float645 coffee_name 2623 non-null object
dtypes: float64(1), object(5)
memory usage: 123.1 KB
None缺失值数量
date 0
datetime 0
cash_type 0
card 89
money 0
coffee_name 0
dtype: int64发现1 card列有89个缺失值可能有些用户不是使用card支付而是其他支付方式。待验证 发现2 date和datetime列的数据类型为object类型需要转化为日期类型
# 转化为datetime日期格式
data[date] pd.to_datetime(data[date])
data[datetime] pd.to_datetime(data[datetime])# 异常值检查检查monet列是否有0值或负值
data[money].describe()结果最小值大于0因此无异常值。一、付款方式分析:观察‘支付方式’的趋势
# 计算不同支付方式的数量以及占比。
ty data[cash_type].value_counts()# 可视化
plt.pie(ty, labelsty.index, autopctlambda pct: f{int(pct/100*ty.sum())}, {pct:.1f}%)
plt.title(不同支付方式的数量以及占比)
plt.show()结论支付方式只有两种cash和card96%的用户选择使用“card”进行支付。也说明了card列的89个缺失值是合理的因为89个订单数据显示cash现金支付分析用户选择的支付方式随时间的变化趋势
from datetime import datetime# 提取月份
data[month] data[date].dt.month# unstack()方法用于将行索引转为列或者更准确地说是将 DataFrame 中的层次化索引的某一层转换为列
payment_counts data.groupby([month, cash_type]).size().unstack(fill_value0)
payment_counts.index payment_counts.index.astype(str)# 查看结果
print(payment_counts)cash_type card cash
month
3 175 31
4 168 28
5 241 26
6 223 4
7 237 0
8 272 0
9 344 0
10 426 0
11 259 0
12 189 0结果可视化
# 创建一个图形容器、子图对象
fig, ax plt.subplots(figsize(8, 5))# 绘制cash-card订单数量的柱状图
ax.bar(payment_counts.index, payment_counts[cash], labelcash现金, colorblue)
ax.bar(payment_counts.index, payment_counts[card], bottompayment_counts[cash], labelcard, colorskyblue)# 同一坐标系下绘制每月的cash现金数量占比的折线图
ax1 ax.twinx()
ax1.set_ylim([0, 0.5])
cash_pct (payment_counts[cash] / (payment_counts[card] payment_counts[cash])).round(2)
ax1.plot(payment_counts.index, cash_pct, labelcash占比, marker^, colorr)
for i in range(len(payment_counts)):ax1.text(payment_counts.index[i], cash_pct.iloc[i], sf{cash_pct.iloc[i]}%)ax.legend(locupper left)
ax1.legend(locbest)
plt.title(cash-card数量的堆积柱状图\n每月的cash现金数量占比, fontsize15)
ax.set_xlabel(month月份)
ax.set_ylabel(数量)
plt.show()结论在3-6月cash现金支付的订单数占比逐月下降且之后几个月全部订单都是使用card卡支付的呈现出无现金支付的趋势。二、销售趋势分析热销时间段时间趋势
# 定义设置时间段的函数[0-66-88-1212-1414-1818-2121-0], 对应[凌晨、早晨、早上、中午、下午、晚上、深夜]
def f(hour):if hour6:return 凌晨elif hour8:return 早晨elif hour12:return 早上elif hour14:return 中午elif hour18:return 下午elif hour21:return 晚上else:return 深夜# 增加一列表示时间段
data[time] data[datetime].dt.hour.apply(f)# 查看数据
data.head()datedatetimecash_typecardmoneycoffee_namemonthtime02024-03-012024-03-01 10:15:50.520cardANON-0000-0000-000138.7Latte3早上12024-03-012024-03-01 12:19:22.539cardANON-0000-0000-000238.7Hot Chocolate3中午22024-03-012024-03-01 12:20:18.089cardANON-0000-0000-000238.7Hot Chocolate3中午32024-03-012024-03-01 13:46:33.006cardANON-0000-0000-000328.9Americano3中午42024-03-012024-03-01 13:48:14.626cardANON-0000-0000-000438.7Latte3中午
# 计算不同时间段的订单数量占比
nums_time data.groupby(time).size().sort_values()# 可视化
plt.pie(nums_time, labelsnums_time.index, autopctlambda pct: f{int(pct/100*nums_time.sum())}\n{pct:.1f}%, radius1)
plt.title(不同时间段的订单数及其占比)
plt.show()结论店铺早上8-12点的订单数最多占比31%第二下午14-18点占比24%第三是晚上18-21点占比18%。这3个时间段占比总和近75%。三、咖啡销量分析某时间段最畅销的咖啡最受欢迎
# 按照[time, coffee_name]分组计算每组包含的销量数据并通过unstack()方法转化行层次化索引[time, coffee_name]的‘coffee’索引转为列
cof_time data.groupby([time, coffee_name]).size().unstack(fill_value0)# 查看数据
cof_timecoffee_nameAmericanoAmericano with MilkCappuccinoCocoaCortadoEspressoHot ChocolateLattetime下午861249536433152160中午6293451538181370早上11422680381273234180早晨71210322029晚上399210330221063110深夜197435171544469
分时间段进行可视化:
# 创建一个图形对象fig、包含1*6张子图的ax对象
fig, ax plt.subplots(6, 1, figsize(6, 30))# 绘制每个时间段的销量柱状图
for i in range(len(cof_time)):# cof_time的取每行数据并排序用于可视化d cof_time.iloc[i].sort_values(ascendingFalse)ax[i].bar(d.index, d.values, colorskyblue)ax[i].tick_params(axisx, rotation45) #tick_params()可以调整刻度线的位置、大小、颜色、旋转、刻度标签的对齐方式、字体大小等ax[i].set_title(f{cof_time.index[i]}——热销的coffee)ax[i].set_ylabel(销量)ax[i].grid(axisy, alpha0.5)fig.tight_layout()
plt.show()结论每个时间段最受欢迎的coffee类参考上图。# 文章到此结束有问题可以一起交流我们下期文章再见叭