数据读取
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取数据
df = pd.read_excel('./香港酒店数据.xlsx')
print(df.head())
# 删除第一行的空值
df = df[1:]
# 重置索引
df.index = range(len(df))
# 删除Unnamed列
df = df.drop('Unnamed: 0', axis=1)
# print(df.head())
# print(df.tail())
# 重新设置列的名称
df = df.rename(columns={'字段1': '名字', '字段2': '类型', '字段3': '城市', '字段4': '地区',
'字段5': '地点', '字段6': '评分', '字段7': '评分人数', '字段8': '价格'})
# print(df.head())
# 查找出所有类型为“休闲度假”并且在湾仔地区的酒店
# 查找出所有地址在观塘或者油尖旺,评分大于4的酒店
print(df[(df['类型'] == '休闲度假') & (df['地区'] == '湾仔')])
print(df[((df['地区'] == '观塘') | (df['地区'] == '油尖旺')) & (df['评分'] > 4)])
# 找出缺失值数据用“其他”填充类型和地区
df['类型'].fillna('其他', inplace=True)
df['地区'].fillna('其他', inplace=True)
# 用评分均值填充评分缺失值
df['评分'].fillna(np.mean(df['评分']), inplace=True)
# 删除价格和评分人数的缺失值
df = df.dropna(axis=0, subset=['价格', '评分人数'])
df.drop_duplicates(inplace=True)
df.index = range(len(df))
# print(df.tail())
# 保存到处理好的数据到“酒店数据1.xlsx中
df.to_excel('酒店数据1.xlsx', index=False)
数据分析
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取保存的预得理好的数据
df = pd.read_excel('./酒店数据1.xlsx')
# print(df.head())
# 查看“评分”的格式
print(df['评分'].dtypes)
# 并分别进行升序和降序排序.对酒店按照价格进行排名,计算“油尖旺”地区的均价
print(df.sort_values(by='评分', ascending=True))
print(df.sort_values(by='评分', ascending=False))
print(df.sort_values(by='价格', ascending=False)['名字'])
print(df[df['地区'] == '油尖旺']['价格'].mean())
# 描述性统计
print(df.describe())
# 所有价格的均值方差,最大最小值,中值
print(df['价格'].var())
print(df['价格'].max())
print(df['价格'].min())
print(df['价格'].median())
# 评分和价格之间的的相关系数,协方差
print(df[['评分', '价格']].corr())
print(df[['评分', '价格']].cov)
# 评分降序排序,评分相同时按价格升序排序
print(df.sort_values(by=['评分', '价格'], ascending=(False, True)))
# 评分小于3分的酒店数量和占比
print(len(df[df['评分'] < 3]))
print(len(df[df['评分'] < 3]) / len(df))
# 酒店评分大于等于4分的酒店的价格均值
print(df[df['评分'] >= 4]['价格'].mean())
# 计算出每个地区的酒店占总酒店数量的比例
print(df['地区'].value_counts() / len(df))
# 找出酒店评分人数排名前20的酒店,并计算他们的价格均值
print(df.sort_values(by='评分人数', ascending=False)[:20]['名字'])
print((df.sort_values(by='评分人数', ascending=False)[:20]['价格']).mean())
# 酒店分布的类型数量和地区数量
print(len(df['类型'].unique()))
print(len(df['地区'].unique()))
# 统计各个类型和地区包含的酒店数量。
print(df['类型'].value_counts())
print(df['地区'].value_counts())
绘制出每个地区酒店数量的柱状图
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
# 绘制出每个地区酒店数量的柱状图,柱状颜色为红色.
data = df['地区'].value_counts()
# print(data)
x = data.index
y = data.values
plt.figure(figsize=(10, 6))
plt.title('各个地区酒店数量', fontsize=20)
plt.xlabel('地区',fontsize=16)
plt.ylabel('数量',fontsize=16)
for a, b in zip(x,y):
# 第一个参数:x轴的位置,第一个参数:y轴的位置,第三个参数:显示的内容
plt.text(a, b+0.2, b, ha='center',va='bottom',fontsize=12)
plt.bar(x,y,color='r',label='数量')
# x坐标轴的字体
plt.tick_params(labelsize=10)
# 调整x轴竖着显示
plt.xticks(rotation=90)
plt.legend()
plt.show()
绘制出每个价格等级酒店数量的柱状图
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
# 绘制出每个价格等级酒店数量的柱状图。
# 先打印出最大和最小价格,明确划分区间
# print(df['价格'].max())
# print(df['价格'].min())
df['价格等级'] = pd.cut(df['价格'], [0, 250, 500, 1000, 5000, 15000], labels=['经济', '实惠', '中档', '高档', '奢华'])
print(df)
data = df['价格等级']
value = data.values
label = data.index
print(value)
print(label)
plt.figure(figsize=(10, 6))
plt.title('每个价格等级酒店数量', fontsize=20)
plt.xlabel('价格等级', fontsize=16)
plt.ylabel('数量', fontsize=16)
plt.bar(value, label, width=0.5, color='c', label='数量')
# x坐标轴的字体
plt.tick_params(labelsize=10)
# 给图像上加上图例
plt.legend()
plt.show()
绘制出各个价格等级占比的饼图
# 绘制出各个价格等级占比的饼图。
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
df['价格等级'] = pd.cut(df['价格'], [0, 250, 500, 1000, 5000, 15000], labels=['经济', '实惠', '中档', '高档', '奢华'])
# print(df)
data = df['价格等级'].value_counts()
value = data.values
label = data.index
plt.figure(figsize=(10, 6))
plt.title('价格等级占比')
plt.pie(value, labels=label, autopct='%.2f%%')
plt.show()
绘制出酒店评分的直方图
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
# 绘制出酒店评分的直方图。
data = df['评分']
plt.hist(data, bins=8, edgecolor='k', alpha=0.5)
plt.title('酒店评分')
plt.show()
绘制出每个热门等级酒店评分均值的柱状图。(按照评分均值从小到大排序。)
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
# 绘制出每个热门等级酒店评分均值的柱状图。(按照评分均值从小到大排序。)
df['价格等级'] = pd.cut(df['价格'], [0, 250, 500, 1000, 5000, 15000], labels=['经济', '实惠', '中档', '高档', '奢华'])
data = df['评分'].groupby(df['价格等级']).mean()
value = data.values
label = data.index
plt.title('每个热门等级酒店评分均值',fontsize=16)
plt.xlabel('价格等级',fontsize=12)
plt.ylabel('评分均值',fontsize=12)
plt.bar(label, value, color='b', label='数量')
for a, b in zip(label, value):
plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
plt.legend()
plt.show()
根据评分和价格信息,绘制散点图
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文问题
plt.rcParams['font.sans-serif'] = 'SimHei'
# 读取预处理后的数据
df = pd.read_excel('酒店数据1.xlsx')
# 根据评分和价格信息,绘制散点图。
x = df['评分']
y = df['价格']
plt.figure(figsize=(10, 6))
plt.scatter(x, y, color='c')
plt.title('酒店评分与价格')
plt.xlabel('评分')
plt.ylabel('价格')
plt.show()