人工智能-seaborn单双多变量绘图、两案例:NBA球员数据分析、北京租房数据统

1、 seaborn

作用:更高效地绘图

#安装
pip3 install seaborn

#导入
import seaborn as sns

单变量:直方图或核密度曲线
双变量:散点图、二维直方图、

主要函数:distplot()与joinplot()函数

1.1 单变量绘图

API
在这里插入图片描述

import seaborn as sns
import numpy as np

np.random.seed(0) #确定随机数种子
arr = np.random.rand(100)
sns.distplot(arr,bins=10,hist=True,kde=True,rug=True)

在这里插入图片描述

1.2 双变量绘图

散点图-kind = ‘scatter’
在这里插入图片描述

import pandas as pd
df = pd.DataFrame({'x':np.random.randn(500),'y':np.random.randn(500)})
df.head()
sns.joinplot('x','y',data = df)

在这里插入图片描述
核密度估计曲形-kind = ‘kde’

sns.joinplot('x','y',data = df,kind = 'kde')

在这里插入图片描述
颜色越深,表示数据越密集

二维直方图-kind = ‘hex’


sns.joinplot('x','y',data = df,kind = 'hex')

在这里插入图片描述
多个成对的双变量分布

dataset = sns.load_dataset('iris')

sns.pairplot(dataset)

在这里插入图片描述

1.3 总结

  • 绘制单变量分布图像:seaborn.distplot()
  • 绘制双变量分布图像:seaborn.jointplot()
  • 绘制成对的双变量分布图像:seaborn.pairplot()

2、分类数据绘图

2.1 类别散点图

在这里插入图片描述

data = sns.load_dataset('tips')
data.load()
sns.stripplot(x='day',y='total_bill',data=data)

在这里插入图片描述

sns.stripplot(x='day',y='total_bill',data=data,hue='time')
#hue='time'按time类别分颜色,这里只有两类

在这里插入图片描述

sns.stripplot(x='day',y='total_bill',data=data,hue='time',jitter=True)
#jitter=True不让数据重叠起来

在这里插入图片描述

sns.swarmplot('day','total_bill',data=data)
#swarmplot-完全没有重叠

在这里插入图片描述

2.2 类别内的数据发布

箱线图、小提琴图
在这里插入图片描述
小提琴图结合了箱线图和密度图的特征,主要用来显示数据的分布
在这里插入图片描述
箱线图API

seaborn.boxplot(x=None,y=None,hue=None,data=None,orient=None,color=None,saturation=0.9)
#hue--分组
#palette=['g','b','y',''b]设置颜色,是对hue分组类别的颜色
#saturation颜色设置的饱和度

#举例
sns.boxplot('day','total_bill',data=data)

小提琴图

#API
seaborn.violinplot(x=None,y=None,hue=None,data=None)

#举例
sns.violinplot('day','total_bill',data=data)

条形图sns.barplot与点图sns.pointplot

#条形图(及其置信区间)
sns.barplot(x='day',y='total_bill',data=tips)

#点图(点估计及其置信区间)
sns.pointplot(x='day',y='total_bill',data=tips)

在这里插入图片描述
在这里插入图片描述

3、案例:NBA球员数据分析

NBA数据

3.1获取数据且初识数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#获取数据且初识数据
data = pd.read_csv('F:/人工智能/nba_2017_nba_players_with_salary.csv')
data.head()
data.shape
data.describe()

3.2 热力图

#数据分析
##数据相关性
data_cor = data.loc[:,['RPM','AGE','SALARY_MILLIONS','ORB','DRB','TRB','AST','STL','BLK','TOV','PF','POINTS','GP','MPG','ORPM','DRPM']]
data_cor.head()
#列名太多,只对部分列求一下相关性
corr = data_cor.corr()
corr.head()
###热力图
plt.figure(figsize=(20,8),dpi=100)#设置图大小
sns.heatmap(corr,square=True,linewidths=0.1,annot=True)
#square=True调至方形,linewidths=0.1中间加宽度为0.1的线,annot=True显示数据

在这里插入图片描述

3.3数据排名分析

#基本数据排名分析
data.loc[:,['PLAYER','RPM','AGE']].sort_values(by='RPM',ascending=False).head()
#按照RPM降序排名

在这里插入图片描述

#按照球员薪资排名
data.loc[:,['PLAYER','RPM','AGE','SALARY_MILLIONS']].sort_values(by='SALARY_MILLIONS',ascending=False).head()

在这里插入图片描述

3.4seaborn常用的三个数据可视化方法

3.4.1单变量
#seaborn常用的三个数据可视化方法
##单变量
#利用seaborn中的distplot绘图来分别看薪水、效率值、年龄三个信息的分布情况
sns.set_style('darkgrid')#设置基本模式
plt.figure(figsize=(10,10))

plt.subplot(3,1,1)
sns.distplot(data['SALARY_MILLIONS'])
plt.ylabel('salary')

plt.subplot(3,1,2)
sns.distplot(data['RPM'])
plt.ylabel('RPM')

plt.subplot(3,1,3)
sns.distplot(data['AGE'])
plt.ylabel('AGE')

在这里插入图片描述

3.4.2双变量-散点图
##双变量jointplot
#使用jointplot查看年龄和薪水之间的关系
sns.jointplot(data.AGE,data.SALARY_MILLIONS,kind='hex') #hex显示六边形形式

在这里插入图片描述

3.4.3多变量
##多变量
multi_data = data.loc[:,['RPM','SALARY_MILLIONS','AGE','POINTS']]
multi_data.head()
sns.pairplot(multi_data)

在这里插入图片描述

3.5 衍生变量的一些可视化实践-以年龄为例

自定义了一个年龄分层

#年龄划分
def age_cut(df):
    if df.AGE <=24:
        return 'young'
    elif df.AGE >=30:
        return 'old'
    else:
        return 'best'
    
#使用apply对年龄进行划分
data['age_cut'] = data.apply(lambda x:age_cut(x),axis=1)
data.head()

分层散点图

#方便计数再加一个cut列
data['cut'] = 1

data.loc[data.age_cut == 'best'].SALARY_MILLIONS.head()

#通过年龄对球员薪水和效率值进行分析
sns.set_style('darkgrid')
plt.figure(figsize=(10,10),dpi=100)
plt.title('RPM and SALARY')

x1 = data.loc[data.age_cut == 'old'].SALARY_MILLIONS
y1 = data.loc[data.age_cut == 'old'].RPM
plt.plot(x1,y1,"^")#"^"上三角形式

x2 = data.loc[data.age_cut == 'best'].SALARY_MILLIONS
y2 = data.loc[data.age_cut == 'best'].RPM
plt.plot(x2,y2,"^")

x3 = data.loc[data.age_cut == 'young'].SALARY_MILLIONS
y3 = data.loc[data.age_cut == 'young'].RPM
plt.plot(x3,y3,".")

在这里插入图片描述
成对双变量绘图pairplot

dat2 = data.loc[:,['RPM','POINTS','TRB','AST','STL','BLK','age_cut']]
sns.pairplot(dat2,hue='age_cut')

在这里插入图片描述

3.6 球队数据分析

查看不同类别下的情况,求均值,最值等—agg聚合函数
排名sort_values

data.groupby(by='age_cut').agg({"SALARY_MILLIONS":np.mean})
#利用agg函数输出各年龄段的平均薪资

#按照球队分组,平均薪水降序排序
data_team = data.groupby(by='TEAM').agg({"SALARY_MILLIONS":np.mean}) #TEAM球队
data_team.sort_values(by='SALARY_MILLIONS',ascending=False).head(10)

#按照分年龄段分球队,上榜球员数降序排列。若上榜球员数相同,则按效率值降序排列
data_rpm = data.groupby(by=['TEAM','age_cut']).agg({"SALARY_MILLIONS":np.mean,"RPM":np.mean,"PLAYER":np.size})
data_rpm.sort_values(by=['PLAYER','RPM'],ascending=False).head()
                                    

用图像来展示各球队的情况

#利用箱线图和小提琴图进行数据分析
sns.set_style('whitegrid')
plt.figure(figsize=(20,10))

data_team2 = data[data.TEAM.isin(['GS','CLE','SA','LAC','OKC','UTAH','CHA','TOR','NO','BOS'])]#只取了部分球队名
#绘图箱线图
plt.subplot(3,1,1)
sns.boxplot(x='TEAM',y='SALARY_MILLIONS',data =data_team2) #部分球队的薪资分布

plt.subplot(3,1,2)
sns.boxplot(x='TEAM',y='AGE',data =data_team2)  #部分球队的年龄分布

plt.subplot(3,1,3)
sns.boxplot(x='TEAM',y='MPG',data =data_team2)#部分球队的出场时间分布

在这里插入图片描述

#小提琴图
sns.set_style('whitegrid')
plt.figure(figsize=(20,10))

plt.subplot(3,1,1)
sns.violinplot(x='TEAM',y='3P%',data =data_team2) #部分球队的3分球命中率分布

plt.subplot(3,1,2)
sns.violinplot(x='TEAM',y='POINTS',data =data_team2)  #部分球队的得分分布

plt.subplot(3,1,3)
sns.violinplot(x='TEAM',y='eFG%',data =data_team2)#部分球队的真实命中率分布

在这里插入图片描述

4、案例:北京租房数据统计分析

需求:
在这里插入图片描述
链家北京租房数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#获取数据
file_data = pd.read_csv('F:/淘宝-人工智能-课件/链家北京租房数据.csv')
file_data

file_data.shape
file_data.info()
file_data.describe()#只计算数值列的

数据基本处理

4.1重复值和空值处理

file_data = file_data.drop_duplicates()#删除重复值,第一次出现不删除,后面出现重复的会被删除
file_data.shape

#空值处理
file_data = file_data.dropna()#删除空值
file_data.shape

在这里插入图片描述

4.2 数据类型转换

想把”面积列“转换成float类型
户型列的表达,有“几房间几厅”的表达,把该列统一为“几室几厅”的表达

#面积列
file_data['面积(㎡)'].values
file_data['面积(㎡)'].values[0][:-2]

#创建一个空的数组,用来存储改格式后的面积列
data_new = np.array([])
data_area = file_data['面积(㎡)'].values
for i in data_area:
    data_new = np.append(data_new,np.array(i[:-2]))
    
data_new

#转换data_new中数据类型
data_new = data_new.astype(np.float64)
data_new
file_data.loc[:,'面积(㎡)'] = data_new #替换
file_data.head()
#户型表达方式替换
house_data = file_data['户型']
temp_list=[]
for i in house_data:
    new_info = i.replace('房间','室')
    temp_list.append(new_info)
    
file_data.loc[:,"户型"] = temp_list
file_data

调整后的数据
在这里插入图片描述

4.3 图表分析

4.3.1 房源数量、位置分布分析
file_data["区域"].unique()
new_df = pd.DataFrame({"区域":file_data["区域"].unique(),"数量":[0]*13})
new_df

#获取每个区域房源数量
area_count = file_data.groupby(by='区域').count()
new_df["数量"] = area_count.values
new_df.sort_values(by='数量',ascending=False)
4.3.2 户型数据分析
house_data = file_data["户型"]
house_data.head()

def all_house(arr):
	key = np.unique(arr)
	result = {}
	for k in key:
		mask = (arr == k)
		arr_new = arr[mask]
		v = arr_new.size
		result[k] = v
	return result

house_info = all_house(house_data)

#去掉统计数量较少的值
house_data = dict((key,value) for key,value in house_info.items() if value >50)
pd.DataFrame({"户型":[x for x in house_data.keys()],"数量":[x for x in house_data.values()]})
show_houses

在这里插入图片描述

#图形展示房屋类型
house_type = show_houses['户型']
house_type_num = show_houses['数量']
plt.barh(range(11),house_type_num)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 1. 数据集说明 这是一份北京租房数据,总计7000 多 条记录,分为 8 个同样结构的 CSV 数据文件。 # 2. 数据处理 首先通过 pandas 将这些数据文件合并到一起,然后进行数据处理,最后将清洗好的数据写到 sqlite 。 # 3.数据分析可视化 ## 3.1 整体情况 该数据集总共有 6024 个房源信息,平均每平米的租金为 169 元,每套房源的平均出租面积为 15.68 平米。 ## 3.2 地区分析 房源数量分布情况如下,可以看到朝阳和通州这个地区的房源数量要远大于其它区,说明这个地方的租赁市场比较活跃,人员流动和人口密度可能也比较大。 房租最贵的小区 TOP 10。半壁街南路 1 号院的房租最高,达到 596 元/平米,是平均值 169 元/平米的 **3** 倍。 从户型的房源数量分布来看,主要集中在 2-4 室的户型。之前也分析了,每套房源的平均出租面积为 15.68 平米,可见大部分房源都是合租,毕竟房租那么贵,生活成本太高了。 国家规定楼层 7 层以上需要装电梯,依据这个规定,我们根据楼层数来判断房源是否有电梯。 从下图可以看到,电梯房的房源数量比较多,毕竟楼层高,建的房子多,此外,电梯房平均每平米的租金也要比非电梯房贵 10 块钱。 在区分出电梯房之后,我们再引入楼层的纬度进行分析。 从租金上看,不管是电梯房还是非电梯房,低楼层的租金都会比较贵一些。因为北京地处北方,天气较干燥,不会有回南天,而且低楼层出行较为方便。电梯房的高楼层,租金也会比较贵,这大概是因为高楼层的风景较好。 > 南方天气潮湿,在春天的时候,有时会出现 回南天 这一气象,导致低楼层会出现地板、墙壁渗水,所以在南方一般都不爱租低层。 从房源数量上看,非电梯房的高层房源最多,低层房源最少。说明非电梯房的高层房源不容易租出去,这点在租金上也有所体现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值