阅读这篇文章大约需要3分钟。
不要把一生献给平庸和庸俗。工作应该是快乐的。不喜欢就放下。没关系。经过2020-2021这几年,OF越来越希望把时间花在自己喜欢的事情上,比如分享这些可能不起眼的数据分析知识。即使读者能被我们的进取态度所激励或学到一个知识点,也会感到满意。
言归正传,经过01-03这三篇文章的积累,相信你对Python数据分析有了一定的了解。今天OF介绍易学Python数据分析系列的第四部分:数据可视化图表(1读取数据集-2数据处理-3数据可视化图表)。
主要内容:Excel办公自动化与数据分析适合人群:办公人员/Python初学者/对数据分析感兴趣的人。准备内容:Anaconda-Spyder,pandas,seaborn,matplotlib.pyplot库如果不能安装库可以参考下面的教程:
如何安装Python库
OF已在03篇
介绍过了如何下载、读取数据集(文末有01-03篇的链接),就不再赘述。先读取一个目标数据集,以下例子的数据集是在Kaggle下载的(澳大利亚的房产数据),如果需要该数据集也可以私信我。import pandas as pdhouse = pd.read_csv(r'D:\XX\housetest.csv')
拿到这样一个数据集,我们先看看里面有些什么样的数据(把我们要分析的数据列展现出来):
承接03篇的数据处理方式,我们先观察地下室总面积列的数据。
import pandas as pdhouse = pd.read_csv(r'D:\XX\housetest.csv')print(house["TotalBsmtSF"].isnull().sum())
输出结果:
1
我们可以看到,该列有一个数据是空值,处理缺失值可以分为两类:删除缺失值和缺失值插补。我们以平均数插补为例:
import pandas as pdhouse = pd.read_csv(r'D:\XX\housetest.csv')#将house数据集中"地下室总面积"列数组赋给price_nullprice_null = pd.isnull(house["TotalBsmtSF"]) #将house数据集中"地下室总面积"不为空值的数组赋给good_pricegood_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 pdimport seaborn as snsimport matplotlib.pyplot as plt#1 读取数据集house = pd.read_csv(r'D:\XX\housetest.csv')#2 数据处理#将house数据集中"地下室总面积"列数组赋给price_nullprice_null = pd.isnull(house["TotalBsmtSF"]) #将house数据集中"地下室总面积"不为空值的数组赋给good_pricegood_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 pdimport seaborn as snsimport matplotlib.pyplot as plthouse = 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 pdimport seaborn as snsimport matplotlib.pyplot as plthouse = pd.read_csv(r'D:\XX\housetest.csv')#将house数据集中"地下室总面积"列数组赋给price_nullprice_null = pd.isnull(house["TotalBsmtSF"]) #将house数据集中"地下室总面积"不为空值的数组赋给good_pricegood_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"]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 pdimport seaborn as snsimport matplotlib.pyplot as plthouse = pd.read_csv(r'D:\Mechtouch\Pyproject\historypro\datadiagram\housetest.csv')#将house数据集中"地下室总面积"列数组赋给price_nullprice_null = pd.isnull(house["TotalBsmtSF"]) #将house数据集中"地下室总面积"不为空值的数组赋给good_pricegood_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 pdimport seaborn as snsimport matplotlib.pyplot as plthouse = 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的数据结构,即基础原理
2、数据读取和生成
3、Pandas的数据处理
4、数据可视化图表(本篇文章)
5、项目实战