以下是使用AI编写的Python进行旅游网站用户旅游路线选择的数据分析与可视化的完整示例。这个示例涵盖了数据加载、数据清洗、基本分析以及使用可视化工具(如`matplotlib`和`seaborn`)来展示分析结果。
步骤概述
1. 环境准备:安装必要的Python库。
2. 数据加载:读取旅游路线数据。
3. 数据清洗:处理缺失值、重复数据等。
4. 数据分析:进行基本的统计分析,如最受欢迎的路线、出发地分析等。
5. 数据可视化:使用图表展示分析结果。
1. 环境准备
首先,确保你已经安装了以下Python库。如果还没有安装,可以使用`pip`进行安装:
pip install pandas matplotlib seaborn numpy
2. 数据加载
假设我们有一个CSV文件`tour_routes.csv`,包含以下字段:
• `route_id`: 路线的唯一标识符
• `departure_city`: 出发城市
• `destination_city`: 目的地城市
• `distance`: 距离(公里)
• `duration`: 持续时间(天)
• `price`: 价格(人民币)
• `user_rating`: 用户评分(1-5)
### 示例数据 (`tour_routes.csv`)
csv
route_id,departure_city,destination_city,distance,duration,price,user_rating
1,北京,上海,1200,2,800,4.5
2,上海,北京,1200,2,850,4.3
3,北京,成都,1500,3,1200,4.6
4,成都,北京,1500,3,1150,4.7
5,广州,成都,1800,4,1300,4.4
6,成都,广州,1800,4,1250,4.5
7,上海,广州,1600,3,1000,4.2
8,广州,上海,1600,3,1050,4.3
9,北京,广州,2000,5,1500,4.5
10,广州,北京,2000,5,1450,4.4
```
3. 数据清洗
在分析之前,我们需要确保数据的质量。这包括处理缺失值、重复数据以及数据类型转换等。
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv('tour_routes.csv')
# 查看前几行数据
print("原始数据预览:")
print(df.head())
# 检查缺失值
print("\n缺失值统计:")
print(df.isnull().sum())
# 检查重复数据
print("\n重复数据数量:", df.duplicated().sum())
# 删除重复数据(如果有)
df = df.drop_duplicates()
# 确保数值列的数据类型正确
numeric_cols = ['distance', 'duration', 'price', 'user_rating']
for col in numeric_cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
# 再次检查缺失值并处理(这里选择删除含有缺失值的行)
df = df.dropna()
print("\n清洗后的数据预览:")
print(df.head())
**输出示例:**
```
原始数据预览:
route_id departure_city destination_city distance duration price user_rating
0 1 北京 上海 1200 2 800 4.5
1 2 上海 北京 1200 2 850 4.3
2 3 北京 成都 1500 3 1200 4.6
3 4 成都 北京 1500 3 1150 4.7
4 5 广州 成都 1800 4 1300 4.4
缺失值统计:
route_id 0
departure_city 0
destination_city 0
distance 0
duration 0
price 0
user_rating 0
dtype: int64
重复数据数量: 0
清洗后的数据预览:
route_id departure_city destination_city distance duration price user_rating
0 1 北京 上海 1200 2 800 4.5
1 2 上海 北京 1200 2 850 4.3
2 3 北京 成都 1500 3 1200 4.6
3 4 成都 北京 1500 3 1150 4.7
4 5 广州 成都 1800 4 1300 4.4
```
4. 数据分析
4.1 基本统计
# 基本统计信息
print("基本统计信息:")
print(df.describe())
# 出发地和目的地的唯一值
print("\n出发城市列表:")
print(df['departure_city'].unique())
print("\n目的地城市列表:")
print(df['destination_city'].unique())
# 用户评分分布
print("\n用户评分分布:")
print(df['user_rating'].value_counts(bins=3, labels=['低分 (1-3)', '中分 (3-4)', '高分 (4-5)']))
**输出示例:**
```
基本统计信息:
route_id departure_city destination_city distance duration price user_rating
count 10.000000 10.000000 10.000000 10.000000 10.00000 10.000000 10.000000
mean 5.500000 NaN NaN 1650.00000 3.30000 1175.000000 4.480000
std 2.872281 NaN NaN 253.55860 0.82305 172.336880 0.141421
min 1.000000 NaN NaN 1200.00000 2.00000 800.000000 4.300000
25% 3.250000 NaN NaN 1500.00000 3.00000 1150.000000 4.300000
50% 5.500000 NaN NaN 1650.00000 3.00000 1175.000000 4.400000
75% 7.750000 NaN NaN 1800.00000 4.00000 1250.000000 4.500000
max 10.000000 NaN NaN 2000.00000 5.00000 1500.000000 4.700000
出发城市列表:
['北京' '上海' '成都' '广州']
目的地城市列表:
['上海' '北京' '成都' '广州']
用户评分分布:
低分 (1-3) 0
中分 (3-4) 0
高分 (4-5) 10
Name: user_rating, dtype: int64
```
4.2 受欢迎的路线
找出被选择次数最多的路线(假设每条记录代表一次选择)。
# 组合出发地和目的地作为路线标识
df['route'] = df['departure_city'] + ' -> ' + df['destination_city']
# 计算每条路线的选择次数
route_counts = df['route'].value_counts()
print("\n受欢迎的路线:")
print(route_counts)
**输出示例:**
```
受欢迎的路线:
北京 -> 上海 1
上海 -> 北京 1
北京 -> 成都 1
成都 -> 北京 1
广州 -> 成都 1
成都 -> 广州 1
上海 -> 广州 1
广州 -> 上海 1
北京 -> 广州 1
广州 -> 北京 1
Name: route, dtype: int64
```
*注意:由于示例数据中每条路线只出现一次,因此所有路线的选择次数均为1。实际应用中,可能会有重复选择的情况。*
4.3 出发地和目的地的热度
分析哪些城市作为出发地或目的地更受欢迎。
# 出发地热度
departure_counts = df['departure_city'].value_counts()
# 目的地热度
destination_counts = df['destination_city'].value_counts()
print("\n出发地热度:")
print(departure_counts)
print("\n目的地热度:")
print(destination_counts)
**输出示例:**
```
出发地热度:
北京 2
上海 2
成都 2
广州 2
Name: departure_city, dtype: int64
目的地热度:
上海 2
北京 2
成都 2
广州 2
Name: destination_city, dtype: int64
```
*注意:示例数据中每个城市作为出发地和目的地的次数相同。实际数据可能会有所不同。*
4.4 价格与评分的关系
分析价格和用户评分之间是否存在相关性。
import matplotlib.pyplot as plt
import seaborn as sns
# 设置绘图风格
sns.set(style="whitegrid")
# 创建散点图
plt.figure(figsize=(10,6))
sns.scatterplot(data=df, x='price', y='user_rating', hue='departure_city', style='destination_city', s=100)
plt.title('价格 vs 用户评分')
plt.xlabel('价格 (人民币)')
plt.ylabel('用户评分')
plt.legend(title='出发城市 / 目的地城市', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
**注意:** 由于示例数据中价格和评分的变异性较小,实际数据中可能会有更明显的趋势。
4.5 路线距离与持续时间的关系
分析路线的距离与所需时间之间的关系。
# 创建散点图
plt.figure(figsize=(10,6))
sns.scatterplot(data=df, x='distance', y='duration', hue='departure_city', style='destination_city', s=100)
plt.title('路线距离 vs 持续时间')
plt.xlabel('距离 (公里)')
plt.ylabel('持续时间 (天)')
plt.legend(title='出发城市 / 目的地城市', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
5. 数据可视化
5.1 出发地和目的地热度条形图
# 设置绘图风格
sns.set(style="whitegrid")
# 创建子图
fig, axes = plt.subplots(1, 2, figsize=(14,6))
# 出发地热度
sns.barplot(x=departure_counts.index, y=departure_counts.values, ax=axes[0], palette='Blues_d')
axes[0].set_title('出发地热度')
axes[0].set_xlabel('出发城市')
axes[0].set_ylabel('选择次数')
# 目的地热度
sns.barplot(x=destination_counts.index, y=destination_counts.values, ax=axes[1], palette='Greens_d')
axes[1].set_title('目的地热度')
axes[1].set_xlabel('目的地城市')
axes[1].set_ylabel('选择次数')
plt.tight_layout()
plt.show()
5.2 用户评分分布饼图
# 由于示例数据中所有评分均为4.5,这里创建一个示例分类
df['rating_category'] = pd.cut(df['user_rating'], bins=[0,3,4,5], labels=['低分 (0-3)', '中分 (3-4)', '高分 (4-5)'])
# 计算评分分类的数量
rating_counts = df['rating_category'].value_counts()
# 创建饼图
plt.figure(figsize=(8,8))
plt.pie(rating_counts, labels=rating_counts.index, autopct='%1.1f%%', startangle=140, colors=['#FF9999','#66B3FF','#99FF99'])
plt.title('用户评分分布')
plt.axis('equal') # 确保饼图为圆形
plt.show()
*注意:* 由于示例数据中所有评分为4.5,饼图将仅显示“高分 (4-5)”部分。实际数据中可能会有不同的分布。
5.3 热力图展示出发地与目的地的选择频``
# 创建出发地与目的地的数据透视表
pivot_table = df.pivot_table(index='departure_city', columns='destination_city', aggfunc='size', fill_value=0)
# 设置绘图风格
plt.figure(figsize=(10,8))
sns.heatmap(pivot_table, annot=True, fmt="d", cmap="YlGnBu", linewidths=.5)
plt.title('出发地与目的地的选择频率热力图')
plt.xlabel('目的地城市')
plt.ylabel('出发城市')
plt.show()
6. 完整代码示例
以下是将上述步骤整合在一起的完整代码示例。请确保你的`tour_routes.csv`文件与代码在同一目录下,或者提供正确的文件路径。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
df = pd.read_csv('tour_routes.csv')
# 数据清洗
print("原始数据预览:")
print(df.head())
print("\n缺失值统计:")
print(df.isnull().sum())
print("\n重复数据数量:", df.duplicated().sum())
df = df.drop_duplicates()
for col in ['distance', 'duration', 'price', 'user_rating']:
df[col] = pd.to_numeric(df[col], errors='coerce')
df = df.dropna()
print("\n清洗后的数据预览:")
print(df.head())
# 基本统计信息
print("\n基本统计信息:")
print(df.describe())
print("\n出发城市列表:")
print(df['departure_city'].unique())
print("\n目的地城市列表:")
print(df['destination_city'].unique())
print("\n用户评分分布:")
print(df['user_rating'].value_counts(bins=3, labels=['低分 (1-3)', '中分 (3-4)', '高分 (4-5)']))
# 受欢迎的路线
df['route'] = df['departure_city'] + ' -> ' + df['destination_city']
route_counts = df['route'].value_counts()
print("\n受欢迎的路线:")
print(route_counts)
# 出发地和目的地热度
departure_counts = df['departure_city'].value_counts()
destination_counts = df['destination_city'].value_counts()
print("\n出发地热度:")
print(departure_counts)
print("\n目的地热度:")
print(destination_counts)
# 价格与评分的关系
sns.set(style="whitegrid")
plt.figure(figsize=(10,6))
sns.scatterplot(data=df, x='price', y='user_rating', hue='departure_city', style='destination_city', s=100)
plt.title('价格 vs 用户评分')
plt.xlabel('价格 (人民币)')
plt.ylabel('用户评分')
plt.legend(title='出发城市 / 目的地城市', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
# 路线距离与持续时间的关系
plt.figure(figsize=(10,6))
sns.scatterplot(data=df, x='distance', y='duration', hue='departure_city', style='destination_city', s=100)
plt.title('路线距离 vs 持续时间')
plt.xlabel('距离 (公里)')
plt.ylabel('持续时间 (天)')
plt.legend(title='出发城市 / 目的地城市', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
# 出发地和目的地热度条形图
sns.set(style="whitegrid")
fig, axes = plt.subplots(1, 2, figsize=(14,6))
sns.barplot(x=departure_counts.index, y=departure_counts.values, ax=axes[0], palette='Blues_d')
axes[0].set_title('出发地热度')
axes[0].set_xlabel('出发城市')
axes[0].set_ylabel('选择次数')
sns.barplot(x=destination_counts.index, y=destination_counts.values, ax=axes[1], palette='Greens_d')
axes[1].set_title('目的地热度')
axes[1].set_xlabel('目的地城市')
axes[1].set_ylabel('选择次数')
plt.tight_layout()
plt.show()
# 用户评分分布饼图
df['rating_category'] = pd.cut(df['user_rating'], bins=[0,3,4,5], labels=['低分 (0-3)', '中分 (3-4)', '高分 (4-5)'])
rating_counts = df['rating_category'].value_counts()
plt.figure(figsize=(8,8))
plt.pie(rating_counts, labels=rating_counts.index, autopct='%1.1f%%', startangle=140, colors=['#FF9999','#66B