1 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于大数据的京东消费行为分析与可视化
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:3分
🧿 选题指导, 项目分享:见文末
2 数据处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import seaborn as sns
from pylab import *
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import textwrap
# 中文设置
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
plt.rc('font',family = 'Microsoft YaHei',size = '15')
warnings.filterwarnings("ignore")
%matplotlib inline
# 读取数据
data = pd.read_excel('D:/data/京东消费者分析数据.xlsx')
data.head(10)
# 查看数据量
print('数据条数:{} \n数据字段:{}'.format(data.shape[0],data.shape[1]))
#字段中文命名
data.columns = ["客户id","产品id","行为时间","行为id","行为类别","年龄分段","性别","客户注册日期",\
"会员级别","会员城市级别","产品品牌","店铺id","产品类别","产品上市日期","商家id",\
"粉丝数","会员数","开店时间","店铺主营","店铺打分"]
data.head(10)
data.info()
# 缺失率
data.isnull().mean()
缺失字段只有“年龄分段”,“会员城市级别”,“开店时间”。
其中“年龄分段”,“会员城市级别”数据量占比很少,可以去除
“开店时间”缺失达到1/3,暂时保留数据,需要相关分析时再去除。
# 删除缺失值
data.dropna(subset=['年龄分段','会员城市级别'],inplace=True)
print(data.shape)
data.isnull().mean()
# 删除重复值
data.drop_duplicates(inplace=True)
print(data.shape)
# 数据描述
print('行为类别包含:{}'.format(data['行为类别'].unique()))
print('性别包含:{}'.format(data['性别'].unique()))
print('产品类别包含:{}'.format(data["产品类别"].unique()))
print('年龄分段包含:{}'.format(data['年龄分段'].unique()))
data[['年龄分段','粉丝数','会员数','店铺打分']].describe()[1:]
# 异常值判断
print(len(data[data['店铺打分'] < 0]))
print(len(data[data['店铺打分'] < 0]) / data.shape[0])
店铺打分出现负值,考虑到可能是差评,但是常规评分为(0-10),认为0分已经是差评了,具体要看实际业务评定,这里考虑到数量极少,可以视为0分处理
#替换异常值
data['店铺打分'] = data['店铺打分'].apply(lambda x: 0 if x<0 else x)
data[['年龄分段','粉丝数','会员数','店铺打分']].describe()[1:]
# 转化行为时间,提取年份、月份、日、周数据
pd.to_datetime(data['行为时间'],format="%Y-%m-%d")
data['年份'] = data['行为时间'].dt.year
data['月份'] = data['行为时间'].dt.month
data['日'] = data['行为时间'].dt.day
data['周'] = data['行为时间'].dt.weekday
data['日期'] = data['行为时间'].dt.date
data['小时'] = data['行为时间'].dt.hour
# 重建data索引
data = data.reset_index(drop = True)
data.head()
3 数据分析
每日UV(访客数)与每日PV(访客量)
# 计算每日的UV
uv_data = data.drop_duplicates(subset = ['日期','客户id'])
uv_data = uv_data[['日期','客户id']].groupby(['日期']).count().reset_index()
uv_data.rename(columns = {
'客户id':'日UV'},inplace = True)
uv_data.head()
# 绘制平滑好看的折线图函数
def echarts_line(x,y,title = '主标题',subtitle = '副标题',label = '图例'):
"""
x: 函数传入x轴标签数据
y:函数传入y轴数据
title:主标题
subtitle:副标题
label:图例
"""
line = Line(
init_opts=opts.InitOpts(
bg_color='#080b30', # 设置背景颜色
theme='dark', # 设置主题
width='1200px', # 设置图的宽度
height='600px', # 设置图的高度
)
)
line.add_xaxis(x)
line.add_yaxis(
label,
y,
is_symbol_show=False, # 是否显示数据标签点
is_smooth=True, # 设置曲线平滑
label_opts=opts.LabelOpts(
is_show=False, # 是否显示数据
),
itemstyle_opts=opts.ItemStyleOpts(color='#00ca95'), # 设置系列颜色
# 线条粗细阴影设置
linestyle_opts={
"normal": {
"color": "#00ca95", #线条颜色
"shadowColor": 'rgba(0, 0, 0, .3)', #阴影颜色和不透明度
"shadowBlur": 2, #阴影虚化大小
"shadowOffsetY": 5, #阴影y偏移量
"shadowOffsetX": 5, #阴影x偏移量
"width": 6 # 线条粗细
},
},
# 阴影设置
areastyle_opts={
"normal": {
"color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(0,202,149,0.5)'
},
{
offset: 1,
color: 'rgba(0,202,149,0)'
}
], false)"""), #设置底色色块渐变
"shadowColor": 'rgba(0,202,149, 0.9)', #设置底色阴影
"shadowBlur": 20 #设置底色阴影大小
}
},
)
line.set_global_opts(
# 标题设置
title_opts=opts.TitleOpts(
title=title, # 主标题
subtitle=subtitle, # 副标题
pos_left='center', # 标题展示位置
title_textstyle_opts=dict(color='#fff') # 设置标题字体颜色
),
# 图例设置
legend_opts=opts.LegendOpts(
is_show=True, # 是否显示图例
pos_left='right', # 图例显示位置
pos_top=