基于python分析微信好友的性别分布,区域分布,词云分析,头像拼接

简介: 的工资大体是你最好的五个朋友的平均数(可以视情况去除一个最高值和最低值,万一人家拆迁了),那性格是不是大多也可以这么推理呢 你知道你的好友签名正能量多还是负能量多吗, 你知道你的好友全国分布吗

  你知道你的微信好友男生多还是女生多吗,(单身?应该能立马答出来吧)

   你知道你的微信好友都是什么性格吗,话说你的工资大体是你最好的五个朋友的平均数(可以视情况去除一个最高值和最低值,万一人家拆迁了),那性格是不是大多也可以这么推理呢

   你知道你的好友签名正能量多还是负能量多吗,

   你知道你的好友全国分布吗

不,你不知道

知道了还怎么看我下面的文章

通过安装第三方工具包itcaht,我们可以通过二维码登陆微信,然后获得我们的好友信息,如下图所示

 

itchat.auto_login(hotReload=False)
friends = itchat.get_friends(update=True)

然后获取你所有friends的数据,我们可以看到数据是以字典形式呈现的,第一个元素是当前用户。所以,在下面的数据分析流程中,我们始终取friends[1:]作为原始输入数据,集合中的每一个元素都是一个字典结构,以我本人为例,可以注意到这里有Sex、City、Province、HeadImgUrl、Signature这四个字段,我们下面的分析就从这四个字段入手:

1.微信好友性别分布

首先分析好友性别,可以从friends中的Sex中提取出来,然后统计出来男性,女性和未知性别分别有多少,由于小编的好友都是编程爱好者,所以男性占了绝大部分,当然热爱编程的女性好友也是有一定数量滴,可以大致了解在互联网行业男女的比例了,男女比例5:1,按照法定夫妻1:1配比,那么还有剩下的4分男生可以。。。。。当我没说

image.png


一行数据好友性别分布

 

def analyseSex(firends):
    sexs = list(map(lambda x: x['Sex'], friends[1:]))
    counts = Counter(sexs).items()
    counts = sorted(counts, key=lambda x: x[0], reverse=False)
    counts = list(map(lambda x: x[1], counts))
    labels = ['女性', '男性', '未知']
    colors = ['red', 'yellowgreen', 'lightskyblue']
    plt.figure(figsize=(8, 5), dpi=80)
    plt.axes(aspect=1)
    plt.pie(counts,
            labels=labels,
            colors=colors,
            labeldistance=1.1,
            autopct='%3.1f%%',
            shadow=False,
            startangle=90,
            pctdistance=0.6
            )
    plt.legend(loc='upper right', )
    plt.title(u'%s的微信好友性别组成' % friends[0]['NickName'])
    plt.show()

2.微信好友头像分析

分析好友头像,从两个方面来分析,第一,在这些好友头像中,使用人脸头像的好友比重有多大;第二,从这些好友头像中,可以提取出哪些有价值的关键字。这里需要根据HeadImgUrl字段下载头像到本地,然后通过腾讯优图提供的人脸识别相关的API接口,检测头像图片中是否存在人脸以及提取图片中的标签。其中,前者是分类汇总,我们使用饼图来呈现结果;后者是对文本进行分析,我们使用词云来呈现结果。

通过者篇文章从微信头像看出你的性格

   没太刻意选择过的生活照作头像

   这类人对自己的接纳度比较高,对外貌也比较有自信,不一定长得好看,但是能接纳自己的本来面目。内心没藏太多秘密,也没做过什么见不得人的事儿,在网络世界和现实世界中差别不大。

   用风景美图作头像

   这种人通常为人比较成熟,人缘很好,很注重人际关系的和谐。

仅供参考,从我的分布图

微信头像分布图

微信头像分布图

不过可以注意到,在所有微信好友中,约有接近1/4的微信好友使用了人脸头像, 而有接近3/4的微信好友没有人脸头像,这说明在所有微信好友中对”颜值 “有自信的人,仅仅占到好友总数的25%,或者说75%的微信好友行事风格偏低调为主,不喜欢用人脸头像做微信头像。这是否说明”好看的皮囊”并非是千篇一律,长得好看的人实在是少数中的少数。所以,当女生的妆容越来越向着”韩式半永久粗平眉”、”瓜子脸”和”大红唇”靠拢的时候,当男生的服饰越来越向着”大背头”、”高领毛衣”和”长款大衣”靠拢的时候,我们能不能真正得个性一次。生命中有太多被世俗绑架着的事情,既要和别人不一样 ,同时还要和大多数人一样,这是人生在世的无可奈何。考虑到腾讯优图并不能真正得识别”人脸”,我们这里对好友头像中的标签再次进行提取,来帮助我们了解微信好友的头像中有哪些 关键词,其分析结果如图所示:

微信头像词云分布图

微信头像词云分布图

你瞧!除了女孩,女孩,男孩,合影,合影还有天空,大海,卡通画嘛

def analyseHeadImage(frineds):
    # Init Path
    basePath = os.path.abspath('.')
    baseFolder = basePath + '\\HeadImages\\'
    if(os.path.exists(baseFolder) == False):
        os.makedirs(baseFolder)
    # Analyse Images
    faceApi = FaceAPI()
    use_face = 0
    not_use_face = 0
    image_tags = ''
    for index in range(1,len(friends)):
        friend = friends[index]
        # Save HeadImages
        imgFile = baseFolder + '\\Image%s.jpg' % str(index)
        imgData = itchat.get_head_img(userName = friend['UserName'])
        if(os.path.exists(imgFile) == False):
            with open(imgFile,'wb') as file:
                file.write(imgData)
        # Detect Faces
        time.sleep(1)
        result = faceApi.detectFace(imgFile)
        if result == True:
            use_face += 1
        else:
            not_use_face += 1 
        # Extract Tags
        result = faceApi.extractTags(imgFile)
        image_tags += ','.join(list(map(lambda x:x['tag_name'],result)))
    labels = [u'使用人脸头像',u'不使用人脸头像']
    counts = [use_face,not_use_face]
    colors = ['red','yellowgreen','lightskyblue']
    plt.figure(figsize=(8,5), dpi=80)
    plt.axes(aspect=1)
    plt.pie(counts, #性别统计结果
            labels=labels, #性别展示标签
            colors=colors, #饼图区域配色
            labeldistance = 1.1, #标签距离圆点距离
            autopct = '%3.1f%%', #饼图区域文本格式
            shadow = False, #饼图是否显示阴影
            startangle = 90, #饼图起始角度
            pctdistance = 0.6 #饼图区域文本距离圆点距离
    )
    plt.legend(loc='upper right',)
    plt.title(u'%s的微信好友使用人脸头像情况' % friends[0]['NickName'])
    plt.show()
    image_tags = image_tags.encode('iso8859-1').decode('utf-8')
    back_coloring = np.array(Image.open('face.jpg'))
    wordcloud = WordCloud(
        font_path='simfang.ttf',
        background_color="white",
        max_words=1200,
        mask=back_coloring,
        max_font_size=75,
        random_state=45,
        width=800,
        height=480,
        margin=15
    )
    wordcloud.generate(image_tags)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

3.微信好友签名分析

分析好签名,签名是好友信息中最为丰富的文本信息,按照人类惯用的”贴标签”的方法论,签名可以分析出某一个人在某一段时间里状态,就像人开心了会笑、哀伤了会哭,哭和笑两种标签,分别表明了人开心和哀伤的状态。这里我们对签名做两种处理,第一种是使用用结巴分词进行分词后生成词云,目的是了解好友签名中的关键字有哪些,哪一个关键字出现的频率相对较高;第二种是使用SnowNLP分析好友签名中的感情倾向,即好友签名整体上是表现为正面的、负面的还是中立的,各自的比重是多少。这里提取Signature字段即可

image

image

通过词云,我们可以发现:在微信好友的签名信息中,出现频率相对较高的关键词有:人生,生命,努力、前行,战略,坚强,美丽。果然我的微信好友都是温暖、正直的好青年啊! 其实,签名这个设定,从某种程度上是在反映人的一种心态,人在年轻时不免”为赋新词强说愁”,等到你真正到了这个精神境界,突然发现年轻时图样图森破,或许这就是我们不愿意让别人了解过去的原因,因为伴随着人的成长,某一种瞬间的状态简直不忍直视,QQ空间陪伴了我们这代人的整个青春,令人印象深刻的”那年今日”功能,有时让我们感到回忆的温暖,有时让我们感到岁月的萧杀,”当时只道是寻常”的物是人非,”回首向来萧瑟处”的淡定从容,”今夕复何夕”的失落惆怅……都在这一行行签名里留下深深浅浅的印记。在知乎上有关于签名的话题讨论,对此感兴趣的朋友不妨找时间看看。:

image

image

通过柱状图,我们可以发现:在微信好友的签名信息中,正面积极的情感判断约占到55.56%,中立的情感判断约占到32.10%,负面消极的情感判断约占到12.35%。这个结果和我们通过词云展示的结果基本吻合,这说明在微信好友的签名信息中,约有87.66%的签名信息,传达出来都是一种积极向上的态度。朋友圈中基本上有两类用户,第一类用户使用朋友圈记录自己的生活,第二类用户使用朋友圈输出自己的观点。显然,对于第二类用户,它并不介意别人了解它的过去,它更在乎它从始至终输出的观点是否一致。所以,不管朋友圈里别人在或晒美食、或晒旅游、或秀恩爱、或晒宝宝、或煲鸡汤等等,在我看来这都是一种生活方式,精神层次和物质层次比你高的人群,觉得你朋友圈里的内容”无趣”,这是符合人类一贯的认知方式的,在大多数情况下,反而是那些和你层次差不多的人群,对不熟悉的人或者事物妄加判断,如果你不喜欢我朋友圈里的内容,请直接屏蔽我就好,因为这样我们还可以做朋友;如果你因为喜欢A而在我这里和我说B不好,这就真的是三观不合啦。我相信没有完全兴趣匹配的两个人,即使是男女朋友或者情侣之间,总之人与人相处嘛,真诚和互相尊重是基本要求。

代码附上:

 

def analyseSignature(friends):
    signatures = ''
    emotions = []
    pattern = re.compile("1f\d.+")
    for friend in friends:
        signature = friend['Signature']
        if(signature != None):
            signature = signature.strip().replace('span', '').replace('class', '').replace('emoji', '')
            signature = re.sub(r'1f(\d.+)','',signature)
            if(len(signature)>0):
                nlp = SnowNLP(signature)
                emotions.append(nlp.sentiments)
                signatures += ' '.join(jieba.analyse.extract_tags(signature,5))
    with open('signatures.txt','wt',encoding='utf-8') as file:
         file.write(signatures)
    # Sinature WordCloud
    back_coloring = np.array(Image.open('flower.jpg'))
    wordcloud = WordCloud(
        font_path='simfang.ttf',
        background_color="white",
        max_words=1200,
        mask=back_coloring,
        max_font_size=75,
        random_state=45,
        width=960,
        height=720,
        margin=15
    )
    wordcloud.generate(signatures)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    wordcloud.to_file('signatures.jpg')
    # Signature Emotional Judgment
    count_good = len(list(filter(lambda x:x>0.66,emotions)))
    count_normal = len(list(filter(lambda x:x>=0.33 and x<=0.66,emotions)))
    count_bad = len(list(filter(lambda x:x<0.33,emotions)))
    labels = [u'负面消极',u'中性',u'正面积极']
    values = (count_bad,count_normal,count_good)
    plt.rcParams['font.sans-serif'] = ['simHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.xlabel(u'情感判断')
    plt.ylabel(u'频数')
    plt.xticks(range(3),labels)
    plt.legend(loc='upper right',)
    plt.bar(range(3), values, color = 'rgb')
    plt.title(u'%s的微信好友签名信息情感分析' % friends[0]['NickName'])
    plt.show()

4.微信好友分布

分析好友位置,主要通过提取Province和City这两个字段。本来想用pyecharts来实现,但是由于最近政策原因不能导出地图,参照网上的一些意见发现BDP在线制图非常好用,0编程门槛,拖拽使用,一键下载,所以首先将数据存储在csv上传到这个在线制图网站。

微信好友全国分布图

image.png

上图是BDP中生成的微信好友地理分布图,可以发现:我的微信好友主要集中在北上广深啊哈哈,可以小见大中国的互联网分布主要还是在这些一线沿海地区,找工作在这些区域也会更加便利

 

def analyseLocation(friends):
    headers = ['NickName','Province','City']
    with open('location.csv','w',encoding='utf-8',newline='',) as csvFile:
        writer = csv.DictWriter(csvFile, headers)
        writer.writeheader()
        for friend in friends[1:]:
           row = {}
           row['NickName'] = friend['NickName']
           row['Province'] = friend['Province']
           row['City'] = friend['City']
           writer.writerow(row)

5. 微信好友全家福

通过下载好友头像进行拼接,做成一张好友头像全家福,快来看一看有没有你呀! (ps:不知道这个有没有侵犯你的隐私,如果觉得有冒犯来跟我说一下哦,我来删除或打码)

image.png

 

import itchat
import math
import os
import PIL.Image as Image
# 开启热登录,短时间内退出,再次进入可以不用扫码登录
itchat.auto_login(hotReload=False)
friends = itchat.get_friends(update=True)
# 下载所有好友的头像图片
num = 0
imgPath = './headImg/'
if not os.path.exists(imgPath):
    os.mkdir(imgPath)
for i in friends:
    img = itchat.get_head_img(i["UserName"])
    with open(imgPath + str(num) + ".jpg", 'wb') as f:
        f.write(img)
        f.close()
        num += 1
length = len(os.listdir(imgPath))
# 根据总面积求每一个的大小
each_size = int(math.sqrt(float(810 * 810) / length))
# 每一行可以放多少个
lines = int(810 / each_size)
# 生成一张空白大图片
image = Image.new('RGBA', (810, 810), 'white')
x = 0
y = 0
#把每张头像依次粘贴到大图上
for i in range(0, length):
    try:
        img = Image.open(imgPath + str(i) + ".jpg")
    except IOError:
        print(i)
        print("image open error")
    else:
        img = img.resize((each_size, each_size), Image.ANTIALIAS)
        image.paste(img, (x * each_size, y * each_size))
        x += 1
        if x == lines:
            x = 0
            y += 1
image.save(imgPath + "myFriends.png")
# 通过文件传输助手发送到自己微信中
itchat.send_image(imgPath + "myFriends.jpg", 'filehelper')
image.show()

6.小结

数字时代的神经牵动着每一个社交关系链的人,我们想要竭力去保护的那点隐私,在这些数据中一点点地折射出来。人类或许可以不断地伪装自己,可这些从数据背后抽离出来的规律和联系不会欺骗人类。数学曾经被人称为最没有用的学科,因为生活中并不需要神圣而纯粹的计算,在不同的学科知识里,经验公式永远比理论公式更为常用。可是此时此刻,你看,这世界就像一只滴滴答答转动着的时钟,每一分每一秒都是严丝合缝的。

如果有需要源码的可以关注微信公众号「一行数据」,后台回复"1023",可以获得全套代码直接运行哦

参考:

[1] https://blog.csdn.net/qinyuanpei/article/details/79360703

[2] https://zhuanlan.zhihu.com/p/26489740

[3] https://zhuanlan.zhihu.com/p/34290391


相关文章
|
18天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
20天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
27天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
84 7
|
2月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
79 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
26天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
32 3
|
27天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
43 2
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
2月前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
60 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
52 2