程序员分析微信好友后的惊天发现

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事

640?wx_fmt=png

图片源自:モブサイコ100

作者

码农

如需转载,请联系原作者授权。


今天我将带领大家一起来看看微信好友里面的秘密,主要从两个方面开始分析:性别,好友所在位置,采用饼图和地图两种方式呈现出其特点和数据结果。话不多说,我们一起来看看吧!


实现原理:

通过 itchat 来登陆微信网页版,来获取微信好友信息,其中可以获取到:性别、昵称、签名、位置等,但是我们这里只要用到性别和位置,主要用到的库有下面几种,请大家先自行安装好,尤其需要注意的是,用 pyecharts 生成地图需要自行安装好对应的地图包,详情请看代码解析。


 
 

import itchat               # 登陆微信,获取朋友信息的库
import collections           # 计数用的库
import matplotlib.pyplot as plt # 画饼图用的库
from matplotlib.font_manager import FontProperties # 解决图片中文乱码
from pyecharts import Map       # 画地图用的库
from pyecharts import Geo       # 画地图二

pip install echarts-countries-pypkg    #全球国家地图: echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图
pip install echarts-china-provinces-pypkg # 中国省级地图: echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区
pip install echarts-china-cities-pypkg  # 中国市级地图: echarts-china-cities-pypkg (3.8MB):370 个中国城市
pip install echarts-china-counties-pypkg # 中国县区级地图: echarts-china-counties-pypkg (4.1MB):2882 个中国县·区
pip install echarts-china-misc-pypkg   # 中国区域地图: echarts-china-misc-pypkg (148KB):11 个中国区域地图,比如华南、华北


微信好友信息获取:

分析微信好友数据的前提是获得好友信息,通过使用 itchat 这个模块,这一切会变得非常简单,我们通过下面两行代码就可以实现,同平时登录网页版微信一样,我们使用手机扫描二维码就可以登录,这里返回的 friends 是一个集合,第一个元素是当前用户,也就是你自己,集合中的每一个元素都是一个字典结构,可以注意到这里有Sex、City、Province、NickName、Signature等等,当然我们只需要 Sex, City,Province 即可。


 
 

itchat.login()          # 登陆微信网页版
friends = itchat.get_friends(update=True)[0:] # 获取当前微信好友信息
print(friends)


640?


性别比例分析:

由于 friends 集合里第一个表示的是自己,所以我们从第二个开始获取,使用 matplotlib 模块绘制出饼图,具体的代码实现如下,每行我都有非常详细的代码解析,相信大家能够看明白:


 
 

sexs = list(map(lambda x: x['Sex'],friends[1:]))

# 解释下这行代码,微信中性别字段的取值有Unkonw、Male和Female三种,其对应的数值分别为0、1、2。
# 我们将会得到如 sexs = [1,0,1,0,1,0,1,0,2,1,1,2,1] 的集合
# 这行代码语法看不懂的,可以对应看这下面行代码帮助语法上的理解 ,
# map(lambda x: x ** 2, [1, 2, 3, 4, 5])  会得到 [1, 4, 9, 16, 25]

sex_counts = [0,1,2]
sex = collections.Counter(sexs) # 通过Collection模块中的Counter()对这三种不同的取值进行统计
counts = []                     # 性别统计结果
for i in sex_counts:            # 按照 0,1,2 的顺序统计出相应的性别,
   counts.append(sex[i])
print(counts)
labels = ['Unknow','Male','Female'] # 设置饼图的标签
colors = ['red','blue','coral']     # 设置饼图的颜色
explode = [0,0,0.1]                 # 0.1 凸出这部分,female
plt.figure(figsize=(8, 8))          # 设置绘图对象的大小
plt.axes(aspect=1)                  # 参数设置这个饼为正圆
plt.pie(counts,                     # 性别统计结果
       labels=labels,              # 性别展示标签
       colors=colors,              # 饼图区域配色
       explode=explode,            # 凸出部分
       labeldistance=1.1,          # 标签距离圆点距离,1.1指1.1倍半径的位置
       autopct='%3.1f%%',          # 饼图区域文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
       shadow=False,               # 饼图是否显示阴影
       startangle=90,              # 起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
       pctdistance=0.6             # 饼图区域文本距离圆点距离
       )
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15) # 解决 Windows 环境下乱码问题
plt.title(u'Fightjiang 的微信好友性别比例', fontproperties=font_set)
plt.show()


这是我的微信好友性别比例,可以非常明显的看出男女比例严重失衡,这也难怪程序员单身一大片,社交圈里就没几个女的,不单身就怪了,注意其中的 Unknow 不是代表人妖,是有些微信好友没有填写自己的性别的,不要乱想哟。


640?

微信好友所在位置:

跟上面的做法一样,先提取微信好友所在地的信息,这里我们使用 pyecharts 模板来将信息在地图上显示出来,是为了方便大家更直接的看到数据信息,这是地图一,是根据微信好友所在省会生成出来的,详情请看代码解析:


 
 

attr = ['安徽', '北京', '福建', '广东', '贵州', '海南', '河北', '河南', '黑龙江',
       '湖北', '湖南', '吉林', '江苏', '辽宁', '山东','山西', '陕西', '上海',
       '四川', '天津', '云南', '浙江', '重庆']
friend = []    # 好友所在的省份
for i in friends[1:]:
   friend.append(i['Province'])
print(friend)
location = collections.Counter(friend) #  一个迭代对象生成的counter

value = []     # weixin1 Map
for i in attr:  # value 每个省会对应的数量
   value.append(location[i])
print(value)
map = Map(u"Fightjiang 各省微信好友分布","正经的码农",width=1200, height=600)
map.add("", attr, value, maptype='china', is_visualmap=True,
       visual_text_color='#000')
#map.show_config()
map.render('weixin1.html')


640?


地图二,是根据微信好友所在城市生成出来的,由于有些好友在填写城市时,有些是乱填,有些是外国城市,所以这里可能需要大家自行调节一下,当然代码中我已经去掉英文城市名和没有填写的情况,具体请看代码解析。


 
 

City = [] # 微信好友所在城市
for city in friends[1:]:
   City.append(city['City'])
Citys = collections.Counter(City) # 每个城市对应的数量

values = []                  # weixin2 Map
for city in set(City):           # values 每个城市对应的数量
   if(city != ''and city.isalpha()): # 除去没有城市的 和 外国城市
       values.append((city,Citys[city]))
print(values)

geo = Geo(u"Fightjiang 各省微信好友分布", u"正经的码农",
         title_color="#fff", title_pos="center",
         width=1200, height=600, background_color='#404a59')
attr, value = geo.cast(values)
geo.add("", attr, value, visual_range=[0, 200],
       visual_text_color="#fff", symbol_size=15, is_visualmap=True)
#  geo.show_config()
geo.render("weixin2.html")


640?


地图二相比地图一能更直观的放映出微信好友在地图上的密集度,大家通过上面两张图片的数据展示,大概可以猜出我在那个省会的吧,在微信公众号后台发送「微信好友」即可获得完整代码。


当大量的数据汇集在一起的时候,通过数据分析和处理将数据可视化,往往会有惊人的发现,你也可以试试哟!


- The End -

「若你有原创文章想与大家分享,欢迎投稿。」

加编辑微信ID,备注#投稿#:

程序 丨 druidlost  

小七 丨 duoshangshuang


上期精彩内容

640?wx_fmt=png

640?wx_fmt=gif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值