300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python 京东_Python数据分析-京东订单数据分析实战

python 京东_Python数据分析-京东订单数据分析实战

时间:2021-05-13 08:18:40

相关推荐

python 京东_Python数据分析-京东订单数据分析实战

本次数据来源于京东,类目为大家电-家用电器-冰箱,抽取5月25日10%数据,数据量为 70k+,在 jupyer notebook 内进行分析。

数据文件:

链接:迅雷云盘;提取码:ezQq

对于订单数据,在业务中最常见的是使用可视化报表来监测订单关键指标的变化,并在一定维度上进行下钻。

分析思路

本次主要从以下几个方面对订单数据进行分析:

1.订单宏观数据

订单的总体特征:订单总量、GMV、总用户数、销售额

订单的价格分布:累计分布折线图

2.订单微观数据

时间维度:有效订单量、人均有效订单量、客单价、平均点单价

地区维度:有效订单量、头部市场地区、客单价比较数、省份的客单价和点单数量

品牌维度:订单数量与累计百分比、平均价格和市场占有、订单数量与平均优惠价格

Python代码展示

数据导入

import pandas as pdimport numpy as npimport matplotlibimport matplotlib.pyplot as plt%matplotlib inlinedata = pd.read_csv("data.csv", encoding="utf-8", sep="t")data.info()

数据展示

<class 'pandas.core.frame.DataFrame'>RangeIndex: 76631 entries, 0 to 76630Data columns (total 23 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 user_log_acct 76631 non-null object 1 parent_sale_ord_id 76631 non-null int64 2 sale_ord_id 76631 non-null int64 3 sale_ord_tm 76631 non-null object 4 sale_ord_dt 76631 non-null object 5 item_sku_id 76631 non-null int64 6 item_name76631 non-null object 7 brandname76631 non-null object 8 sale_qtty76631 non-null int64 9 item_first_cate_name76631 non-null object 10 item_second_cate_name 76631 non-null object 11 item_third_cate_name76631 non-null object 12 before_prefr_unit_price 76631 non-null float6413 after_prefr_unit_price 76631 non-null float6414 user_actual_pay_amount 76631 non-null float6415 sale_ord_valid_flag76631 non-null int64 16 cancel_flag 76631 non-null int64 17 check_account_tm 53360 non-null object 18 total_offer_amount 76631 non-null float6419 self_ord_flag 76631 non-null int64 20 user_site_city_id 38441 non-null float6421 user_site_province_id 38598 non-null float6422 user_lv_cd76631 non-null int64 dtypes: float64(6), int64(8), object(9)memory usage: 13.4+ MB

可以看到数据共计76631条,部分数据存在缺失。

数据预处理

1.因列数量较多,为方便理解和操作,对列名进行重命名为中文。

# 列明重命名col_names = ["用户账号","父订单号","订单号","订单时间","订单日期","商品sku","商品名称","品牌名称","商品数量","一级品类名称","二级品类名称","三级品类名称","优惠前单价","优惠后单价","实际支付价格","订单有效标志","订单取消标志","支付时间","总优惠金额", "自营标志","用户所在城市编号","用户所在省份编号","用户会员等级"]data.columns = col_names

2.优惠前冰箱的最低价格为288,数据中存在大量的低价订单,其中绝大部分是保修、返现等无价值订单,一小部分是异常订单,可以忽略

data = data[data["优惠前单价"]>=288]

3.删除重复值

#查看重复订单数量data["订单号"].duplicated().sum()

4.填充缺失值

# 查看缺失值,降序排列total = data.isnull().sum().sort_values(ascending=False)percent_1 = data.isnull().sum()/data.isnull().count()*100percent_2 = (round(percent_1, 1)).sort_values(ascending=False)missing_data = pd.concat([total, percent_2], axis=1, keys=["total", "%"])# concat合并数据集missing_data.head()

缺失值数量:

total%用户所在城市编号2995148.7用户所在省份编号2979748.4支付时间1992532.4用户会员等级00.0一级品类名称00.0

49% 的城市、省份信息缺失,30.4%的订单时间缺失部分订单的订单时间是空值,原因是订单尚未支付,可以将其赋特殊值比如-1

data["用户所在城市编号"].fillna("-1",inplace = True)data["用户所在省份编号"].fillna("-1",inplace = True)data["支付时间"].fillna("-1",inplace = True)

5.添加总价格列

data["总价格"] = data["优惠后单价"] * data["商品数量"]

6.预处理完毕后的数据信息

data.info()<class 'pandas.core.frame.DataFrame'>Int64Index: 61536 entries, 0 to 76630Data columns (total 24 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 用户账号61536 non-null object 1 父订单号61536 non-null int64 2 订单号 61536 non-null int64 3 订单时间61536 non-null object 4 订单日期61536 non-null object 5 商品sku61536 non-null int64 6 商品名称61536 non-null object 7 品牌名称61536 non-null object 8 商品数量61536 non-null int64 9 一级品类名称 61536 non-null object 10 二级品类名称 61536 non-null object 11 三级品类名称 61536 non-null object 12 优惠前单价61536 non-null float6413 优惠后单价61536 non-null float6414 实际支付价格 61536 non-null float6415 订单有效标志 61536 non-null int64 16 订单取消标志 61536 non-null int64 17 支付时间61536 non-null object 18 总优惠金额61536 non-null float6419 自营标志61536 non-null int64 20 用户所在城市编号 61536 non-null object 21 用户所在省份编号 61536 non-null object 22 用户会员等级 61536 non-null int64 23 总价格 61536 non-null float64dtypes: float64(5), int64(8), object(11)memory usage: 11.7+ MB

1.京东订单数据的宏观分析

#订单总量order_sum = data["订单号"].count()#取消订单数order_cancel = data[data["订单取消标志"]== 1]["订单号"].count()#有效订单数总数order_vaild_data = data[(data["订单有效标志"]==1) & (data["订单取消标志"]==0) & (data["优惠前单价"] != 0)]order_vaild = order_vaild_data["订单号"].count()#已支付订单order_payed = data[data["实际支付价格"] != 0]["订单号"].count()#未支付订单#总销售额total_sales = order_vaild_data["实际支付价格"].sum()# GMV:本实例中指所有有效订单的总交易额GMV = order_vaild_data["总价格"].sum()#总用户数total_users = data["用户账号"].nunique()print("订单总数:",order_sum)print("取消订单数:",order_cancel)print("有效订单总数:",order_vaild)print("已支付订单:",order_payed)print("总销售额:",total_sales)print("GMV:",GMV)print("总用户数:",total_users)

宏观数据指标信息

订单总数: 61536

取消订单数: 17782

有效订单总数: 33846

已支付订单: 31711

总销售额: 46224258.08

GMV: 60861858.15

总用户数: 39323

有效订单和已支付订单的占比

# 解决matplotlib中文乱码matplotlib.rcParams["font.sans-serif"] = ["SimHei"]matplotlib.rcParams["font.serif"] = ["SimHei"]matplotlib.rcParams["axes.unicode_minus"] = Falsefig,axes = plt.subplots(1,2,figsize =(10,5))sizes = [order_cancel, order_sum - order_cancel]axes[0].pie(sizes,labels = ["取消","未取消"],autopct = "%1.2f%%",startangle = 90)axes[0].set_title("订单总数")sizes = [order_payed,order_vaild-order_payed]axes[1].pie(sizes,labels = ["已支付","未支付"],autopct = "%1.2f%%",startangle = 90)axes[1].set_title("有效订单总数")

结果如下图:

订单的价格分布

通过累计分布折线图查看订单的价格分布

#查看订单价格分布#处理数据,计算累计占比order_price = pd.DataFrame(order_vaild_data.groupby("优惠后单价")["优惠后单价"].count())order_price.columns = ["数量"]order_price["占比"] = (order_price["数量"]/(order_price["数量"].sum())).cumsum()#绘图plt.figure(figsize=(10,5))plt.xlabel("订单价格")plt.ylabel("百分比")x = order_price.indexy = order_price["占比"]plt.plot(x,y,color="blue")plt.title("订单价格累计折线图")plt.savefig("./订单价格累计折线图.png",dpi = 120)

通过整体的价格分布可以发现,约80%的订单在3000元以下。

2.京东订单数据的微观分析

2.1 从时间维度来对订单数据进行拆分

有效订单量

#不同时段的有效订单量order_vaild_data["订单小时"] = order_vaild_data["订单时间"].str.extract("s+([0-9]{2})", expand =True) #提取小时数paytime_df = order_vaild_data.groupby("订单小时")["订单号"].count()#绘图x = paytime_df.indexy = paytime_df.valuesplt.figure(figsize=(10,5))plt.title("有效订单量小时分布")plt.xlabel("小时")plt.bar(x,y)

通过对时间维度进行深挖,发现0时是订单数量最多的时间,在这个小时内有超过4000个订单,远远超过其他任何时间的订单数。除了0时之外,上午十点和晚上八点也是订单的高峰期。

人均有效订单量

利用多维度拆解分析方法将订单量拆解:订单量=人均有效订单量×用户数量。

#人均有效订单量pay_human_time = order_vaild_data.groupby("订单小时")["用户账号"].nunique() #统计每个时段的用户数#绘图x = paytime_df.indexy = paytime_df.values/pay_human_time.values #计算人均有效订单量plt.figure(figsize=(10,5),dpi = 100)plt.title("人均有效订单量")plt.xlabel("小时")plt.plot(x,y)

从数据上来看,0时的人均有效订单确实偏高(1.06),但是低于但是低于峰值(1时的1.08)并且和11时的数值非常接近。这说明0时出现异常高的单人订单量的可能性很小。

客单价和平均订单价格

total_money = order_vaild_data.groupby("订单小时")["总价格"].sum() #计算总价格x = total_money.indexy1 = total_money.values/paytime_df.values #计算平均订单价格y2 = total_money.values/pay_human_time.values #计算客单价plt.figure(figsize=(10,5))plt.plot(x,y1,linewidth = 1.5, )plt.plot(x,y2, linewidth = 1.5, )plt.xlabel("小时")plt.title("客单价及平均订单价格")plt.legend(["平均订单价格","客单价"])

从客单价和平均订单价格来看,0时的客单价和平均订单价格是全天中最高的。

优惠价格

offer_amount = order_vaild_data.groupby("订单小时")["总优惠金额"].sum() #计算优惠金额#绘图x = paytime_df.indexy = offer_amount.values/paytime_df.values #计算平均订单优惠价格plt.figure(figsize=(10,5))plt.plot(x,y)plt.xlabel("小时")plt.title("每时段订单优惠价格")

0点优惠力度最大,吸引用户下单,且大部分0时下单的用户都具有更高的客单价。

2.2 从地区维度来对订单数据进行拆分

有效订单量

计算各省份的有效订单量,找出订单量比较强多的地区

area = pd.read_excel("E:Python京东数据分析课件datacity_level.xlsx") # 读取区域数据area = area[["dim_province_name", "province_id"]].drop_duplicates("province_id") # 只保留省份信息df = order_vaild_data[["订单号", "用户账号", "总价格", "用户所在省份编号", "用户所在城市编号"]] # 选取数据df = df.groupby("用户所在省份编号", as_index=False).agg({"订单号": "count", "用户账号": "nunique", "总价格": "sum"})df.drop([34], inplace=True)df["客单价"] = df["总价格"] / df["用户账号"]df["订单占比"] = df["订单号"] / (df["订单号"].sum())df = pd.merge(df, area, left_on="用户所在省份编号", right_on="province_id") # 合并数据df = df[["订单号", "用户账号", "总价格", "客单价", "订单占比", "dim_province_name"]] # 选取数据子集df.columns = ["有效订单量", "用户数量", "总价格", "客单价", "订单量占比", "省份"] # 重命名列df.sort_values(by="有效订单量", ascending=False, inplace=True) # 降序排序,方便计算累计百分比province_orders = df[["有效订单量", "省份", "订单量占比"]]province_orders["累计占比"] = province_orders["订单量占比"].cumsum()# 绘图x = province_orders["省份"]y1 = province_orders["有效订单量"]y2 = province_orders["累计占比"]fig, ax1 = plt.subplots(figsize=(10, 5))ax1.bar(x, y1)plt.xticks(rotation=90)ax1.set_ylabel("有效订单数量")ax2 = ax1.twinx()ax2.plot(x, y2, color="blue")ax2.set_ylabel("累计占比")plt.title("各省有效订单数量和累计占比")

广东,北京,上海,江苏,四川五个省份有效订单数量占比超过60%为头部市场。

各省份的客单价对比

通过对客单价进行比较,可以找出购买力比较强的地区。

#客单价前十省份情况price_per = df.reset_index(drop = True)[:10]price_per.sort_values(by = "客单价", ascending = False, inplace = True) #降序排序,方便作图#绘图x = price_per["省份"]y = price_per["客单价"]plt.figure(figsize=(10,5))plt.bar(x,y)plt.title("前十省份的客单价")

购买力强的地区依次为上海、山东、江苏、北京、浙江等地区。

各省份的客单价和订单数量对比

x =price_per["客单价"]y = price_per["有效订单量"]txt = price_per["省份"]plt.figure(figsize = (10,5))plt.scatter(x,y,alpha=0.5, s=x*3, c=["#6699CC"])plt.xlabel("客单价")plt.xticks(np.arange(1600, 3000, 200))plt.ylabel("有效订单量")plt.yticks(np.arange(0, 2500, 200))#添加散点图标签for i in range(len(x)):plt.annotate(txt[i], xy = (x[i], y[i]), xytext = (x[i], y[i]))plt.title("各省份的客单价和订单数量对比")

通过气泡图也可以找出购买力比较强的地区。

2.3 从品牌维度来对订单数据进行拆分

各品牌有效订单量

#各品牌有效订单量df= order_vaild_data.groupby("品牌名称",as_index = False)["订单号"].count().sort_values("订单号",ascending = False)df["占比"] = df["订单号"] / (df["订单号"].sum())df["累积占比"] = df["占比"].cumsum()x = df["品牌名称"]y1 = df["订单号"]y2 = df["累积占比"]fig,ax1 = plt.subplots(figsize=(10,5))ax1.bar(x,y1)ax1.set_ylabel("有效订单数量")ax1.set_xticklabels(x, rotation=90)ax2 = ax1.twinx()ax2.plot(x,y2,color = "blue")ax2.set_ylabel("累计占比")plt.title("各品牌有效订单数量和累计占比")plt.grid(alpha =0.2)

海尔,容声,美的,康佳,志高,海信等品牌占据60%的订单。

df = order_vaild_data.groupby(["用户所在省份编号","品牌名称"],as_index=False)["订单号"].count()df= df[df["用户所在省份编号"] != "-1"]df["用户所在省份编号"] = df["用户所在省份编号"].astype(int)df_city = pd.merge(df,area,left_on = "用户所在省份编号",right_on ="province_id" )df_city = df_city[df_city["dim_province_name"].isin(["广东","北京","上海","江苏","四川"])] #筛选头部省份df_city = df_city[["品牌名称","订单号","dim_province_name"]]df_city.columns = ["品牌名称","订单量","省份"]df_city = df_city.pivot(values = "订单量",columns = "省份",index = "品牌名称") #透视表透视数据df_city_sum = df_city/(df_city.sum()) #计算市场订单量占比df_city_sum.sum(axis = 1).sort_values(ascending = False).plot(kind="bar",figsize=(10,5)) #计算累计占比并绘图plt.title("头部省份的品牌市场占有率")

各品牌的平均产品价格和市场占有率

5大头部省份(广东,北京,上海,江苏,四川)的头部品牌为海尔,容声、西门子、康佳、美的。

#品牌市场占有率和平均价格df1 = order_vaild_data.groupby("品牌名称",as_index=False).agg({"总价格":"sum","商品数量":"sum"})df1["单价"] = df1["总价格"]/df1["商品数量"]df2 = order_vaild_data.groupby("品牌名称",as_index = False)["订单号"].count().sort_values("订单号",ascending = False)df2["占比"] = df2["订单号"] / (df2["订单号"].sum())df2["累积占比"] = df2["占比"].cumsum()df = pd.merge(df1,df2,on = "品牌名称")df = df[["品牌名称","单价","占比"]]x = df["占比"]y = df["单价"]txt = df["品牌名称"]plt.figure(figsize = (15,10), dpi = 120)plt.scatter(x, y,alpha = 0.5, s = 3000,c=["#6699CC"] )plt.xlabel("市场占有率")plt.ylabel("平均价格")plt.title("各品牌平均价格和市场占有率")for i in range(len(x)):plt.annotate(txt[i], xy = (x[i], y[i]), xytext = (x[i], y[i]))

通过对比各个品牌的平均产品价格和市场占有率可以发现,头部品牌的平均定价都在2500左右或低于2500元。

各品牌的订单数量和平均优惠价格

#订单数量与平均优惠价格df = order_vaild_data.groupby("品牌名称",as_index = False).agg({"总价格":"sum","商品数量":"sum","订单号":"count"})df["优惠单价"] = df["总价格"] / df["商品数量"]df = df[["品牌名称","订单号","优惠单价"]]df.columns = ["品牌名称","订单数量","优惠单价"]#绘图x = df["订单数量"]y = df["优惠单价"]plt.figure(figsize = (10,5))plt.scatter(x,y,alpha = 0.8,s =50,color = "",marker="o", edgecolors="#1f77b4")plt.xlabel("订单数量")plt.ylabel("平均优惠价格")plt.title("订单数量与平均优惠价格的关系")

从订单数量和平均优惠价格的数据来看,它们的相关性很弱。优惠价格不会增加订单数量。

总结:

1.从宏观角度:

整体把握了当天的订单状况订单总量: 61536总用户数:39323GMV:60861858.15 元销售额: 46224258.08 元

2.从时间维度:

0时是订单数量和客单价最高的时间段 其原因可能是因为在此时间段有优惠活动

3.从地区维度:

广东、北京、上海、四川、江苏为冰箱的头部市场 上海地区的品牌偏好明显区别于其他头部市场 上海地区的购买力更强

4.从品牌维度:

海尔、容声、美的、康佳、志高是电冰箱行业的头部玩家头部品牌的平均商品价格均在2500左右或更低订单数量和平均优惠价格在品牌维度上相关性不是特别大

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。