数据分析之微信通讯录分析

简介:
python有个itchat的库,据说是一个非常神奇的python库,可以干很多有意思的事情,今天闲着没事,把自己的微信分析了个遍,包括对微信好友性别、地域、以及签名等的分析。
思路:
有了itchat这个库,一切都不是太难办。先介绍一下,本人微信上目前有340左右的好友,首先是对微信好友性别的分析,我想看一下自己微信上究竟是男生还是女生还是,好吧,其实是想看一下性别的占比。话不多说,上代码:

def getSex(self):
        counts = dict()
        wc_friends = pd.DataFrame(self.friends)
        sex = wc_friends.Sex
        sex_list = []
        for i in sex:
            sex_list.append(i)
        sex_item = set(sex)
        for s in sex_item:
            counts[s] = sex_list.count(s)
        return counts
        # print(Counter(sex))

    def plot_sex(self):
        counts = self.getSex()
        # x_label = ['ubnknow', 'male', 'female']
        x_label = ['0', '1', '2']
        y_label = []
        for i in counts:
            # x_label.append(i)
            y_label.append(counts[i])

        plt.xticks((0,1,2),("unknow", "male", "female"))
        # plt.bar(range(len(y_label)), y_label, width='0.35', tick_label = x_label, color = 'rgb')
        plt.bar(range(len(y_label)), y_label, width=0.7, color = 'byg')
        plt.xlabel("sex")
        plt.ylabel('number')
        plt.title('sex analysis')
        # plt.xlabel(u"性别", fontproperties=font)
        # plt.ylabel(u'数目', fontproperties=font)
        # plt.title(u'性别分布', fontproperties=font)
        for a,b in zip(x_label, y_label):
            plt.text(a, b, '%.0f'%b, ha= 'center', va='bottom',fontsize = 7)
        plt.show()

这块是对性别的一个分析,用matplotlib画图得到如下:
这里写图片描述
我是很想知道那21个是不是可男可女的?好可怕我竟然有这么多奇怪的好友,男生190,女生129,还不错,争取今年结束时女生数可以超过男生数(逃。
接下来是对好友地域的分析,代码如下:

 def get_province(self):
        provinces_pd = pd.DataFrame(self.friends).Province
        provinces_only = set(provinces_pd)
        provinces_counts = dict()
        provinces_numbers = []
        for i in provinces_pd:
            provinces_numbers.append(i)
        for j in provinces_only:
            provinces_counts[j] = provinces_numbers.count(j)
        return provinces_counts

    def plot_province(self):
        counts = self.get_province()
        # python3里面object.keys()返回的不是一个可定位的集合,所以要用list转换
        keys = list(counts.keys())
        # print(type(keys))
        counts_split_space = dict()
        for k in keys[1:len(counts)]:
            counts_split_space[k] = counts[k]
        #这里是reverse,不是reversed
        counts_sorted = sorted(counts_split_space.items(), key= lambda d: d[1], reverse=True)
        provinces_name = []
        provinces_number = []
        print(type(counts_sorted))
        for i in counts_sorted[:10]:
            provinces_name.append(i[0])
            provinces_number.append(i[1])
        # print(provinces_name)
        # print(provinces_number)
        colors = ['red', 'yellow', 'blue', 'green']
        explode = (0.05,0,0,0,0,0,0,0,0,0)
        plt.pie(provinces_number, explode = explode, labels= provinces_name, colors= colors, labeldistance=1.1,
                autopct='%3.0f%%', shadow=False, startangle=90, pctdistance= 0.8)
        plt.axis('equal')
        # plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
        plt.grid()
        plt.show()

解释一下,因为地域中来自“火星”的好友比较一些,有些地域基本上个数就是一个,还有大概50多位好友在地域这一栏是选择空的,基于以上两点,刨去了地域为空以及地域分布人数极少的地域,选取了人数排名前十位的地域,分析如下:
这里写图片描述
有没有猜出我的家乡在哪,哈哈哈
最后是对签名一个词云分析,代码如下:

def get_whatsup(self):
        signatures = pd.DataFrame(self.friends).Signature
        regex1 = re.compile('<span.*?</span>')
        # 匹配两个以上占位符。
        regex2 = re.compile('\s{2,}')
        # 用一个空格替换表情和多个空格。
        signatures = [regex2.sub(' ', regex1.sub('', signature, re.S)) for signature in signatures]
        while '' in signatures:
            signatures.remove('')
        print(signatures)
        text = ''.join(signatures)
        wordlist = jieba.cut(text, cut_all=True)
        word_space_split = ' '.join(wordlist)
        background_Image = plt.imread('test.jpg')
        wc = WordCloud(background_color='white',  # 设置背景颜色
                       mask=background_Image,  # 设置背景图片
                       max_words=2000,  # 设置最大现实的字数
                       font_path='STFANGSO.ttf',
                       # font_path='font2.ttf',
                       stopwords=STOPWORDS,  # 设置停用词
                       max_font_size=50,  # 设置字体最大值
                       random_state=30,  # 设置有多少种随机生成状态,即有多少种配色方案
                       )
        wc.generate(word_space_split)
        image_colors = ImageColorGenerator(background_Image)
        wc.recolor(color_func=image_colors)
        plt.imshow(wc)
        plt.axis('off')
        plt.show()

通过做出词云图,我发现我的好友好多神经病啊,扑鼻而来的“哈哈哈”,真是猝不及防…
这里写图片描述
好了,以上就是微信好友的一个大致分析,代码简单,乐趣还是多多。
有交流学习的可以找我噢:1132274748(微信号)。
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值