随着微信的普及,越来越多的人开始使用微信。微信已经从一个简单的社交软件逐渐变成了一种生活方式。人们日常交流需要微信,工作交流也需要微信。微信上的每一个好友都代表着人们在社会中扮演的不同角色。今天的文章将基于Python分析微信好友的数据。这里选择的维度主要包括:性别、头像、签名、所在地。结果主要以两种形式呈现:图表和词云。其中,文本信息会用到词频分析和情感分析两种方法。俗话说:工欲善其事,必先利其器。在本文正式开始之前,先简单介绍一下本文使用的第三方模块:itchat:微信网页版接口封装Python版本,本文用于获取微信好友信息。jieba:Python版结巴分词,本文用到的是对文本信息进行分词处理。matplotlib:Python中的图表绘制模块,本文用于绘制柱状图和饼图snownlp:Python中的中文分词模块,本文用于对文本信息进行情感判断。PIL:Python中的一个图像处理模块,本文使用它来处理图像。numpy:Python中的一个数值计算模块,与本文的wordcloud模块配合使用。wordcloud:Python中的词云模块,本文用来绘制词云图。TencentYoutuyun:腾讯优图提供的Python版SDK,本文用于人脸识别和图像标签信息提取。如果itchat无法使用,可以参考:如何使用Python查看微信好友撤回的消息?以上模块可以通过pip安装。各个模块的详细使用说明请参考各自的文档。1、数据分析分析微信好友数据的前提是获取好友信息。通过使用itchat模块,这一切都会变得非常简单。我们可以通过下面两行代码实现:itchat.auto_login(hotReload=True)friends=itchat.get_friends(update=True)和登录网页版微信一样。我们可以用手机扫描二维码登录。这里返回的friends对象是一个集合,第一个元素是当前用户。因此,在下面的数据分析过程中,我们始终以friends[1:]作为原始输入数据,集合中的每个元素都是一个字典结构。以我为例,大家可以注意到有Sex、City、Province、HeadImgUrl、Signature这四个字段。我们下面的分析从这四个字段入手:2.好友性别要分析好友性别,首先需要获取所有好友的性别信息。这里我们将每个好友信息的Sex字段提取出来,然后分别统计Male、Female和Unkonw的数量。我们将这三个值组装成一个列表,然后使用matplotlib模块绘制饼图。代码实现如下:defanalyseSex(firends):sexs=list(map(lambdax:x['Sex'],friends[1:]))counts=list(map(lambdax:x[1],Counter(sexs).items()))labels=['Unknown','Male','Female']colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labelslabels=labels,#性别显示标签colorscolors=colors,#饼图区域配色labeldistance=1.1,#labeldistancefromdotdistanceautopct='%3.1f%%',#饼图区域文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字距离dot)plt.legend(loc='upperright',)plt.title(u'%s'微信好友'%friends[0]['NickName']的性别构成)plt.show()这里简单解释一下这段代码。微信中的gender字段有三个值:Unkonw、Male和Female,对应的值分别为0、1、2。这三个不同的值在Collection模块中通过Counter()进行统计,其items()方法返回一组元组。元组的第一维元素表示key,即0,1,2,元组的第二维元素表示数字,对元组的集合进行排序,即key的顺序为0,1,2按顺序排列,所以这三个不同值的个数可以通过map()方法得到,我们可以传给matplotlib进行绘图。这三个不同值的百分比是通过matplotlib计算出来的。下图是matplotlib绘制的好友性别分布图:3.好友头像从两个方面分析好友头像。第一,在这些朋友头像中,使用人脸头像的朋友比例是多少;第二,从这些好友头像中,可以从好友头像中提取出哪些有价值的关键词。这里需要根据HeadImgUrl字段将头像下载到本地,然后使用腾讯优图提供的人脸识别相关API接口检测头像图片中是否有人脸,提取图片中的标签。其中,前者是分类汇总,我们用饼图来呈现结果;后者是对文本进行分析,我们用词云来呈现结果。关键代码如下:defanalyseHeadImage(frineds):#InitPathbasePath=os.path.abspath('.')baseFolder=basePath+'\\HeadImages\\'if(os.path.exists(baseFolder)==False):os.makedirs(baseFolder)#AnalyseImagesfaceApi=FaceAPI()use_face=0not_use_face=0image_tags=''forindexinrange(1,len(friends)):friend=friends[index]#SaveHeadImagesimgFile=baseFolder+'\\Image%s.jpg'%str(index)imgData=itchat.get_head_img(userName=friend['UserName'])if(os.path.exists(imgFile)==False):withopen(imgFile,'wb')asfile:file.write(imgData)#DetectFacestime.sleep(1)result=faceApi.detectFace(imgFile)ifresult==True:use_face+=1else:not_use_face+=1#ExtractTagsresult=faceApi.extractTags(imgFile)image_tags+=','.join(列表(地图(lambdax: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,#性别统计结果labelslabels=labels,#性别显示标签colorscolors=colors,#蛋糕图区域配色labeldistance=1.1,#labeldistancedotdistancefromautopct='%3.1f%%',#饼图区域文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字距离dotdistance)plt.legend(loc='upperright',)plt.title(u'%s微信好友使用人脸头像'%friends[0]['NickName'])plt.show()image_tagsimage_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()这里我们会在当前目录下新建一个HeadImages目录来存放所有好友的头像,然后我们这里会用到一个叫做FaceApi的类,这个类是腾讯优图的SDK封装的,这里单独调用那里是人脸检测和图像标签识别的两个API接口。前者会统计“使用人脸头像”和“不使用人脸头像”的好友数量,后者会将每个头像提取的标签分析结果累加如下图:可以注意到在所有微信好友中,约有1/4的微信好友使用人脸头像,而近3/4的微信好友没有人脸头像,这说明在所有微信好友中,对自己“颜值”自信的人只占对于总好友数的25%,即75%的微信好友,行为风格低调,不喜欢用人脸作为微信头像。其次,考虑到腾讯优图无法真正识别“人脸”,这里我们再次提取好友头像中的标签,帮助我们了解微信好友头像中有哪些关键词。分析结果如图:通过词云我们可以发现,在微信好友的签名词云中,出现频率相对较高的关键词有:女孩、树、房子、文字、截图、卡通、合影、天空,海。由此可见,在我的微信好友中,好友选择的微信头像主要来自四个来源:日常生活、旅行、风景、截图。朋友选择的微信头像风格以卡通为主,朋友选择的微信头像中常见的元素有天空、大海、房屋、树木。通过观察我所有好友的头像,我发现我的微信好友中,有15人使用个人照片作为微信头像,53人使用网络图片作为微信头像,25人使用动漫图片作为微信头像,25人使用集体照。用图片做微信头像的有3人,用小孩照片做微信头像的有5人,用风景图片做微信头像的有13人,用女生照片做微信头像的有18人,基本一致与图像标签提取的分析结果。.4.好友签名分析好友签名。签名是好友信息中最丰富的文字信息。按照人类使用的“标签”方法论,签名可以分析出某个人在某个时间段内的状态,就像人高兴时会笑,悲伤时会哭,而哭这两个标签和笑分别表示高兴和悲伤的状态。这里我们对签名做了两种处理。第一个是使用结巴分词在分词后生成词云。使用SnowNLP分析朋友签名中的情绪倾向,即朋友签名总体上是正面的、负面的还是中性的,各自所占的比例是多少。这里提取签名段即可,其核心代码如下:defanalyseSignature(friends):signatures=''emotions=[]pattern=re.compile("1f\d.+")forfriendinfriends:signature=friend['Signature']if(签名!=无):signaturesignature=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))withopen('signatures.txt','wt',encoding='utf-8')asfile:file.write(signatures)#SinatureWordCloudback_coloring=np.array(Image.open('flower.jpg'))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')#SignatureEmotionalJudgmentcount_good=len(列表(过滤器(lambdax:x>0.66,情绪)))count_normal=len(列表(过滤器(lambdax:x>=0.33andx<=0.66,情绪)))count_bad=len(列表(过滤器(lambdax:x<0.33,情绪)))labels=[u'negativenegative',u'neutral',u'positivepositive']values=(count_bad,count_normal,count_good)plt.rcParams['font.sans-serif']=['simHei']plt。rcParams['axes.unicode_minus']=Falseplt.xlabel(u'情感判断')plt.ylabel(u'频率')plt.xticks(range(3),labels)plt.legend(loc='upperright',)plt.bar(range(3),values,color='rgb')plt.title(u'%s'微信好友签名信息情感分析'%friends[0]['NickName'])plt.show()通过词云,我们可以发现,在微信好友的签名信息中,出现频率相对较高的关键词有:努力、成长、美丽、幸福、生活、幸福、生活、距离、时间、行走通过下面的直方图,我们可以发现,在微信好友的签名信息中,正面情绪判断占比约55.56%,中性情绪判断ac约占32.10%,负面情绪判断约占12.35%。这个结果和我们通过词云展示的结果基本一致,这表明微信好友的签名信息中,约有87.66%的人传达了积极的态度。5.好友所在位置分析好友所在位置,主要是提取Province和City这两个字段。Python中的地图可视化主要是通过Basemap模块。该模块需要从国外网站下载地图信息,使用起来很不方便。百度的ECharts用在前端比较多。虽然社区提供了pyecharts项目,但是我注意到由于政策变化,Echarts不再支持导出图的功能。因此,地图定制仍然是一个问题。主流的技术方案是配置全国所有省市的JSON数据。这里我使用的是BDP个人版,这是一种零编程的解决方案。我们通过Python导出一个CSV文件,然后上传到BDP。您可以通过简单的拖放来制作可视化地图。它再简单不过了。这里我们只展示生成CSV部分的代码:defanalyseLocation(friends):headers=['NickName','Province','City']withopen('location.csv','w',encoding='utf-8',newline='',)ascsvFile:writer=csv.DictWriter(csvFile,headers)writer.writeheader()forfriendinfriends[1:]:row={}row['NickName']=friend['NickName']row['Province']=friend['Province']row['City']=friend['City']writer.writerow(row)下图是BDP中生成的微信好友的地域分布。可以发现我的微信好友主要集中在宁夏和陕西两省。6.小结本文是对数据分析的又一次尝试。我主要从性别、头像、签名、位置四个维度对微信好友进行了简单的数据分析,主要是图表和词云的形式。展示结果。一句话,“数据可视化是手段而非目的”。重要的不是我们在这里拍了这些图,而是这些图所反映的现象。我们能得到什么本质的启示?希望这篇文章能够对大家有所启发。最后推荐一下我们的星球:有兴趣玩一些有趣的Python程序,想玩服务器编程的可以加入我们。一年带你玩7个项目。您可以修改我们的代码来扩展它的功能,比如监控股票可以改成监控基金,或者多个金融数据产品,然后根据一些均线策略提醒您的交易策略。
