- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
这篇数据分析记述了一次关于天猫维生素类的药品(2020-2021)销售数据的分析.
有些不足的地方,希望大家斧正.
随着国家政策的逐步开放,越来越多的药品可以在网络上购买,医药电商平台蒸蒸日上,受新冠疫情的影响,线下药店购买困难,更让医药电商进入了更多消费者的视野,各大药企也纷纷加大力度布局医药电商领域。但电商模式与线下零售有所不同,如何更好的经营医药电商成为药企急需解决的问题。本题采集了天猫维生素类的药品,请针对维生素药品进行数据的清洗、分析与挖掘,并回答下列问题.
随着国家政策的逐步开放,越来越多的药品可以在网络上购买, 医药电商平台蒸蒸日上,受新冠疫情的影响,线下药店购买困难,更让医药电商进入了更多消费者的视野,各大药企也纷纷加大力度布局医药电商领域.
我们对维生素售卖的药店,维生素药品,维生素药品品牌进行了分析.
对于空值数据采用众数填充,信息的提取用到了正则表达式,药品名称的获取用到了北大中文医药分词的模形并适配自己的词典进行提取。模形预测使用了时间序列的自相关模型并做了基于时间序列残差的模型评估.
基于分析得到的信息给出了销售建议.
众数填充 销售分析 畅销药品 北大中文医药分词 时间序列自相关模型 平稳性 残差 。
通过对数据shop_name栏的统计.
import pandas as pd
import matplotlib.pyplot as plt
import re
from matplotlib.pyplot import style
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller as ADF
from scipy import stats
#qq图
from statsmodels.graphics.api import qqplot
# 加载北大分词包
import pkuseg
data = pd.read_excel('./data.xlsx')
print(data.head())
# 统计商店数量
shop = data['shop_name'].value_counts()
print(shop.head())
print(shop.tail())
print(shop.size)
print(shop.index)
发现共有26家店铺。分别是:
阿里健康大药房, 天猫国际进口超市, 康爱多大药房旗舰店, 天猫超市, ChemistWarehouse海外旗舰店, 焦作国控大药房旗舰店, 阿里健康大药房海外店, nyc美林健康海外专营店, thejamy保健海外专营店, 百康保健品专营店, 康恩贝官方旗舰店, hihealth海外专营店, 宜度海外专营店, 天猫国际妙颜社, NRC营养优选海外专营店, 苏宁易购官方旗舰店, nrfs湖畔海外专营店, 进口/国产保健品精品店, 康寿营养品店,百秀大药房旗舰店, LuckyVitamin海外旗舰店, skyshop海外专营店, 搬运健康馆, 美加精品,SASA美国直邮, 同堂保健品专营店.
由于数据中并没有销售额一栏,需要我们自行计算.
采用:销售额 = 折扣 * 售价 * 销售数量 得到一行数据的销售额.
但是数据的折扣栏存在2884个空值。为了充分利用数据,所以我们使用折扣的众数(95折)进行填充。之后为数据新增一列销售额sales.
# 空值数量
data['discount'].isnull().sum()
# 空值处理 用众数填充
discount_mode = data['discount'].mode()
data['discount'].fillna(discount_mode[0], inplace=True)
data['discount'].isnull().sum()
# 将 9折等转化为 float 0.90
data['discount'] = data['discount'].apply(
lambda x: float(re.findall('[0-9\.]+', x)[0])/10 if len(re.findall('[0-9\.]+', x))!=0 else None)
# 处理过后的空值数量 == 0
data['discount'].isnull().sum()
# 创建销售额数据列
data['sales'] = data['price'] * data['sold'] * data['discount']
data['sales'].head()
经过分析发现天猫维生素品类,26家商店,两年的销售总额达到了1498551953元,即14.98亿元.
对数据以药店名称 shop_name 进行聚类,并对销售额 sales 进行逐项加和,求出每个商店两年内的销售总额,并绘制柱状图.
# 获取总的销售额
all_sales = data['sales'].sum()
# 对数据进行商店名称聚类
shop_group = data.groupby('shop_name')
# 以药店为组,进行销售额汇总
shop_sales = shop_group['sales'].agg('sum')
# 以药店销售额降序排列26个药店
shop_sales.sort_values(ascending=False)
# 获取销售额占比
shop_sales_percent = (shop_sales / all_sales).sort_values(ascending=False)
plt.figure(figsize=(8, 5))
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(shop_sales_percent[:10])), shop_sales_percent[:10])
plt.xticks(range(len(shop_sales_percent[:10])), shop_sales_percent[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10家商店')
plt.gcf().subplots_adjust(bottom = 0.3)
plt.grid()
plt.show()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(shop_sales_percent[-10:])), shop_sales_percent[-10:])
plt.xticks(range(len(shop_sales_percent[-10:])), shop_sales_percent[-10:].index, rotation=45, ha='right')
plt.title('销售额占比最少的10家商店')
plt.gcf().subplots_adjust(bottom = 0.3)
plt.grid()
plt.show()
其中阿里健康大药房的销售总额以674820879元,即6.74亿,占比45.03%,位列第一.
天猫国际进口超市的销售总额以355597052元,即3.55亿,占比23.73%,位列第二.
天猫超市的销售总额以114308114元,即1.14亿,占比7.63%,位列第三.
后十家的药店销售总额加起来为7362907元,即736万元,十家的总占比为0.49%.
经过分析得知电商天猫维生素类药品销量最好的是阿里系的药店,其他药店的销售份额占比非常小.
由上述分析可得,阿里健康大药房的销售占比最高。所以对于16958条阿里健康大药房的数据进行销售分析.
阿里健康大药房2020年有5998条数据,2021年有10960条数据.
经过分析发现,阿里健康大药房2021年销售总额同比增长119.23%。增长幅度较大.
# 阿里健康大药房
Ali = shop_group.get_group('阿里健康大药房').copy()
# 年度分析对比
Ali_year = Ali.groupby(data.date_time.dt.year)
Ali_year_sum = Ali_year['sales'].sum()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(Ali_year_sum)), Ali_year_sum)
plt.xticks(range(len(Ali_year_sum)), Ali_year_sum.index, rotation=45, ha='right')
plt.title('阿里健康大药房年度销售总额')
plt.grid()
plt.show()
growth_rate = (Ali_year_sum[2021] - Ali_year_sum[2020]) / Ali_year_sum[2020]*100
通过季度分析发现,第四季度购买次数最多,第一季度购买次数最少. 。
# 季度分析对比
Ali_qua = Ali.groupby(data.date_time.dt.quarter)
Ali_qua_sum = Ali_qua['sales'].sum()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(Ali_qua_sum)), Ali_qua_sum)
plt.xticks(range(len(Ali_qua_sum)), Ali_qua_sum.index, rotation=45, ha='right')
plt.title('阿里健康大药房季度销售总额')
plt.grid()
plt.show()
我们对阿里健康大药房的畅销商品进行了分析,其中维生素D滴剂,复合维生素片,多元维生素片,维生素AD滴剂,碳酸钙D3片为五大畅销产品.
# 月度分析
Ali['medicine'] = Ali['parameter'].apply(find_medi)
Ali_medi = Ali.groupby('medicine')
Ali_medi_sum = Ali_medi['sales'].sum().sort_values(ascending=False)
Ali_keyMedi = Ali_medi_sum.index[:5]
print(Ali_medi_sum)
Ali_medi_sum = Ali_medi['sales'].sum().sort_values()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.barh(range(len(Ali_medi_sum[-10:])), Ali_medi_sum[-10:])
plt.yticks(range(len(Ali_medi_sum[-10:])), Ali_medi_sum[-10:].index)
plt.title('阿里健康大药房王牌药品')
plt.gcf().subplots_adjust(left = 0.2)
plt.grid()
plt.show()
Ali_month_medi = Ali.groupby(['date_time','medicine'])
num = Ali_month_medi['sales'].sum()
for i in range(5):
num1 = num[num.index.get_level_values(1) == Ali_keyMedi[i]]
plt.plot(range(len(num1)), num1)
plt.legend(Ali_keyMedi)
plt.xticks(range(len(num1)), num1.index.get_level_values(0).date, rotation=45, ha='right')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('畅销产品月度销售额')
plt.show()
通过月度销售额分析,发现所有的畅销产品都有高频波动的迹象,存在明显的季节变动,每年6-7月,12-1月为销售量会大幅增加.
经过对于数据的分析,药品名称在parameter里,并且有不同的形式。 药品通用名称,系列,药品名称.
对于药品名称来说,数据中并没有显式的给出,比较有说服力的是parameter中的药品通用名称,其他属性存在着许多问题,数据杂乱.
系列属性存在无关信息列如,第14550行‘特价优惠’,第14628行‘其他’.
产品名称属性广泛存在品牌名称,例如第45行‘康恩贝牌维生素C咀嚼片(香橙味)’,第14663行‘汤臣倍健?钙维生素D维生素K软胶囊’.
所以我们首先将阿里健康大药房的药品通用名称提取出来,制作成字典(72个品类的dict.txt)。接着采用北大的Python分词包pkuseg,设置自己的字典(dict.txt),进行医学分词.
利用分词包从数据的title里进行医学分词来获取药品数据,获得29085条数据.
对parameter里的药品通用名称使用正则表达式提取出来,获得数据15345条.
将两者合并获得30418条数据.
def find_medi(x):
if type(x) is str:
pattern = r"药品通用名:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. /]+)"
result = re.findall(pattern, x)
if len(result) >= 1:
return result[0]
else:
return None
else:
return None
def title_split(x):
x.upper()
result = segcut.cut(x)
if len(result) >= 1:
for i in result:
if i in dict:
return i
return None
else:
return None
dict = list(Ali_medi_sum.index)
f = open("dict.txt", "w", encoding='utf-8')
for line in dict:
f.write(line + '\n')
f.close()
segcut = pkuseg.pkuseg(model_name = "medicine", user_dict = 'dict.txt', postag = False)
data['medicine'] = data['title'].apply(title_split)
data['medicine1'] = data['parameter'].apply(find_medi)
# 以medicine1 的数据填充 medicine 的空值
data["medicine"].fillna(data["medicine1"], inplace=True)
通过对数据的药品通用名称统计,有112种药品.
medi_group = data.groupby('medicine')
medi_group.size()
# 以药品为组,进行销售额汇总
medi_sales = medi_group['sales'].agg('sum')
# 以药品销售额降序排列 获得销售占比
num = medi_sales.sort_values(ascending=False)
num_rate = num / num.sum()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(num_rate[:10])), num_rate[:10])
plt.xticks(range(len(num_rate[:10])), num_rate[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10个品类')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.grid()
plt.show()
keyMedi = list(medi_sales.sort_values(ascending=False).index)[:10]
month_medi = data.groupby(['date_time','medicine'])
num = month_medi['sales'].sum()
for i in range(10):
num1 = num[num.index.get_level_values(1) == keyMedi[i]]
plt.plot(range(len(num1)), num1)
plt.show()
plt.legend(keyMedi)
plt.xticks(range(len(num1)), num1.index.get_level_values(0).date, rotation=45, ha='right')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('前10大畅销药品月度销售总额')
plt.show()
我们发现药品的品牌在Parameter里所以利用正则表达式进行提取.
# 品牌分析
pattern = "品牌:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. \+ - /]+)"
def find_brand(x):
if type(x) is str:
pattern = "品牌:([\u4E00-\u9FD5 0-9 a-z A-Z ‘ \. \+ - /]+)"
result = re.findall(pattern, x);
if len(result) > 0:
return result[0]
else:
return None
else:
return None
data['brand'] = data['parameter'].apply(find_brand)
分析发现总共有512个品牌.
# 对数据进行品牌名称聚类
brand_group = data.groupby('brand')
brand_group.size()
# 以品牌为组,进行销售额汇总
brand_sales = brand_group['sales'].agg('sum')
# 以品牌销售额降序排列
num = brand_sales.sort_values(ascending=False)
brand_top = list(num.index)[:10]
num_rate = num / num.sum()
plt.rcParams['font.sans-serif'] = 'Simhei'
plt.bar(range(len(num_rate[:10])), num_rate[:10])
plt.xticks(range(len(num_rate[:10])), num_rate[:10].index, rotation=45, ha='right')
plt.title('销售额占比最多的10个品牌')
plt.gcf().subplots_adjust(bottom = 0.2)
plt.grid()
plt.show()
我们对十大品牌的药品销售情况做了分析,这些品牌之所以销量好,首先是药物销售品类与10大畅销品类高度重合,其次可能是品牌自身在这些品类的营销好,消费者认可.
# 品牌销售分析
band_medicine = data.groupby(['brand','medicine'])
b_m_sum = band_medicine['sales'].sum()
num = b_m_sum
num1 = num[num.index.get_level_values(0) == brand_top[0]]
plt.rcParams['font.family'] = ['Arial Unicode MS','Microsoft YaHei','SimHei','sans-serif']
plt.rcParams['axes.unicode_minus'] = False
plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.5,hspace=1)
for i in range(1,11):
# 往画布上添加子图:按五行二列,添加到下标为plt_index的位置(由于这个显示不太好,很挤,所以最后用 两行两列4个 生成3次 获得了最后的图)
plt.subplot(5, 2, i)
# 绘图
num1 = num[num.index.get_level_values(0) == brand_top[i-1]]
plt.barh(range(len(num1)), num1)
plt.yticks(range(len(num1)), num1.index.get_level_values(1))
plt.title(brand_top[i-1] + '销售图')
# 显示画布
plt.show()
这里的预测我们采取时间序列的差分整合移动平均自回归模型(ARIMA).
date = data.groupby('date_time')
date_sales = date['sales'].agg('sum')
plt.figure(figsize=(8,5))
plt.plot(range(24), date_sales)
plt.xticks(range(24), date_sales.index.date, rotation=45)
plt.gcf().subplots_adjust(bottom = 0.2)
plt.title('销售总量')
plt.grid()
plt.show()
平稳性检验 : 采用单位根检验,对时间序列单位根的检验就是对时间序列平稳性的检验,非平稳时间序列如果存在单位根,则一般可以通过差分的方法来消除单位根,得到平稳序列.
style.use('ggplot' )
plt. rcParams['font.sans-serif'] = ['SimHei']
plt. rcParams['axes.unicode_minus'] = False
sales_train = date_sales
sales_diff1 = sales_train.diff().dropna()
for i in range(1,3):
plt.subplot(1, 2, i)
if(i==1):
plt.plot(sales_train)
plt.title("源数据")
else:
plt.plot(sales_diff1)
plt.title("一阶差分")
print(u'原始序列的ADF检验结果为:', ADF(sales_train))
print(u'一阶差分的ADF检验结果为:', ADF(sales_diff1))
原始序列的ADF检验结果为: (-0.25294595330495406, 0.9319092621668796, 7, 16, {'1%': -3.9240193847656246, '5%': -3.0684982031250003, '10%': -2.67389265625}, 484.53439721589336) 一阶差分的ADF检验结果为: (-9.322072363056753, 9.831298270974292e-16, 4, 18, {'1%': -3.859073285322359, '5%': -3.0420456927297668, '10%': -2.6609064197530863}, 455.9637318833934) 一阶差分单位根检验p值<0.05,原始序列p值>0.05,于是ARIMA中的参数d定为1.
相关系数:
acf = plot_acf(sales_diff1, lags=10)
plt.title("ACF" )
acf.show()
pacf = plot_pacf(sales_diff1, lags=10)
plt.title("PACF" )
pacf.show()
model = sm.tsa.arima.ARIMA(sales_train, order=(1, 1, 1))
result = model.fit()
#print (result. sumary()
pred = result.predict( '20220101','20220301' ,dynamic=True, typ='levels' )
print(pred)
plt.figure(figsize=(12,8))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(sales_train)
预测结果: 2022-01-01 9.497130e+07 94971300.0 2022-02-01 1.050360e+08 105036000.0 2022-03-01 1.024374e+08 102437400.0 。
使用QQ图检验残差是否满足正态分布。p值在0.05附近可以看作是成正态分布.
resid = result.resid # 求解模型残差
plt.figure(figsize=(12, 8))
qqplot(resid, line='q', fit=True)
stats.normaltest(resid)#检验序列残差是否为正态分布
商品经营无外乎更便宜,更丰富,更方便,提高商品周转率.
关于销售的货品,主要以畅销的10大药品为主。 ‘维生素D滴剂', '复合维生素片', '多维元素片', '维生素AD滴剂', '碳酸钙D3片', ‘维生素C咀嚼片', ‘维生素E软胶囊', ‘维生素E', ‘维生素C泡腾片', ‘维生素C片'.
药品品牌的选择以畅销品牌的主打药品(销量好)为主。 'swisse':维生素C泡腾片。 'CONBA/康恩贝':维生素C咀嚼片。 'CENTRUM/善存':善存银片,多维元素片。 '星鲨':维生素D滴剂 'elevit/爱乐维':复合维生素片。 '伊可新':维生素AD滴剂,。 '养生堂':维生素E软胶囊, 维生素C咀嚼片。 'BY-HEALTH/汤臣倍健':维生素E软胶囊, 维生素C片。 'FANCL':维生素E软胶囊。 '朗迪':碳酸钙D3片.
多样化的畅销货品销售能提高商品周转率,也能为消费者提供更丰富的选择.
鉴于销售旺季在每年6-7月,12-1月。所以应该提前一个月进行销售的预热。同时尽量用折扣给消费者一个便宜的低价,来拉动销量.
尽量完善好售后客服机制,用心服务好客户,方便客户.
相关文件: https://wwul.lanzoue.com/i2XtR0mhrmuj 。
最后此篇关于2022数据分析:电商天猫维生素类药品销售分析的文章就讲到这里了,如果你想了解更多关于2022数据分析:电商天猫维生素类药品销售分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的学校项目是创建一个销售和出租产品的电子商务网站。 我的主要问题是我找不到“出租”部分的最佳设计。现在我正在考虑两种设计: 第一个数据库设计建议: 第二条数据库设计建议: 如您所见,两种设计中都有相
如果 Mono 项目成功,它将为非 Windows 平台上的商业软件铺平道路。 我对根据我们现有的 Smoke Vector Graphics (OCaml) 和 F# for Visualizati
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
是否有出售 .net 控件的网站?我似乎找不到任何东西。我想知道是否有人可以将我指向一个站点。我宁愿它不是一个需要提供源代码的网站(如果可以的话,无论如何都包括它们)。 最佳答案 有1个站点CodeC
免责声明:我主要是一名后端开发人员,没有广泛的 FE 知识。 我正在编写一个生成 HTML 的非 SPA Golang Web 应用程序,然后将其发送给用户。因为我想更好地更新和监控我的 Javasc
我尝试了几种不同的方法来从 Magento 中删除测试订单。 使用插件(http://www.magentocommerce.com/magento-connect/asperience-delete
我们有一个 Woocommerce 网站,并在 Facebook 和 Instagram 上转换广告。当潜在客户点击这些广告时,我们的网站将加载到 Facebook 和 Instagram 使用的应用
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
我们已经在数据库中看到了销售数据,但在 Appstore Connect 控制台中看不到任何销售数据。有谁知道什么会导致这种情况吗? 只有当苹果应用内购买的 .purchased 状态回调被触发时,我
假设我有一个应用程序,我可以在其中以 iBook 的形式出售补充内容。无论哪种方式,他们都会收取 30%,但我可以将该应用程序用作销售它的平台。有没有一种方法可以通过应用程序本身销售它,但保留 iBo
我使用 BlueSnap API 通过 PayPal 销售产品。在我的网站上,我将购物者发送到 PayPal,而无需他们填写任何运输详细信息 - 一旦他们登录到 PayPal,我就会从他们的 Blue
最近,中国大型发行商联系了我,他们在越狱设备上拥有自己的“AppStore”。他们也让我通过他们的平台销售我的应用程序。我只是想知道有没有人有这方面的经验?合法吗? Apple 会在 AppStore
我正在尝试为 PayPal 交易提取 Sale Id。我正在使用 PayPalAndroidSDK 和 PayPal_MPL 到目前为止,我可以检索支付资源,例如PAY-... 使用这个: Paym
我已经安装了 Magento 2.2 并将支付方式配置为“PayPal Express Checkout” When i have payment with PayPal Express Checko
我有一个网站,人们可以在其中比较驾校。我已经使用 schema.org 标记将我知道的这些学校的所有详细信息(名称、描述、位置、价格范围等)添加到他们在我网站上的页面。 几周以来,人们还可以直接在我的
我需要知道一种向 magento admin 添加打印订单功能的方法。 最佳答案 您可以使用这个 extension .我没有测试它。于是手动安装。复制粘贴其扩展 key 并下载 here . 编辑:
我需要知道一种向 magento admin 添加打印订单功能的方法。 最佳答案 您可以使用这个 extension .我没有测试它。于是手动安装。复制粘贴其扩展 key 并下载 here . 编辑:
我有以下表格作为 MySQL Workbench 8.0CE 中更大架构的一部分; 订单 - Order_ID、Customer_ID、Payment_ID、Delivery_ID、Order_Dat
我正在使用亚马逊 MWS api 来获取完整的亚马逊订单列表。拥有这样的 api 非常好,它返回由亚马逊 (AFN) 完成和由卖家 (MFN) 订单完成。 登录到亚马逊卖家中心后,我可以看到所有销售
我是一名优秀的程序员,十分优秀!