利用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的一些心路历程,从被人疼爱的宝宝逐渐变成了独立的姑娘。

在这里插入图片描述
附上背景图片
在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值