深圳通刷卡数据分析(python语言)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

数据集说明(原文链接:https://blog.csdn.net/weixin_44510615/article/details/114271661)
这是一份来自深圳市政府数据开放平台的深圳通刷卡数据,时间区间为 2018-08-31 到 2018-09-01,总计 1,337,000 条记录,大小为 335 M,包含 11 个字段。为了便于分析,提前了解到2018-08-31是周五,2018-09-01是周六。
深圳通是由深圳市运输局监制、深圳市公共交通结算管理中心发行的一款即可优惠乘坐深圳市公交车,深圳地铁和商店消费的一种储值卡。

1.数据处理

源数据存的是 json 格式的数据,先使用 python 对数据做一下清洗,然后保存为 csv 数据文件。

### 解析 json 数据文件
path = r"C:\Users\Administrator\Desktop\2018record3.jsons"#定义了一个文件路径,指向存储 JSON 数据的文件。
data = []#创建一个空列表 data 来存储解析后的数据。
with open(path, 'r', encoding='utf-8') as f:
    for line in f.readlines():
        data += json.loads(line)['data']#打开文件,并逐行读取数据。
#使用 json.loads() 函数将每行的 JSON 字符串解析为 Python 字典,并将字典中的 'data' 键对应的值添加到 data 列表中。
data = pd.DataFrame(data)#将 data 列表转换为 pandas DataFrame,便于后续处理。
columns = ['card_no', 'deal_date', 'deal_type', 'deal_money', 'deal_value', 'equ_no', 'company_name', 'station', 'car_no', 'conn_mark', 'close_date']#定义一个列名列表 columns,包含数据集中应有的所有字段。
#使用这个列名列表对 DataFrame 进行重新排列,确保列的顺序。
data = data[columns]  # 调整字段顺序
data.info()#使用 data.info() 打印 DataFrame 的概览信息,包括每列的数据类型和非空值数量。

### 输出处理 
# 全部都是 交通运输 的刷卡数据
print(data['company_name'].unique())

# 删除重复值
# print(data[data.duplicated()])
data.drop_duplicates(inplace=True)
data.reset_index(drop=True, inplace=True)

# 缺失值
# 只有线路站点和车牌号两个字段存在为空,不做处理
# print(data.isnull().sum())

# 去掉脏数据
data = data[data['deal_date'] > '2018-08-31']

### 数据保存 
print(data.info)#应该使用 data.info() 来调用。

# 数据保存为 csv
data.to_csv('SZTcard.csv', index=False, header=None)

该处将数据保存为’SZTcard.csv’。


2.数据预览

代码如下:

import pandas as pd
data=pd.read_csv('SZTcard.csv',header=None,names=['卡号','交易日期时间','交易类型','交易金额','交易值','设备编码','公司名称','线路站点','车牌号','联程标记','结算日期'])
data.to_csv('SZTcard.csv', index=False)
data=pd.read_csv('SZTcard.csv')
data['交易日期时间']=data['交易日期时间'].astype(str)#object就是字符串的意思
data['结算日期']=data['结算日期'].astype(str)#object就是字符串的意思
data['交易日期']=data['交易日期时间'].map(lambda x:x.split(' ')[0])#第一个
data['交易时间']=data['交易日期时间'].map(lambda x:x.split(' ')[-1])#最后一个
data['结算日期']=data['结算日期'].map(lambda x:x.split(' ')[0])
data['卡号']=data['卡号'].astype(str)#object就是字符串的意思
data['设备编码']=data['设备编码'].astype(str)#object就是字符串的意思
import numpy as np
deal_money=data.groupby('交易类型')['交易金额'].nunique()
deal_value=data.groupby('交易值')['交易金额'].nunique()
cn=data.groupby('公司名称')['交易金额'].nunique()

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
tu_1= data.groupby('公司名称').agg(cn=('卡号','count')).reset_index().sort_values(by='cn', ascending=False).head(18)
# 创建条形图
plt.figure(figsize=(27, 13))
plt.bar(tu_1['公司名称'], tu_1['cn'], color='skyblue')
plt.xlabel('公司名称')
plt.ylabel('cn')
plt.xticks(range(0, 18))  # 确保 x 轴标签显示所有小时
plt.grid(True)
plt.show()

在这里插入图片描述观察公司名称也就是地铁和巴士不同线路名称的分布情况,没有杂乱不属于这里的名称,可见该数据集并没有其他非交通公司消费的数据,这里全部都是交通出行的数据。


3. 数据分析可视化

3.1 乘客主题

(整体) 通勤费用

代码如下:

import numpy as np
data['交易金额']=data['交易金额'].astype(float)#object就是字符串的意思
data['交易金额']=np.nan_to_num(data['交易金额'])
data['交易金额']
import pandas as pd
# 查询1:按日期分组,计算每天的交易数量和最小、最大交易日期
# 查询2:按公司名称分组,计算每个公司的交易数量,并按数量降序排序
query2 = data.groupby('公司名称').agg(
    cn=('交易金额', 'count')
).reset_index().sort_values(by='cn', ascending=False)

# 查询3:计算整体和按交易类型分组的交易数量、总金额和平均每笔金额
total = data['交易金额'].sum() / 100
per = data['交易金额'].sum() / len(data['交易类型']) / 100
query3_grouped = data[data['交易类型'].isin(['地铁出站', '巴士'])].groupby('交易类型').agg(
    cnt=('交易金额', 'count'),
    total=('交易金额', 'sum'),
    per=('交易金额', lambda x: x.sum() / len(x) / 100)
).reset_index()
total_sum = query3_grouped[query3_grouped['交易类型'].isin(['地铁出站', '巴士'])]['total'].sum()
cnt_sum = query3_grouped[query3_grouped['交易类型'].isin(['地铁出站', '巴士'])]['cnt'].sum()
per_sum = total_sum / cnt_sum / 100  # 计算平均值
# 创建一个包含“整体”行的新 DataFrame
overall_row = pd.DataFrame({
    '交易类型': ['整体'],
    'cnt': [cnt_sum],
    'total': [total_sum],
    'per': [per_sum]
})
# 将“整体”行添加到分组聚合的结果中
query3_overall = pd.concat([query3_grouped, overall_row], ignore_index=True)

# 打印结果
print(query3_overall)

在这里插入图片描述
整体的通勤次数为 872,761 人次,总费用为 24,140,230元,平均每次出行花费 2.76 元。
交通工具上来看,坐巴士平均每次为 1.7 元,坐地铁则要 3.9 元。
从交通优惠的普及情况来看,受众还是非常广的,只有 1,235 人次是购买的全票,占比仅为千分之一(1,235 / 872,761)。
代码如下:

data['交易值'] = pd.to_numeric(data['交易值'], errors='coerce')
data['交易值']=data['交易值'].astype(float)#object就是字符串的意思
import pandas as pd
# 计算 distinct_count 并创建一个新的列
data['distinct_count'] = data['交易金额'] / data['交易值']
# 过滤出 distinct_count 非零的数据
filtered_data = data[data['交易值'] > 0]

# 按照 distinct_count 分组并计算每组的计数
distinct_counts = filtered_data.groupby('distinct_count', as_index=False).agg(
    cn=('交易金额', 'count')
)
# 定义一个函数来确定折扣范围
def get_discount_range(distinct_count):
    if distinct_count == 1:
        return '全票'
    elif distinct_count == 0.95:
        return '9.5折'
    elif distinct_count >= 0.9:
        return '9折'
    elif distinct_count >= 0.85:
        return '8.5折'
    elif distinct_count >= 0.75:
        return '7.5折'
    elif distinct_count >= 0.5:
        return '半票'
    elif distinct_count == 0:
        return '免票'
    else: 
        return '其他'

# 应用函数来创建一个新的列
distinct_counts['discount_range'] = distinct_counts['distinct_count'].apply(get_discount_range)
# 按折扣范围分组并求和
result = distinct_counts.groupby('discount_range').agg(
    cn=('cn', 'sum')
).reset_index().sort_values(by='cn', ascending=False)
# 打印结果
print(result)
result.sort_values('cn',ascending=False)
plt.figure(figsize=(12, 6))
plt.bar(result.discount_range, result.cn , color='skyblue')
plt.xlabel('discount_range')
plt.ylabel('ct')
plt.title('折扣分布')
plt.xticks(range(0, 8))  # 确保 x 轴标签显示所有小时
plt.grid(True)
plt.show()

在这里插入图片描述


(整体) 出行时间分布

代码如下:

filtered_data = data[data['交易类型'].isin(['地铁入站', '巴士'])]

# 筛选指定日期的数据
filtered_data_20180831 = filtered_data[filtered_data['交易日期'] == '2018-08-31']
filtered_data_20180901 = filtered_data[filtered_data['交易日期'] == '2018-09-01']
filtered_data_20180831['交易时间']=filtered_data_20180831['交易时间'].map(lambda x:x.split(':')[0])
filtered_data_20180901['交易时间']=filtered_data_20180901['交易时间'].map(lambda x:x.split(':')[0])

# 计算每个小时的出行次数
hourly_distribution_20180831 = filtered_data_20180831.groupby(filtered_data_20180831['交易时间']).size()
hourly_distribution_20180901 = filtered_data_20180901.groupby(filtered_data_20180901['交易时间']).size()

# 创建一个新的DataFrame来展示结果
hourly_distribution_df_20180831 = pd.DataFrame(hourly_distribution_20180831, columns=['ct'])
hourly_distribution_df_20180831['h'] = hourly_distribution_df_20180831.index
hourly_distribution_df_20180831 = hourly_distribution_df_20180831.sort_values('h').reset_index(drop=True)

hourly_distribution_df_20180901 = pd.DataFrame(hourly_distribution_20180901, columns=['ct'])
hourly_distribution_df_20180901['h'] = hourly_distribution_df_20180901.index
hourly_distribution_df_20180901 = hourly_distribution_df_20180901.sort_values('h').reset_index(drop=True)

# 打印结果
print("2018-08-31每小时出行次数:")
print(hourly_distribution_df_20180831)

print("\n2018-09-01每小时出行次数:")
print(hourly_distribution_df_20180901)

plt.figure(figsize=(12, 6))
plt.bar(hourly_distribution_df_20180831.h, hourly_distribution_df_20180831.ct , color='skyblue')
plt.xlabel('h')
plt.ylabel('ct')
plt.title('20180831(整体) 出行时间分布')
plt.xticks(range(0, 19))  # 确保 x 轴标签显示所有小时
plt.grid(True)
plt.show()
plt.figure(figsize=(12, 6))
plt.bar(hourly_distribution_df_20180901.h, hourly_distribution_df_20180901.ct , color='skyblue')
plt.xlabel('h')
plt.ylabel('ct')
plt.title('20180901(整体) 出行时间分布')
plt.xticks(range(0, 24))  # 确保 x 轴标签显示所有小时
plt.grid(True)
plt.show()

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/29361bb7b74f41669ba8519113a727a7.png
2018-08-31 出行时间分布可以看到晚高峰是在 18-19 点之间,早高峰在 8-9 点之间,可能由于数据集本身的不完整,早高峰看起来不太明显;2018-09-01 出行时间分布可以看到早高峰在 7-8 点之间,只有半天的数据所以看不到晚高峰。

(地铁) 通勤时间

代码如下:

import pandas as pd

# 筛选地铁相关的数据
metro_data = data[data['交易类型'].str.contains('地铁')]

# 为地铁交易记录添加行号
metro_data['px'] = metro_data.groupby('卡号')['交易时间'].rank(method='first')
# 处理 NaN 值
metro_data['px'] = metro_data['px'].astype(float)  # 使用 float 类型
metro_data['px'].fillna(0, inplace=True)  # 将 NaN 替换为 0,或你可以选择删除这些行
# 创建地铁入站和出站的子集
inbound = metro_data[metro_data['交易类型'] == '地铁入站'].copy()
outbound = metro_data[metro_data['交易类型'] == '地铁出站'].copy()

# 确保日期格式正确
inbound['交易时间'] = pd.to_datetime(inbound['交易时间'])
outbound['交易时间'] = pd.to_datetime(outbound['交易时间'])

# 计算时间差
#outbound['diff_sec'] = (outbound['交易时间'] - inbound['交易时间']).dt.total_seconds()

# 合并入站和出站数据
tt2 = pd.merge(inbound,outbound,left_on='卡号',right_on='卡号',suffixes=('_in', '_out'))
tt2['交易日期_in']=tt2['交易日期时间_in'].map(lambda x:x.split(' ')[0])
tt2['交易时间_in']=tt2['交易日期时间_in'].map(lambda x:x.split(' ')[1])

# 筛选同一天的记录,并排除站点相同的记录
tt2 = tt2[(tt2['交易日期_in'] == '2018-09-01') & 
           (tt2['交易日期_out'] == '2018-09-01') & 
           (tt2['线路站点_in'] != tt2['线路站点_out'])]
tt2 = tt2[tt2['px_out'] == tt2['px_in'] + 1]
#  tt2['交易时间_out'] 是 datetime 类型 # 提取小时部分
tt2['小时_out'] = tt2['交易时间_out'].dt.hour
# 需要作为字符串
tt2['时间字符串_out'] = tt2['交易时间_out'].dt.strftime('%H:%M:%S')
tt2['交易时间_in'] = pd.to_datetime(tt2['交易时间_in'])
tt2['时间字符串_out'] = pd.to_datetime(tt2['时间字符串_out'])
tt2['diff_sec'] = (tt2['时间字符串_out'] - tt2['交易时间_in']).dt.total_seconds()
# 计算平均通勤时间(分钟)
average_commute_time = tt2['diff_sec'].mean() / 60

print(average_commute_time)

在这里插入图片描述
由于地铁是进出站都要刷卡,所以可以通过二者之差来计算地铁的通勤时间。平均通勤时间为 29.6 分钟。


3.2 地铁主题(基于站点)

代码如下:

# (基于站点) 进站 top
in_station_top = data[data['交易类型'] == '地铁入站'][['线路站点', '交易时间']].groupby('线路站点').size().sort_values(ascending=False).head(10)

# (基于站点) 出站 top
out_station_top = data[data['交易类型'] == '地铁出站'][['线路站点', '交易时间']].groupby('线路站点').size().sort_values(ascending=False).head(10)

# (基于站点) 进出站 top
station_top = data[data['交易类型'].isin(['地铁出站', '地铁入站'])][['线路站点', '交易时间']].groupby('线路站点').size().sort_values(ascending=False).head(10)

# (基于站点) 站点收入 top
station_income_top = data[data['交易类型'].isin(['地铁出站', '地铁入站'])][['线路站点', '交易金额']].groupby('线路站点').agg(sum=('交易金额', 'sum')).head(10)

# (基于线路) 运输贡献度 top
data['transport_contribution'] = data.apply(lambda x: 1 if x['交易类型'] == '地铁出站' and x['联程标记'] == '1' 
                                            or x['交易类型'] == '地铁入站' else 0, axis=1)
transport_contribution_top = data[data['transport_contribution'] == 1].groupby('公司名称').size().sort_values(ascending=False)
# (基于线路) 运输效率 top
tt = data[data['交易类型'].str.contains('地铁')][['卡号', '交易类型', '公司名称', '线路站点', '交易时间']]
tt['px'] = tt.groupby('卡号')['交易时间'].rank(method='first')
tt2 = pd.merge(tt, tt, left_on='卡号',right_on='卡号',suffixes=('_in', '_out'))
tt2 = tt2[(tt2['交易类型_in'] == '地铁入站') & (tt2['交易类型_out'] == '地铁出站') & (tt2['线路站点_in'] != tt2['线路站点_out'])]
tt2 = tt2[tt2['px_out'] == tt2['px_in'] + 1]
# 计算时间差
tt2['diff_sec'] = (tt2['交易时间_out'] - tt2['交易时间_in']).dt.total_seconds()
transport_efficiency_top = tt2.groupby('公司名称_in')['diff_sec'].mean().reset_index()
transport_efficiency_top['diff_sec']=transport_efficiency_top['diff_sec'].astype(float)/60

(基于站点) 进站人流量 top

代码如下:

print("进站 top:")
print(in_station_top)
print("\n出站 top:")
print(out_station_top)
print("\n进出站 top:")
print(station_top)
print("\n站点收入 top:")
print(station_income_top)
print("\n运输贡献度 top:")
print(transport_contribution_top)
print("\n运输效率 top:")
print(transport_efficiency_top)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# 假设 in_station_top 是一个包含进站次数的 pandas DataFrame
# 并且 '线路站点' 是 DataFrame 的索引
in_station_top=pd.DataFrame(in_station_top)
in_station_top.columns=['进站次数']
# 绘制进站 top 条形图
plt.figure(figsize=(10, 6))
plt.bar(in_station_top.index, in_station_top['进站次数'])  # 使用索引作为 x 轴标签
plt.xlabel('线路站点')
plt.ylabel('进站次数')
plt.title('进站次数 Top')
plt.xticks(rotation=45)
plt.show()
out_station_top=pd.DataFrame(out_station_top)
out_station_top.columns=['出站次数']

在这里插入图片描述
深圳北是进站top。深圳北站作为主要交通枢纽,承担着大量乘客的进出站任务。高人流量可能与站点的地理位置、服务的区域、以及连接的交通线路数量有关。
建议:针对深圳北站这种人流量大的站点,建议增加安检和售票设施,优化乘客流线设计,以减少拥堵,提高通行效率。


(基于站点) 出站人流量 top

代码如下:

# 绘制出站 top 条形图
plt.figure(figsize=(10, 6))
plt.bar(out_station_top.index, out_station_top['出站次数'])  # 使用索引作为 x 轴标签
plt.xlabel('线路站点')
plt.ylabel('出站次数')
plt.title('出站 Top')
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
深圳北也是出站top。与进站趋势一致,说明深圳北站不仅承担着重要的交通集散功能,同时也是重要的目的地站点。
建议:优化周边的交通配套设施,如出租车、公交车的接驳服务,提供更多的出站选择。


(基于站点) 进出站人流量 top

代码如下:

# station_top
station_top=pd.DataFrame(station_top)
station_top.columns=['进出站次数']
# 绘制出站 top 条形图
plt.figure(figsize=(10, 6))
plt.bar(station_top.index, station_top['进出站次数'])  # 使用索引作为 x 轴标签
plt.xlabel('线路站点')
plt.ylabel('进出站次数')
plt.title('进出站  Top')
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
深圳北是进出站top,说明深圳北人流量很大,交通压力也比较大,可能是恰逢开学季,需要了解数据采集时当地有什么大型出行需求。


(基于站点) 站点收入 top

代码如下:

# station_income_top
station_income_top=station_income_top[:10]
station_income_top=pd.DataFrame(station_income_top)
station_income_top.columns=['站点收入']
# 绘制出站 top 条形图
plt.figure(figsize=(10, 6))
plt.bar(station_income_top.index, station_income_top['站点收入'])  # 使用索引作为 x 轴标签
plt.xlabel('线路站点')
plt.ylabel('站点收入')
plt.title('站点收入 top')
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
上海林的站点收入最高,上水径的站点收入最低,侧面说明这两个站的人流量的高低。
上海林站的收入最高可能与站点的人流量、乘客的消费能力、以及可能的票价政策有关。
建议:对于收入较低的站点,可以考虑提供优惠政策,吸引更多乘客使用地铁。


(基于线路) 运输贡献度 top

代码如下:

#transport_contribution_top
transport_contribution_top=pd.DataFrame(transport_contribution_top)
transport_contribution_top.columns=['运输贡献度']
# 绘制出站 top 条形图
plt.figure(figsize=(10, 6))
plt.bar(transport_contribution_top.index, transport_contribution_top['运输贡献度'])  # 使用索引作为 x 轴标签
plt.xlabel('公司名称')
plt.ylabel('运输贡献度')
plt.title('运输贡献度 top')
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
地铁五号线运输贡献度最高,地铁九号线运输贡献度最低。地铁五号线的运输贡献度最高,说明它在城市交通中扮演着重要角色。
建议:对于运输贡献度高的线路,应优先考虑其运营效率和服务质量的提升。


(基于线路) 运输效率 top

代码如下:

# 对DataFrame进行升序排序
transport_efficiency_top_sorted = transport_efficiency_top.sort_values(by='diff_sec')
#print(transport_efficiency_top_sorted)
plt.figure(figsize=(10, 6))  # 设置图形的大小
plt.bar(transport_efficiency_top_sorted['公司名称_in'], transport_efficiency_top_sorted['diff_sec'])
plt.xlabel('公司名称')  # 设置x轴标签
plt.ylabel('时间(分钟)')  # 设置y轴标签
plt.title('线路运输效率 top')  # 设置标题
plt.xticks(rotation=45)  # x轴标签旋转45度
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()  # 显示图形

在这里插入图片描述
单程直达每乘客的平均通勤时间可以体现运输效率,从线路运输效率图可以看到,地铁十一号线的运输效率最低。地铁九号线的运输效率最高,意味着它在单位时间内运输了更多的乘客。
建议:对于运输效率低的线路,分析原因并进行改进,如优化列车运行间隔、提高运营速度等。


(基于线路) 换乘比例 top

代码如下:

# (基于线路) 换乘比例 top
tt =data[data['交易类型'].str.contains('地铁')][['卡号', '交易类型', '公司名称', '线路站点', '交易时间','联程标记']]
tt['px'] = tt.groupby('卡号')['交易时间'].rank(method='first')

tt2 = pd.merge(tt, tt, left_on='卡号',right_on='卡号',suffixes=('_in', '_out'))
tt2 = tt2[(tt2['交易类型_in'] == '地铁入站') & (tt2['交易类型_out'] == '地铁出站') & (tt2['线路站点_in'] != tt2['线路站点_out'])]
tt2 = tt2[tt2['px_out'] == tt2['px_in'] + 1]
tt2['diff_sec'] = (tt2['交易时间_out'] - tt2['交易时间_in']).dt.total_seconds()

transfer_rate_top = tt2.groupby('公司名称_out').apply(lambda x: x['联程标记_out'].value_counts().get(1, 0) / len(x)).reset_index(name='per')
print("换乘比例 top:")
print(transfer_rate_top)
transfer_rate_top_sorted =transfer_rate_top.sort_values(by='per',ascending=False)
plt.figure(figsize=(10, 6))  # 设置图形的大小
plt.bar(transfer_rate_top_sorted['公司名称_out'],transfer_rate_top_sorted['per'])
plt.xlabel('公司名称')  # 设置x轴标签
plt.ylabel('换乘比例')  # 设置y轴标签
plt.title('换乘比例 top')  # 设置标题
plt.xticks(rotation=45)  # x轴标签旋转45度
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()  # 显示图形

在这里插入图片描述
地铁五号线的换乘比例最高,这可能是由于线路连接的区域广泛,乘客需要通过换乘到达目的地。我们可以观察沿途的换乘站点与其它线路的换乘站点比较,当然要看的是2018年9月1日之前开通的站点。(参考:https://baike.baidu.com/item/%E6%B7%B1%E5%9C%B3%E5%9C%B0%E9%93%815%E5%8F%B7%E7%BA%BF/396122)
建议:优化换乘站点的指引标识,增加换乘站点的便利设施,如电梯、自动步道等。


(基于线路) 线路收入 top

代码如下:

# (基于线路) 线路收入 top
line_income_top = data[data['交易类型'].str.contains('地铁')][['公司名称', '交易金额']].groupby('公司名称').agg(sm=('交易金额', 'sum')).reset_index()
print("\n线路收入 top:")
print(line_income_top)
line_income_top_sorted =line_income_top.sort_values(by='sm',ascending=False)
plt.figure(figsize=(10, 6))  # 设置图形的大小
plt.bar(line_income_top_sorted['公司名称'],line_income_top_sorted['sm'])
plt.xlabel('公司名称')  # 设置x轴标签
plt.ylabel('sm')  # 设置y轴标签
plt.title('线路收入 top')  # 设置标题
plt.xticks(rotation=45)  # x轴标签旋转45度
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()  # 显示图形

在这里插入图片描述
地铁一号线为收入top,五号线仅次于它,地铁一号线的收入最高,可能是因为线路覆盖了城市的多个重要商业区和居民区。
建议:对于收入高的线路,可以适当提高服务质量,如提供更舒适的乘车环境,以保持乘客的忠诚度。


3.3 巴士主题

(基于公司) 巴士公司收入 top

代码如下:

# (巴士主题)

# (基于公司) 巴士公司收入 top
bus_income_top = data[data['交易类型'].str.contains('巴士', na=False)][['公司名称', '交易金额']].groupby('公司名称').agg(sm=('交易金额', 'sum')).reset_index()

# (基于公司) 巴士公司贡献度 top
bus_contribution_top = data[data['交易类型'].str.contains('巴士', na=False)][['公司名称']].groupby('公司名称').size().reset_index(name='cn')

# 打印结果
print("\n巴士公司收入 top:")
print(bus_income_top)
print("\n巴士公司贡献度 top:")
print(bus_contribution_top)
bus_income_top_sorted =bus_income_top.sort_values(by='sm',ascending=False)
plt.figure(figsize=(10, 6))  # 设置图形的大小
plt.bar(bus_income_top_sorted['公司名称'],bus_income_top_sorted['sm'])
plt.xlabel('公司名称')  # 设置x轴标签
plt.ylabel('sm')  # 设置y轴标签
plt.title('巴士公司收入 top')  # 设置标题
plt.xticks(rotation=45)  # x轴标签旋转45度
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()  # 显示图形

在这里插入图片描述
巴士集团的收入最高,东部公共交通和东部公共交通仅次于它,前三名断层的高,可能是因为其运营的线路覆盖了城市的主要区域,服务的乘客基数大。
建议:对于收入较低的巴士公司,可以考虑开辟新的线路,或者优化现有线路的服务,提高乘客的乘车体验。


(基于公司) 巴士公司运输贡献度 top

代码如下:

bus_contribution_top_sorted =bus_contribution_top.sort_values(by='cn',ascending=False)
plt.figure(figsize=(10, 6))  # 设置图形的大小
plt.bar(bus_contribution_top_sorted['公司名称'],bus_contribution_top_sorted['cn'])
plt.xlabel('公司名称')  # 设置x轴标签
plt.ylabel('sm')  # 设置y轴标签
plt.title('巴士公司贡献度 top')  # 设置标题
plt.xticks(rotation=45)  # x轴标签旋转45度
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()  # 显示图形

在这里插入图片描述
与上一part呼应,巴士集团的贡献度最高,东部公共交通和东部公共交通仅次于它,前三名断层的高,与收入情况相似,运输贡献度高的巴士公司可能服务的区域更广,或者运营的线路更多。
建议:对于运输贡献度低的公司,可以考虑与其他交通方式进行合作,如地铁、共享单车等,提供联程服务,增加乘客的出行便利性。


总结

通勤费用:整体通勤费用较低,说明公共交通系统提供了经济实惠的出行方式。

交通优惠:绝大多数乘客享受了交通优惠,只有极少数乘客购买了全票。

出行时间分布:晚高峰和早高峰时间分布表明,通勤者主要在早晚上下班时间出行。

地铁通勤时间:地铁平均通勤时间接近30分钟,对于都市生活来说,这是一个相对合理的时间。

站点分析:深圳北站的人流量和收入表明它是重要的交通枢纽。

运输效率:地铁九号线的运输效率最高,而地铁十一号线最低,这可能与线路的拥挤程度和运营效率有关。

换乘比例:地铁五号线的换乘比例最高,这可能与线路的连接性和网络布局有关。

建议

优化交通枢纽:对于人流量大的站点,如深圳北,应优化乘客流线,增加安检和售票设施,提高通行效率。

提升服务质量:对于运输贡献度高的线路,应提高服务质量,满足乘客的需求。

优惠政策:对于收入较低的站点或线路,可以考虑提供优惠政策,吸引更多乘客。

换乘优化:对于换乘比例高的线路,应优化换乘站点的指引标识和便利设施。

联程服务:鼓励不同交通方式之间的合作,提供联程服务,增加乘客的出行选择。

数据驱动的决策:利用数据分析来指导交通规划和运营决策,以更好地满足乘客的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值