一、前言
大家好纹蝴,首先說明的是庄萎,這是一篇技術(shù)文,也是一篇not技術(shù)文骗灶,今天分享的是惨恭,當(dāng)我獲取了微信小程序英文取名的3500多個(gè)微信用戶昵稱、年齡段后耙旦,分析得到下面解果脱羡。。免都。
二锉罐、Let's get it
1.基本信息獲取
1.訪問英文取名的用戶基本信接口,獲取英文取名用戶微信名(NickName)绕娘、訪問次數(shù)(Count)脓规、總數(shù)據(jù)集(ResponseData),并將微信名存入文件险领。
#?獲取所有用戶數(shù)量和相關(guān)信息
defget_json():
#?獲取入口
search_url?='英文取名用戶接口侨舆,歡迎掃碼使用英文取名,生成一個(gè)最適合你的英文名'
#?發(fā)送http請(qǐng)求,獲取請(qǐng)求頁面
search_response?=requests.get(search_url)
#?設(shè)置編碼
search_response.encoding?='UTF-8'
#?將頁面轉(zhuǎn)變成json代碼格式
search_json?=search_response.json()
#?獲取我們需要的數(shù)據(jù),是列表格式
our_data?=search_json['ResponseData']
list_len?=?len(our_data)
print('總用戶數(shù)有:'+?str(list_len))
user_visit_numbers?=0
data_research?=0
NickName?=?[]
forxinour_data:
user_numbers?=?x['Count']?+user_visit_numbers
ifx['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))
運(yùn)行結(jié)果:
總用戶數(shù)有:3549
微信名獲取失敗量:0
總訪問量:4573
2.讀取所有微信名绢陌,數(shù)據(jù)分類
(1)讀取微信名
#?讀取文件挨下,取出微信名
defget_name():
NickName?=?[]
withopen('I:/data.csv','r',encoding='utf8')asfile?:
i?=0
forlineinfile:
ifi?==0:#?去除表頭
i?=1
continue
line?=?line.strip()#?去除換行符
NickName.append(line)
returnNickName
(2)數(shù)據(jù)分為以下六大類
中文名
變量名
數(shù)據(jù)類型
全中文昵稱ch_namelist
全英文昵稱en_namelist
中文和數(shù)字混合昵稱ch_di_namelist
包含圖片表情昵稱img_namelist
其他昵稱other_namelist
#?ch?:Chinese
ch_name_number?=0
ch_name?=?[]
#?en?:English
en_name_number?=0
en_name?=?[]
#?di?:?digtal
di_name_number?=0
di_name?=?[]
#?img?:?image
img_name_number?=0
img_name?=?[]
#?ch_di?:?Chinese?and?digtal
ch_di_name?=?[]
#?other?:?other
oth_name_number?=0
oth_name?=?[]
(3)數(shù)據(jù)分類判斷
#?昵稱全中文判斷
defis_all_ch(keyword):
forcinkeyword:
#?包含常見中文字符
ifnot('\u4e00'<=?c?<='\u9fa5'):
returnFalse
returnTrue
#?昵稱全英文判斷
defis_all_en(keyword):
#?不能全部為空格或者首位為空格
ifall(ord(c)?==32forcinkeyword)orkeyword[0]?=='?':
returnFalse
#?允許空格和英文并存(例如:Xist?A)
ifnotall(65<?ord(c)?<128orord(c)?==32forcinkeyword):
returnFalse
returnTrue
#?昵稱全數(shù)字判斷
defis_all_di(keyword):
forucharinkeyword:
ifnot(uchar?>='\u0030'anduchar?<=u'\u0039'):
returnFalse
returnTrue
#?昵稱包含表情圖判斷
defhave_img(keyword):
#?下面是大部分圖片的一個(gè)unicode編碼集
#?詳情查看:https://en.wikipedia.org/wiki/Emoji
img_re?=?re.compile(u'['
u'\U0001F300-\U0001F64F'
u'\U0001F680-\U0001F6FF'
u'\u2600-\u2B55]+',
re.UNICODE)
ifimg_re.findall(keyword)?:
returnTrue
returnFalse
#?中文+數(shù)字昵稱判斷
defis_ch_di(keyword):
forcinkeyword:
ifnot('\u4e00'<=?c?<='\u9fa5')andnot(c?>='\u0030'andc?<=u'\u0039'):
returnFalse
returnTrue
(4)數(shù)據(jù)歸類計(jì)算各類數(shù)量
list_name?=?get_name()
print("總共有:"+str(len(list_name))+"個(gè)微信名")
foriinrange(len(list_name)):
result?=?classification_name(list_name[i])
ifresult?=='ch':#?中文
ch_name_number?+=1
ch_name.append(list_name[i])
ifresult?=='en':#?英文
en_name_number?+=1
en_name.append(list_name[i])
ifresult?=='di':#?數(shù)字
di_name_number?+=1
di_name.append(list_name[i])
ifresult?=='img':#?含表情
img_name_number?+=1
img_name.append(list_name[i])
ifresult?=='ch_di':#?中文和數(shù)字
ch_di_name_number?+=1
ch_di_name.append(list_name[i])
ifresult?=='other':#?其他
oth_name_number?+=1
oth_name.append(list_name[i])
print("純中文昵稱個(gè)數(shù):"+?str(ch_name_number))
#?print(ch_name)
print("純英文昵稱個(gè)數(shù):"+?str(en_name_number))
#print(en_name)
print("純數(shù)字昵稱個(gè)數(shù):"+?str(di_name_number))
#?print(di_name)
print("包含表情圖昵稱個(gè)數(shù):"+?str(img_name_number))
#?print(img_name)
print("中文和數(shù)字混合昵稱個(gè)數(shù):"+?str(ch_di_name_number))
print(ch_di_name)
print("其他昵稱個(gè)數(shù):"+?str(oth_name_number))
#?print(oth_name)
運(yùn)行結(jié)果:
總共有:3549個(gè)微信名
純中文昵稱個(gè)數(shù):1514
純英文昵稱個(gè)數(shù):569
純數(shù)字昵稱個(gè)數(shù):9
包含表情圖昵稱個(gè)數(shù):400
中文和數(shù)字混合昵稱個(gè)數(shù):19
其他昵稱個(gè)數(shù):1038
3.獲取用戶畫(只獲取用戶年齡段)
3.訪問英文取名用戶畫像接口,獲取近30天活躍用戶和新用戶的年齡段
#?獲取用戶年齡段
defget_data():
#?獲取token,并處理
t?=?get_token().strip('"')
#?然后將處理后的token值和其他參數(shù)作為post方式的參數(shù)值脐湾,調(diào)用用戶畫像api
post_user_api?="?https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait?access_token="
post_user_url?=?post_user_api?+?t
#?訪問獲取概況數(shù)據(jù)?(近一個(gè)月的數(shù)據(jù)情況)
data?=?json.dumps({
"begin_date":"2018-07-21",
"end_date":"2018-08-19"})
#?獲取信息
user_portrait_data?=?get_info(post_user_url,?data)
#?時(shí)間段
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']))
運(yùn)行結(jié)果:
#?id?:?為年齡段序號(hào)??name?:年齡段名稱????value?:?該年齡段人數(shù)
20180721-20180819
[{'id':0,'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':0,'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}]
三臭笆、來點(diǎn)有趣的,數(shù)據(jù)清洗、分析
1.微信名稱類型數(shù)據(jù)可視化分析
核心代碼:
#?1.微信名分類:玫瑰餅圖
frompyechartsimportPie
#?數(shù)據(jù)獲取自上面代碼
attr?=?["純中文昵稱","純英文昵稱","純數(shù)字昵稱","包含表情圖昵稱","中文和數(shù)字混合昵稱","其他昵稱"]
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")
運(yùn)行效果:
微信昵稱類別玫瑰餅圖
從中可以看出愁铺,微信昵稱為全中文的占比最多鹰霍,占有42.66%,其次為其他昵稱(中英文混合茵乱、字符等類型)茂洒,占有29.25%,再比較大的類就是純英文昵稱似将,占有16.03%,和包含表情包昵稱获黔,占有11.27%,像純數(shù)字昵稱和中文數(shù)字混合昵稱相對(duì)占比較少在验,我們常見的中文和數(shù)字混合昵稱最多的就機(jī)構(gòu)名/姓名+聯(lián)系方式玷氏,一些營(yíng)銷號(hào)常用,相較而言腋舌,大多數(shù)人還是喜歡用純中文來作昵稱盏触,既體現(xiàn)一種文化情懷,又簡(jiǎn)明扼要的介紹了自己?块饺,比如我的微信名就是老表赞辩,這是我初中時(shí)候的一個(gè)綽號(hào),朋友們一說老表授艰,不一定是在說親戚辨嗽,有可能在說我,哈哈哈淮腾。
2.微信用戶年齡段可視化分析
核心代碼:
#?2.用戶年齡段:玫瑰餅圖
frompyechartsimportPie
#?數(shù)據(jù)獲取自上面代碼
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")
運(yùn)行效果:
用戶年齡段分布玫瑰餅圖
從中可以看出糟需,年齡段中,18-24歲的95-00后占比最多谷朝,達(dá)到37.59%洲押,接下來是30-39歲的80-90后,占比達(dá)到24.97%,緊隨其后的為25-29歲的90-95后圆凰,占比達(dá)23.12%杈帐,其他年齡段可大概分為兩類:偏兒童類和偏老人類,一共占比10.21%专钉,我個(gè)人覺得這類人群少的原因是:小孩挑童、老人玩微信的少,更不用說微信小程序了跃须,對(duì)于小孩來說微信的作用就是玩游戲(登錄賬號(hào))炮沐,對(duì)于老人來說,微信主要用來聊天回怜,已經(jīng)是比較復(fù)雜的了,小程序使用可能對(duì)老人來說就更復(fù)雜了,也缺少必要性玉雾。
3.詞云分析微信名稱哪些詞語翔试、表情包更受歡迎
(1)繼續(xù)使用pyecharts生成詞云圖
核心代碼:
#?清洗數(shù)據(jù),生成詞云圖
defsplit_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里的內(nèi)容全部不引用
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({"計(jì)數(shù)":?numpy.size})
words_stat?=?words_stat.reset_index().sort_values(by=["計(jì)數(shù)"],?ascending=False)
test?=?words_stat.head(200).values
codes?=?[test[i][0]foriinrange(0,len(test))]
counts?=?[test[i][1]foriinrange(0,len(test))]
wordcloud?=?WordCloud(width=1300,?height=620)
wordcloud.add("微信昵稱",?codes,?counts,?word_size_range=[20,100])
wordcloud.render('render_03.html')
運(yùn)行效果:
pyecharts詞云圖
(2)使用wordcloud+matplotlib生成高級(jí)一點(diǎn)的詞云圖
核心代碼:
#?下下期好好講一下matplotlib繪圖可視化,挺有意思的
#?調(diào)用get_name函數(shù)獲取全部微信名
text?=?get_name()
#?調(diào)用jiebaclearText函數(shù)驹碍,清洗數(shù)據(jù)(該函數(shù)和上面切詞思想一樣)
text1=jiebaclearText(text)
#產(chǎn)生詞云圖
bg?=?plt.imread(r"G:\small_pig.jpg")
#生成詞云
wc=WordCloud(
background_color="wathet",#設(shè)置背景為白色壁涎,默認(rèn)為黑色
mask=bg,#?設(shè)置詞云內(nèi)容范圍(除指定圖片白色區(qū)域的其他區(qū)域都將覆蓋詞云內(nèi)容)
margin=10,#設(shè)置圖片的邊緣
max_font_size=70,#顯示的最大的字體大小
random_state=20,#為每個(gè)單詞返回一個(gè)PIL顏色
font_path='G:\simkai.ttf'#中文處理,用系統(tǒng)自帶的字體
#?可以在這里下載這個(gè)字體:http://www.font5.com.cn/font_download.php?id=534&part=1245067666
).generate(text1)
#為圖片設(shè)置字體
my_font=fm.FontProperties(fname='G:\simkai.ttf')
#?圖片背景
bg_color?=?ImageColorGenerator(bg)
#?開始畫圖
plt.imshow(wc.recolor(color_func=bg_color))
#?為云圖去掉坐標(biāo)軸
plt.axis("off")
#?保存云圖
wc.to_file("render_04.png")
詞云輪廓原圖:
這是您的專屬社會(huì)人
運(yùn)行效果:
wordcloud詞云圖
由于第二種方法無法解析表情圖志秃,所以沒有表情出現(xiàn)怔球,除此外這兩種方法顯示的詞云圖內(nèi)容幾乎大同小異。
通過詞云圖浮还,我們一眼看出大家使用最多的竟坛,除開中文后,就是表情圖了钧舌,你的微信朋友圈里是否也有這樣的大紅嘴唇担汤,我的好像有,哈哈哈~當(dāng)我們單純來看詞云中的中文時(shí)洼冻,發(fā)現(xiàn)像太陽崭歧、陽光、微笑撞牢、可愛率碾、開心、愛普泡、未來等比較積極向上的詞語還是比較受大家喜歡的播掷,也體現(xiàn)出大家的內(nèi)心的積極、樂觀撼班,當(dāng)然還有像麗麗歧匈、徐、陳等這樣的姓名部分砰嘁,在昵稱中大家也使用的比較多件炉,也不缺乏有像悲傷、涼這樣比較冷色的詞語矮湘。
四斟冕、通過昵稱進(jìn)行情緒分析(大膽猜想)
01 | 微信昵稱為全中文
微信昵稱為全中文可以分為兩大類:自己的真名和其他昵稱。
直接用自己的姓名當(dāng)微信昵稱的人缅阳,性格大多是直來直往的那種磕蛇,待人比較坦誠(chéng)。
他們的微信一般用于熟人社交和日常辦公,平時(shí)不會(huì)隨便加不熟的人秀撇,就算用真名也不怕泄露個(gè)人信息超棺,來個(gè)不恰當(dāng)?shù)谋扔鳎翰蛔鎏澬氖拢慌鹿砬瞄T呵燕,哈哈哈棠绘。
為其他昵稱的人,大多有自己的看法再扭,也許昵稱是自己對(duì)未來的一種期望氧苍,也許昵稱是自己對(duì)生活的一種態(tài)度,或者是一些無厘頭的話語泛范,炫酷的話語让虐。(猜測(cè))
02 | 微信昵稱為全英文
出于個(gè)人喜好或工作需求,有些人會(huì)給自己取一個(gè)容易記的敦跌、叫著順口的英文名澄干,比如Tom、Abby柠傍、Jason麸俘,并常常在自我介紹的時(shí)候,讓大家可以用英文名字稱呼自己惧笛。
對(duì)他們而言从媚,英文名就相當(dāng)于自己的第二個(gè)名字,用它做微信名患整,和用本名沒什么太大的區(qū)別拜效。
也有的人會(huì)刻意避開那些常見的英文名,取一些更小眾的各谚,他們更在意提高自己的“逼格”紧憾,喜歡標(biāo)新立異,追求時(shí)尚和前衛(wèi)昌渤。(猜測(cè))