ITPub博客

首页 > 大数据 > 数据分析 > Python分析 | 从00-90后的微信昵称

Python分析 | 从00-90后的微信昵称

原创 数据分析 作者:大禹编程 时间:2018-09-29 15:45:33 0 删除 编辑

一、前言

大家好,首先说明的是,这是一篇技术文,也是一篇 not 技术文,今天分享的是,当我获取了微信小程序 英文取名 的3500多个微信用户昵称、年龄段后,分析得到下面解果。。。

二、Let's get it

1.基本信息获取

1.访问 英文取名 的用户基本信接口,获取 英文取名 用户微信名( NickName )、访问次数( Count )、总数据集( ResponseData ),并将微信名存入文件。



# 获取所有用户数量和相关信息


def   get_json () :
     # 获取入口
    search_url =  '英文取名用户接口,欢迎扫码使用英文取名,生成一个最适合你的英文名'
     # 发送http请求,获取请求页面
    search_response =requests.get(search_url)
     # 设置编码
    search_response.encoding = 'UTF-8'
     # 将页面转变成json代码格式
    search_json =search_response.json()
     # 获取我们需要的数据,是列表格式
    our_data =search_json[ 'ResponseData' ]
    list_len = len(our_data)
    print( '总用户数有:'  + str(list_len))
    user_visit_numbers = 
    data_research = 
    NickName = []
     for  x  in  our_data:
        user_numbers = x[ 'Count' ] +user_visit_numbers
         if  x[ 'NickName' ] ==  '' :
            data_research +=  1
       NickName.append(x[ 'NickName' ])
    print( "微信名获取失败量:" +str(data_research))
    print(NickName)
    name = [ '微信名称' ]
    file_test =pd.DataFrame(columns=name, data=NickName)
    file_test.to_csv( r'I:/data.csv' ,encoding= 'utf-8' ,index= False )
    print( '总访问量:'  + str(user_visit_numbers))

运行结果:

总用户数有:3549
微信名获取失败量:0
总访问量:4573

2.读取所有微信名,数据分类
(1)读取微信名


# 读取文件,取出微信名


def   get_name () :
    NickName = []
     with  open( 'I:/data.csv' , 'r' ,encoding= 'utf8' )  as  file :
        i = 
         for  line  in  file:
             if  i ==  :    # 去除表头
                i =  1
                 continue
            line = line.strip()     # 去除换行符
            NickName.append(line)
     return  NickName
(2)数据分为以下六大类

中文名

变量名

数据类型




全中文昵称

ch_name

list

全英文昵称

en_name

list

中文和数字混合昵称

ch_di_name

list

包含图片表情昵称

img_name

list

其他昵称

other_name

list




# ch :Chinese


ch_name_number = 
ch_name = []
# en :English
en_name_number = 
en_name = []
# di : digtal
di_name_number = 
di_name = []
# img : image
img_name_number = 
img_name = []
# ch_di : Chinese and digtal
ch_di_name = []
# other : other
oth_name_number = 
oth_name = []
(3)数据分类判断


# 昵称全中文判断


def   is_all_ch (keyword) :
     for  c  in  keyword:
         # 包含常见中文字符
         if   not  ( '\u4e00'  <= c <=  '\u9fa5' ):
             return   False
     return   True
# 昵称全英文判断
def   is_all_en (keyword) :
     # 不能全部为空格或者首位为空格
     if  all(ord(c) ==  32   for  c  in  keyword)  or  keyword[ ] ==  ' ' :
         return   False
     # 允许空格和英文并存(例如:Xist A)
     if   not  all( 65  < ord(c) <  128   or  ord(c) ==  32   for  c  in  keyword):
         return   False
     return   True
# 昵称全数字判断
def   is_all_di (keyword) :
     for  uchar  in  keyword:
         if   not  (uchar >=  '\u0030'   and  uchar <=  u'\u0039' ):
             return   False
     return   True
# 昵称包含表情图判断
def   have_img (keyword) :
     # 下面是大部分图片的一个unicode编码集
     # 详情查看:https://en.wikipedia.org/wiki/Emoji
    img_re = re.compile( u'['
                       u'\U0001F300-\U0001F64F'
                       u'\U0001F680-\U0001F6FF'
                       u'\u2600-\u2B55]+' ,
                      re.UNICODE)
     if  img_re.findall(keyword) :
         return   True
     return   False
# 中文+数字昵称判断
def   is_ch_di (keyword) :
     for  c  in  keyword:
         if   not  ( '\u4e00'  <= c <=  '\u9fa5' )  and   not  (c >=  '\u0030'   and  c <=  u'\u0039' ):
             return   False
     return   True
(4)数据归类计算各类数量

list_name = get_name()

print( "总共有:" +str(len(list_name))+ "个微信名" )
for  i  in  range(len(list_name)):
    result = classification_name(list_name[i])
     if  result ==  'ch' :   # 中文
        ch_name_number += 1
        ch_name.append(list_name[i])
     if  result ==  'en' :   # 英文
        en_name_number += 1
        en_name.append(list_name[i])
     if  result ==  'di' :   # 数字
        di_name_number += 1
        di_name.append(list_name[i])
     if  result ==  'img' :  # 含表情
        img_name_number += 1
        img_name.append(list_name[i])
     if  result ==  'ch_di' :  # 中文和数字
        ch_di_name_number += 1
        ch_di_name.append(list_name[i])
     if  result ==  'other' :  # 其他
        oth_name_number += 1
        oth_name.append(list_name[i])

print( "纯中文昵称个数:" + str(ch_name_number))
# print(ch_name)
print( "纯英文昵称个数:" + str(en_name_number))
#print(en_name)
print( "纯数字昵称个数:" + str(di_name_number))
# print(di_name)
print( "包含表情图昵称个数:" + str(img_name_number))
# print(img_name)
print( "中文和数字混合昵称个数:" + str(ch_di_name_number))
print(ch_di_name)
print( "其他昵称个数:" + str(oth_name_number))
# print(oth_name)

运行结果:

总共有:3549个微信名
纯中文昵称个数:1514
纯英文昵称个数:569
纯数字昵称个数:9
包含表情图昵称个数:400
中文和数字混合昵称个数:19
其他昵称个数:1038

3.获取用户画(只获取用户年龄段)

3.访问英文取名用户画像接口,获取近30天活跃用户和新用户的年龄段



# 获取用户年龄段


def   get_data () :
     # 获取token,并处理
    t = get_token().strip( '"' )
     # 然后将处理后的token值和其他参数作为post方式的参数值,调用用户画像api
    post_user_api =  " https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait?access_token="
    post_user_url = post_user_api + t
     # 访问获取概况数据 (近一个月的数据情况)
    data = json.dumps({
     "begin_date"  :  "2018-07-21" ,
     "end_date"  :  "2018-08-19" })
     # 获取信息
    user_portrait_data = get_info(post_user_url, data)
     # 时间段
    ref_date = user_portrait_data[ 'ref_date' ]
     # 新用户
    visit_uv_new = user_portrait_data[ 'visit_uv_new' ]
     活跃用户
    visit_uv = user_portrait_data[ 'visit_uv' ]
     # 年龄段
    print(ref_date )
    print((visit_uv_new[ 'ages' ]))
    print((visit_uv[ 'ages' ]))

运行结果:



# id : 为年龄段序号  name :年龄段名称    value : 该年龄段人数


20180721 -20180819
[{ 'id' :  ,  'name' :  '未知' ,  'value' :  6 }, { 'id' :  1 ,  'name' :  '17岁以下' ,  'value' :  18 }, { 'id' :  2 ,  'name' :  '18-24岁' ,  'value' :  118 }, { 'id' :  3 ,  'name' :  '25-29岁' ,  'value' :  75 }, { 'id' :  4 ,  'name' :  '30-39岁' ,  'value' :  81 }, { 'id' :  5 ,  'name' :  '40-49岁' ,  'value' :  14 }, { 'id' :  6 ,  'name' :  '50岁以上' ,  'value' :  7 }]
[{ 'id' :  ,  'name' :  '未知' ,  'value' :  6 }, { 'id' :  1 ,  'name' :  '17岁以下' ,  'value' :  20 }, { 'id' :  2 ,  'name' :  '18-24岁' ,  'value' :  147 }, { 'id' :  3 ,  'name' :  '25-29岁' ,  'value' :  88 }, { 'id' :  4 ,  'name' :  '30-39岁' ,  'value' :  95 }, { 'id' :  5 ,  'name' :  '40-49岁' ,  'value' :  20 }, { 'id' :  6 ,  'name' :  '50岁以上' ,  'value' :  10 }]

三、来点有趣的,数据清洗、分析

1.微信名称类型数据可视化分析

核心代码:



# 1.微信名分类:玫瑰饼图


from  pyecharts  import  Pie
# 数据获取自上面代码
attr = [ "纯中文昵称" ,  "纯英文昵称" ,  "纯数字昵称" ,  "包含表情图昵称" ,  "中文和数字混合昵称" ,  "其他昵称" ]
v1 = [ 1514 ,  569 ,  9 ,  400 ,  19 ,  1038 ]
pie = Pie( "微信名分类饼图" , title_pos= 'center' , width= 900 )
pie.add(
     "占比" ,
    attr,
    v1,
    center=[ 50 ,  50 ],
    is_random= True ,
    radius=[ 30 ,  75 ],
    rosetype= "area" ,
    is_legend_show= False ,
    is_label_show= True ,
)
pie.render( "render_01.html" )

运行效果:

微信昵称类别玫瑰饼图

从中可以看出,微信昵称为全中文的占比最多,占有 42.66% ,其次为其他昵称(中英文混合、字符等类型),占有 29.25% ,再比较大的类就是纯英文昵称,占有 16.03% ,和包含表情包昵称,占有 11.27% ,像纯数字昵称和中文数字混合昵称相对占比较少,我们常见的中文和数字混合昵称最多的就 机构名/姓名+联系方式 ,一些营销号常用,相较而言,大多数人还是喜欢用纯中文来作昵称, 既体现一种文化情怀,又简明扼要的介绍了自己  ,比如我的微信名就是 老表 ,这是我初中时候的一个绰号,朋友们一说老表,不一定是在说亲戚,有可能在说我,哈哈哈。

2.微信用户年龄段可视化分析

核心代码:



# 2.用户年龄段:玫瑰饼图


from  pyecharts  import  Pie
# 数据获取自上面代码
attr = [ "未知" ,  "17岁以下" ,  "18-24岁" ,  "25-29岁" ,  "30-39岁" ,  "40-49岁" , "50岁以上" ]
v1 = [ 12 ,  38 ,  265 ,  163 ,  176 ,  34 , 17 ]
pie = Pie( "微信用户年龄段饼图" , title_pos= 'center' , width= 900 )
pie.add(
     "占比" ,
    attr,
    v1,
    center=[ 50 ,  50 ],
    is_random= True ,
    radius=[ 30 ,  75 ],
    rosetype= "area" ,
    is_legend_show= False ,
    is_label_show= True ,
)
pie.render( "render_02.html" )

运行效果:

用户年龄段分布玫瑰饼图

从中可以看出,年龄段中, 18-24岁 的 95-00后 占比最多,达到 37.59% ,接下来是 30-39岁 的 80-90后 ,占比达到 24.97% ,紧随其后的为 25-29岁 的 90-95后 ,占比达 23.12% ,其他年龄段可大概分为两类:偏儿童类和偏老人类,一共占比 10.21% ,我个人觉得这类人群少的原因是: 小孩、老人玩微信的少,更不用说微信小程序了 ,对于小孩来说微信的作用就是 玩游戏 (登录账号),对于老人来说,微信主要用来 聊天 ,已经是比较复杂的了,小程序使用可能对老人来说就更复杂了,也 缺少必要性 。

3.词云分析微信名称哪些词语、表情包更受欢迎

(1)继续使用 pyecharts 生成词云图
核心代码:



# 清洗数据,生成词云图


def   split_word (test_str) :
    test_str = re.sub( '[,,。. \r\n]' ,  '' , test_str)
     # jieba 词语
    segment = jieba.lcut(test_str)
    words_df = pd.DataFrame({ 'segment' : segment})
     # quoting=3 表示stopwords.txt里的内容全部不引用
    stopwords = pd.read_csv( r"H:\PyCoding\ Analysis_wx_name\stopwords.txt" , index_col= False , quoting= 3 , sep= "\t" , names=[ 'stopword' ], encoding= 'utf-8' )
    words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
    words_stat = words_df.groupby(by=[ 'segment' ])[ 'segment' ].agg({ "计数" : numpy.size})
    words_stat = words_stat.reset_index().sort_values(by=[ "计数" ], ascending= False )
    test = words_stat.head( 200 ).values
    codes = [test[i][ ]  for  i  in  range( ,len(test))]
    counts = [test[i][ 1 ]  for  i  in  range( ,len(test))]
    wordcloud = WordCloud(width= 1300 , height= 620 )
    wordcloud.add( "微信昵称" , codes, counts, word_size_range=[ 20 ,  100 ])
    wordcloud.render( 'render_03.html' )

运行效果:

pyecharts词云图

(2)使用 wordcloud + matplotlib 生成高级一点的词云图
核心代码:


# 下下期好好讲一下matplotlib绘图可视化,挺有意思的


# 调用get_name函数获取全部微信名
text = get_name()
# 调用jiebaclearText函数,清洗数据(该函数和上面切词思想一样)
text1=jiebaclearText(text)
#产生词云图
bg = plt.imread( r"G:\small_pig.jpg" )
#生成词云
wc=WordCloud(
    background_color= "wathet" ,  #设置背景为白色,默认为黑色
    mask=bg,       # 设置词云内容范围(除指定图片白色区域的其他区域都将覆盖词云内容)
    margin= 10 ,                #设置图片的边缘
    max_font_size= 70 ,    #显示的最大的字体大小
    random_state= 20 ,     #为每个单词返回一个PIL颜色
    font_path= 'G:\simkai.ttf'     #中文处理,用系统自带的字体
     # 可以在这里下载这个字体:http://www.font5.com.cn/font_download.php?id=534&part=1245067666
    ).generate(text1)
#为图片设置字体
my_font=fm.FontProperties(fname= 'G:\simkai.ttf' )
# 图片背景
bg_color = ImageColorGenerator(bg)
# 开始画图
plt.imshow(wc.recolor(color_func=bg_color))
# 为云图去掉坐标轴
plt.axis( "off" )
# 保存云图
wc.to_file( "render_04.png" )

词云轮廓原图:

这是您的专属社会人

运行效果:

wordcloud 词云图

由于第二种方法无法解析表情图,所以没有表情出现,除此外这两种方法显示的词云图内容几乎大同小异。
通过词云图,我们一眼看出大家使用最多的,除开中文后,就是表情图了,你的微信朋友圈里是否也有这样的 大红嘴唇 ,我的好像有,哈哈哈~当我们单纯来看词云中的中文时,发现像 太阳 、 阳光 、 微笑 、 可爱 、 开心 、 爱 、 未来 等比较积极向上的词语还是比较受大家喜欢的,也体现出大家的内心的积极、乐观,当然还有像 丽丽 、 徐 、 陈 等这样的姓名部分,在昵称中大家也使用的比较多,也不缺乏有像 悲伤 、 凉 这样比较冷色的词语。

四、通过昵称进行情绪分析( 大胆猜想 )

01 | 微信昵称为全中文

微信昵称为全中文可以分为两大类:自己的真名和其他昵称。

直接用自己的姓名当微信昵称的人,性格大多是直来直往的那种,待人比较坦诚。

他们的微信一般用于熟人社交和日常办公,平时不会随便加不熟的人,就算用真名也不怕泄露个人信息,来个不恰当的比喻:不做亏心事,不怕鬼敲门,哈哈哈。

为其他昵称的人,大多有自己的看法,也许昵称是自己对未来的一种期望,也许昵称是自己对生活的一种态度,或者是一些无厘头的话语,炫酷的话语。 (猜测)

02 | 微信昵称为全英文

出于个人喜好或工作需求,有些人会给自己取一个容易记的、叫着顺口的英文名,比如Tom、Abby、Jason,并常常在自我介绍的时候,让大家可以用英文名字称呼自己。

对他们而言,英文名就相当于自己的第二个名字,用它做微信名,和用本名没什么太大的区别。

也有的人会刻意避开那些常见的英文名,取一些更小众的,他们更在意提高自己的“逼格”,喜欢标新立异,追求时尚和前卫。 (猜测)





来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31552449/viewspace-2215258/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
最有影响力的程序员自媒体,关注程序员相关话题:程序人生,职场,一起学习新技术,走上程序的人生巅峰,活出自己!

注册时间:2018-08-28

  • 博文量
    25
  • 访问量
    25646