利用pandas和matplotlib库对香港酒店数据进行分析

1 篇文章 0 订阅
1 篇文章 0 订阅

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:数据来源于网络,若侵权,请联系删除。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Young_bl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值