豆瓣读书数据分析-python
(思路来自课程老师绿树)刚刚学完python数据分析的课程,决定做一个有关python数据分析的小项目,思来想去,还是决定分析豆瓣的数据,因为豆瓣是python写成的。用python爬虫抓取数据较为方便,比一般网站少很多页面bug问题,而且豆瓣上的数据量大概在million这个量级,算是算太大的,但也不小。正好手里有一份跑出的大概300多万的数据,直接开始分析。
首先导入数据,将数据赋给一个dataframe,取名为douban
douban=pd.read_table("douban.dat",sep="::",names=["user","book","rate"])

看一下这个数据的描述

总共3648104行,其他的诸如平均数,中位数的值,是豆瓣书籍的链接后缀,并无实际意义。
然后关于豆瓣读书用户
user_count=douban.groupby('user').count()
user_count=user_count.sort('book',ascending=False)


、我们发现共有38万多读者,计数最多的一位eastwolf东狼,真的很厉害,一共写了4000多的书评。不过我们不排除这是个机器人或者公众号,因为4000度书评,就算一天看一本书,也要写11年,而豆瓣创建才不过11年。有点假,不过这个问题我们暂且不谈,仅从数据来看,第一名最爱读书的书霸,就是eastwolf了,大家鼓掌。
然后我们再来看一下书籍的信息
看一下描述

最受欢迎的书有2071个书评,平均每本书大概有45个书评。
看一下具体情况

我们挑出书评最多的10本,找到图片,就是以下这10本书

可以发现由于不同出版社不同翻译的问题,10本书实际是4本,豆瓣果然是文艺青年聚集地,《小王子》《追风筝的人》《活着》几乎就是文艺青年必备了。
豆瓣做为文艺青年聚集地,本身用户属于素质较高的群体。里面分很多小组,读书,电影,音乐,算是给大家找志同道合之友的好地方。关于读书这个方面,在大家都很爱读书的基础上,我们可以用户进行聚类分析。依靠的根据是对书籍的打分,这样来计算不同用户之间的距离。因为读的书目越相似,对同一本书打分结果越接近,说明价值观越相同,找出这样的相似者,就能给用户推荐一下潜在的‘同志’,算是给豆瓣增加一个社交功能了。
首先我们把用户信息和书本信息结合,因为考虑到大部分书籍用户之间交集为空,而且我的电脑的处理能力有限,所以截取了用户和书籍的前100进行分析,这样得到一个新的dataframe


然后我们建立邻近性矩阵
ubrcore=doubancore.pivot('user','book','rate')

即使在取前100的条件下,依然大部分是空白,为了能够计算,我们把空白处替换成0.
ubrcore1=ubrcore.fillna(value=0)
然后对要进行距离计算,由于本身对书本的打分在1到5之间,纯粹的大小差距并不大,所以我们更多的考虑在方向上的差异,所以用余弦距离来反应不同用户之间的差异性。


构建公式,并将计算结果给userdistdf这个dataframe
Userdistdf结果如下
最像用户的就是他自己,余弦距离都是1。其他人只能是部分相像,果然人生得一知己难啊。不过知己找不到,我们可以给用户找10个部分相像的‘同志’
构建函数
试一下
Bingo,成功!!!!
这样,我们可以为用户qdmimi19810920找到了10个志同道合的‘同志’了。
网友评论