seaborn数据可视化案例分析—共享单车

目录

 一、Seaborn介绍

二、数据介绍

三、数据分析

统计2011、2012年个季度使用共享单车用户量


 一、Seaborn介绍

        Seaborn是基于matplotlib开发的高阶Python数据可视图库,用于绘制更精致、美观的图形,其绘图逻辑与matplotlib基本一致,但呈现效果比matplotlib要清晰美观。常见的图表有散点图、折线图、柱状图等。

        本文以共享单车数据为例,介绍的Seaborn中的柱状图、散点图以及pandas对数据的相关处理方式,用柱状图、散点图实现对共享单车数据的可视化分析。

本文共享单车数据可在积分资源中获取。下载链接:https://download.csdn.net/download/m0_52051577/87794022?spm=1001.2014.3001.5503


二、数据介绍

        本文选取的数据为共享单车2011-2012年的数据,数据属性包括datetime(日期)、season(季度)、holiday(节日)、workingday(工作日)、weather(天气)、temp(温度)、atemp(体感温度)、humidity(湿度)、windspeed(风速)、casual(发起的非注册用户租赁数量)、registered(已注册用户租赁的数量)、count(总租车人数)。

三、数据分析

统计2011、2012年个季度使用共享单车用户量

(1)实现流程如下:

(2) 涉及到的seaborn相关函数:

sns.barplot(x,y,data,hue,palette)函数:其中x,y表示dataframe中的列名,其中data表示数据表或数组。hue表示分类的依据,palette表示色调的设置。

(3)实现步骤

导入数据:

##导入数据并预览
import pandas as pd
data=pd.read_csv(r"D://jupyter_data/bike_train.csv")
data

 提取数据目标列:season,count,datetime列。将datetime列切分处理。

##提取datetime列并以'-'为分隔符进行切分,将日期分为年、月、日
data1=data[['season','count','datetime']]
year=data1['datetime'].str.split('-',expand=True)[0]
month=data1['datetime'].str.split('-',expand=True)[1]
day1=data1['datetime'].str.split('-',expand=True)[2]
data1.insert(2,'year',year)
data1.insert(3,'month',month)
data1.insert(4,'day',day1)
data1

 分别提取2011、2012的数据,并取前三列数据,按季度统计每个季度对应的租车人数。

data1_2011=data1[data1['year']=='2011'].iloc[:,0:3]
data1_2012=data1[data1['year']=='2012'].iloc[:,0:3]
group1=data1_2011.groupby('season').agg({'count':'sum'})
group2=data1_2012.groupby('season').agg({'count':'sum'})
# 表格转置并重置索引,重设列名
group1.columns=['2011']
s_count_st=pd.DataFrame(group1.stack(),columns=['count'])
s_count_st=s_count_st.reset_index()
s_count_st.columns=['season','year','count']
mid=s_count_st['year']
s_count_st.pop('year')
s_count_st.insert(2,'year',mid)
s_count_st

 合并数据

s_count1=pd.concat([s_count_st,s_count_st2],axis=0)
s_count1

 

分别统计2011、2012每个月份的租车人数

month1_2011=data1[data1['year']=='2011'].iloc[:,[0,1,3]]
#提取出季度、租车人数、月份三列
m_count2011=month1_2011.groupby('month').agg({'count':'sum'})
#按月份分组,统计每个月的租车人数
m_count2011.columns=['2011']
m_count_st=pd.DataFrame(m_count2011.stack(),columns=['count'])
#重置索引
m_count_st=m_count_st.reset_index()
m_count_st.columns=['month','year','count']
midpro=m_count_st['year']
m_count_st.pop('year')
m_count_st.insert(2,'year',midpro)
m_count_st
month1_2012=data1[data1['year']=='2012'].iloc[:,[0,1,3]]
m_count2012=month1_2012.groupby('month').agg({'count':'sum'})
m_count2012.columns=['2012']
m_count_st1=pd.DataFrame(m_count2012.stack(),columns=['count'])
m_count_st1=m_count_st1.reset_index()
m_count_st1.columns=['month','year','count']
midpro1=m_count_st1['year']
m_count_st1.pop('year')
m_count_st1.insert(2,'year',midpro1)
m_count_st1

将原数据表中的日期列进一步划分为年月日之后,将日一列切分出时间戳,并对时间戳进一步切分,切分出小时。

#提取年
year=data['datetime'].str.split('-',expand=True)[0]
#提取月
month=data['datetime'].str.split('-',expand=True)[1]
#提取日+时间
day1=data['datetime'].str.split('-',expand=True)[2]
#提取日
day=day1.str.split(' ',expand=True)[0]
#提取年月日
date=data['datetime'].str.split(' ',expand=True)[0]
#提取时间
timestamp=data['datetime'].str.split(' ',expand=True)[1]
#提取小时
hour=timestamp.str.split(':',expand=True)[0]
data2=data.drop(['datetime'],axis=1)
data2.insert(11,'date',date)
data2.insert(12,'timestamp',timestamp)
data2.insert(13,'year',year)
data2.insert(14,'month',month)
data2.insert(15,'day',day)
data2.insert(16,'hour',hour)
data2

 2011、2012年数据:

#分别筛选出2011、2012的数据
data_2011=data2.loc[data2['year']=='2011']
data_2012=data2.loc[data2['year']=='2012']

作图展示(簇状图):

plt.figure(figsize=[10,6])
sns.barplot(data=s_count1,x='season',y='count',hue='year',palette='Set2')
plt.xticks(ticks=range(4),labels=['spring','summer','autumn','winter'])
plt.tight_layout()
plt.show()

 从柱状图中可看出,各个季度来看,2012年租车人数比2011年租车人数要多,且租车人数夏秋季比纯冬季要多。

 绘制气温与风度的散点图:

sns.scatterplot(data=data_2011,x='temp',y='windspeed',hue='count')
plt.tight_layout()
plt.show()

从散点图可看出,租车人数集中在气温为20-35、风度为10-40的区间段中。

 绘制气温与湿度的散点图:

sns.scatterplot(data=data_2011,x='temp',y='humidity',hue='count')
plt.tight_layout()
plt.show()

 从散点图可看出,租车人数集中在气温为20-35、湿度为20-80的区间段中。

猜你喜欢

转载自blog.csdn.net/m0_52051577/article/details/130735989