利用Python对微信好友数据进行分析
一直就想着做个微信好友数据分析,折腾了一天总算是勉强完成了。
本文参考:
微信好友大数据分析
Python基于jieba库进行简单分词及词云功能实现方法
本文会使用到的第三方模块:
- itchat:微信网页版接口封装Python版本,在本文中用以获取微信好友信息。
- jieba:结巴分词的 Python 版本,在本文中用以对文本信息进行分词处理。
- matplotlib: Python 中图表绘制模块,在本文中用以绘制柱形图和饼图
- PIL: Python 中的图像处理模块,在本文中用以对图片进行处理。
- wordcloud: Python 中的词云模块,在本文中用以绘制词云图片。
首先是安装相应的包,我用的是Anaconda3中的spyder,用cmd进入到Anaconda文件下的Scripts文件夹,输入命令pip install itchat,等待安装成功。
导入相关包,运行程序弹出二维码,扫描登录微信,显示连接成功即可
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import itchat
#弹出二维码,登录自己的微信
itchat.login()
获取好友相关数据,保存到变量friends内
仔细观察了一下返回的数据结构,发现”性别“是存放在一个字典里面的,key是”Sex“,男性值为1,女性为2,其他是不明性别的。可以写个循环获取性别数据,得到自己微信好友的性别比例
friends = itchat.get_friends(update=True)[0:]
#初始化计数器
male = female = other = 0
for i in friends[1:]:
sex = i['Sex']
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
#查看好友总数
total = len(friends[1:])
分析微信好友男女比例情况并绘制柱状图
print('男性好友:%.2f%%' % (float(male)/total*100))
print('女性好友:%.2f%%' % (float(female)/total*100))
print('不明性别好友:%.2f%%' % (float(other)/total*100))
label_name = ['Boy','Girl','Unknow']
gender_list = [male,female,other]
plt.figure(figsize=(8,4))
colors = ['yellowgreen','red','lightskyblue']
plt.bar(range(len(gender_list)),gender_list,tick_label=label_name,color=colors)
plt.grid()
plt.xlabel('性别')
plt.ylabel('人数')
plt.show()
x = np.arange(3)
y = np.array(gender_list)
for a,b in zip(x,y):
plt.text(a,b+0.1,b,ha='center',va='bottom',fontsize=12)
从图中可以看出微信好友男女比例人差的不是很多,主要我微信人数太少了,这数据说明不了啥,但是仔细一想主要是上了大学才玩的微信,多数好友为自己学院的同学,加上学院男女比例均衡,所以我好友中男女比例没有失调。
定义函数,获取好友指定的信息并转换成DataFrame
#定义函数,获取好友的其他信息
def get_var(var):
variable = []
for i in friends[1:]:
value = i[var]
variable.append(value)
return variable
NickName = get_var('NickName') #昵称
Sex = get_var('Sex') #性别
Province = get_var('Province') #省份
City = get_var('City') #城市
Signature = get_var('Signature') #个性签名
#转化成DataFrame
data = pd.DataFrame({'NickName':NickName,
'Sex':Sex,
'Province':Province,
'Signature':Signature})
接下来对好友的城市分布进行分析
#统计好友的城市分布
city_dict = {}
x_city = []
y_city = []
for city_name in City:
if city_name in city_dict:
city_dict[city_name] += 1
else:
city_dict[city_name] = 1
city_list = sorted(city_dict.items(),key=lambda item:item[1],reverse=True)
for i in city_list[1:10]:
x_city.append(i[0])
y_city.append(i[1])
plt.figure()
plt.bar(range(len(x_city)),
y_city,
tick_label=x_city)
plt.grid()
plt.title('微信好友城市分布')
x = np.arange(len(x_city))
y = np.array(y_city)
for i,j in zip(x,y):
plt.text(i,j+0.1,j,ha='center',va='bottom',fontsize=9)
从图中可以看出好友的城市分布,排名第一的赣州正是自己家乡,第二的九江是自己所在学校,第三的珠海是由于暑假工时期交的朋友,这个图一出来有些记忆就比较清晰的浮现在脑海了,如果随着微信的继续使用,这些好友的城市分布数据也可以反映出自己成长的轨迹图。
接下来就是制作自己微信好友个性签名的自定义词云图
#根据个性签名绘制词云图
import re
Signature_list = []
for i in friends:
signature = i['Signature'].strip().replace('span','').replace('class','').replace('emoji','').replace('""','')
rep = re.compile('1f\d+\w*|[<>/=]')
signature = rep.sub('',signature)
Signature_list.append(signature)
text = ''.join(Signature_list)
import jieba
wordlist = jieba.cut(text, cut_all=False)
words =' '
for word in wordlist:
words = words + word + ' '
print(words)
from wordcloud import WordCloud,ImageColorGenerator
import PIL.Image as Image
coloring = np.array(Image.open('C:\\Users\\Administrator\\Desktop\\微信朋友数据分析\\wangye.jpg'))
my_wordcloud = WordCloud(background_color='white',
max_words=200,
mask=coloring,
max_font_size=80,
random_state=42,
scale=2,
width=960,height=720,
font_path='C:\\Windows\\Fonts\\SimHei.ttf')
my_wordcloud.generate(words)
image_colors = ImageColorGenerator(coloring)
plt.figure()
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()
说明:
首先对好友的个性签名进行数据清洗,用正则表达式去掉一些干扰符号,接着导入jieba包对中文句子进行分词,用空格将所有分词隔开,输出查看分词结果,可以得到好友个性签名里的所有词语,最后进行词云的绘制
从词云图中可以看出我微信朋友里基本都是积极向上的,最显眼的词语比如努力、自己、人生(life)、学习等。感觉凑起来就是自己在生活中只有努力学习才能活出人生的精彩,当然有的朋友会有遗憾,比如辜负,无法弥补等词语。其实吧人生都是一个不断前进的过程,没必要抓住过去不放,好好珍惜当下才是。还有姑娘和宝宝两个显示的词语,这大概是girl的一些心路历程,从被人疼爱的宝宝逐渐变成了独立的姑娘。
附上背景图片