python学习第18节:数据可视化

发布时间:2020/07/18 作者:天马行空 阅读(1284)

一、数据可视化
数据可视化指的是,将数据(比如上关中爬虫爬到的信息)中的信息以可视化图表的方式展现出来的技术。
数据的属性可以分为两大类:数值属性和类别属性。老师为你分别介绍对这两类不同属性的可视化操作。

数值可视化
数值属性(numerical attribute)指的是可以用数字度量的属性,属性值是实数。比如,人的身高、体重。

读取数据

# 导入pandas库,重命名为pd
import pandas as pd
# 读取文件(文件目录和名字为'..data/data.xlsx')
data = pd.read_excel('../data/data.xlsx')
# 打印所有的列名
print(data.columns.values)


现在变量data已经是一个pandas数据类型了,这种类型的正式名字叫做DataFrame,在之前的练习中也已经接触过了。DataFrame数据类型可以很方便地进行数据可视化。

1.1、散点图
散点图(Scatter plot)是指数据点在二维坐标系平面上的分布图,散点图一方面可以直观观察数据分布,另一方面可以用来观察两个数值属性之间的相关性。
在我们收集的职位信息中,薪资水平往往是我们最关心的,data中有关薪资水平的数据有两个,分别是'薪资下限' 和'薪资上限'。
薪资下限和薪资上限之间的关系很难看清楚。使用散点图可以解决这个头疼的问题:我们使用二维坐标系来画图,坐标系的横轴为薪资下限,纵轴为薪资上限,在图上绘制各个数据点的对应位置看看这两个属性之间的关系。
可以调用matplotlib.pyplot的scatter方法绘制两个属性之间的关系。传入scatter的第一个参数是绘图时使用的横坐标数据,第二个参数是纵坐标数据。

import pandas as pd
import matplotlib.pyplot as plt
#下面一行语句作用是:让图像直接输出在编辑环境中
%matplotlib inline
data = pd.read_excel('../data/data.xlsx')
# 剔除高出十万的数据点
data = data[data['薪资下限']<=100000]
min_salary = data["薪资下限"]
max_salary = data["薪资上限"]
years = data["工作经验"]
# 获取薪资水平
salary = (min_salary + max_salary)/2
# 画出散点图
plt.scatter(years, salary)
# 添加坐标轴标签
plt.xlabel('工作年限')
plt.ylabel('平均薪资')
plt.show()


散点图展现的是两列数据对应位置上的数据值之间的关系。从散点图中,可以发现两个信息:
    1、薪资上限和薪资下限的分布和范围:薪资下限大致从0到14万多,上限大致从0到20万左右。
    2、薪资上限和薪资下限存在很强的相关性:散点图基本在一条直线上,上限随着下限的增加而增加。
另外还有一个点(图片的右上角)显得非常不正常:这个点对应的薪资水平过于高了。在数据分析中称这种数据点为 离群值(outlier) ,也被称作异常值。

如何标注横纵坐标轴各自代表的属性名?
可以分别使用plt.xlabel(横坐标标签)和plt.ylabel(纵坐标标签)来为两个不同的坐标轴加上标签。

1.2、直方图
直方图(histogram)使用一系列高度不等的纵向长方形表示数据分布的情况。pyplot中绘制直方图的基础调用语法为plt.hist(数据)。
默认情况下,matplotlib将数据集按它们的取值分成10等份。然后在坐标轴上绘制高低不同但彼此相连的10个长方形小条。小条的面积表示落在它所覆盖的横坐标取值范围内的数据频数(就是有多少个数据落在这个区间)。小条的宽度被称为组距(数据组之间的距离)。
如果觉得这张图的条形太少,显得不太细致,我们可以使用bins参数来指定条形数量。bins参数可以规定直方图条数的多少,比如我们可以设置bins=20。请将代码plt.hist(salary, bins=20)补充到指定位置,完成直方图bins参数的训练。

import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('../data/data.xlsx')
#下面一行语句作用是:让图像直接输出在编辑环境中
%matplotlib inline
data = data[data['薪资下限']<=100000]
max_salary = data['薪资上限']
min_salary = data['薪资下限']
# 画出直方图,alpha设置透明度,range设置范围参数,使用label参数设置图例标签,bins指定x轴有多少个段
plt.hist(max_salary, alpha=0.4, range=(0, 60000), bins=20, label='max salary')
plt.hist(min_salary, alpha=0.4, range=(0, 60000), bins=20, label='min salary')
plt.xlabel('salary level')
plt.ylabel('count')
plt.show()

图片.png

二、类别可视化

2.1、条形图
条形图和直方图长得非常的像,都是一个又一个的长条样的矩形。但是它们的作用却不一样。
条形图(bar chart)用长条形表示每一个类别,长条形的长度表示类别的频数(就是有多少数据属于这个类别)。
与直方图每个长条在横坐标上表示数据所覆盖的取值范围不同,条形图的宽是固定的,不同长方条之间相互隔开,分别表示数据中的不同类型,用于表示类别型的数据,比如职位信息中的学历要求或者就职城市等。

在pyplot模块里,绘制条形图使用bar( )函数。hist( )只接收一组数据参数就可以进行绘制,而bar( )则至少需要两组数据。
一组代表每类的名称(类别),另一组代表每类的频数,基础语法为:plt.bar(类别, 频数)。从拉勾抓取的数据中,每一条数据是一个具体的职位需求,学历的频数需要我们自己计算一下。

import pandas as pd
import matplotlib.pyplot as plt
#下面一行语句作用是:让图像直接输出在编辑环境中
%matplotlib inline
data = pd.read_excel('../data/data.xlsx')
education = data['学历要求']
education = list(education)
edu_keys = list(set(education))
edu_counts = [0 for i in range(len(edu_keys))]
for i, key in enumerate(edu_keys):
    edu_counts[i] = education.count(key)
plt.rcParams['font.sans-serif']=['SimHei']
plt.xlabel('学历要求')
plt.ylabel('职位数量')
# color可以设置颜色,颜色的具体参数值可以在网上查询
plt.bar(edu_keys, edu_counts, color='c', alpha=0.4)
plt.show()



2.2、饼图

matplotlib中用来绘制饼图的函数是pie( )。
pie( )要求的必须参数只有一个:用来定义每一块扇形面积的基础数据,也就类似条形图里用到的频数列表。基础语法为:plt.pie(频数列表)。

import pandas as pd
import matplotlib.pyplot as plt
#下面一行语句作用是:让图像直接输出在编辑环境中
%matplotlib inline
data = pd.read_excel('../data/data.xlsx')
city = data['城市']
city = list(city)
city_keys = list(set(city))
city_counts = [0 for i in range(len(city_keys))]
for i, key in enumerate(city_keys):
    city_counts[i] = city.count(key)
plt.rcParams['font.sans-serif']=['SimHei']
plt.pie(city_counts)
# 添加图例,设置位置偏右
plt.legend(city_keys, loc="right")
plt.show()

图片.png


三、文本可视化

3.1、词云图

词云图就是对文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的次要信息,使阅读者只要一眼扫过图形就可以领略文本的主旨。


词云图的绘制并不难,但它要用到一个新的模块:WordCloud。先用个简单的例子来认识一下词云图。

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
#下面一行语句具体作用不用理会,防止出现运行两次才出图的状况
%matplotlib inline

data = pd.read_excel('../data/data.xlsx')
# 获取技能标签列的数据
skills = data.loc[:, '技能标签']

# 将读取到的skills中的元素内容都转换为字符串,使用strip方法将字符串的头尾空格移除,
# 并且使用列表生成式用这些内容组成一个列表,再将新生成的列表重新赋值给skills
skills = [str(skill).strip() for skill in skills]

# 使用join函数将列表的每个元素内容通过逗号拼接起来
skill_string = ','.join(skills)
# 绘制词云图collocations不重复显示关键词
wc = WordCloud(font_path='../data/simhei.ttf', background_color='white', collocations=False)
wc.generate(skill_string)

plt.imshow(wc)
plt.axis('off')
plt.show()

图片.png

总结
数值属性:可以用数字度量的属性,属性值是实数。
散点图:数据点在直角坐标系平面上的分布图。
直方图:用长条形的面积表示频数,用宽度来表示组距。
条形图:用长条形表示每一个类别,长条形的长度表示类别的频数。
饼图:用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。通过扇形统计图可以很清楚地表示出各部分数量同总数之间的关系。
词云图:对文本中出现频率较高的“关键词”予以视觉上的突出。


练习:在绘制数据分析师职位需求组成的词云图时,呈现心型的底图形状。

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
import numpy as np
from PIL import Image
#下面一行语句作用是:让图像直接输出在编辑环境中
%matplotlib inline
# 将数据读入data
data = pd.read_excel('../data/lesson17_test_data.xlsx')
# 获取“职位需求”列并用' '将所有列中内容串接成一个字符串并存储到变量skills中
skills = data['职位需求']
skills = ' '.join(skills)
#  调用jieba.cut将skill进行分词,并将结果存储在skills_after_jieba中
skills_after_jieba = jieba.cut(skills, cut_all=True)
# 使用" " 对skills_after_jieba进行拼接
skills_str = " ".join(skills_after_jieba)
# 定义词云背景轮廓图
mask = np.array(Image.open('../data/wc_heart.png')) 

# 构建WordCloud对象,将背景轮廓图指定为mask
# 注意指定字体为simhei.ttf,字体路径为'../data/simhei.ttf'
wc = WordCloud(
    background_color="white", #设置背景为白色,默认为黑色
    font_path='../data/simhei.ttf', # 设置字体格式
    mask=mask, # 设置背景图
)
wc.generate(skills_str)
# 绘制词云
plt.figure(figsize=(10, 10))
plt.imshow(wc)
plt.axis("off")
plt.show()


关键字python python教程