前言
周末在整理云盘时发现了一份“用户消费”的练习数据,忘记从哪里讨来的了。全部数据大概有23M,这样一份数据不练了它实在可惜,因此做了这个项目。
项目使用python3.7在Jupyter notebook上开发。开发过程中使用pandas、numpy对数据进行清洗,可视化使用的是pyecharts和matplotlib。
一、分析角度
数据共23.3M,记录了从2016年3月1日至5月2日的用户ID,支付状态,支付金额,支付时间。虽然只有4个字段,但是也可以做很丰富的分析。
1. 周期分析
- 总体消费趋势
- 3,4月消费对比
- 每周用户消费金额
- 3,4月工作日及周末消费金额、消费次数、消费人数、消费时段对比
2. 用户个体消费分析
- 用户消费金额和消费次数描述统计
- 用户消费金额分布
- 用户消费次数分布
3. 用户消费行为分析
- 用户首购时间
- 用户最后一次消费时间
- RFM
- 新老客消费比
- 用户生命周期
- 用户购买周期
二、分析流程
import pandas as pd
import numpy as np
from pyecharts.charts import Pie, Bar, Map, WordCloud,Line,Grid,Scatter,Radar,Page #可视化
from pyecharts import options as opts
from pyecharts.globals import SymbolType
from pyecharts.globals import ThemeType
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import string
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.style.use('ggplot')
df = pd.read_csv("order_info_utf.csv",
header=None,
names=['index','ID','type','mony','time'])
df.head()
源数据是csv格式,且不含表头,因此自定义columns。
其中
ID:用户编号
type:支付结果
mony:消费金额
time:消费时间
1. 数据概览
print("*"*15,"基础信息","*"*15)
print(df.info())
print("*"*15,"空值量","*"*15)
print(df.isnull().sum())
print("*"*15,"购买状态对比","*"*15)
print(df.type.value_counts())
print("*"*15,"描述统计","*"*15)
print(df.describe())
print("*"*15,"数据类型","*"*15)
print(df.dtypes)
*************** 基础信息 ***************
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 539414 entries, 0 to 539413
Data columns (total 5 columns):
index 539414 non-null int64
ID 539414 non-null int64
type 539414 non-null object
mony 539414 non-null float64
time 461805 non-null object
dtypes: float64(1), int64(2), object(2)
memory usage: 20.6+ MB
None
*************** 空值量 ***************
index 0
ID 0
type 0
mony 0
time 77609
dtype: int64
*************** 购买状态对比 ***************
已支付 461805
未支付 77609
Name: type, dtype: int64
*************** 描述统计 ***************
index ID mony
count 539414.000000 539414.000000 539414.000000
mean 269711.828099 24455.136400 682.737632
std 155718.619380 24595.314273 286.883866
min 1.000000 1.000000 19.000000
25% 134855.250000 11211.000000 493.000000
50% 269710.500000 11211.000000 645.000000
75% 404567.750000 28677.750000 836.000000
max 539425.000000 101535.000000 12367.000000
*************** 数据类型 ***************
index int64
ID int64
type object
mony float64
time object
dtype: object
- 可以看到源数据共计539414条,其中time有461805条,而已支付刚好有461805,可以判断出,缺失的数据都是未支付的time列。
- 用户平均消费 682.73元,标准差在286.88元,具有波动性。最高一次消费12367元,最低消费19元。50分位消费645元,略低于平均水平,75分位在836元,中低端消费较多。
- 一般而言,消费类的数据分布,都是长尾形态。大部分用户都是小额,然而小部分用户贡献了收入的大头,俗称二八。
1. 数据清洗
#删除index列
df.drop(['index'],axis=1,inplace=True)
#替换type列
df.loc[df["type"] == "已支付", "type"] = 1
df.loc[df["type"] == "未支付",