likes
comments
collection
share

基于机器学习的IC电子产品数据挖掘:数据探索篇

作者站长头像
站长
· 阅读数 5

公众号:尤而小屋作者:Peter编辑:Peter

大家好,我是Peter~

最近获取到了一份IC电子产品电商数据的分析,后面会进行3个主题的数据分析与挖掘:

  1. 第一阶段:基于pandas、numpy、matplotlib、seaborn、plotly等库的统计可视化分析
  2. 第二阶段:基于机器学习聚类算法RFM模型用户画像分析
  3. 第三阶段:基于关联规则算法的品牌、产品和产品种类关联性挖掘

本文是第一个阶段,主要内容包含:

  • 数据预处理
  • 数据探索EDA
  • 多角度对比分析

基于机器学习的IC电子产品数据挖掘:数据探索篇

导入库

In [1]:

import pandas as pd
import numpy as np

import time
import os
from datetime import datetime
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#设置中文编码和负号的正常显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

import plotly_express as px
import plotly.graph_objects as go

import missingno as ms

from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler

数据基本信息

读取数据

df = pd.read_csv(
    "ic_sale.csv",
     encoding="utf-8",  # 指定编码
     converters={"order_id":str,"product_id":str,"category_id":str,"user_id":str} # 指定字段类型
)  
df.head()

converters参数的作用:数据中的多个id字段全部是数字,在csv或者excel文件中被当做了数字(用科学计数法表示);本质上它们就是"字符串"信息,不具备任何大小含义。读取的时候需要特意指定类型

基于机器学习的IC电子产品数据挖掘:数据探索篇

基本信息

读进来之后先查看数据的基本信息:

In [3]:

# 1、数据shape

df.shape   

Out[3]:

(564169, 11)

In [4]:

# 2、数据字段类型

df.dtypes

Out[4]:

event_time        object
order_id          object
product_id        object
category_id       object
category_code     object
brand             object
price            float64
user_id           object
age                int64
sex               object
local             object
dtype: object

In [5]:

描述统计信息是针对数值型的字段:

# 3、数据描述统计信息

df.describe()

Out[5]:

priceage
count564169.000000564169.000000
mean208.26932433.184388
std304.55987510.122088
min0.00000016.000000
25%23.13000024.000000
50%87.94000033.000000
75%277.75000042.000000
max18328.68000050.000000

In [6]:

# 4、总共多少个不同客户

df["user_id"].nunique()

Out[6]:

6908

In [7]:

# 5、总共多少个不同品牌

df["brand"].nunique()

Out[7]:

868

In [8]:

# 6、总共多少个订单

df["order_id"].nunique()

Out[8]:

234232

In [9]:

# 7、总共多少个产品

df["product_id"].nunique()

Out[9]:

3756

数据预处理

数据筛选

从描述统计信息中发现price字段的最小值是0,应该是没有成交的数据;我们选择price大于0的信息:

In [10]:

df = df[df["price"] > 0]

缺失值处理

缺失值情况

In [11]:

df.isnull().sum()

Out[11]:

event_time            0
order_id              0
product_id            0
category_id           0
category_code    129344
brand             27215
price                 0
user_id               0
age                   0
sex                   0
local                 0
dtype: int64

可以看到缺失值体现在字段:

  • category_code:类别
  • brand:品牌

In [12]:

ms.bar(df,color="blue")  # 缺失值可视化

plt.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

缺失值填充

In [13]:

df.fillna("missing",inplace=True)

In [14]:

df.isnull().sum()  # 填充之后无缺失值

Out[14]:

event_time       0
order_id         0
product_id       0
category_id      0
category_code    0
brand            0
price            0
user_id          0
age              0
sex              0
local            0
dtype: int64

时间字段处理

字段类型转化

读进来的数据中时间字段是object类型,需要将其转成时间格式的类型

In [15]:

df["event_time"][:5]   # 处理前

Out[15]:

0    2020-04-24 11:50:39 UTC
1    2020-04-24 11:50:39 UTC
2    2020-04-24 14:37:43 UTC
3    2020-04-24 14:37:43 UTC
4    2020-04-24 19:16:21 UTC
Name: event_time, dtype: object

In [16]:

# 去掉最后的UTC
df["event_time"] = df["event_time"].apply(lambda x: x[:19])  

In [17]:

# 时间数据类型转化:字符类型---->指定时间格式

df['event_time'] = pd.to_datetime(df['event_time'], format="%Y-%m-%d %H:%M:%S")

字段衍生

In [18]:

# 提取多个时间相关字段

df['month']=df['event_time'].dt.month
df['day'] = df['event_time'].dt.day
df['dayofweek']=df['event_time'].dt.dayofweek
df['hour']=df['event_time'].dt.hour

In [19]:

df["event_time"][:5]   # 处理后

Out[19]:

0   2020-04-24 11:50:39
1   2020-04-24 11:50:39
2   2020-04-24 14:37:43
3   2020-04-24 14:37:43
4   2020-04-24 19:16:21
Name: event_time, dtype: datetime64[ns]

可以看到字段类型已经发生了变化

整体趋势分析

分析1:每月成交金额多少?

In [20]:

amount_by_month = df.groupby("month")["price"].sum().reset_index()
amount_by_month

Out[20]:

monthprice
011953358.17
122267809.88
232897486.26
341704422.41
457768637.79
567691244.33
6716354029.27
7827982605.44
8917152310.57
91019765680.76
101111961511.52

In [21]:

fig = px.scatter(amount_by_month,x="month",y="price",size="price",color="price")

fig.update_layout(height=500, width=1000, title_text="每月成交金额")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

可以看到:

  • 8月份是整个销售的顶峰
  • 下半年的整体销售会好于下半年

分析2:月订单量如何变化?

In [22]:

order_by_month = df.groupby("month")["order_id"].nunique().reset_index()
order_by_month

Out[22]:

monthorder_id
0110353
1211461
2312080
349001
4530460
5628978
6757659
7873897
89345
91014
10116

In [23]:

fig = px.line(order_by_month,x="month",y="order_id")

fig.update_layout(height=500, width=1000, title_text="每月成交订单量")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

关于订单量:

  • 从1到8月份是一个逐渐上升的趋势;尤其是4到8月份;可能是五一假期或者暑假、开学季引起的
  • 9、10月份订单量陡降:开学之后销量下降快

分析3:月消费人数/人次如何变化?

In [24]:

# nunique:对每个user_id进行去重:消费人数
# count:统计user_id 的次数;消费人次(存在一人多次购买)

people_by_month = df.groupby("month")["user_id"].agg(["nunique","count"]).reset_index()
people_by_month

Out[24]:

monthnuniquecount
01138815575
12150817990
23159718687
34152511867
45316840332
56396641355
67515976415
786213100006
89549770496
9104597104075
1011313467332

In [25]:

fig = px.line(people_by_month,x="month",y="nunique")

fig.update_layout(height=500, width=1000, title_text="每月成交人数")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

fig = px.line(people_by_month,x="month",y="count")

fig.update_layout(height=500, width=1000, title_text="每月成交人次")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

分析4:每月订单价多少?

In [27]:

amount_by_month  # 每月成交金额

Out[27]:

monthprice
011953358.17
122267809.88
232897486.26
341704422.41
457768637.79
567691244.33
6716354029.27
7827982605.44
8917152310.57
91019765680.76
101111961511.52

In [28]:

order_by_month  # 每月订单数

Out[28]:

monthorder_id
0110353
1211461
2312080
349001
4530460
5628978
6757659
7873897
89345
91014
10116

In [29]:

amount_by_userid = pd.merge(amount_by_month,order_by_month)

amount_by_userid

Out[29]:

monthpriceorder_id
011953358.1710353
122267809.8811461
232897486.2612080
341704422.419001
457768637.7930460
567691244.3328978
6716354029.2757659
7827982605.4473897
8917152310.57345
91019765680.7614
101111961511.526

In [30]:

amount_by_userid["average"] = amount_by_userid["price"] / amount_by_userid["order_id"]

amount_by_userid

基于机器学习的IC电子产品数据挖掘:数据探索篇

fig = px.line(amount_by_userid,x="month",y="average")

fig.update_layout(height=500, width=1000, title_text="每月客单价")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

从上面的折线图可以看出来:

  1. 1到8月份月订单量基本持平;可能是有很多批量的订单;通过量大带来利润:量的路线
  2. 9到10月份:月单价急剧上升;订单量少,但是金额;可能存在大额消费的用户:质的路线

分析5:每个订单包含多少产品

In [32]:

product_by_order = df.groupby("order_id")["product_id"].count().reset_index().sort_values("product_id",ascending=False)

product_by_order.head(10)

Out[32]:

order_idproduct_id
234208238844098113464000015021
234210238844098113466000014891
234211238844098113467000014845
234212238844098113468000014765
234202238844098113458000014587
234205238844098113461000014571
234207238844098113463000014443
234204238844098113460000014416
234206238844098113462000014414
234203238844098113459000014194

In [33]:

fig = px.bar(product_by_order[:20],
             x="order_id",
             y="product_id",
             text="product_id"
            )

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

一个订单下包含的产品数量是不同;上万的订单可能是小型的ic元器件产品。

不同省份对比

分析6:订单量、用户量和成交金额对比

不同省份下的订单量、用户量和成交金额对比

In [34]:

local = df.groupby("local").agg({"order_id":"nunique","user_id":"nunique","price":sum}).reset_index()
local.head()

Out[34]:

localorder_iduser_idprice
0上海39354568019837942.20
1北京38118570219137748.75
2四川1339635896770891.28
3天津1305834976433736.85
4广东51471608526013770.86

In [35]:

df1 = local.sort_values("order_id",ascending=True)  # 订单量升序
df1

Out[35]:

localorder_iduser_idprice
6浙江1279034856522657.59
8湖北1281034885993820.57
3天津1305834976433736.85
10重庆1305834966479488.14
7海南1307635876968674.41
2四川1339635896770891.28
5江苏1357535986357286.87
9湖南1387934816983078.88
1北京38118570219137748.75
0上海39354568019837942.20
4广东51471608526013770.86

In [36]:

fig = px.pie(df1, names="local",labels="local",values="price")

fig.update_traces(
    textposition="inside",
    textinfo="percent+label"
)

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

无疑:广东省No.1

每个省份的订单量对比:

fig = px.bar(df1,x="order_id",y="local",orientation="h")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

# 整体的可视化效果

fig = px.scatter_3d(local,
              x="order_id",
              y="user_id",
              z="price",
              color="order_id",
              hover_name="local"
             )

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

基于机器学习的IC电子产品数据挖掘:数据探索篇

通过3D散点图我们发现:广东省真的是一骑绝尘

  • 订单量多;订单金额也大:主打搞钱
  • 除去北上广,湖南和江苏的用户群是最多的,有前景

分析7:不同省份的客户钟爱哪些品牌?

In [39]:

local_brand = df.groupby(["local","brand"]).size().to_frame().reset_index()

local_brand.columns = ["local","brand","number"]  # 修改字段名

local_brand

基于机器学习的IC电子产品数据挖掘:数据探索篇

# 根据local和number进行排序
local_brand.sort_values(["local","number"],ascending=[True,False],inplace=True,ignore_index=True)
local_brand = local_brand[local_brand["brand"] != "missing"]
# 每个local下面最受欢迎的前3个品牌
local_brand = local_brand.groupby("local").head(3)
local_brand

基于机器学习的IC电子产品数据挖掘:数据探索篇

fig = px.bar(local_brand,
             x="brand",
             y="number",
             color="number",
             facet_col="local")

fig.update_layout(height=500,width=1000)

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

不同时间对比

分析8:下单时间对比

In [43]:

df.columns

Out[43]:

Index(['event_time', 'order_id', 'product_id', 'category_id', 'category_code',       'brand', 'price', 'user_id', 'age', 'sex', 'local', 'month', 'day',       'dayofweek', 'hour'],
      dtype='object')

In [44]:

df2 = df.groupby("dayofweek")["order_id"].nunique().reset_index()
df2

Out[44]:

dayofweekorder_id
0035690
1134256
2231249
3331555
4433010
5534772
6633922

In [45]:

plt.figure(figsize=(12,7))

df2["order_id"].plot.bar()

plt.xticks(range(7),['周一','周二','周三','周四','周五','周六','周日'],rotation=0)
plt.xlabel('星期')
plt.ylabel('订单量')
plt.title('订单数随星期变化')

plt.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

看来大家都很喜欢: samsung 、apple、ava

分析9:每小时订单量

In [46]:

df3 = df.groupby("hour")["order_id"].nunique().reset_index()
df3.head(10)

Out[46]:

hourorder_id
002865
112711
223981
336968
4412176
5516411
6618667
7720034
8820261
9920507

In [47]:

plt.figure(figsize=(14,8))
df3["order_id"].plot()

plt.xlabel('小时')
plt.ylabel('订单数量')
plt.title('订单随小时数变化')

plt.grid()
plt.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

用户都喜欢在上午8、9、10点下单;可能是刚开始上班工作,大家更积极

不同用户消费行为分析

分析10:消费次数和消费金额

In [48]:

df4 = df.groupby("user_id").agg({"order_id":"nunique", "price":sum})

fig = px.scatter(df4,
                x="order_id",
                y="price",
                color="price",
                size="price")

fig.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

  • 同时存在低频高额和高频高额用户

分析11:用户消费周期

In [50]:

# 用户消费周期

# shift函数:移动一个单位

purchase_time=df.groupby('user_id').apply(lambda x: x['event_time'] - x['event_time'].shift()).dt.days
purchase_time

Out[50]:

user_id                    
1515915625439950000  96014      NaN
1515915625440030000  374760     NaN
                     484927    35.0
1515915625440050000  463812     NaN
                     473430     1.0
                               ... 
1515915625514880000  564132     0.0
                     564143     0.0
                     564164     0.0
1515915625514890000  564158     NaN
                     564165     0.0
Name: event_time, Length: 564130, dtype: float64

In [51]:

purchase_time[purchase_time>0].describe()

Out[51]:

count    120629.000000
mean         35.494500
std         663.803583
min           1.000000
25%           2.000000
50%           4.000000
75%          12.000000
max       18466.000000
Name: event_time, dtype: float64

说明:

  1. 至少消费两次的用户的消费周期是4天
  2. 有75%的客户消费周期在12天

分析12:用户复购行为

In [52]:

pivoted_counts = df.pivot_table(index='user_id',
               columns='month',
               values='order_id',
               aggfunc='nunique').fillna(0)

pivoted_counts

Out[52]:

基于机器学习的IC电子产品数据挖掘:数据探索篇

基于机器学习的IC电子产品数据挖掘:数据探索篇

pivoted_counts_map.sum() / pivoted_counts_map.count()

# 结果
month
1     0.406340
2     0.439655
3     0.474640
4     0.700328
5     0.829861
6     0.792990
7     0.891452
8     0.920328
9     0.781153
10    0.609963
11    0.419592
dtype: float64
(pivoted_counts_map.sum()/pivoted_counts_map.count()).plot(figsize=(12,6))

plt.xticks(range(11),columns_month)

plt.title('复购率')
plt.show()

基于机器学习的IC电子产品数据挖掘:数据探索篇

  • 复购的高峰期在4、6、9月份
  • 10月份开始,销售开始冷淡;复购急降
转载自:https://juejin.cn/post/7206391499264016441
评论
请登录