2018最后一天,我分析了自己的朋友圈好友
今天是2018的最后一天,小编和往常一样,拿起手机刷刷朋友圈,看看微博。突然瞄到了一篇公众号提到了‘itchat’。itchat是一个开源的微信个人号接口,使用它调用微信变得非常简单。本文就基于itchat,做个简单的朋友圈好友数据分析。希望明年可以认识更多的好朋友。
这个库非常神奇,爬取个人微信好友相关信息,一共只需两行代码。如下:
1import itchat
2import pandas as pd
3
4#登陆微信
5itchat.auto_login(hotReload=True)
6#获取好友相关信息
7friends = itchat.get_friends(update=True)一句代码登陆微信,一句代码获取好友信息。运行代码会跳出一个二维码,你使用微信手机端APP扫描登陆,然后就会显示你已经登陆成功,如下图:
你会获得关于好友各方面的信息,这里我们仅简单分析了好友的性别、省份、城市和个性签名。
首先是性别。在原始数据里面,性别分别用的是0、1和2表示,0代表该好友没有选择性别,1表示男生,2表示女生。
在小编的好友列表里面,男生比女生稍微多一些。难道因为小编在理工院校的缘故???
在省份方面,因为小编是四川人,并且在四川上学,所以好友也多以四川为主。
因为柱状图不太直观,于是做了热力地图:
看了这张图,小编好友圈居然没有一个西北地方的好友!!!看来是时候拓宽一下交友圈了。
在城市方面,首先是柱状图,不直观,而且大量的数据为1。如下图:
考虑到小编朋友圈四川人数呈压倒性优势,于是仅考虑四川省,做了热力地图如下:
小编是绵阳人,在成都上学。因此,成都市和绵阳市,人数更多,颜色更深。
最后是个性签名,因为个性签名里面有emoji,而显示在字符串里面会变成<span class="emoji emoji1f447"></span>。因此,数据预处理的时候要去掉,<span>内的东西。为方便起见,将各种各样的emoji都统一为emoji。得到词云图,如下:
emoji,喜欢,时间,爱等等,这些都是大家喜欢加在个性签名里面的。似乎验证了小编的好友们极有可能都是正能量满满的呢!
通过一个简单的分析,小编简单认识到了自己的朋友圈好友的分布。希望2019年,能够认识更多不同地方的朋友们,更希望自己可以游历祖国的大江南北
剩余部分全部代码如下:
1#定义函数,提取需要信息
2def get_attr(friends, key):
3 return list(map(lambda user: user.get(key), friends))
4
5#获得我们分析用的数据
6nickname=get_attr(friends, "NickName")
7sex=get_attr(friends, "Sex")
8province=get_attr(friends, "Province")
9city=get_attr(friends, "City")
10signature=get_attr(friends, "Signature")
11data = {'nickname': nickname, 'sex': sex, 'province': province, 'city': city, 'signature':signature}
12data = pd.DataFrame(data, columns=['nickname', 'sex', 'province', 'city', 'signature'])
13
14#绘图
15import matplotlib.pyplot as plt #绘图
16import matplotlib as mpl #配置字体
17import seaborn as sns
18from pyecharts import Map
19sns.set(font='SimHei')
20mpl.rcParams['font.sans-serif'] = ['SimHei']
21sns.set_style("white")
22sns.set_context('notebook')
23
24#性别
25data['sex'] = data['sex'].apply(lambda x: 'male' if x==1 else( 'female' if x==2 else 'unkknown'))
26plt.figure(figsize=(10,10))
27sns.countplot(x=data['sex'],palette="pastel") #上图
28plt.show
29
30#省份
31data['province'] = data['province'].apply(lambda x: 'unknown' if x=='' else x)
32pro = data['province'].value_counts()
33pro_map = Map('中国地图', title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
34pro_map.add('', pro.index, pro.values, is_label_show=True, is_visualmap=True, visual_text_color='#000')
35pro_map.render('pro.html')
36
37plt.figure(figsize=(20, 10))
38sns.barplot(x=pro.index, y=pro.values,palette="Set2")
39sns.set_xticklabels(pro.index, rotation=90)
40plt.show
41
42
43#city
44data['city'] = data['city'].apply(lambda x: 'unknown' if not x else x)
45ct = data['city'].value_counts()
46plt.figure(figsize=(30, 10))
47sns.barplot(x=ct.index, y=ct.values,palette="Set2")
48sns.set_xticklabels(ct.index, rotation=90)
49plt.show
50
51#只考虑四川省
52sc_data = data.query('province == "四川"')
53sc_data['city'] = sc_data['city'].apply(lambda x: 'unknown' if not x else x+'市')
54sc = sc_data['city'].value_counts()
55sc_map = Map('四川', title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
56sc_map.add('', sc.index, sc.values, maptype='四川',is_label_show=True, is_visualmap=True, visual_text_color='#000')
57sc_map.render('sc.html')
58
59#个性签名
60import jieba
61import re
62data['signature'] = data['signature'].apply(lambda x: re.sub(re.compile(r"<span.*?</span>"), "emoji", x) if '<span' in x else x)
63signature=''.join(data['signature'])
64wordlist = jieba.cut(signature, cut_all=False)
65stopwords_chinese = [line.strip() for line in open('stopwords_chinese.txt',encoding='UTF-8').readlines()]
66#过滤点单个字
67word_list=[]
68for seg in wordlist:
69 if seg not in stopwords_chinese:
70 word_list.append(seg)
71
72word_list=pd.DataFrame({'signature':word_list})
73word_rank = word_list["signature"].value_counts()
74
75from pyecharts import WordCloud
76wordcloud_chinese = WordCloud(width=1500, height=820)
77wordcloud_chinese.add("", word_rank.index[0:100], word_rank.values[0:100], word_size_range=[20, 200], is_more_utils=True)
78wordcloud_chinese.render("signature.html")