第一步.数据预处理
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()