简单分析
已经有了pandas的dataframe,下面就可以对数据进行简单的分析了
比如:
click_all.info()
查看各列的唯一数总数
for col in click_all.columns:
print(col,click_all[col].nunique())
各列的汇总
click_all.describe()
看到统计信息里面不包含product_id 和industry,说明里面可能有字符串信息,肉眼观察发现里面有一些数据被标记为\N,我这里处理的方式比较简单粗暴,就是使用0进行替换
click_all["product_id"]=click_all['product_id'].apply(lambda x : 0 if x == '\\N' else x)
click_all["industry"]=click_all['industry'].apply(lambda x : 0 if x == '\\N' else x)
替换完成后再整理一下数据类型
click_all["product_id"]=click_all["product_id"].astype(np.int32)
click_all["industry"]=click_all["industry"].astype(np.int32)
click_all = reduce_mem_usage(click_all)
click_all.info()
这样就可以了,虽然还有特征工程要做,但是这样的数据已经达到了输入到模型中进行训练的最基本的要求了。
pandas还有一个强大的功能就是可以建立直方图帮我们观察数据的分布
cols=["creative_id", "click_times", "ad_id",
"product_id", "advertiser_id", "industry", ]
for col in cols:
if col=="type":
continue
click_all.hist(col)
这条语句会显示所有列的直方图,我们以一个为例:
点击次数中我们看到大部分数据都分布在25以内,但是他的最大值是185。
我们继续使用箱型图印证对于click_times的观点,使用箱型图可以查看
click_all.boxplot("click_times",vert=False, grid = True)
看到这个图对数据分析有过理解的小伙伴一定就知道了,我们可以看一下
# 上四分位数
cl=click_all["click_times"]
q3 = cl.quantile(q=0.75)
#下四分位数
q1 = cl.quantile(q=0.25)
print(q3,q1)
上四分位数和下四分位数都是1,我们根本就不需要查看异常值了,这就说明都会被算作异常值
#可以试试这个代码,看看怎么判断
cl01 = cl[(cl>q3+1.5*iqr) | (cl<q1-1.5*iqr)]
看看这些值到底是什么样的
click_all[click_all["click_times"]>100]
大于100的click大部分都是test数据集的,这里肯定是一个坑。
这里我们指定了click_times,如果不指定pandas会绘制所有列的箱型图,但是由于数据级数不一样,所以合并看意义不大。
最后我们来看一下对于每个用户,每天都有多少次点击:
user=click_all.groupby(["time","user_id"])['click_times'].count().reset_index(name="count")
user[user["count"]>2000]
还有每天点击大于2000的用户
user.boxplot("count",vert=False, grid = True)
# 上四分位数
cl=user["count"]
q3 = cl.quantile(q=0.75)
#下四分位数
q1 = cl.quantile(q=0.25)
print(q3,q1)
iqr = q3-q1
print("上四分位数:{}\n下四分位数:{}\n四分位差{}".format(q3,q1,iqr))
cl01 = cl[(cl>q3+1.5*iqr) | (cl<q1-1.5*iqr)]
print("异常值:\n{}".format(cl))
异常值我们先不管,这里能明显的看出,肯定有一部分数据是垃圾数据,或者说一部分用户是干扰用户,可以再深入研究下将其删除
本篇文章就先讲这么多吧,最后祝大家比赛取得好成绩