1. 程式人生 > >資料分析之微信通訊錄分析

資料分析之微信通訊錄分析

簡介:
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(微訊號)。
這裡寫圖片描述