本文采用的是之前的一個上海商鋪數(shù)據(jù)饭望,里面主要包括了店名仗哨、類別、評論數(shù)铅辞、星級厌漂、價(jià)格、以及評分巷挥,評分主要包括環(huán)境桩卵、口味、服務(wù)倍宾,因此也是從這個三個維度作雷達(dá)圖。
在這里胜嗓,提出我們的問題:
1.各個類目的評分如何高职?
2.評分與評論數(shù)、星級的關(guān)聯(lián)度辞州?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from math import pi
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
#設(shè)置字體怔锌,作圖中才能顯示中文
f = open(r'E:\BaiduNetdiskDownload\商鋪數(shù)據(jù).csv',encoding='utf-8')
shops = pd.read_csv(f)
#導(dǎo)入數(shù)據(jù),由于數(shù)據(jù)名稱中帶有中文变过,因此要用這種形式
shops.head()
首先把數(shù)據(jù)導(dǎo)入進(jìn)來埃元,然后觀察數(shù)據(jù)
在這里要對comment,price進(jìn)行處理
shops['comment'] = shops['comment'].str.replace('我要點(diǎn)評','0')
shops['comment'] = shops['comment'].str.replace('條點(diǎn)評','')
shops['comment'] = shops['comment'].apply(lambda x : int(x))
#將comment中的中文全部去掉媚狰,沒有評論的用0代替
shops['price'] = shops['price'].str.replace('人均 -','NaN')
shops['price'] = shops['price'].str.replace('人均 ¥','')
#同樣將中文去掉
shops = shops[['classify','shop_name','comment','star','price','口味','環(huán)境','服務(wù)']]
#選取其中這些特征
首先岛杀,根據(jù)第一個問題:各個類目的評分如何。我們在這里選擇雷達(dá)圖崭孤,只要這種雷達(dá)圖做出來类嗤,其他情況下都沒什么問題,也許雷達(dá)圖在這里不是最好的表達(dá)方式辨宠,但是本文的目的在于學(xué)習(xí)雷達(dá)圖的制作遗锣。
classifys = list(shops['classify'].unique())
#將所有類目作個列表
rating_classify = shops.groupby('classify').mean()[['口味','環(huán)境','服務(wù)']]
#這三個指標(biāo)是我們做來作雷達(dá)圖的指標(biāo)
color = ['b','r','y']
plt.figure(figsize=(15,10))
idx = 1
for i in classifys: #遍歷所有類目
features = dict(rating_classify.loc[i]) #選取每個類目中的值,作個字典
classify_ = features.keys() #字典的鍵為口味嗤形,環(huán)境精偿,服務(wù)
value = list(features.values()) #字典的值則為評分
value += value[:1] #value尾巴加上第一個值,用于連接首尾
N = len(classify_) #根據(jù)特征切分整圓
angles = [n/float(N) * 2 * pi for n in range(N)] #劃分弧度
angles += angles[:1] #同樣用于連接首尾
plt.subplot(1,3,idx,polar=True) #polar則代表用弧度來作圖,這是雷達(dá)圖的關(guān)鍵
plt.xticks(angles[:-1],classify_,color='grey',size = 8)
#雷達(dá)圖其實(shí)類似于折線圖首尾連接形成一個圓笔咽,它的基本要點(diǎn)同樣是找到x和y值墓阀,這里x值為特征,y則為評分拓轻,
#只不過x軸的刻度變成了弧度也就是angles斯撮,而弧度上的刻度則為特征
plt.ylim(0,10)
#設(shè)置y的范圍,根據(jù)數(shù)值來確定
plt.grid(True)
plt.tick_params('y', labelleft=False)
plt.plot(angles,value,linewidth=1,linestyle = 'solid')
#畫折現(xiàn)即可扶叉,區(qū)別就是x為angles
plt.fill(angles,value,c = color[idx-1],alpha = 0.3)
idx += 1
plt.title(i)
由圖可知勿锅,三者不同特征評分相似。接下來我們只研究在美食中枣氧,細(xì)分不同條件觀察評分溢十。
首先根據(jù)評論數(shù),先對評論數(shù)分為三個等級(低評論达吞,中評論张弛,高評論)代表評論數(shù)的不同。然后根據(jù)每個等級作雷達(dá)圖酪劫,代碼如下:
shops['comment'] = pd.cut(shops['comment'],[-1,1000,10000,22000],labels = ['少評論','中評論','高評論'])
#首先根據(jù)評論數(shù)作分級處理吞鸭,這里用到cut函數(shù)
food = shops[shops['classify'] == '美食']
idx = 1
plt.figure(figsize = (30,6))
for comments_,features in food.groupby('comment').mean()[['口味','環(huán)境','服務(wù)']].iterrows():
print(comments_)
print(features)
feature = dict(features)
value = list(feature.values())
value += value[:1]
print(value)
class_comment = feature.keys()
N = len(class_comment)
angle = [n/float(N) * 2 * pi for n in range(N)]
angle += angle[:1]
plt.subplot(polar = True)
plt.xticks(angle,class_comment,size = 10,color='grey')
plt.ylim(0,10)
plt.grid(True)
plt.tick_params('y',labelleft=False)
plt.plot(angle,value,linewidth = 2,linestyle='solid',label = comments_)
plt.legend(loc = 'best')
#plt.fill(angle,value,c = color[idx-1],alpha = 0.3)
#plt.title(comments_)
idx += 1
可以看出,高評論數(shù)的商家往往比低評論數(shù)的商家具有更高的評分覆糟。由于這里的評論并沒有分的很細(xì)刻剥,在實(shí)際情況可以進(jìn)一步分得更細(xì)來進(jìn)行觀察。隨后是針對star繪制雷達(dá)圖滩字。
star = list(shops['star'].unique())
plt.figure(figsize = (8,6))
idx = 1
for star_,features in food.groupby('star').mean()[['口味','環(huán)境','服務(wù)']].iterrows():
plt.figure(figsize = (8,6))
plt.subplot(polar = True)
feature = dict(features)
value = list(feature.values())
value += value[:1]
star_comment = feature.keys()
N = len(star_comment)
angle = [n/float(N) * 2 * pi for n in range(N)]
print(N)
angle += angle[:1]
#plt.subplot(7,1,idx,polar = True)
plt.xticks(angle,class_comment,size = 10,color='grey')
plt.ylim(0,9)
plt.grid(True)
plt.tick_params('y',labelleft=False)
plt.plot(angle,value,linewidth = 1,linestyle='solid',label = star_)
plt.legend(loc = 'best')
#plt.fill(angle,value,c = color[idx-1],alpha = 0.3)
#plt.title(comments_)
idx += 1
這里選取部分圖造虏,可以看出星級越高評分也越高,各方面均衡上升才能保證更高的水準(zhǔn)麦箍,因此一個商鋪要想做好漓藕,必須在環(huán)境口味服務(wù)各方面都下功夫。