1.数据预处理
import pandas as pd
import numpy as np
df = pd.read_excel('./香港酒店数据.xlsx')
print(df.head())
# 删除第一行的空值
df = df[1:]
# 重置索引
df.index = range(0, len(df))
print(df.head())
# 删除Unnamed列
df = df.drop('Unnamed: 0', axis=1)
df.columns = ['名字', '类型', '城市', '地区', '地点', '评分', '评分人数', '价格']
print(df.head())
df1 = df[(df['类型'] == '休闲度假') & (df['地区'] == '湾仔')]
print(df1)
df2 = df[((df['地区'] == '观塘') | (df['地区'] == '油尖旺')) & (df['评分'] > 4)]
print(df2)
# df3 = df[(((df['地区'] == '观塘') | (df['地区'] == '油尖旺')) & (df['评分'] > 4)) | ((df['类型'] == '休闲度假') & (df['地区'] == '湾仔'))]
# print(df3)
# print('*' * 30)
# print(df3[df3['地区'].isnull()])
# print('*' * 30)
# print(df3[df3['类型'].isnull()])
df['类型'] = df['类型'].fillna('其他')
df['地区'] = df['地区'].fillna('其他')
df['评分'] = df['评分'].fillna(df['评分'].mean())
df = df.dropna(axis=0, subset=['价格', '评分人数'])
print(df)
df.drop_duplicates(inplace=True)
print(df)
df.index = range(0, len(df))
print('*' * 30)
print(df.isnull().sum())
print(df.dtypes)
df['评分人数'] = df['评分人数'].astype(np.int64)
print(df.dtypes)
df.to_excel('酒店数据1.xlsx', index=False)
2.数据分析
import pandas as pd
df = pd.read_excel('./酒店数据1.xlsx')
print(df.head())
print(df['评分'].dtypes) # float64
# 评分按升序排序
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('*' * 60)
print(df['价格'].describe())
'''
count 397.000000
mean 681.659950 #均值
std 906.282671 #标准差
min 67.000000 #最小值
25% 247.000000 #上四分位数
50% 418.000000 #结合中位数
75% 766.000000 #下四分位数
max 12926.000000 #最大值
Name: 价格, dtype: float64
'''
# 计算评分和价格的相关系数,协方差
print('*' * 60)
print(df['评分'].corr(df['价格'])) # 相关系数 0.2881887477836199
print(df['评分'].cov(df['价格'])) # 协方差 126.41083185662454 正相关
# 按照评分降序排序,评分相同时按价格升序排序
print(df.sort_values(by=['评分', '价格'], ascending=[False, True]))
'''
211 香港李女士宾馆(家庭旅馆)(MS LI GUEST HOUSE) 地铁周边 香港 ... 4.9 7 351
333 香港新金冠宾馆(New Golden Crown Guest House) 客栈 香港 ... 4.9 10 395
317 香港尊贵旅馆(Hong Kong Premium Guest House) 其他 香港 ... 4.8 19 166
199 香港鸣人宾馆(Naruto Inn) 地铁周边 香港 ... 4.8 921 190
75 香港和平客栈(HK Peaceful Guesthouse) 民宿 香港 ... 4.8 511 264
.. ... ... .. ... ... ... ...
332 香港欣欣宾馆(家庭旅馆)(YAN YAN GUEST HOUSE) 地铁周边 香港 ... 2.3 6 977
360 香港港龙酒店(Comfort Lodge Hong Kong) 地铁周边 香港 ... 2.2 18 492
280 香港经济型酒店 (家庭旅馆)(Hong Kong Budget Hostel) 地铁周边 香港 ... 2.0 29 67
282 巴黎旅馆(Paris Guest House (D2, 10/F)) 其他 香港 ... 2.0 5 67
385 香港中 港酒店(家庭旅馆)(HK-China Hotel) 地铁周边 香港 ... 1.5 7 429
'''
# 计算出,评分小于3分的酒店和占比。
df2 = df[df['评分'] < 3]
print(len(df2))
# 12
print(len(df2) / len(df))
# 0.030226700251889168
# 统计出酒店评分大于等于4分的酒店价格的均值
print(df[df['评分'] >= 4]['价格'].mean())
# 计算出每个地区的酒店占总酒店数量的比列。
print('*' * 60)
print(df['地区'].value_counts())
print(df['地区'].value_counts()/len(df))
'''
油尖旺 0.465995
其他 0.141058
湾仔 0.103275
中西区 0.083123
九龙城 0.052897
东区 0.040302
离岛 0.027708
观塘 0.017632
荃湾 0.017632
葵青 0.012594
南区 0.012594
沙田 0.010076
元朗 0.005038
屯门 0.005038
深水埗区 0.002519
罗湖区 0.002519
Name: 地区, dtype: float64
'''
# 找出酒店评分人数排名前20的酒店,并计算他们的价格均值。
print('*' * 60)
print(df.sort_values(by='评分人数', ascending=False)[:20]['价格'].mean())
# 查看酒店分布的类型数量和地区数量,并统计各个类型和地区包含的酒店数量
#查看类型和类型数量
print(df['类型'].unique())
print(len(df['类型'].unique()))
print(df['地区'].unique())
print(len(df['地区'].unique()))
# 统计各个类型和地区包含的酒店数量
print(df['类型'].value_counts())
print(df['地区'].value_counts())
3.每个地区酒店数量柱状图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
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)
plt.bar(x, y, color='r', label='数量')
# x坐标轴的字体
plt.tick_params(labelsize=10)
# 调整x轴竖着显示
plt.xticks(rotation=90)
for a, b in zip(x, y):
# 第一个参数:x轴的位置,第二个参数y轴的位置,第三个参数就是显示的值
plt.text(a, b + 0.2, b, ha='center', va='bottom', fontsize=10)
plt.legend()
plt.show()
4.每个价格等级酒店数量柱状图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
plt.rcParams['font.sans-serif'] = 'SimHei'
df = pd.read_excel('./酒店数据1.xlsx')
print(df['价格'].describe())
'''
min 67.000000
25% 247.000000
50% 418.000000
75% 766.000000
max 12926.000000
'''
df['价格等级'] = pd.cut(df['价格'], [0, 500, 1000, 3000, 13000], labels=['经济', '中档', '高档', '奢华'])
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)
plt.bar(x, y, color='r', label='数量')
# x坐标轴的字体
plt.tick_params(labelsize=10)
for a, b in zip(x, y):
# 第一个参数:x轴的位置,第二个参数y轴的位置,第三个参数就是显示的值
plt.text(a, b + 0.2, b, ha='center', va='bottom', fontsize=10)
plt.legend()
plt.show()
5.各个价格等级占比饼图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
plt.rcParams['font.sans-serif'] = 'SimHei'
df = pd.read_excel('./酒店数据1.xlsx')
print(df['价格'].describe())
df['价格等级'] = pd.cut(df['价格'], [0, 500, 1000, 3000, 13000], labels=['经济', '中档', '高档', '奢华'])
data = df['价格等级'].value_counts()
plt.pie(x=data.values, labels=data.index, autopct='%.0f%%', shadow=True)
plt.show()
6.酒店评分直方图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
plt.rcParams['font.sans-serif'] = 'SimHei'
df = pd.read_excel('./酒店数据1.xlsx')
data = df['评分']
plt.hist(data, bins=20, edgecolor='k', alpha=0.5)
plt.title('酒店的评分频率')
plt.show()
7.每个热门等级酒店评分均值柱状图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
plt.rcParams['font.sans-serif'] = 'SimHei'
df = pd.read_excel('./酒店数据1.xlsx')
print(df['评分人数'].describe())
'''
min 1.000000
25% 96.000000
50% 869.000000
75% 3283.000000
max 45463.000000
'''
df['热门等级'] = pd.cut(df['评分人数'], [0, 100, 1000, 5000, 50000], labels=['鲜为人知', '略有耳闻', '小有名气', '人尽皆知'])
r1_mean = df[df['热门等级'] == '鲜为人知']['评分'].mean()
r2_mean = df[df['热门等级'] == '略有耳闻']['评分'].mean()
r3_mean = df[df['热门等级'] == '小有名气']['评分'].mean()
r4_mean = df[df['热门等级'] == '人尽皆知']['评分'].mean()
labels = ['鲜为人知', '略有耳闻', '小有名气', '人尽皆知']
x = labels
y = [r1_mean, r2_mean, r3_mean, r4_mean]
# 设置画布的宽和高
plt.figure(figsize=(10, 6))
plt.title('各个热门等级酒店评分均值', fontsize=20)
plt.xlabel('价格等级', fontsize=16)
plt.ylabel('评分均值', fontsize=16)
plt.bar(x, y, color='r', label='评分均值')
# x坐标轴的字体
plt.tick_params(labelsize=10)
for a, b in zip(x, y):
# 第一个参数:x轴的位置,第二个参数y轴的位置,第三个参数就是显示的值
plt.text(a, b + 0.2, b, ha='center', va='bottom', fontsize=10)
plt.legend()
plt.show()
8.评分和价格散点图
import matplotlib.pyplot as plt
import pandas as pd
# 解决中问问题
plt.rcParams['font.sans-serif'] = 'SimHei'
df = pd.read_excel('./酒店数据1.xlsx')
x = df['价格']
y = df['评分']
plt.figure(figsize=(10,8))
plt.scatter(x, y, color='c')
plt.title('酒店价格与评分')
plt.xlabel('价格')
plt.ylabel('评分')
plt.show()
tips:数据来源于网络,若侵权,请联系删除。