目录
一、引言
智能推荐服务是提高电子商务网站销售转化率的重要技术手段之一。它与传统的搜索技术有着重要的区别,智能推荐服务能够更加精准地提供信息,节省用户找寻信息的时间,提高找寻信息的准确度。通过建立智能推荐系统提高服务效率,帮助消费者节约时间成本,帮助企业制定有针对性的营销战略方案,促进企业长期、稳定、高速发展。
本篇文章通过对用户访问的网页日志数据进行分析与处理,采用基于物品的协同过滤算法对处理后的数据进行建模分析,并应用模型实现智能推荐,进行个性化推荐,帮助用户更加便捷地获取信息。
二、分析方法与过程
2.1 分析步骤与流程
为了帮助用户从海量的信息中快速发现感兴趣的网页,本案例主要采用协同过滤算法进行推荐,由于用户访问网站的数据记录较多,需要进行分类处理直接采用协同过滤算法进行推荐。
2.2数据抽取
以用户的访问为条件,选取3个月内(2015/2/1~2015/4/29)用户的访问数据作为原始数据集。采取python读取数据库的操作方式进行数据抽取。
import os
import pandas as pd
# 修改工作路径到指定文件夹
os.chdir("D:/pyhoncode")
# 第一种连接方式
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
# 第二种连接方式
import pymysql as pm
con = pm.connect(host='localhost',user='root',password='123456',database='test',charset='utf8',port=3306)
data = pd.read_sql('select * from all_gzdata',con=con)
con.close() #关闭连接
# 保存读取的数据
data.to_csv('./data/all_gzdata.csv', index=False, encoding='utf-8')
2.3数据探索分析
原始数据集包括用户号、访问时间、来源网站、访问页面等信息,需要原始数据进行网页类型、点击次数、王爷排名等各个维度的分布分析,了解用户浏览网页的行为及关注内容,获取数据内在的规律。
1)分析网页类型
对原始数据中用户点击的网页类型进行统计分析。
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
# 分析网页类型
counts = [i['fullURLId'].value_counts() for i in sql] #逐块统计
counts = counts.copy()
counts = pd.concat(counts).groupby(level=0).sum() # 合并统计结果,把相同的统计项合并(即按index分组并求和)
counts = counts.reset_index() # 重新设置index,将原来的index作为counts的一列。
counts.columns = ['index', 'num'] # 重新设置列名,主要是第二列,默认为0
counts['type'] = counts['index'].str.extract('(\d{3})') # 提取前三个数字作为类别id
counts_ = counts[['type', 'num']].groupby('type').sum() # 按类别合并
counts_.sort_values(by='num', ascending=False, inplace=True) # 降序排列
counts_['ratio'] = counts_.iloc[:,0] / counts_.iloc[:,0].sum()
print(counts_)
结果如下
因此,点击与咨询相关(网页类型为101)的记录占了49.16%,其他类型(网页类型为199)占比24%左右,知识相关(网页类型为107)占比22%左右。根据统计结果对用户点击的页面类型进行排名,然后进一步对咨询类别内部进行统计分析。
# 因为只有107001一类,但是可以继续细分成三类:知识内容页、知识列表页、知识首页
def count107(i): #自定义统计函数
j = i[['fullURL']][i['fullURLId'].str.contains('107')].copy() # 找出类别包含107的网址
j['type'] = None # 添加空列
j['type'][j['fullURL'].str.contains('info/.+?/')]= '知识首页'
j['type'][j['fullURL'].str.contains('info/.+?/.+?')]= '知识列表页'
j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')]= '知识内容页'
return j['type'].value_counts()
# 注意:获取一次sql对象就需要重新访问一下数据库(!!!)
#engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
counts2 = [count107(i) for i in sql] # 逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum() # 合并统计结果
print(counts2)
#计算各个部分的占比
res107 = pd.DataFrame(counts2)
# res107.reset_index(inplace=True)
res107.index.name= '107类型'
res107.rename(columns={'type':'num'}, inplace=True)
res107['比例'] = res107['num'] / res107['num'].sum()
res107.reset_index(inplace = True)
print(res107)
结果如下
可得,浏览咨询内容页(101003)记录最多,其次是咨询列表页(101002)和咨询首页(101001)。初步分析可得用户都喜欢通过浏览问题方式找到自己需要的信息,而不是以提问的方式或者查看长篇内容的方式寻找信息。对原始数据的网址中带“?”的数据进行统计。
def countquestion(i): # 自定义统计函数
j = i[['fullURLId']][i['fullURL'].str.contains('\?')].copy() # 找出类别包含107的网址
return j
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
counts3 = [countquestion(i)['fullURLId'].value_counts() for i in sql]
counts3 = pd.concat(counts3).groupby(level=0).sum()
prin