《Python数据分析与挖掘实战》第12章——电子商务网站用户行为分析及服务推荐(协同推荐)数据探索分析篇①

news/2024/5/9 18:43:57/文章来源:https://blog.csdn.net/weixin_43746433/article/details/100515910

文章目录

  • 1 背景与目标分析
  • 2.数据探索分析
    • 2.1 网页类型分析
      • 2.1.1 统计各个网页类型所占的比例
      • 2.1.2 网页107类型中的内部统计
      • 2.1.3 统计带"?"问号网址类型统计
      • 2.1.4 统计199类型中的具体类型占比
      • 2.1.5 统计瞎逛用户中各个类型占比
    • 2.2 点击次数分析
      • 2.2.1 统计点击次数
      • 2.2.2 点击次数与用户数量关系
      • 2.2.3 统计1~7次数及7次以上的点击数
      • 2.2.4 浏览一次的用户行为分析
    • 2.3 网页排名
      • 2.3.1 网页点击率排名表
      • 2.3.2 获取网页点击排名数筛选出点击次数>50的有html结尾的网址
      • 2.3.3 翻页网页统计,对浏览网页翻页的情况进行统计

《Python数据分析与挖掘实战》的实战部分的第12章的数据——《电子商务网站用户行为分析及服务推荐》。

用一种方法解决问题,然后再结合别人的分析思路,优化自己的解决方案。(sql数据可能导入不全)

旨在补充原文中的细节代码,并给出文中涉及到的内容的完整代码。

在作者所给代码的基础上增加的内容包括:

1)原书中所分析的内容中缺少的代码

2)实现了协同过滤推荐结果展示;

3)实现了按照流行度推荐以及随机推荐;

1 背景与目标分析

  • 目标
    分析某网站的用户访问记录,然后分析网页相关主题,分析用户网上访问行为;借助用户的访问记录,发现用户的访问习惯,对不同用户进行相关服务页面的推荐。

  • 实质:推荐算法。

2.数据探索分析

  • 读取数据
import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
'''
用create_engine建立连接,连接地址的意思依次为“数据库格式(mysql)+程序名(pymysql)+账号密码@地址端口/数据库名(test)”,最后指定编码为utf8;
all_gzdata是表名,engine是连接数据的引擎,chunksize指定每次读取1万条记录。这时候sql是一个容器,未真正读取数据。
'''

2.1 网页类型分析

2.1.1 统计各个网页类型所占的比例

  • 统计fullURLId的数量
counts = [ i['fullURLId'].value_counts() for i in sql] #按次10000存取,逐块统计counts = pd.concat(counts).groupby(level=0).sum() #合并统计结果,把相同的统计项合并(即按index分组并求和)
counts = counts.reset_index() #重新设置index,将原来的index作为counts的一列。
counts.columns = ['index', 'num'] #重新设置列名,主要是第二列,默认为0
counts

在这里插入图片描述

  • 提取前3个数字做网页类别
counts['type'] = counts['index'].str.extract('(\d{3})') #提取前三个数字作为类别id
counts

0903125628634.png)

  • 按类别合并
counts_ = counts[['type', 'num']].groupby('type').sum() #按类别合并
counts_.sort_values('num', ascending = False) #降序排列
counts_['percentage'] = (counts_['num']/counts_['num'].sum())*100
counts_.to_excel('./tmp/1_1_3type_counts.xlsx')
counts_

在这里插入图片描述

  • 各网页类型中小类别占比
# 每个大类别下面小类别占比
a = counts.set_index(['type'])
b = counts.groupby('type').sum()
print(b)
c = pd.merge(a,b,left_index=True,right_index=True)
print(c)

在这里插入图片描述
添加网页类型百分比

c['persentage'] = (c['num_x']/c['num_y'])*100
del c['num_y']
c.rename(columns={'num_x':'num'},inplace=True)
c

在这里插入图片描述

2.1.2 网页107类型中的内部统计

  • 统计各类型的数量
import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)#统计107类别的情况
def count107(i): #自定义统计函数j = i[['fullURL']][i['fullURLId'].str.contains('107')].copy() #找出类别包含107的网址j['type'] = None #添加空列j['type'][j['fullURL'].str.contains('info/.+?/')] = u'知识首页' #info以/结尾j['type'][j['fullURL'].str.contains('info/.+?/.+?')] = u'知识列表页'j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')] = u'知识内容页'return j['type'].value_counts()counts2 = [count107(i) for i in sql] #逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum() #合并统计结果counts2.to_excel('./tmp/1_4type107.xlsx')
print(counts2)

在这里插入图片描述

  • 百分比
#计算各个部分的占比
res107 = pd.DataFrame(counts2)
# res107.reset_index(inplace=True)
res107.index.name= u'107类型'
res107.rename(columns={'type':'num'},inplace=True)
res107[u'百分比'] = (res107['num']/res107['num'].sum())*100
res107.reset_index(inplace = True)
#保存的表名命名格式为“1_1_k+此表功能名称”,此表表示生成的第3张表格,功能为type107,计算知识类型各个小类型所占比例
res107.to_excel('1_1_3type107.xlsx')
res107

在这里插入图片描述

2.1.3 统计带"?"问号网址类型统计

2.1.4 统计199类型中的具体类型占比

2.1.5 统计瞎逛用户中各个类型占比

2.2 点击次数分析

目标:点击次数分析:统计分析原始数据用户浏览网页次数(以“真实IP”区分)的情况

2.2.1 统计点击次数

import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)#统计点击次数
c = [i['realIP'].value_counts() for i in sql] #分块统计各个IP的出现次数
count3 = pd.concat(c).groupby(level = 0).sum() #合并统计结果,level=0表示按index分组
count_df = pd.DataFrame(count3) #Series转为DataFrame
count3=count_df
count3[1]=1 # 添加1列全为1
print(count3.head())

在这里插入图片描述

2.2.2 点击次数与用户数量关系

realIP_sum=count3['realIP'].sum()
print(realIP_sum)count3= count3.groupby('realIP').sum()##统计各个“不同点击次数”分别出现的次数# 也可以使用counts1_['realIP'].value_counts()功能print(count3.head())count3.columns=[u'用户数']
count3.index.name = u'点击次数'print(count3.head())

在这里插入图片描述

  • 用户点击次数所占百分比
count3[u'用户百分比'] = count3[u'用户数']/count3[u'用户数'].sum()*100
count3[u'点击记录百分比'] = count3[u'用户数']*count3.index/realIP_sum*100
count3.sort_index(inplace = True)
c=count3.iloc[:7,]
c=c.T
c

在这里插入图片描述

2.2.3 统计1~7次数及7次以上的点击数

c.insert(0,u'总计',[count3[u'用户数'].sum(),100,100])
c[u'7次以上'] = c.iloc[:,0]- c.iloc[:,1:].sum(1)c.to_excel('./tmp/2_2_2clickTimes.xlsx')
c

在这里插入图片描述

  • 转置表格,并将所有输出保留两位小数
d = c.T
format = lambda x: '%.2f' % x  # 也可以使用d.round(4)
d = d.applymap(format)
d.T

在这里插入图片描述
从上表中可以看出大约80%的用户(不超过3次)只提供了大约30%的浏览量(几乎满足二八定律)。在数据中,点击次数最大值为23861次,对其进行分析,发现是律师的浏览信息(通过律师助手进行判断)。下表是对浏览次数达到7次以上的情况进行的分析,可以从中看出大部分用户浏览8到100次。

  • 分析浏览次数7次以上的用户
# 分析浏览次数7次以上的数据
times = counts1_.index[7:]
bins = [7,100,1000,50000]
cats = pd.cut(times,bins,right=True,labels=['8~100','101~1000','1000以上'])
e = cats.value_counts()
e = DataFrame(e, columns =[u'用户数'])
e.index.name = u'点击次数'e[u'用户数'] = np.nan
e.ix[u'8~100',u'用户数'] = a.loc[8:100,:][u'用户数'].sum()
e.ix['101~1000',u'用户数'] = a.loc[101:1000,:][u'用户数'].sum()
e.ix['1000以上',u'用户数'] = a.loc[1001:,:][u'用户数'].sum()
e.sort_values(by=u'用户数',ascending=False,inplace = True)
e.reset_index(inplace=True) 
e

在这里插入图片描述

2.2.4 浏览一次的用户行为分析

# 获取浏览一次的所有数据
f = count_df[count_df['realIP']==1] # [i['realIP'].value_counts() for i in sql]
del f[1]
f.columns = [u'点击次数']
f.index.name 

在这里插入图片描述

import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
# g = [pd.merge(f,i[['fullURLId','fullURL','realIP']],right_on = 'realIP',left_index=True,how ='left') for i in sql]
g = [i[['fullURLId','fullURL','realIP']] for i in sql]
g = pd.concat(g)
h = pd.merge(f,g,right_on = 'realIP',left_index=True,how ='left')
h.head()

在这里插入图片描述

  • 浏览一次的用户的网页类型ID分析
# 浏览一次的用户的网页类型ID分析
i = h['fullURLId'].value_counts()
i = pd.DataFrame(i)
print(i)
i.rename(columns={'fullURLId':u'个数'},inplace=True)
i.index.name = u'网页类型ID'
i[u'百分比'] = i[u'个数']/i[u'个数'].sum()*100#保存的表名命名格式为“1_2_k此表功能名称”,此表表示生成的第2张表格,功能为typeID:浏览一次的用户的网页类型ID分析
i.to_excel('./tmp/2_3_4typeID.xlsx')

在这里插入图片描述

  • 提取个数大一百的类型
j=i[i[u'个数']>100]j.loc[u'其他',u'个数'] = i[i[u'个数']<=100][u'个数'].sum()
j.loc[u'其他',u'百分比'] = i[i[u'个数']<100][u'百分比'].sum()
j# 浏览一次的用户中浏览的网页类型ID

在这里插入图片描述
针对浏览次数为一次的用户进行分析,其结果如上图所示。其中,问题咨询页占比74%,知识页占比16%,而且这些记录基本上全是通过搜索引擎进人的。
由此可以猜测两种可能:

  1. 用户为流失用户,在问题咨询与知识页面上没有找到相关的需要。
  2. 用户找到其需要的信息,因此直接退出。综合这些情况,可以将这些点击一次的用户行为定义为网页的跳出率。为了降低网页的跳出率,需要对这些网页进行针对用户的个性化推荐,帮助用户发现其感兴趣或者需要的网页。
  • 用户点击1次所浏览网页统计(点击数大于100次的)
# 点击1次用户浏览网页统计(点击数大于100次的)
k = pd.DataFrame(h['fullURL'].value_counts())
k.index.name = u'网址'
k.columns = [u'点击数']
m = k[k[u'点击数'] > 100]
m.loc[u'其他',u'点击数'] = k[k[u'点击数']<=100][u'点击数'].sum()
m[u'百分比'] = m[u'点击数']/k[u'点击数'].sum()
#保存的表名命名格式为“1_2_k此表功能名称”,此表表示生成的第3张表格,功能为lookMorethan100:点击1次用户浏览网页统计(点击数大于100次的)
m.to_excel('./tmp/2_3_5lookMorethan100.xlsx')
m

在这里插入图片描述
结论:排名靠前的都是知识与咨询页面,因此可以猜测大量用户的关注都在知识或咨询页面上。

2.3 网页排名

2.3.1 网页点击率排名表

import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
# g = [pd.merge(f,i[['fullURLId','fullURL','realIP']],right_on = 'realIP',left_index=True,how ='left') for i in sql]def clickfreq(i): #自定义统计函数j = i[['fullURL','fullURLId','realIP']][i['fullURL'].str.contains('\.html')]return jcounts1 = [clickfreq(i) for i in sql] #
counts1 = pd.concat(counts1)counts1_ = counts1['fullURL'].value_counts()
counts1_ = pd.DataFrame(counts1_)counts1_.columns = [u'点击次数']
counts1_.index.name = u'网址'
a = counts1_.sort_values(u'点击次数',ascending=False).iloc[:20,:]
a

在这里插入图片描述

2.3.2 获取网页点击排名数筛选出点击次数>50的有html结尾的网址

b = counts1_.reset_index()
c = b[b[u'点击次数']>50][b[u'网址'].str.contains('/\d+?_*\d+?\.html')]
c.set_index(u'网址',inplace=True)
c.sort_index(inplace = True)
# savetosql(c, 'count355')# 并保存到数据库中
c

在这里插入图片描述

2.3.3 翻页网页统计,对浏览网页翻页的情况进行统计

  • 获取网址中以http://与.html中间的主体部分,即去掉翻页的内容
# 获取网址中以http://与.html中间的主体部分,即去掉翻页的内容,即去掉尾部"_d"
import re
import numpy as np
pattern = re.compile('http://(.*\d+?)_\w+_\w+\.html$|http://(.*\d+?)_\w+\.html$|http://(.*\w+?).html$',re.S)
c['websitemain'] = np.nan
for i in range(len(c)):items = re.findall(pattern, c.index[i])if len(items)== 0:temp = np.nanelse:for j in items[0]:if j !='':temp = jc.iloc[i,1] = temp
c

在这里插入图片描述

  • 获取所有网页主体的网页数
d = c['websitemain'].value_counts()
d = pd.DataFrame(d)
d

在这里插入图片描述

  • 统计网页主体出现次数为不少于二次的,即存在翻页的网址
# 统计网页主体出现次数为不少于二次的,即存在翻页的网址
e = d[d['websitemain']>=2]
e.columns=['Times']#记录某网页及子网页出现的次数
e.index.name='websitemain'# 主网页e['num'] = np.arange(1,len(e)+1) 
f = pd.merge(c,e,left_on='websitemain',right_index=True,how='right')
f.sort_index(inplace=True)
f['per'] = np.nan
f# 相同num的网页是拥有同一网页主体

在这里插入图片描述

  • 统计翻子页的点击率与上一页网页点击率的比重
# 统计翻子页的点击率与上一页网页点击率的比重(注意:用此处这个方法对网页翻页后序号有10页及以上的合适
def getper(x):x.sort_index(inplace=True) #必须先排序将网页xfor i in range(len(x)-1):x.iloc[i+1,-1] = x.iloc[i+1,0]/x.iloc[i,0]return x    result = pd.DataFrame([]) # 用一个空表格记录值
for i in range(1,f['num'].max()+1):#count36['num'].max()+1k= getper(f[f['num'] == i])result = pd.concat([result,k])# 每次进行一次操作时
f['Times'].value_counts() # 由统计结果看,只有一个主网址出现过10次及以上,该数据采用上述方法会出问题,因此,在结果中将其剔除后观察剩余数据

在这里插入图片描述

flipPageResult = result[result['Times']<10]
#保存的表名命名格式为“1_3_k此表功能名称”,是此小节生成的第1张表格,功能为flipPageResult:统计翻子页的点击率与上一页网页点击率的比重
flipPageResult.to_excel('./tmp/3_flipPageResult.xlsx')
flipPageResult

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_770943.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Python数据分析与挖掘实战》第12章——电子商务网站用户行为分析及服务推荐(协同推荐)数据预处理篇②

文章目录1 数据清洗1.1 查看各个需要删除的规则包含的信息1 数据清洗 1.1 查看各个需要删除的规则包含的信息 类型网页 import pandas as pd from sqlalchemy import create_engine# 读取数据库数据 engine create_engine(mysqlpymysql://root:localhost/wangye?charsetut…

提升 10 倍网站访问速度,全局负载均衡与CDN内容分发

CDN简介 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;…

一款开源免费的网站监控系统

做过前端的开发的小伙伴想必经常被线上的各种问题弄的焦头烂额&#xff0c;不是出现适配问题&#xff0c;就是出现功能异常。 虽然&#xff0c;公司一般也有各种监控系统来帮助我们分析和发现问题&#xff0c;但是&#xff0c;我们每次解决问题都需要辗转于各种监控系统之间&a…

基于Python电影网站系统的日志

文章目录使用技术&#xff1a;模块10.1810.1910.2610.2711.1611.1712.2512.269-1上映预告-标签筛选-电影分页9-2 电影搜索-电影详情5-4 会员-收藏-评论管理页面搭建6-8 修改密码6-9 日志管理1.1遇到的问题1. 当验证在Flask中失败时&#xff0c;如何覆盖html默认的“请填写此字段…

Flask搭建新闻网站①

跟之前flask做的ihome租房网站类似&#xff0c;配置信息几乎完全一样&#xff0c;这里只记录下重点内容 git忽略log日志可在logs文件夹下加 .gitkeep文件 文章目录项目预览文章列表页文章详情页个人中心Day108_表结构分析数据库迁移显示网站logo文件Day2使用请求钩子自定义过滤…

Flask搭建新闻网站②

文章目录Day5404创建管理员管理员登录用户统计防止用户进入admin页面gunicorn运行项目nginxDocker部署服务器建立docker镜像Day5 404 # 统一返回404页面 index_bp.route(/404) user_login_data def page_not_found():data {"user_info": g.user.to_dict() if g.use…

Django+xadmin实现教育网站系统

文章目录环境配置与项目介绍Django升级2.0 注意的点app管理数据库设计注册model注册app目录5 xadmin搭建后台管理系统5-3 users app 的model注册5-5 xadmin全局配置app.py 定义app后台名称第6章 用户注册功能实现6.1 登录表单验证6-6 session和cookie自动登录机制用户注册发送邮…

Django+xadmin实现教育网站系统②

文章目录第10章 个人中心和全局搜索功能实现全局搜索修改头像第11章 首页、全局功能细节和404以及500页面配置第12章 常见web攻击及防范sql注入12-2 xss攻击原理及防范12-3 csrf攻击与防范第13章 xadmin的进阶开发13-1 userprofile注册以及django的权限管理13-3 model_icon, 只…

视频网站解决带宽问题(总结)

自己搜来的一些方案&#xff0c;汇总下供自己学习吧 1.大带宽是重中之重 所有了解视频类应用的人都知道&#xff0c;视频网站的带宽才是重中之重。在线视频播放网站每天都会产生巨额的流量&#xff0c;每个客户都会占据非常大的带宽。如果带宽不够就会出现用户播放卡顿&#…

php投票网站教程,PHP之投票联系

1.建立数据库表1&#xff1a;DiaoYanTiMu表2&#xff1a;DiaoYanXuanXiang2.页面页面1&#xff1a;投票首页无标题文档#fanhui{ display:none}$db new MySQLi("localhost","root","123","mydb");$sql "select * from diaoyanti…

网站页面左右_建设一个普通的网站需要多少钱?就是一个展示型的公司网站。...

这个问题在行业内是没有准确定义的&#xff0c;每一个建站公司在面对不同的客户需求&#xff0c;都会有不同的报价模式&#xff0c;而影响价格的因素有很多&#xff0c;但无疑建站成员所拥有的“宝贵经验”往往是最贵的&#xff0c;这也是建站公司相互报价差距巨大的原因。要想…

java页面加速_为你的网站加速

我的博客刚成立也是不久&#xff0c;所以现在我关注了很多中小博客站点&#xff0c;发现很多站点打开速度很慢&#xff0c;甚至有一些网站出现打不开的情况。网站运行不稳定&#xff0c;可能和使用的服务器有关系&#xff0c;因为很多人都图方便&#xff0c;为了不备案直接使用…

linux 重启命令nginxed,Nginx转发,部署网站相关linux命令

进入目录cd /etc/nginx/sites-available进入文件defaultsudo vim default;编辑a鼠标右键粘贴退出编辑Esc保存:wq重启Nginx服务sudo service nginx restart清空default里面的内容sudo sh -c encho "" >default创建manage-front文件&#xff0c;并复制cib-front到ma…

电子病历模板编辑器_这几个邮件模板网站,帮助提升工作效率

AUTOKLOSE: 一些免费的邮件正文模板。Autopilot Templates:ree customer journey templates for marketing automationBEE TEMPLATES for GMAIL: 可编辑Gmail邮件模板。COLD EMAIL TEMPLATE: 一系列营销邮件模板。Contactually: 不知道邮件内容怎么写&#xff1f;参考下这些邮件…

关于ssm框架的外文文献及译文_使用彩云小译,翻译外文网站实现双语对照

彩云小译扩展&#xff0c;实现外语网页的翻译功能&#xff0c;一段原文一段译文&#xff0c;让查阅外文资料可以随心所欲。整理&排版 | idea君 &#xff0c;预计阅读时间 | 3分钟 文章意在学习交流分享&#xff0c;如有侵权请联系删除 封面&#xff1a;http://www.pexels.c…

网站index.php怎么关联其余,thinkphp隐藏index.php/home并允许访问其他模块的实现方法...

想要达成的效果很简单&#xff0c;我有两个模块&#xff0c;Home、Wechat。http://localhost/index.php/home/index/index 缩短为&#xff1a; http://localhost/index/indexhttp://localhost/index.php/wechat/index/index 缩短为&#xff1a; http://localhost/wechat/index/…

php5.2.8升级,UWA2.X通用建站升级程序

UWA2.X通用建站升级程序是一款基于PHP和MySQL开发的通用建站系统&#xff0c;程序简洁、灵活而具备强大的扩展性&#xff0c;将是您轻松建站的首选利器。采用XML名字空间风格核心模板&#xff1a;模板全 部使用文件形式保存&#xff0c;对用户设计模板、网站升级转移均提供很大…

google android开发者网站,谷歌上线 Fuchsia OS 开发者网站

原标题&#xff1a;谷歌上线 Fuchsia OS 开发者网站谷歌自研的操作系统 Fuchsia OS 又有新动作了。据了解&#xff0c;谷歌近日悄悄地上线了 Fuchsia OS 的开发者网站 https://fuchsia.dev/。谷歌表示&#xff0c;上线 fuchsia.dev 是为了让开发者更好地参与 Fuchsia OS 的开发…

如何自制网页服务器,如何自己制作网站?如何制作自己的网页?

如何自己制作网站?如何制作自己的网页?首先&#xff0c;你是非开发者&#xff0c;你需要知道做一个网页要采取哪些步骤。下面一起来看看吧!简单来说&#xff0c;网页制作需要的内容如下:页面设计、前端开发、后端开发(如果只是简单的介绍页面或者是不经常更改的页面)&#xf…

我的世界服务器换披风的网站,我的世界正版披风怎么换|或

【我的世界评测】我的世界正版披风怎么换。那下面给大家分享的则是我的世界正版中更换披风的教程哦~那到底怎么更换披风呢&#xff1f;那下面就给大家详细的介绍一下吧&#xff01;如果你有心仪的作品或者心得分享的话&#xff0c;欢迎来游戏园投稿&#xff0c;大家可以点击>…