【Python可视化实战】共享单车可视化

一、项目背景与目标

随着共享经济的兴起,共享单车已成为城市出行的重要方式之一。然而,共享单车的使用情况、分布情况以及用户行为等方面的信息仍然缺乏系统的分析和可视化。本项目旨在通过可视化技术,全面展示共享单车的使用情况,为城市规划和管理提供决策支持。

二、数据收集与处理

1. 数据简介

数据集中包括了美国共享单车公司Capital Bikeshare在华盛顿地区2011年和2012年的使用量历史记录,以及每天对应的天气信息。利用该数据集,可以对季节因素、天气因素等对单车使用量的影响进行分析。数据集中共包含16个特征,下表中展示了数据集所有特征的名称及对应含义:

字段名称 含义说明
instant 行数编码
dteday 日期变量
season 季节变量,编码1-4分别表示
1-3月、4-6月、6-9月,10-12月
yr 年份变量,编码0代表2011年,1代表2012年
mnth 月份编码,范围为1-12,代表1-12月
holiday 是否为节假日,0代表不是,1代表是
weekday 一周的第几天,范围为0-6
workingday 是否为工作日,0代表不是,1代表是
weathersit 天气类型,1代表晴朗少云,2代表多云雾,
3代表小雨/小雪/雷电
temp 以摄氏度表示的标准化温度,值被除以41(最大值)
atemp 以摄氏度表示的标准化感觉温度,值被除以50(最大值)
hum 标准化湿度,值被除以100(最大值)
windspeed 标准化风速,值被除以67(最大值)
casual 未注册用户单车使用量
registered 注册用户单车使用量
cnt 所有用户单车使用量,包括未注册用户和注册用户

2.数据读取与处理

2.1 导入数据集与必要模块

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from plotnine import *
%matplotlib inline

## 设置绘图时的中文字体
from matplotlib.font_manager import FontProperties
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False

首先,读取数据集: 

## 读取数据
data_old = pd.read_csv('./Bike_Sharing_Dataset.csv')
## 查看数据的前5行
data_old.head()
## 查看数据集基本信息
data_old.info()

【Python可视化实战】共享单车可视化_第1张图片

从结果中可以看出,数据集中共包含731条数据,均无缺失数据。

2.2 数据预处理

有些字段与数据分析无关,例如:字段instant表示行数编码,可以直接删除。有些字段的含义较为接近,保留其一即可,例如:字段atemptemp都表示温度,留下一个就可以。

data = data_old.drop(['instant', 'atemp', 'casual', 'registered'], axis=1)

为方便进行可视化后的观察,我们对各字段使用字典进行中文标识:

chs_name = {'dteday': '日期',
            'season': '季节',
            'yr': '年份',
            'mnth': '月份',
            'holiday': '节假日',
            'weekday': '星期',
            'workingday': '工作日',
            'weathersit': '天气类型',
            'temp': '温度',
            'hum': '湿度', 
            'windspeed': '风速', 
            'cnt': '使用量'}
data.rename(columns=chs_name, inplace=True)
## 标识后的结果
data.head()

【Python可视化实战】共享单车可视化_第2张图片

最后,我们查看各变量的字段类型,并统计个数、绘制条形图:

data_type_df = pd.DataFrame(data.dtypes.value_counts()).rename(columns={0: 'count'})

## 绘制条形图
data_type_df.plot(kind='bar', 
                  title='字段类型个数条形图', 
                  legend=False,
                  rot=360,
                  figsize=(8, 6))

 【Python可视化实战】共享单车可视化_第3张图片

三、可视化设计与实现 

3.1 利用直方图、箱线图观察单车使用量的分布

在探究影响因素之前,我们首先通过直方图和箱线图来观察共享单车的使用量的分布情况。通过这两种图形,我们可以直观地了解使用量的频数分布和数据的中心趋势、离散程度以及异常值。

## 绘制直方图
plt.figure(figsize = (14,6))                     
plt.subplot(1, 2, 1)
plt.hist(data['使用量'],
         bins=8,
         facecolor='green',
         alpha=0.5,
         edgecolor='black')
plt.title('使用量直方图', fontsize=15)
plt.xlabel('使用量', fontsize=15)
plt.ylabel('频数', fontsize=15)

## 绘制箱线图
plt.subplot(1, 2, 2)
plt.boxplot(data['使用量'], 
            labels=['使用量'],
            patch_artist = True,
            boxprops = {'color':'black','facecolor':'yellow'}, 
            flierprops = {'markerfacecolor':'red','color':'black'})

plt.title('使用量箱线图', fontsize=15)
plt.xticks(fontsize=12)

【Python可视化实战】共享单车可视化_第4张图片

由结果图可知,单车使用量近似正态分布,且不存在异常值。

3.2 利用条形图、饼图对比两年的单车使用量

为了对比两年的共享单车使用量,我们将使用条形图和饼图进行可视化。这两种图形将帮助我们清晰地展示不同年份之间使用量的差异,并揭示哪一年或哪一个季节的使用量更高。 

## 绘制条形图
### 分组聚合
count_grouped = data['使用量'].groupby(data['年份']).sum()
count_grouped_df = count_grouped.reset_index()
count_grouped_df['年份'] = count_grouped_df['年份'].map({0:'2011', 1:'2012'})

### 绘图
plt.figure(figsize = (14,6))                     
plt.subplot(1, 2, 1)
plt.bar(count_grouped_df['年份'],
        count_grouped_df['使用量'],
        width=0.5,
        color=['blue', 'orange'])
plt.title('两年使用总量对比条形图', fontsize=15)
plt.xlabel('年份', fontsize=15)
plt.ylabel('使用量', fontsize=15)

## 绘制饼状图
### 计算百分比
count_grouped_df['百分比'] = count_grouped_df['使用量']/count_grouped_df['使用量'].sum()

### 绘图                    
plt.subplot(1, 2, 2)
plt.pie(count_grouped_df['百分比'],
        labels=['2011', '2012'],
        autopct = '%1.1f')
plt.title('两年使用总量对比饼状图', fontsize=15)
plt.legend(loc='upper right', fontsize=10)

从上面两幅图可以看出,2012年单车的使用量要远高于2011年的使用量,用户几乎增加了一倍,说明共享单车在这期间的推广比较有成效。

3.3 利用条形图、折线图探究单车使用量和季节的关系

为了探究单车使用量的影响因素,我们首先使用条形图和折线图来探究两年中使用量与季节的关系:

## 绘图
### 分组聚合
season_Aggregated = pd.DataFrame(data.groupby(['年份','季节']).sum())['使用量'].reset_index()

### 绘制条形图
plt.figure(figsize=(14, 8))
plt.subplot(1, 2, 1)
plt.bar(season_Aggregated['季节'][:4]-0.2,
        season_Aggregated['使用量'][:4],
        width=0.4,
        color='green', label='2011')
plt.bar(season_Aggregated['季节'][4:]+0.2,
        season_Aggregated['使用量'][4:],
        width=0.4,
        color='yellow', label='2012')
plt.title('使用量与季节关系条形图', fontsize=15)
plt.xlabel('季节', fontsize=15)
plt.ylabel('使用量', fontsize=15)
plt.xticks([1, 2, 3, 4], ['春季', '夏季', '秋季', '冬季'])
plt.legend(loc='best')

### 绘制折线图
plt.subplot(1, 2, 2)
plt.plot(season_Aggregated['季节'][:4],
         season_Aggregated['使用量'][:4],
         color='green',
         lw=3,
         marker='o',
         label='2011')
plt.plot(season_Aggregated['季节'][4:],
         season_Aggregated['使用量'][4:],
         color='yellow',
         lw=3,
         marker='o',
         label='2012')
plt.title('使用量与季节折线图', fontsize=15)
plt.xlabel('季节', fontsize=15)
plt.ylabel('使用量', fontsize=15)
plt.xticks([1, 2, 3, 4], ['春季', '夏季', '秋季', '冬季'])
plt.legend(loc='best')
plt.grid(True)

【Python可视化实战】共享单车可视化_第5张图片 从上面两幅图可以看出,使用量随季节变化的趋势大致相同,而春季使用量明显少于其它三个季节,秋季使用量需求最大。

3.4 利用条形图、折线图探究单车使用量和月份的关系

为了探究共享单车的使用量和月份之间的关系,我们将使用条形图和折线图来进行可视化。

## 绘图
### 分组聚合
month_Aggregated = pd.DataFrame(data.groupby(['年份','月份']).sum())['使用量'].reset_index()

### 绘制条形图
plt.figure(figsize=(14, 10))
plt.subplot(2, 1, 1)
plt.bar(month_Aggregated['月份'][:12]-0.2,
        month_Aggregated['使用量'][:12],
        width=0.4,
        color='blue', label='2011')
plt.bar(month_Aggregated['月份'][12:]+0.2,
        month_Aggregated['使用量'][12:],
        width=0.4,
        color='gold', label='2012')
plt.title('使用量与月份关系条形图', fontsize=15)
plt.xlabel('月份', fontsize=15)
plt.ylabel('使用量', fontsize=15)
plt.xticks(np.arange(1, 13))
plt.legend(loc='best')

### 绘制折线图
plt.subplot(2, 1, 2)
plt.plot(month_Aggregated['月份'][:12],
         month_Aggregated['使用量'][:12],
         color='blue',
         lw=3,
         marker='o',
         label='2011')
plt.plot(month_Aggregated['月份'][12:],
         month_Aggregated['使用量'][12:],
         color='gold',
         lw=3,
         marker='o',
         label='2012')
plt.title('使用量与月份折线图', fontsize=15)
plt.xlabel('月份', fontsize=15)
plt.ylabel('使用量', fontsize=15)
plt.xticks(np.arange(1, 13))
plt.legend(loc='best')
plt.grid(True)

【Python可视化实战】共享单车可视化_第6张图片 从上面两幅图可以看到,两年中每月的租车量的变化趋势大致相同,租车量的高峰体现在7、8、9月份,可见用户在这三个月对租车需求较大。

3.5 利用条形图、箱线图探究单车使用量和星期的关系

为了探究共享单车的使用量和星期几的关系,我们将使用条形图和箱线图进行可视化分析。

条形图将帮助我们直观地比较不同星期的使用量。通过条形的长度或高度,我们可以清晰地看出哪一天的使用量更高或更低。通过这种比较,我们可以发现使用量的周周期性变化,例如是否在工作日或周末的使用量会有所不同。

箱线图则将展示每周使用量的分布情况。通过箱线图,我们可以观察到数据的集中趋势(中位数)、离散程度(四分位距)以及任何可能的异常值。箱线图有助于我们快速识别出数据中的极端值或异常点,这些值可能对数据的整体分布和解读产生影响。

【Python可视化实战】共享单车可视化_第7张图片 从上面三幅图可以看出,2011年一周内各天的租车量大致相同,2012年周四、周五和周六的租车量最高;在工作日方面,是否为工作日对租车辆的影响并不明显;而节假日的租车量相较非节假日来说较小。

3.6 利用箱线图探究单车使用量和天气的关系

接着,我们使用箱线图来观察使用量与天气的关系:

## 筛选
plt.figure(figsize=(8, 8))
weaType1 = pd.Series(data['使用量'][data['天气类型']==1])
weaType2 = pd.Series(data['使用量'][data['天气类型']==2])
weaType3 = pd.Series(data['使用量'][data['天气类型']==3])
weather_usecount = [weaType1, weaType2, weaType3]

### 箱线图
plt.boxplot(weather_usecount,
            labels = ['晴朗少云', '多云雾', '小雨雪雷电'],
            widths=0.5,
            patch_artist = True,
            showfliers = False)
plt.title('使用量与天气关系箱线图', fontsize=15)
plt.xlabel('天气', fontsize=15)
plt.grid(True)

 【Python可视化实战】共享单车可视化_第8张图片

从上图可以看出,天气对租车量的影响较为明显,随着天气质量的逐渐变差,单车使用量逐渐减少。

3.7 利用条形图、折线图探究单车使用量和温度、湿度和风速的关系

为了探究共享单车的使用量和温度、湿度、风速之间的关系,我们将使用条形图和折线图进行可视化分析。

单车使用量与温度的关系:

### 与温度的关系
plt.figure(figsize=(12, 8))
ggplot(data, aes('温度', '使用量')) + geom_point(color='blue') + geom_smooth(method='lm') + theme(text = element_text(fontproperties=myfont))

【Python可视化实战】共享单车可视化_第9张图片

单车使用量与湿度的关系:

### 与湿度的关系
plt.figure(figsize=(12, 8))
ggplot(data, aes('湿度', '使用量')) + geom_point(color='green') + geom_smooth(method='lm') + theme(text = element_text(fontproperties=myfont))

【Python可视化实战】共享单车可视化_第10张图片 单车使用量与风速的关系:

### 与风速的关系
plt.figure(figsize=(12, 8))
ggplot(data, aes('风速', '使用量')) + geom_point(color='red') + geom_smooth(method='lm') + theme(text = element_text(fontproperties=myfont))

 【Python可视化实战】共享单车可视化_第11张图片

从上面三幅图可以看出,温度与使用量呈正相关关系,随着温度的升高租车量在增加;湿度和风速与使用量呈负相关关系,随着湿度和风速的升高租车量在下降。

四、模型预测

1.决策树预测单车的使用量

 下面我们把数据分为训练集和测试集,利用除单车使用量之外的所有特征来建立决策树模型,预测单车的使用量,并将模型可视化并得到各特征的重要性,数据的分割比例为训练集75%,测试集25%。

## 分离数据和目标
X = data.drop(['日期', '使用量'], axis=1)
y = data['使用量']


## 分割训练集合测试集
cut_point = np.floor(X.shape[0]*0.75)

### 分割训练集
X_train = X.loc[:cut_point, :]
y_train = y.loc[:cut_point]

### 分割测试集
X_test = X.loc[cut_point:, :]
y_test = y.loc[cut_point:]

接下来,我们建立模型并使用训练集进行训练:

## 载入必要库
from sklearn.tree import DecisionTreeRegressor

### 建立模型
model_DF = DecisionTreeRegressor(max_depth=3, random_state=10)

### 训练模型
model_DF.fit(X_train, y_train)

决策树可视化:

### 决策树可视化
## 导入必要库
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO

from IPython.display import Image 
import pydotplus

## 输出图片到dot文件
X_train_ename = ['season', 'year', 'month', 'holiday', 'weekday', 'workingday', 'weather', 'temperature', 'humidity', 'windSpend']
export_graphviz(model_DF, out_file='tree.dot', 
                feature_names=X_train_ename,
                rounded=True, precision = 1)

## 使用dot文件构造图
graph= pydotplus.graph_from_dot_file('tree.dot')
Image(graph.create_png())

【Python可视化实战】共享单车可视化_第12张图片

### 查看特征重要性
feature_importance = pd.Series(model_DF.feature_importances_, index=X_train.columns).sort_values(ascending=False)[:5]
print(feature_importance)

### 绘制水平条形图
plt.figure(figsize=(8, 6))
plt.bar(feature_importance.index, 
        feature_importance.values, 
        color=['b', 'k', 'g', 'y', 'm'])
plt.title('特征重要性条形图', fontsize=15)
plt.xlabel('特征', fontsize=15)
plt.ylabel('重要性', fontsize=15)

【Python可视化实战】共享单车可视化_第13张图片

五、项目成果与价值

根据本次共享单车可视化项目的分析,我们得出以下结论:

  1. 季节性影响显著:共享单车在夏季和秋季的使用量明显高于其他季节。这表明夏季和秋季是共享单车需求量最大的时期,可能与人们户外活动和短途出行需求的增加有关。因此,共享单车运营商和城市规划者应重点关注夏季和秋季的车辆调度和运营策略,以满足用户需求。
  2. 工作日与节假日使用模式差异:周四、周五和周六是共享单车使用量最大的日子,这表明在工作日的中后期和周末,人们更倾向于使用共享单车进行出行。此外,非节假日的使用量普遍高于节假日,这可能与人们的出行计划和工作日程安排有关。因此,共享单车运营商可以根据这种使用模式调整车辆调度和运营策略,以更好地满足用户需求。
  3. 天气因素对使用量有显著影响:温度、湿度和风速等气象因素对共享单车的使用量有显著影响。高温、低湿度和低风速条件下,用户对共享单车的需求量增加。这可能是因为这些天气条件更适宜骑行。因此,共享单车运营商可以利用天气预报数据来预测和调整车辆的调度和运营策略,以更好地满足用户需求和提高运营效率。
  4. 地区分布不均:通过条形图的分析,我们发现共享单车在城市中的分布存在不均匀的现象。某些区域的使用量远高于其他区域。这可能是因为某些区域的用户需求更高或车辆调度不够合理。因此,共享单车运营商应重新考虑车辆的调度策略,使车辆在各区域的分布更加均匀,以满足用户需求并提高运营效率。
  5. 用户行为模式分析的价值:通过深入的用户行为分析,我们可以更好地理解用户的需求和行为模式,从而优化产品和服务。例如,根据用户常用路线和使用习惯,可以优化车辆调度和停放点设置,提高用户出行便利性和满意度。这种用户行为模式分析可以为共享单车运营商提供有价值的洞察,以改善产品和服务并满足用户需求。

你可能感兴趣的:(python,开发语言,信息可视化,数据挖掘,机器学习)