Written by wanping7
from datetime import datetime
# data process
import numpy as np, pandas as pd
from datetime import datetime, timedelta
# visualize
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
%config ZMQInteractiveShell.ast_node_interactivity='all'
import plotly.express as px
import plotly.graph_objects as go
import plotly.figure_factory as ff
from plotly.subplots import make_subplots
# sys
import os, sys
import warnings
warnings.filterwarnings('ignore')
# 大小设置
sns.set(rc={
'figure.figsize':(13,7)})
# 风格设置
sns.set_style("whitegrid")
PATH = "../data/"
结论
每个CSV文件用户-项目点击分布
- 用户点击:呈现右尾分布,log1p近似正态。
- 项目被点击:呈现右尾分布,但是在点击量很高的商品中也出现了一个峰,可能是热点商品。
- 时间【最小,90分位数,最大】分布:发现时间随文件重心慢慢转移,说明文件分割是有一定时间顺序。每个均为四个峰左右,说明是四五天左右的数据。
- 每个文件:用户量1700 、项目项4100
- 整体文件:用户量2900 、项目项8900
整体CSV文件用户-项目点击分布
- 1546265点击中,将近一半有重复点击
- 时间分布:
- 9个峰,大概是前后9天的数据
- 最左边与最右边数据量较中间小,可能左右并非完整的一天数据或者中间包含节假日、促销等成分
用户画像与用户点击
- 用户画像中有6786个用户,整个训练点击数据用户量在29128,说明有用户画像的只是一部分。
- 用户画像中三个用户重复信息:两个用户年龄变化(更新),一个用户城市变化。
合并数据分布
以下分析均为有用户画像的点击数据
- 这些有用户画像的数据:
- 用户点击量较整体大
- 项目点击量较整体小
- 总结:这些有用户画像的人,更爱多次点击那种稀有的物件(可能是需要反复对比的奢饰品牌)
有用户画像——性别、年龄、城市分布
- 男女随时间点击趋势均呈现周期性(天)
- 各年龄阶段的访问量大致呈正态分布
- 从城市level看不出城市背后的真实等级
- 男女在年龄上的点击量存在差异性,比如年龄阶段6
- 男女在城市上的点击量差异性看不出。
TEST_PATH = PATH + "underexpose_test/"
TEST_DIRS = os.listdir(TEST_PATH)
TEST_FILES = [i for i in TEST_DIRS if ("underexpose_test_" in i) and ".csv" in i]
TEST_FILES
# # 输出所有文件和文件夹
# for file in dirs:
# print(file)
['underexpose_test_click-0.csv',
'underexpose_test_click-1.csv',
'underexpose_test_click-2.csv',
'underexpose_test_click-3.csv',
'underexpose_test_click-4.csv',
'underexpose_test_click-5.csv',
'underexpose_test_qtime-0.csv',
'underexpose_test_qtime-1.csv',
'underexpose_test_qtime-2.csv',
'underexpose_test_qtime-3.csv',
'underexpose_test_qtime-4.csv',
'underexpose_test_qtime-5.csv']
TRAIN_PATH = PATH + "underexpose_train/"
TRAIN_DIRS = os.listdir(TRAIN_PATH)
TRAIN_FILES = [i for i in TRAIN_DIRS if ("underexpose_" in i) and ".csv" in i]
TRAIN_FILES
# # 输出所有文件和文件夹
# for file in dirs:
# print(file)
['underexpose_item_feat.csv',
'underexpose_train_click-0.csv',
'underexpose_train_click-1.csv',
'underexpose_train_click-2.csv',
'underexpose_train_click-3.csv',
'underexpose_train_click-4.csv',
'underexpose_train_click-5.csv',
'underexpose_user_feat.csv']
TRAIN_PATH = PATH + "underexpose_train/"
Click特征
-
underexpose_train_click-T.csv/underexpose_test_click-T.csv
- user_id
- item_id
- time:点击事件发生时的时间戳,即(unix_timestamp - random_number_1)/ random_number_2
1 训练Click特征
1.1 每个CSV文件用户-项目点击分布
- 用户点击:呈现右尾分布,log1p近似正态。
- 项目被点击:呈现右尾分布,但是在点击量很高的商品中也出现了一个峰,可能是热点商品。
- 时间【最小,90分位数,最大】分布:发现时间随文件重心慢慢转移,说明文件分割是有一定时间顺序。每个均为四个峰左右,说明是四五天左右的数据。
- 每个文件:用户量1700 、项目项4100
- 整体文件:用户量2900 、项目项8900
# 大小设置
sns.set(rc={
'figure.figsize':(17, 3)})
# 风格设置
sns.set_style("whitegrid")
TRAIN_CLICK_FILES = [i for i in TRAIN_FILES if "underexpose_train_click" in i]
names=["user_id", "item_id", "time"]
for i, TRAIN_CLICK_FILE in enumerate(TRAIN_CLICK_FILES):
train_click = pd.read_csv(TRAIN_PATH + TRAIN_CLICK_FILE, header=None, names=names)
#################### 拼接所有train_click数据
if i == 0:
merge_train_click = train_click
else:
merge_train_click = pd.concat([merge_train_click, train_click], axis=0)
#################### 用户click统计
user = train_click[["user_id"]].groupby(["user_id"]).size().reset_index()
user.columns = ["user_id", "click"]
#################### 项目click统计
item = train_click[["item_id"]].groupby(["item_id"]).size().reset_index()
item.columns = ["item_id", "click"]
#################### 用户、项目click可视化
f, axes = plt.subplots(1, 5)
######## user-click
g0 = sns.kdeplot(user["click"], color="Red", shade = True, ax=axes[0])
x = g0.set_xlabel("user-click")
x = g0.set_ylabel("Frequency")
g = g0.legend([TRAIN_CLICK_FILE])
## user-click log
g01 = sns.kdeplot(np.log(user["click"]), color="Red", shade = True, ax=axes[1])
x = g01.set_xlabel("LOG_user-click")
x = g01.set_ylabel("Frequency")
g = g01.legend([TRAIN_CLICK_FILE])
######## item-click
g1 = sns.kdeplot(item["click"], color="Blue", shade = True, ax=axes[2])
x = g1.set_xlabel("item-click")
x = g1.set_ylabel("Frequency")
g1 = g1.legend([TRAIN_CLICK_FILE])
## item-click log
g11 = sns.