版权声明:本文为博主原创文章,如若转载请注明出处 https://blog.csdn.net/tonydz0523/article/details/85264155
数据
以下是本数据集的13个特征变量的详细说明:
- order_id:订单ID,数字组合而成,例如4283851335。
- order_date:订单日期,格式为YYYY-MM-DD,例如2013-10-17。
- order_time:订单日期,格式为HH:MM:SS,例如12:54:44。
- cat:商品一级类别,字符串型,包含中文、英文。
- attribution:商品所属的渠道来源,字符串型,包含中文、英文。
- pro_id:商品ID,数字组合而成。
- pro_brand:商品品牌,字符串型,包含中文、英文。
- total_money:商品销售金额,浮点型。
- total_quantity:商品销售数量,整数型。
- order_source:订单来源,从哪个渠道形成的销售,字符串型,包含中文、英文。
- pay_type:支付类型,字符串型,包含中文、英文。
- use_id:用户ID,由数字和字母等组成的字符串。
- city:用户订单时的城市,字符串型,中文。
数据清洗
# 模块导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 数据载入
dtypes = {'order_id': np.object,
'pro_id': np.object,
'use_id': np.object}
df = pd.read_csv('abnormal_orders.txt', dtype=dtypes)
df.head(3).T
# 数据行列
df.shape
#(134190, 12)
# 缺失值
df.isna().sum()
不是很多直接舍弃:
# 弃去缺失值
df.dropna(inplace=True)
时间数据处理:
# 合并时间,并更改类型,弃去原来时间
df['datetime'] = (df.order_date + ' ' + df.order_time ).astype('datetime64[ns]')
df.drop(columns=['order_date', 'order_time', 'abnormal_label'], inplace=True)
# 设置时间段
start_time = pd.datetime(2013, 9, 1)
end_time = pd.datetime(2013, 10, 1)
# 根据时间段截取数据
df_time = df[(df.datetime < end_time) & (df['datetime'] > start_time)]
# 提取一个月中的每天成列
df_time['day'] = df_time.datetime.dt.day
# 获取各列包含种类
df.nunique()
可视化
plot.bar()
简单的柱状图
# 每天的订单量
df_time.day.value_counts().sort_index().plot.bar()
plt.savefig('bar1.png')
添加其他设置:
# 一个月中每个类别商品的品牌数量 使用figsize更改画幅大小 title设置标题
df_time.pro_brand.groupby(df_time.cat).nunique().plot.bar(
figsize=(10,5),
title='商品品类品牌数量'
)
plt.savefig('bar2.png')
# 一个月中每个类别商品用户数量 使用color更改颜色
df_time.use_id.groupby(df_time.cat).nunique().plot.bar(figsize=(10,5), color='red')
plt.title('商品品类买家数量')
plt.savefig('bar3.png')
更改字体大小:
# 一个月中每个类别商品商品数量 使用fontsize更改字体大小
df_time.pro_brand.groupby(df_time.cat).nunique().plot.bar(
figsize=(10,5),
color='g',
fontsize=14
)
plt.title('商品品类商品数量', fontsize=16)
堆叠:
# 每种类商品不同渠道获得订单量 使用stacked=True进行堆叠
df_time[['cat', 'order_source']].pivot_table(index=['cat'], columns=['order_source'], aggfunc=len, margins=False, fill_value=0).plot.bar(stacked=True)
# 每种商品以不同方式支付的订单量
pd.crosstab(df_time.cat, df_time.attribution, margins=False).plot.bar(figsize=(8, 5))
plot.barh()
就是把柱状图横过来放
# 不同商品种类商品渠道来源情况
pd.crosstab(df_time.cat, df_time.attribution, margins=False).plot.barh(figsize=(5,6))
plot.pie()
饼状图用于描述占比
# 售卖不同种类商品占比情况
df_time.cat.value_counts().plot.pie(figsize=(8,8))
plot.line()
折线图
# 一个月每天的成交金额走势
df_time.total_money.groupby(df_time.day).sum().plot.line()
# 一个月每天的成交金额, 成交商品量走势 使用subplots=True进行分图
pd.DataFrame(df_time.total_money.groupby(df_time.day).sum()).join(df_time.total_quantity.groupby(df_time.day).sum()).plot.line(subplots=True)
plot.area()
面积填充图
# 一个月每天不同支付方式占比走势
pd.crosstab(df_time.day, df_time.pay_type, margins=False).plot.area()
plot.hist()
直方图:数据分布情况
# 每天成交金额直方图
df_time.total_money.groupby(df_time.day).sum().plot.hist()
plot.kde()
核密度估计
# 每天成交金额核密度估计
df_time.total_money.groupby(df_time.day).sum().plot.kde()
plot.scatter()
散点图
# 成交总金额跟售卖量大体情况
df_time[(df_time.total_money < 100000) & (df_time.total_quantity < 40)].plot.scatter(x='total_quantity', y='total_money')
plot.hexbin()
# 六边形分箱图 :密度通过颜色体现
df_time[(df_time.total_money < 100000)].plot.hexbin(x='total_quantity', y='total_money', gridsize=20, cmap="cool")
plot.box()
箱线图:用于观察分布及异常值
# 成交金额箱线图
df_time[df_time.total_money <1000].total_money.plot.box()
boxplot()
箱线图:用于观察分布及异常值
# 不同支付方式成交金额箱线图
df_time[df_time.total_money <1000].boxplot(column=['total_money'], by='pay_type')