数据读取
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()