使用FEA Spk探索经典数据集MovieLens

原创
2017/06/15 21:19
阅读数 118

有一种烦恼

叫“巧妇难为无米之炊”

一身的好技术

却苦于没有原料而无法发挥

相信很多想练手的FEA数据分析师

也有为找不到可以分析的数据集而烦恼的时候吧

今天我就告诉大家一个获取数据集的好地方

不用爬虫

合规使用

它就是MovieLens数据集

MovieLens数据集包括电影元数据信息和用户属性信息。常常用来做推荐系统,机器学习算法的测试数据集。

尤其在推荐系统领域,很多著名论文都是基于这个数据集的。

下载地址为:http://files.grouplens.org/datasets/movielens/,有好几种版本,对应不同数据量,可选用。

本文下载数据量最小的100k版本,对该数据集进行探索:

初步预览

1. 首先是用户信息:

其中各列数据分别为:

用户id | 用户年龄 | 用户性别 | 用户职业 | 用户邮政编码

2. 然后是影片信息:

其中前几列数据分别为:

影片id | 影片名 | 影片发行日期 | 影片链接 | (后面几列先不去管)

3. 最后是评分数据:

其中各列数据分别为:

用户id | 影片id | 评分值 | 时间戳(timestamp格式)

探索用户数据

1. 打开fea界面,执行以下原语

#创建spk连接

spk = @udf df0@sys by spk.open_spark

#加载|为分隔符的u.user文件

df= @udf spk by spk.load_format with (|,/sample/u.user)

给df表更换列名

df=@udf df by spk.renameall with (uid,age,sex,profession,code)

#查看加载后的数据,默认显示前10行

a= @udf df by spk.dump

dump a

2. 分别统计用户,性别,职业的个数:

df1=@udf df by spk.loc with (uid) #选择uid这列

a=@udf df1 by spk.count      #统计用户数

dump a

df2=@udf df by spk.loc with (sex) #选择sex这列

df2=@udf df2 by spk.distinct     #对sex进行去重

a=@udf df2 by spk.count        #统计性别数

dump a

df3=@udf df by spk.loc with (profession) #选择profession这列

df3=@udf df3 by spk.distinct     #对profession进行去重

a=@udf df3 by spk.count        #统计职业数

dump a

df4=@udf df by spk.loc with (code) #选择code这列

df4=@udf df4 by spk.distinct     #对code进行去重

a=@udf df4 by spk.count        #统计邮编数

dump a

3. 查看年龄分布情况:

df5=@udf df by spk.loc with (age) #选择age这列

df51=@udf df5 by spk.df_agg_count with (age) #对age字段分组统计

df52= @udf df51 by spk.order with (age)

#对df51表按照age字段进行升序排列

a=@udf df52 by spk.to_DF

dump a

下面使用fea画出图,如下所示

  • 18岁以上观看者人数激增,估计是“高考”完了时间多了?

  • 20多岁的年轻人,我猜主要是大学生和刚工作不久的年轻人?观看者最多。

  • 然后50岁的观看者也蛮多的,估计是快退休了,开始享受生活了。

4.查看职业分布情况:

df6=@udf df by spk.loc with (profession) #profession这列

df61=@udf df6 by spk.df_agg_count with (profession)

#对profession字段分组统计

b=@udf df61 by spk.to_DF

dump b

使用fea 做出图,如下所示

果然,是学生,教育工作者观看影片的多。

不过程序猿观众也不少...... 医生是最少看电影的。

探索电影数据

打开fea界面,运行以下命令

m= @udf spk by spk.load_format with (|,/sample/u.item)

a=@udf m by spk.dump

dump a

我们需要的数据是

影片id | 影片名 | 影片发行日期 | 影片链接 |

m= @udf m by spk.loc with (_c0,_c1,_c2,_c4)#选择这四列

m= @udf m by spk.renameall with (pid,pname,pdate,plink)

#为这四列重命名

a=@udf m by spk.dump

dump a

可以看到我们所要的数据了

a=@udf m by spk.count  #统计有多少部电影

dump a

c= @udf m by spk.df_null_count with (pid,pname,pdate,plink)

#统计这四个字段是否有空值,有多少个空值

dump c

m= @udf m by spk.drop_null with (pdate)

#将pdate字段为null的过滤掉

c= @udf m by spk.df_null_count with (pid,pname,pdate,plink)

dump c

可以看到已经过滤掉了

m1= @udf m by spk.opfield with (pid:pname:substring(pdate,-4,4):substring(pdate,-4,4) as time:plink)

#选择pid列,pname列,pdate列提取出年份列名为substring(pdate,-4,4)

substring(pdate,-4,4)列重命名为time,plink列

p= @udf m1 by spk.dump

dump p

可以看到多了一列substring(pdate,-4,4)

m1= @udf m1 by spk.df_drop_col with (substring(pdate, -4, 4))

#删除substring(pdate, -4, 4)这列

p= @udf m1 by spk.dump

dump p

m2= @udf m1 by spk.opfield with (1998-time)

#因为这份数据集比较老,1998年提供的,所以就按当时的电影年龄来统计吧

m2= @udf m2 by spk.rename with ((1998 - time):age)

#将(1998 - time)字段命名为age字段

m3= @udf m2 by spk.df_agg_count with (age)

#对age字段进行分组统计

m3= @udf m3 by spk.alter with (age:int)

#将age字段的类型修改为int类型

m3= @udf m3 by spk.order with (age)

#按照m3表的age字段升序排列

c= @udf m3 by spk.to_DF

dump c

使用fea作图如下

可以看到,大部分电影还是比较新的

探索评级数据

打开fea的界面,输入以下原语

u= @udf spk by spk.load_format with (\t,/sample/u.data) 

u=@udf u by spk.renameall with (uid,pid,rating,time)

#给四列数据重命名

p=@udf u by spk.count#统计有多少条评分记录

dump p

p=@udf u by spk.dump  #查看表的数据

dump p

u1= @udf u by spk. df_desc with (rating)

#查看rating字段的最大值,最小值,平均值等指标

p=@udf u1 by spk.dump

dump p

u2=@udf u by spk.df_agg_count with (uid)

#统计不同用户的评分次数

p=@udf u2 by spk.dump

dump p

u3= @udf u by spk.df_agg_count with (rating)

#对评分数据进行分组统计

u3= @udf u3 by spk.order with (rating)

#按照rating字段升序

d= @udf u3 by spk.to_DF

dump d

使用fea作图如下

评分分布看来也应该挺满足正态分布的。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部