模拟自练数据分析
1、统计出防晒的产品保质期3年及以上且质量分高于4.55的前十数据,价格排序,绘图X轴为店名,Y轴为价格
2、绘制柱状图,X轴为各个国家,Y轴为只适合女的产品总数量。
3、哪个国家的不同店名数量最高前十名 绘图X为国家,Y为国家对应的店铺数量
4、以不同人群分组,得出对应分数量组下不同功效的数量,以数量降序排列,取出前五绘制饼状图。
5、取出总销量前10的产品,将其质量分和服务分取出来,绘制折现统计图,做在一张图里,对比质量分和服务分的情况。X轴总销量,Y轴分数
6、假设每样口红成本价是出售价的80%,求出不同产地(国家)下所有商品平均可以净赚多少钱。并平均价由高到低排序绘制柱状图,X为国家,Y轴为对应国家下的商品平均价。
7、以不同产地(国家)分组,绘制非防晒产品系列中,总销量,价格与总评数三个折线统计图,X为国家,Y轴为数量,取总销量前十的国家
8、按产地(国家)分类所有产品,组平均价大于平台(即整个的所有)商品平均价的商店数量柱状图,(提示:横轴为国家,纵轴为各产地(国家)对应商店数量)
9、求出价格Top10下对应的不同服务分的平均分数。绘制柱状图,X为价格,服务分平均分数为Y轴
表格结构如下:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import re
plt.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体
data=pd.read_excel('口红.xlsx')
1、统计出防晒的产品保质期3年及以上且质量分高于4.55的前十数据,价格排序,绘图X轴为店名,Y轴为价格
data['防晒']=data['防晒'].apply(lambda x:str(x).strip()) #去重空格
data1=data[(data['防晒']=='是')&(data['质量分']>4.55)&(data['保质期']=='3年及以上')] #过滤条件
# data1['价格']=data1['价格'].apply(lambda x:float(re.sub('¥.*~','',x).replace('¥',''))) #把价格字段值重新定义成数字类型,方便后面操作
data2=data1.sort_values(by=['价格'],ascending=False) #降序排列
X=data2['店名'].values[:10] #取出店名前十
Y=data2['价格'].values[:10] #取出价格前十
plt.xticks(np.arange(0,10),X,rotation=60) #设置X轴刻度线
plt.bar(['A','B','C','D','E','F','G','H','I','J'],Y) #先定义X轴头部
plt.show()
2、绘制柱状图,X轴为各个国家,Y轴为只适合女的产品总数量。
data1=data[data['适合人群']=='女'] #取出只适合女的产品
data2=data1[['国家','店名']] #适合女的产品中取出国家和店名的数据
data3=data2.groupby(by='国家').count() #以国家分组记数
data3.sort_values('店名',ascending=False,inplace=True) #以店名的数量排序
data3.plot(kind='bar')
3、哪个国家的不同店名数量最高前十名 绘图X为国家,Y为国家对应的店铺数量
data1=data['国家'].unique() #取出不同的国家
list=[]
for i in data1:#遍历国家
data2=data[data['国家']==i].drop_duplicates(['店名'])['店名'].count() #遍历每个国家下对应的店名的数量
list.append(data2)
data3=pd.DataFrame(list,index=data1) #构建DataFrame,值为不同店名数量,索引为国家
data4=data3.sort_values(0,ascending=False) #以店名数量降序排列
data4[:10].plot.bar() #构建前十的国家对应的店名的数量柱状图
4、以不同人群分组,得出对应分数量组下不同功效的数量,以数量降序排列,取出前五绘制饼状图。
data['适合人群']=data['适合人群'].fillna(value='空') #将适合人群为空的值赋值一个‘空’字符串
data1=data[['适合人群','功效']] #取出适合人群和功效的数据
data2=data1.groupby(by='适合人群')['功效'].nunique() #以人群分组,然后以功效取独自数据
data_index=data2.index #取出适合人群
data_value=data2.values #取出不同功效数量
data3=pd.DataFrame(data_value,index=data_index) #构建一个新的DataFrame类型,索引为适合人群,值为功效数量
data3.sort_values(0,ascending=False,inplace=True) #以标签索引取出值进行降序排列
data3[:5].plot.pie(subplots=True,autopct="%.2f%%",legend=False)
#需要加subplots=True否则报错:ValueError: pie requires either y column or 'subplots=True'
#autopct是百分比,lengend=False去掉图例。
5、取出总销量前10的产品,将其质量分和服务分取出来,绘制折现统计图,做在一张图里,对比质量分和服务分的情况。X轴总销量,Y轴分数
data1=data.sort_values('总销量',ascending=False) #先排序总销量
data2=data1[:10][['质量分','服务分']] #取出前十条的俩个字段下的值
X=data1['总销量']
Y1=data2['质量分'] #取出质量分为Y1
Y2=data2['服务分'] #取出服务分为Y2
plt.xticks(np.arange(10),X,rotation=60) #设置刻度线
plt.plot(['A','B','C','D','E','F','G','H','I','J'],Y1,label='质量分') #绘制Y1
plt.plot(['A','B','C','D','E','F','G','H','I','J'],Y2,label='服务分') #绘制Y2
plt.legend() #图例
plt.show()
6、假设每样口红成本价是出售价的80%,求出不同产地(国家)下所有商品平均可以净赚多少钱。并平均价由高到低排序绘制柱状图,X为国家,Y轴为对应国家下的商品平均价。
data['价格']=data['价格'].apply(lambda x:float(re.sub('¥.*~','',x).replace('¥',''))) #处理价格
data['利润']=(data['价格'])*(data['总销量'])*0.2 #设立一个新的利润值字段
data1=data[['利润','国家']] #取出利润和国家
data2=data1.groupby(by='国家').mean() #以国家分组,求对应数据的平均值,即利润的平均值
data2.sort_values('利润',ascending=False,inplace=True) #以利润排序
data2.plot(kind='bar') #绘制柱状图
7、以不同产地(国家)分组,绘制非防晒产品系列中,总销量,价格与总评数三个折线统计图,X为国家,Y轴为数量,取总销量前十的国家
data['价格']=data['价格'].apply(lambda x:float(re.sub('¥.*~','',x).replace('¥',''))) #处理价格为浮点类型
data['防晒']=data['防晒'].apply(lambda x:str(x).strip()) #去空格
data1=data[data['防晒']=='否'] #过滤条件为否的防晒产品
data2=data1[['国家','总销量','价格','总评价数']] #取数据
data3=data2.groupby('国家').sum() #求总数量
data4=data3.sort_values('总销量',ascending=False) #以总销量降序排列
data4[:10].plot()
8、按产地(国家)分类所有产品,组平均价大于平台(即整个的所有)商品平均价的商店数量柱状图,(提示:横轴为国家,纵轴为各产地(国家)对应商店数量)
data['价格']=data['价格'].apply(lambda x:float(re.sub('¥.*~','',x).replace('¥',''))) #处理价格为浮点类型
mean_price=data['价格'].mean() #求所有价格的平均值
data1=data.groupby('国家').mean() #以国家分组求平均值(包含了分组求平均价的数据)
data2=data1[data1['价格']>mean_price] #取出分组后平均价格大于所有平均价的数据
data3=data2.index #取出索引即对于满足上述条件的国家
list=[]
for i in data3: #遍历国家名字
d=data[data['国家']==i]['店名'].nunique() #取出不同国家对于不同商店的数量
list.append(d) #添加到列表构成新的数据
data4=pd.DataFrame(list,index=data3) #构建新的DataFrame类型,国家为索引,对于商店数量为值
data5=data4.sort_values(0,ascending=False) #以值降序排列
Y=data5.values.reshape(1,11)[0] #构建Y,取0是因为它是列表套列表,我们只需要一层列表
X=data5.index #设定X
plt.xticks(np.arange(0,11),X,rotation=60) #设置X刻度线
plt.bar(['A','B','C','D','E','F','G','H','I','J','L'],Y) #绘制柱状图
plt.show()
9、求出价格Top10下对应的不同服务分的平均分数。绘制柱状图,X为价格,服务分平均分数为Y轴
data['价格']=data['价格'].apply(lambda x:float(re.sub('¥.*~','',x).replace('¥',''))) #处理价格为浮点类型
data1=data['价格'].unique().tolist() #取出转成列表
data2=sorted(data1,reverse=True)[:10] #列表降序排列,取出前十条数据
list=[]
for i in data2: #遍历价格
data3=data[data['价格']==i].drop_duplicates(['服务分'])['服务分'].mean() #对每次遍历的价格进行处理
list.append(data3)
data4=pd.DataFrame(list,index=data2) #设定DataFrame类型,值为平均分,索引为价格
data5=data4.sort_values(0,ascending=False) #以平均分降序排列
data5.plot.bar() #绘制柱状图