阅读本文大约需要 3 分钟
不要把生命献给平庸低俗,工作应该是快乐的,如果你不喜欢,就放下,无所谓的。经历了2020-2021年的这些时光,OF越来越希望将自己的时间用在喜欢的事上,比如分享这些可能毫不起眼的数据分析知识,哪怕是有一位读者能够被我们的上进态度所激励,或者能学到一个知识点,OF都会心满意足。
言归正传,经过了01-03这3篇文章的积累,相信大家对Python数据分析也有了一定的认知,今天OF向大家介绍轻松学Python数据分析系列的第4部分:数据可视化图表(1读取数据集->2数据处理->3数据可视化图表)。
主要内容:Excel 办公自动化和数据分析
适用人群:办公室职员 / Python 初学者 / 有志从事数据分析工作的人员
准备内容:Anaconda-Spyder,pandas、seaborn、matplotlib.pyplot库
不会安装库的可以参考如下教程:
Anaconda如何安装Python库
OF在第03篇文章中已经介绍过了如何下载、读取数据集(文末有01-03篇的链接),就不再赘述。先读取一个目标数据集,以下例子的数据集是在Kaggle下载的(澳大利亚的房产数据),如果需要该数据集也可以私信我。
import pandas as pd
house = pd.read_csv(r'D:\XX\housetest.csv')
拿到这样一个数据集,我们先看看里面有些什么样的数据(把我们要分析的数据列展现出来):
承接03篇的数据处理方式,我们先观察地下室总面积列的数据。
import pandas as pd house = pd.read_csv(r'D:\XX\housetest.csv')
print(house["TotalBsmtSF"].isnull().sum())
输出结果:
1
我们可以看到,该列有一个数据是空值,处理缺失值可以分为两类:删除缺失值和缺失值插补。我们以平均数插补为例:
import pandas as pd
house = pd.read_csv(r'D:\XX\housetest.csv')
#将house数据集中"地下室总面积"列数组赋给price_null
price_null = pd.isnull(house["TotalBsmtSF"])
#将house数据集中"地下室总面积"不为空值的数组赋给good_price
good_price = house[price_null == False]["TotalBsmtSF"]
#计算good_price的平均值
mean_price = good_price.mean()
#补充所有缺失值以mean_price这个数值
house.loc[price_null == True, "TotalBsmtSF"] = mean_price
经过了数据处理,我们可以开始对数据进行分析了。举个例子,想要统计各种HouseStyle房子的数量,我们可以采用seaborn的barplot。(seaborn教程:https://seaborn.pydata.org/examples/index.html)
知识点1:完整的数据分析步骤(1读取数据集->2数据处理->3可视化图表呈现)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#1 读取数据集
house = pd.read_csv(r'D:\XX\housetest.csv')
#2 数据处理
#将house数据集中"地下室总面积"列数组赋给price_null
price_null = pd.isnull(house["TotalBsmtSF"])
#将house数据集中"地下室总面积"不为空值的数组赋给good_price
good_price = house[price_null == False]["TotalBsmtSF"]
#计算good_price的平均值
mean_price = good_price.mean()
#补充所有缺失值以mean_price这个数值
house.loc[price_null == True, "TotalBsmtSF"] = mean_price
#3 可视化图表
df = house.copy()
#统计各种房子样式的数量并按降序排序
house_count = df.groupby('HouseStyle')['TotalBsmtSF'].count().sort_values(ascending=False).reset_index()
sns.barplot(x="HouseStyle", y="TotalBsmtSF", data=house_count)
plt.show()
输出结果:
上述这个例子为大家快速简单地呈现了可视化的效果,接下来OF要通过这个数据集和seaborn库,来呈现一些常用的图表。
知识点2:柱形图countplot/barplot
1)countplot比较简单,计数并画成柱状图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r'D:\XX\housetest.csv')
# 建立matplotlib图表
f, ax1 = plt.subplots(1, 1, figsize=(10, 6), sharex=True)
# 生成柱形图
x1 = house["HouseStyle"]
sns.countplot(x=x1, ax=ax1, palette="Greens_d")
# 展现图表
plt.show()
输出结果:
2)barplot,呈现两列数据的关系,这里有个要注意的,因为x,y轴设置了中文字体显示,所以需要加两行代码,否则x,y轴的标题就不显示了。
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
完整代码如下:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r'D:\XX\housetest.csv')
#将house数据集中"地下室总面积"列数组赋给price_null
price_null = pd.isnull(house["TotalBsmtSF"])
#将house数据集中"地下室总面积"不为空值的数组赋给good_price
good_price = house[price_null == False]["TotalBsmtSF"]
#计算good_price的平均值
mean_price = good_price.mean()
#补充所有缺失值以mean_price这个数值
house.loc[price_null == True, "TotalBsmtSF"] = mean_price
# 建立matplotlib图表
f, ax1 = plt.subplots(1, 1, figsize=(12, 7), sharex=True)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
# 生成Sequential类型的柱形图
x1 = house["HouseStyle"]
y1 = house["TotalBsmtSF"]
sns.barplot(x=x1, y=y1, ax=ax1, data=house)
ax1.set_title('HouseStyle各户型地下室面积情况', fontsize=20)
ax1.set_xlabel("户型")
ax1.set_ylabel("地下室面积")
# 展现图表
plt.show()
输出结果:
看了上图,大家会看到黑色的一条柱子,这条柱子指的是y轴(地下室总面积)的范围,可能数据呈现的并不直观,那么我们用boxplot更好些。
知识点3:箱形图,它能显示出一组数据的 最大值、最小值、中位数及上下四分位数。
代码,也比较简单,直接将柱形图代码中的sns.barplot,改为sns.boxplot。
输出结果:
如果需要再增加一个区域维度,呈现各区域各户型的地下室面积情况,我们需要使用hue属性。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r'D:\Mechtouch\Pyproject\historypro\datadiagram\housetest.csv')
#将house数据集中"地下室总面积"列数组赋给price_null
price_null = pd.isnull(house["TotalBsmtSF"])
#将house数据集中"地下室总面积"不为空值的数组赋给good_price
good_price = house[price_null == False]["TotalBsmtSF"]
#计算good_price的平均值
mean_price = good_price.mean()
#补充所有缺失值以mean_price这个数值
house.loc[price_null == True, "TotalBsmtSF"] = mean_price
# 建立matplotlib图表
f, ax1 = plt.subplots(1, 1, figsize=(12, 7), sharex=True)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
# 生成柱形图
x1 = house["HouseStyle"]
y1 = house["TotalBsmtSF"]
hue1 = house["MSZoning"]
sns.boxplot(x=x1, y=y1, ax=ax1, hue=hue1, data=house)
ax1.set_title('HouseStyle各户型地下室面积情况', fontsize=20)
ax1.set_xlabel("户型")
ax1.set_ylabel("地下室面积")
# 展现图表
sns.despine(offset=10, trim=True)
输出结果:
知识点4:直方图和密度图的集合体、线性回归图
如果我们想把几张图一起显示(横向或纵向),在建立matplotlib时,把参数调整成对应数量
#纵向数量改第一个参数,横向数量改第二个参数
f, [ax1, ax2] = plt.subplots(1, 2, figsize=(15, 5))
完整代码如下:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r'D:\XX\housetest.csv')
columns = ['LotArea', 'TotalBsmtSF']
df = pd.DataFrame(house, columns=columns)
# 建立matplotlib图表
f, [ax1, ax2] = plt.subplots(1, 2, figsize=(15, 5))
# 建筑面积的分布情况
sns.distplot(df['LotArea'], bins=20, ax=ax1, color='r')
sns.kdeplot(df['LotArea'], shade=True, ax=ax1)
# 各建筑面积和地下室面积的关系
sns.regplot(x='LotArea', y='TotalBsmtSF', data=df, ax=ax2)
plt.show()
输出结果:
今天,OF简要介绍了制作数据可视化图表的流程和几种图表的作法,在第5篇关于项目实战的文章中我们将实战一些小项目。OF主要为大家介绍最完整、最简单、最实用的方法来学习办公自动化和数据分析,用Pandas对Excel的数据处理已经足够了。预计还有最后一期展现一个完整的项目实战,尽请期待!
1、Pandas的数据结构,即基础原理
轻松学Python数据分析1-最简单实用的Pandas讲解
2、数据读取和生成
轻松学Python数据分析2-Excel读取和生成
3、Pandas的数据处理
轻松学Python数据分析3-数据处理
4、数据可视化图表(本篇文章)
5、项目实战
若有读者对选材和内容有任何建议,请随时评论或私信我,只要是好的建议,OF一定不会辜负大家,会有惊喜送上。
若学员对知识点有疑问或想学习更有用的知识,也请随时评论或私信我,请相信OF的诚意,一定会努力帮助大家发现-解决问题,提高自身的核心竞争力。