赞
踩
第一步.数据预处理
- import pandas as pd
- import numpy as np
- df = pd.read_excel('./香港酒店数据.xlsx')
- print(df.head())
- df = df.drop('Unnamed: 0',axis=1)
- df=df[1:]
- df.index=range(0,len(df))
- print(df.head())
- #重新设置数据的索引,重新设置列名称为'名字','类型','城市','地区','地点','评分','评分人数','价格'
- df.columns=['名字','类型','城市','地区','地点','评分','评分人数','价格']
- #查找出所有类型为“休闲度假”并且在湾仔地区的酒店
- print(df[(df['类型']=='休闲度假')&(df['地区']=='湾仔')])
- #查找出所有地址在观塘或者油尖旺,评分大于4的酒店
- df['评分']=df['评分'].astype(np.float64)
- print(df[((df['地区']=='湾仔')|(df['地区']=='观塘')) & (df['评分']>4)])
- #找出缺失值数据用“其他”填充类型和地区
- df['地区']=df['地区'].fillna('其他')
- df['类型']=df['类型'].fillna('其他')
- #用评分均值填充评分缺失值
- df['评分'].fillna(np.mean(df['评分']),inplace=True)
- #删除价格和评分人数的缺失值
- df=df.dropna()
- #保存到处理好的数据到“酒店数据1.xlsx中
- df.to_excel('./酒店数据1.xlsx')
第二步.数据分析
- import pandas as pd
- import numpy as np
- df = pd.read_excel('./酒店数据1.xlsx')
- print(df['评分'].dtype)
- print(df.sort_values(by='评分')[:-1])
- print(df.sort_values(by='评分',ascending=False)[:-1])
- print(df['评分'].mean())
-
- '''4.286394590153922'''
- print(df.describe())
- ''' Unnamed: 0 评分 评分人数 价格
- count 397.000000 397.000000 397.000000 397.000000
- mean 200.654912 4.286395 2511.929471 681.659950
- std 118.315211 0.483998 4566.627028 906.282671
- min 0.000000 1.500000 1.000000 67.000000
- 25% 99.000000 4.200000 96.000000 247.000000
- 50% 198.000000 4.400000 869.000000 418.000000
- 75% 300.000000 4.600000 3283.000000 766.000000
- max 419.000000 4.900000 45463.000000 12926.000000
- '''
- print(df['价格'].mean())
- print(df['价格'].median())
- print(df['价格'].var())
- print(df['价格'].max())
- print(df['价格'].min())
- #相关系数
- print(df[['价格','评分']].corr())
- #协方差
- print(df[['价格','评分']].cov())
- #评分相同时按价格升序排序
- print(df.sort_values(by=['评分','价格'],ascending=[False,True])[:-1])
- #评分小于3分的酒店数量和占比
- print(len(df[df['评分']<3]))
- print((len(df[df['评分']<3])/len(df)))
- #酒店评分大于等于4分的酒店的价格均值
- print(df[df['评分']>=4]['价格'].mean())
- #计算出,评分小于3分的酒店数量和占比
- per = str(round((len(df[df['评分']<3])/len(df)) * 100,2))+ '%'
- print(per)
- #找出酒店评分人数排名前20的酒店
- print(df.sort_values(by='评分人数')[:20]['价格'].mean())
- #酒店分布的类型数量和地区数量
- print(df['类型'].unique())
- print(df['地区'].unique())
- #计算出每个地区的酒店占总酒店数量的比例
- per = round((df['地区'].value_counts()/len(df)) * 100,2)
- print(per.astype(str) + '%')
第三步.画图(图形报表)
1.各个价格等级占比的饼图
- import pandas as pd
- import matplotlib.pyplot as plt
- # 解决中文乱码问题
- plt.rcParams['font.sans-serif']='SimHei'
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- df['价格等级'] = pd.cut(df['价格'],[0,200,500,1000,3000,100000],labels=['一星级','二星级','三星级','四星级','五星级'])
- data = df['价格等级'].value_counts()
- print(data)
- x = data.values
- y = x/sum(x)
- print(x)
- print(y)
- plt.figure(figsize=(15,10))
- plt.pie(y,labels=data.index,autopct='%.1f %%')
- plt.title('各个价格等级占比')
- #显示图例
- plt.legend()
- plt.show()
2.酒店评分的直方图
- import pandas as pd
- import matplotlib.pyplot as plt
-
- # 解决中文乱码问题
- plt.rcParams['font.sans-serif']='SimHei'
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- plt.figure(figsize=(10,6))
- plt.hist(df['评分'],bins=10,edgecolor='k')
- plt.title('酒店评分')
- plt.xlabel('分数')
- plt.ylabel('酒店数量')
- plt.show()
3.每个地区酒店数量的柱状图
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- data = df['地区'].value_counts()
- print(data)
- x = data.index
- y = data.values
- plt.figure(figsize=(10,6))
- plt.bar(x,y,color='r',width=0.8)
- plt.title('每个地区酒店数量分布',fontsize=20)
- plt.xlabel('地区',fontsize=16)
- plt.ylabel('酒店数量',fontsize=16)
- #调整x轴竖着显示
- plt.xticks(rotation=90)
- #显示每个轴的数字
- for a,b in zip(x,y):
- #第一参数x轴的位置,第二个参数就是y轴的位置,第三个参数显示的文本内容
- plt.text(a,b,b,ha='center',va='bottom',fontsize=10)
- plt.show()
4.价格等级酒店数量的柱状图
- import pandas as pd
- import matplotlib.pyplot as plt
-
- # 解决中文乱码问题
- plt.rcParams['font.sans-serif']='SimHei'
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- df['热门等级'] = pd.cut(df['价格'],[0,300,600,1000,3000,20000],labels=['特惠','廉价','标准','昂贵','豪华'])
- print(df.head())
- group = df['评分'].groupby(df['热门等级']).sum().sort_values()
- print(group)
- x = group.index
- y = group.values
- plt.bar(x,y,width=0.5)
- for a,b in zip(x,y):
- plt.text(a,b,round(b,2),ha='center',va='bottom')
- plt.show()
5.每个热门等级酒店评分均值的柱状图
- import pandas as pd
- import matplotlib.pyplot as plt
-
- # 解决中文乱码问题
- plt.rcParams['font.sans-serif']='SimHei'
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- df['热门等级'] = pd.cut(df['价格'],[0,300,600,1000,3000,20000],labels=['特惠','廉价','标准','昂贵','豪华'])
- print(df.head())
- group = df['评分'].groupby(df['热门等级']).mean().sort_values()
- print(group)
- x = group.index
- y = group.values
- plt.bar(x,y,width=0.5)
- for a,b in zip(x,y):
- plt.text(a,b,round(b,2),ha='center',va='bottom')
- plt.show()
6.评分价格散点图
- import pandas as pd
- import matplotlib.pyplot as plt
- plt.rcParams['font.sans-serif']='SimHei'
- # 解决负号无法显示问题
- plt.rcParams['axes.unicode_minus']=False
- df = pd.read_excel('酒店数据1.xlsx')
- x = df['价格']
- y = df['评分']
- plt.figure(figsize=(10,8))
- plt.scatter(x, y, color='b')
- plt.title('酒店价格与评分')
- plt.xlabel('价格')
- plt.ylabel('评分')
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。