有一种烦恼
叫“巧妇难为无米之炊”
一身的好技术
却苦于没有原料而无法发挥
相信很多想练手的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作图如下
评分分布看来也应该挺满足正态分布的。