Task2_天池新闻推荐数据分析

前言

本文针对天池有关推荐系统的赛题进行数据分析部分的理解及大致梳理,不当之处还望指正

一、导包及相关数据的读取:

1.导包
由于此次分析主要是熟悉了解整个数据集的基本情况,包括每个文件里的数据、每个字段所表示的实际含义、数据集中特征之间的相关性以及用户和文章交互的一些分布,所以进行数据分析前要导入读取相关格式文件以及可视化的包

%matplotlib inline
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='SimHei', size=13)

import os,gc,re,warnings,sys
warnings.filterwarnings("ignore")

2.读取

path = './data_raw/'

#####train
trn_click 啊= pd.read_csv(path+'train_click_log.csv')
#trn_click = pd.read_csv(path+'train_click_log.csv', names=['user_id','item_id','click_time','click_environment','click_deviceGroup','click_os','click_country','click_region','click_referrer_type'])
item_df = pd.read_csv(path+'articles.csv')
item_df = item_df.rename(columns={'article_id': 'click_article_id'})  #重命名,方便后续match
item_emb_df = pd.read_csv(path+'articles_emb.csv')

#####test
tst_click = pd.read_csv(path+'testA_click_log.csv')

train_click_log.csv文件数据中每个字段的含义
user_id: 用户的唯一标识
click_article_id: 用户点击的文章唯一标识
click_timestamp: 用户点击文章时的时间戳
click_environment: 用户点击文章的环境
click_deviceGroup: 用户点击文章的设备组
click_os: 用户点击文章时的操作系统
click_country: 用户点击文章时的所在的国家
click_region: 用户点击文章时所在的区域
click_referrer_type: 用户点击文章时,文章的来源

二、数据的预处理和概况浏览

1.训练集、测试集用户点击rank和点击次数预处理
对每个用户的点击时间戳进行排序并计算用户点击文章的次数,在原来表里增加一列count

#这里以训练集为例、测试集同样操作
trn_click['rank'] = trn_click.groupby(['user_id'])['click_timestamp'].rank(ascending=False).astype(int)
trn_click['click_cnts'] = trn_click.groupby(['user_id'])['click_timestamp'].transform('count')

2.训练集、测试集分别和item_df数据整合及概况
通过主键合并的方式将trn_click(train_click_log.csv)和item_df(articles.csv)合并,tst_click同理(下同),再查看我们大概要了解的特征分布

#查看训练集用户数量,发现训练集中的用户数量为20w
trn_click.user_id.nunique()
#查看训练集里面发现每个用户至少点击了两篇文章
trn_click.groupby('user_id')['click_article_id'].count().min()  
#查看训练集各个基本属性出现次数前十分布
plt.figure()
plt.figure(figsize=(15, 20))
i = 1
for col in ['click_article_id', 'click_timestamp', 'click_environment', 'click_deviceGroup', 'click_os', 'click_country', 
            'click_region', 'click_referrer_type', 'rank', 'click_cnts']:
    plot_envs = plt.subplot(5, 2, i)
    i += 1
    v = trn_click[col].value_counts().reset_index()[:10]
    fig = sns.barplot(x=v['index'], y=v[col])
    for item in fig.get_xticklabels():
        item.set_rotation(90)
    plt.title(col)
plt.tight_layout()
plt.show()
执行上述代码发现从点击时间clik_timestamp来看,分布较为平均,而点击环境click_environment来看,仅有1922次(占0.1%)点击环境为1;仅有24617次(占2.3%)点击环境为2;剩余(占97.6%)点击环境为4。从点击设备组click_deviceGroup来看,设备1占大部分(60.4%),设备3占36%。

以上代码块主要是针对训练集的,相应的代码和了解到的信息我在上面已经标出,对于测试集也是同样道理,但是能发现测试集和训练集用户完全不一样,测试集用户数量有5w,并且有只点击过一次文章的用户

3.item_df(articles.csv)数据概况

#查看不同字数文章的点击量,执行可发现字数200以内的文章点击数是相对靠前的
item_df['words_count'].value_counts()
#查看到共有461个文章主题
item_df['category_id'].nunique()
# 364047篇文章
item_df.shape  #(364047, 4)

4.item_emb_df(articles_emb.csv)数据概况

#文章的embedding向量,每篇文章对应一个,刚好364047篇文章
item_emb_df.shape #(364047, 251)

三、数据分析

1. 用户角度

#查看每个用户点击每篇文章的次数(重复点击)
user_click_count = user_click_merge.groupby(['user_id', 'click_article_id'])['click_timestamp'].agg({'count'}).reset_index()
#查看记录中用户重复点击的数值都有哪些
user_click_count['count'].unique() #array([ 1,  2,  4,  3,  6,  5, 10,  7, 13], dtype=int64)
#查看重复点击的数值频数高低
user_click_count.loc[:,'count'].value_counts() 

user_click_count.loc[:,‘count’].value_counts() 执行结果:
用户点击新闻次数
结果有1605541(约占99.2%)的用户并没有重复阅读文章,但有极少数用户重复点击过某篇文章。

#查看用户点击新闻数量的分布
user_click_item_count = sorted(user_click_merge.groupby('user_id')['click_article_id'].count(), reverse=True)#横坐标用户,纵坐标数量
plt.plot(user_click_item_count)
#查看点击次数在前50的用户(可根据需求调整)
plt.plot(user_click_item_count[:50])

上面这部分也可以查点击数比较靠后的,然后抽取出这部分用户,对点击次数进行离散化,区分出不同活跃程度的用户,然后制定不同的推荐策略。

#查看用户都点击了哪些新闻类型,度量兴趣是否广泛
plt.plot(sorted(user_click_merge.groupby('user_id')['category_id'].nunique(), reverse=True))

运行结果:
在这里插入图片描述
从上图中可以看出有一小部分用户阅读类型是很广泛的,但大部分人都处在20个新闻类型以下。

2. 文章角度

#查看新闻点击次数分布
item_click_count = sorted(user_click_merge.groupby('click_article_id')['user_id'].count(), reverse=True)
plt.plot(item_click_count[:100])#可以画出前N篇或比较靠后文章被点击次数

这部分和user_click_item_count= sorted(user_click_merge.groupby(‘user_id’)[‘click_article_id’].count(), reverse=True)一样的思路,只是对分组键进行调换,执行结果后抽取前100可以发现点击次数最多的前100篇新闻,点击次数大于1000次;这里也可以对点击次数进行离散化,区分出不同热度的新闻。结合了用户和新闻这两个类似又相反角度,可以对不同活跃度的用户推荐他点击最多的某类新闻

#查看新闻共现频次:两篇新闻连续出现的次数
tmp = user_click_merge.sort_values('click_timestamp')
tmp['next_item'] = tmp.groupby(['user_id'])['click_article_id'].transform(lambda x:x.shift(-1))
union_item = tmp.groupby(['click_article_id','next_item'])['click_timestamp'].agg({'count'}).reset_index().sort_values('count', ascending=False)
union_item[['count']].describe()#查看一些统计量

#可以通过散点图看文章共现不同次数的一个分布
x = union_item['click_article_id']
y = union_item['count']
plt.scatter(x, y)

#可以通过折线图看共现次数靠后的文章共现次数的分布
plt.plot(union_item['count'].values[40000:])#根据需求调,这里执行结果会发现大概有70000个pair(两篇文章连续,不管先后)至少共现一次

#查看不同类型的新闻出现的次数
plt.plot(user_click_merge['category_id'].value_counts().values)#由此可直观看出新闻类型的关注度

#还可以通过新闻字数的描述性统计发现用户所阅读文章内容的长短,是偏向字数少的还是多的
user_click_merge['words_count'].describe()
#或者通过统计不同用户点击新闻的平均字数,这个可以反映用户是对长文更感兴趣还是对短文更感兴趣。
plt.plot(sorted(user_click_merge.groupby('user_id')['words_count'].mean(), reverse=True))

环境也能成为分析的一个方面,但具体要怎么利用这个“上下文”我还没有很清晰,但是通过随机采样测试集10个用户出来看

def plot_envs(df, cols, r, c):
    plt.figure()
    plt.figure(figsize=(10, 5))
    i = 1
    for col in cols:
        plt.subplot(r, c, i)
        i += 1
        v = df[col].value_counts().reset_index()
        fig = sns.barplot(x=v['index'], y=v[col])
        for item in fig.get_xticklabels():
            item.set_rotation(90)
        plt.title(col)
    plt.tight_layout()
    plt.show()

sample_user_ids = np.random.choice(tst_click['user_id'].unique(), size=10, replace=False)
sample_users = user_click_merge[user_click_merge['user_id'].isin(sample_user_ids)]
cols = ['click_environment','click_deviceGroup', 'click_os', 'click_country', 'click_region','click_referrer_type']
for _, user_df in sample_users.groupby('user_id'):
    plot_envs(user_df, cols, 2, 3)

运行结果可以看出用户的点击环境environment是比较固定的,那可不可以当作我上一篇提到的,就是用户常在的某个地点,成为一个特征利用起来,给用户推荐距离他生活范围更近的一些新闻文章?

四、总结

对于数据的分析可以从用户的角度和物品(新闻)的角度,然后综合起来其实是真的可以得到很多信息,最重要的是要怎么进行梳理和利用,上面我也是按着这两个角度大概汇总了一下,但最后还有一部分对用户点击新闻的时间相关性分析这里没有汇总,因为还不是很能理解,希望有思路能够理解的小伙伴可以留言分享鸭。

五、参考

[1]Datawhale组队学习新闻推荐_数据分析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值