三十、电子商务分析与服务推荐的分析方法与过程

1. 分析方法与过程

1.1 目标

本案例的目标是对用户进行推荐,即以一定的方式将用户与物品之间建立联系。为了更好地帮助用户从海量的数据中快速发现感兴趣的网页,在目前相对单一的推荐系统上进行补充。电子商务服务推荐的分析方法与过程的主要内容包括:

  • 数据抽取
  • 数据探索性分析

2. 数据抽取

  • 推荐系统使用的推荐算法**
  • 本项目中使用的是协同过滤算法,其特点是通过历史数据找出相似的用户或者网页,在数据抽取的过程中,进可能选择大量的数据,这样就能降低推荐结果的随机性,提高推荐结果的准确性,能更好地发掘长尾网页中用户感兴趣的网页。

用户访问数据的特征

  • 用户的访问时间为条件,选取3个月用户的访问数据作为原始数据集。数据总量有837450条记录,其中包括用户号、访问时间、来源网站、访问页面、页面标题、来源网页、标签、网页类别和关键词词等属性。

智能推荐系统的流程图

  • 建立数据库
  • 导入数据
  • 搭建Python等数据库环境
  • 数据分析
  • 建立模型
    三十、电子商务分析与服务推荐的分析方法与过程_第1张图片

Python访问数据库的代码

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize=10000)

3 探索性数据分析

网页类分析

  • 首先对原始数据中用户点击的网页类型进行统计,网页类型是指“网址类型”中的3位数字(本身有6/7位数字)。

网页类统计结果

  • 点击与咨询相关(网页类型为101)的记录占了49.16%,其次是其他的类型(网页类型为199)占比24%左右,然后是知识相关(网页类型为107)占比22%左右。
    三十、电子商务分析与服务推荐的分析方法与过程_第2张图片
  • 可以得到用户的点击页面类型的排行榜为:咨询相关、知识相关、其它方面的网页、法规(类型为310)、律师相关(类型为102)。可以初步得出相对于长篇的知识,用户更加偏向于查看咨询或者进行咨询。
    三十、电子商务分析与服务推荐的分析方法与过程_第3张图片
  • 知识类型内部统计
    三十、电子商务分析与服务推荐的分析方法与过程_第4张图片

网页类分析实现的代码

counts = [i['fullURLId'].value_counts() for i in sql]  # 逐块统计
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['percent'] = counts['num'] / counts['num'].sum() * 100
counts_ = counts[['type', 'num', 'percent']].groupby('type').sum()  # 按类别合并
counts_.sort_values('num', ascending=False)  # 降序排列
print(counts_)

点击次数分析

  • 统计分析原始数据用户浏览网页次数(以“真实IP区分”)的情况,其结果如下表所示:可以从表中发现浏览一次的用户占所有用户总量的58%左右,大部分用户浏览的次数在2~7次,用户浏览的平均次数是3次

三十、电子商务分析与服务推荐的分析方法与过程_第5张图片
点击次数分析代码的实现过程

#统计点击次数
#value_count统计数据出现的频率

c = [i['realIP'].value_counts() for i in sql]
count3 = pd.concat(c).groupby(level=0).sum()
count3 = pd.DataFrame(count3)
count3[1] = 1
count3 = count3.groupby('realIP').sum()

count3_ =count3.iloc[:7,:].append(count3.iloc[7:,:].sum(),ignore_index=True)
count3_.index = list(range(1,8))+['7次以上']
print(count3_)

三十、电子商务分析与服务推荐的分析方法与过程_第6张图片

网页排名

  • 由分析目标课程,个性化推荐主要针对以html为后缀的网页。从原始数据中统计以html为后缀的网页的点击率。
  • 从表中可以看出,点击次数前20名中,“法规专题”占了大部分,其次是“知识”,然后是“咨询”。
    三十、电子商务分析与服务推荐的分析方法与过程_第7张图片

类型点击数统计
在这里插入图片描述

翻页网页统计
在这里插入图片描述

6 总结

分析方法与过程

  • 数据抽取
    1、建立数据库—导入数据—搭建Python环境—数据分析—建立模型

  • 数据探索性分析
    2、网页类型分析
    3、网页点击次数分析
    4、网页排名分析

7.完整代码

7.1 代码目录结果

三十、电子商务分析与服务推荐的分析方法与过程_第8张图片

7.2 完整代码

1 sql_value_counts.py

import pandas as pd
from sqlalchemy import create_engine

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

counts = [i['fullURLId'].value_counts() for i in sql]  # 逐块统计
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['percent'] = counts['num'] / counts['num'].sum() * 100
counts_ = counts[['type', 'num', 'percent']].groupby('type').sum()  # 按类别合并
counts_.sort_values('num', ascending=False)  # 降序排列
print(counts_)

2 ask_value_counts.py

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize=10000)


# 统计101类别的情况
def count101(i):  # 自定义统计函数
    j = i[['fullURLId']][i['fullURLId'].str.contains('101')].copy()  # 找出类别包含101的网址
    return j['fullURLId'].value_counts()


counts2 = [count101(i) for i in sql]  # 逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum()  # 合并统计结果
counts2 = pd.DataFrame(counts2)
counts2.columns = ['num']
counts2['percent'] = counts2['num'] / counts2['num'].sum() * 100
counts2.sort_values('num', ascending=False)  # 降序排列

print(counts2)

3 know_value_counts.py

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?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'知识首页'
  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 = pd.DataFrame(counts2)
counts2.columns=['num']
counts2['percent'] = counts2['num']/counts2['num'].sum()*100
print(counts2)

4 other_value_counts.py

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize=10000)


# 统计1999001类别的情况
def count101(i):  # 自定义统计函数
    j = i[['pageTitle']][i['fullURLId'].str.contains('1999001')].copy()  # 找出类别包含101的网址
    j['type'] = u'其他'
    j['type'][(j['pageTitle'] != '') & (j['pageTitle'].str.contains(u'快车-律师助手'))] = u'快车-律师助手'
    j['type'][(j['pageTitle'] != '') & (j['pageTitle'].str.contains(u'免费发布法律咨询'))] = u'免费发布咨询'
    j['type'][(j['pageTitle'] != '') & (j['pageTitle'].str.contains(u'咨询发布成功'))] = u'咨询发布成功'
    j['type'][(j['pageTitle'] != '') & (j['pageTitle'].str.contains(u'快搜'))] = u'快搜'
    return j['type'].value_counts()


counts2 = [count101(i) for i in sql]  # 逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum()  # 合并统计结果
counts2 = pd.DataFrame(counts2)
counts2.columns = ['num']
counts2['percent'] = counts2['num'] / counts2['num'].sum() * 100
counts2.sort_values('num', ascending=False)  # 降序排列

web_click_counts.py

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)

#统计点击次数
#value_count统计数据出现的频率

c = [i['realIP'].value_counts() for i in sql]
count3 = pd.concat(c).groupby(level=0).sum()
count3 = pd.DataFrame(count3)
count3[1] = 1
count3 = count3.groupby('realIP').sum()

count3_ =count3.iloc[:7,:].append(count3.iloc[7:,:].sum(),ignore_index=True)
count3_.index = list(range(1,8))+['7次以上']
print(count3_)


# 对浏览次数达7次以上的情况进行分析,发现大部分用户浏览8~100次,代码实现:

counts3_7 = pd.concat([count3.iloc[7:100,:].sum(),count3.iloc[100:300,:].sum(),count3.iloc[300:,:].sum()])
counts3_7.index = ['8-100','101-300','301以上']
counts3_7df = pd.DataFrame(counts3_7)
counts3_7df.index.name = '点击次数'
counts3_7df.columns = ['用户数']
print(counts3_7df)

web_sort

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:[email protected]:3306/7law?charset=utf8')

sql = pd.read_sql('all_gzdata', engine, chunksize=10000)

counts4 = [i[['realIP','fullURL','fullURLId']] for i in sql]
counts4_ = pd.concat(counts4)
a = counts4_[counts4_['fullURL'].str.contains('\.html')]
print(a.head())

.0.0.1:3306/7law?charset=utf8’)

sql = pd.read_sql('all_gzdata', engine, chunksize=10000)

counts4 = [i[['realIP','fullURL','fullURLId']] for i in sql]
counts4_ = pd.concat(counts4)
a = counts4_[counts4_['fullURL'].str.contains('\.html')]
print(a.head())

你可能感兴趣的:(数据挖掘)