天池新闻推荐入门赛之【数据分析】Task02

天池新闻推荐入门赛之【数据分析】Task02

数据分析

导包

%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")

读取数据

path = './'
train_click = pd.read_csv('./train_click_log.csv')
item_df = pd.read_csv('./articles.csv')
item_emb_df = pd.read_csv('./articles_emb.csv')

数据预处理

1)按照时间戳排序

train_click['rank'] = train_click.groupby('user_id')['click_timestamp'].rank(ascending=False, method='first').astype(int)

2)计算用户点击文章的次数

train_click['click_cnts'] = train_click.groupby(['user_id'])['click_timestamp'].transform('count')

数据浏览

用户点击日志文件和新闻介绍文件合并

train_click = train_click.merge(item_df, how='left', on=['click_article_id'])

train_click_log.csv文件数据中每个字段的含义

user_id: 用户的唯一标识
click_article_id: 用户点击的文章唯一标识
click_timestamp: 用户点击文章时的时间戳
click_environment: 用户点击文章的环境
click_deviceGroup: 用户点击文章的设备组
click_os: 用户点击文章时的操作系统
click_country: 用户点击文章时的所在的国家
click_region: 用户点击文章时所在的区域
click_referrer_type: 用户点击文章时,文章的来源

# 训练集不重复的用户的个数
train_click['user_id'].nunique()
# 训练集里面每个用户至少浏览过2篇新闻
train_click.groupby(['user_id'])['click_article_id'].count().min()

直方图显示基本的属性分布

plt.figure(figsize=(15, 20))
num = 1
columns_candidate_list = train_click.columns.tolist()
columns_candidate_list = columns_candidate_list[1:]
columns_candidate_list = columns_candidate_list[:-3]
for col in columns_candidate_list:
    plot_envs = plt.subplot(5, 2, num)
    num+=1
    tmp_df = train_click[col].value_counts().reset_index()[:10]
    fig = sns.barplot(x=tmp_df['index'], y=tmp_df[col])
    for item in fig.get_xticklabels():
        item.set_rotation(-45)
    plt.title(col)
plt.tight_layout()
plt.show()

不同的特质的直方图展示
从点击时间clik_timestamp来看,分布较为平均,可不做特殊处理。由于时间戳是13位的,后续将时间格式转换成10位方便计算。

从点击环境click_environment来看,仅有1922次(占0.1%)点击环境为1;仅有24617次(占2.3%)点击环境为2;剩余(占97.6%)点击环境为4。

从点击设备组click_deviceGroup来看,设备1占大部分(60.4%),设备3占36%。

数据分析

用户重复点击

user_click_count = user_click_merge.groupby(['user_id', 'click_article_id'])['click_timestamp'].agg({'count'}).reset_index()
user_click_count[user_click_count['count']>7]

在这里插入图片描述
用户点击新闻次数

user_click_count.loc[:, 'count'].value_counts()

在这里插入图片描述
用户点击环境变化分析

def plot_envs(df, cols, r, c):
    plt.figure(figsize=(10, 5))
    i = 1
    for col in cols:
        plt.subplot(r, c, i)
        i+=1
        tmp_df = df[col].value_counts().reset_index()
        fig = sns.barplot(x=tmp_df['index'], y=tmp_df[col])
        for item in fig.get_xticklabels():
            item.set_rotation(-45)
        plt.title(col)
    plt.tight_layout()
    plt.show()
# 分析用户点击环境变化是否明显,这里随机采样10个用户分析这些用户的点击环境分布
sample_user_ids = np.random.choice(train_click['user_id'].unique(), size=5, replace=False)
sample_user = 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_user.groupby(['user_id']):
    plot_envs(user_df, cols, 2, 3)

在这里插入图片描述
用户点击新闻数量分布

user_click_item_count = sorted(user_click_merge.groupby(['user_id'])['click_article_id'].count(), reverse=True)
plt.plot(user_click_item_count)

在这里插入图片描述
新闻点击次数分析

item_click_count = sorted(user_click_merge.groupby(['click_article_id'])['user_id'].count(), reverse=True)
plt.plot(item_click_count)

在这里插入图片描述
新闻共现频次:两篇新闻连续出现的次数

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.describe()

在这里插入图片描述

x = union_item['click_article_id']
y = union_item['count']
plt.scatter(x, y)

在这里插入图片描述
新闻文章信息

#不同类型的新闻出现的次数
plt.plot(user_click_merge['category_id'].value_counts().values)

在这里插入图片描述
用户点击的新闻类型的偏好
此特征可以用于度量用户的兴趣是否广泛

plt.plot(sorted(user_click_merge.groupby('user_id')['category_id'].nunique(), reverse=True))

在这里插入图片描述
用户查看文章的长度的分布

plt.plot(sorted(user_click_merge.groupby('user_id')['words_count'].mean(), reverse=True))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值