第二章 数据准备 2.4 数据可视化 2.4.1 基本可视化图案动手学数据分析(四)主要是对数据可视化,针对不同的数据要求,使用不同的图像表现形式,以突出其表达的数据信息。重点在于以多列柱状图、堆积柱状图、折线图、核密度图等图像形式完成泰坦尼克号数据集中的不同特征下的生存人数与死亡人数分布情况、年龄分布情况等。
基本的可视化图案有哪些?分别适用于那些场景?
折线图:用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势。
柱状图(又名条形图):,使用垂直或水平的柱子显示类别之间的数值比较。柱状图描述的是分类数据,其中一个轴表示需要对比的分类,另一个轴代表相应的数值。
直方图:是一种统计报告图,描述的是一组数据的频次分布,由一系列高度不等的条纹表示数据分布的情况。
散点图:显示变量之间的相互影响程度,即变量间相关性。
饼状图:通常用来描述量、频率和百分比之间的关系。
箱型图:一种用作显示一组数据分散情况资料的统计图。词云图: 展现文本信息,对出现频率较高的“关键词”予以视觉上的突出,比如用户画像的标签。
雷达图:将多个分类的数据量映射到坐标轴上,对比某项目不同属性的特点。
2.4.2 可视化泰坦尼克号数据集中男女中生存人数分布情况【柱状图与直方图的区别】
1.直方图展示数据的分布,柱状图比较数据的大小。
2.直方图X轴为定量数据(为数字区间),柱状图X轴为分类数据。
3.直方图柱子无间隔,柱状图柱子有间隔。
4.直方图柱子宽度可不一,柱状图柱子宽度须一致。
step1:求出具体男女中生存人数。
方法1:使用groupby方法
方法2:使用pivot_table透视表方法
#方法1:使用groupby方法
data1=df.groupby('Sex').agg({'Survived':'sum'})
data1
#方法2:使用pivot_table透视表方法
data=pd.pivot_table(df,index='Sex',values='Survived',aggfunc='sum')
data
step2:绘制柱状图
#1、导入可视化库,并设置中文字体
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
sns.set(font='SimHei')
#2、数据导入,3、作图数据
data=pd.pivot_table(df,index=['Sex'],values='Survived',aggfunc='sum')
#data=df.groupby('Sex').agg({'Survived':'sum'})
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(6,7),dpi=70) #画布的设计
plt.bar(data.index,data['Survived'],width=0.6)
for a,b in zip(data.index,data['Survived']): #柱子上的数字显示
plt.text(a,b,'%d'%b,ha='center',va='bottom',fontsize=15)
#5、图例注释等装饰
plt.ylabel('生存人数')
plt.title('泰坦尼克号数据集中男女中生存人数分布情况')
plt.show()
【思考】计算出泰坦尼克号数据集中男女中死亡人数,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
step1:求出具体男女中生存人数、死亡人数
data=df.groupby('Sex').agg({'Survived':'count'}).rename(columns={'Survived':"总人数"})
data1=df.groupby('Sex').agg({'Survived':'sum'}).rename(columns={'Survived':"生存人数"})
f_data=pd.merge(data,data1,on='Sex')
f_data["死亡人数"]=f_data["总人数"]-f_data["生存人数"]
f_data
step2:绘制多列柱状图、堆积柱状图
要想把男女生存人数与死亡人数结合在一起比较分析,本文使用两种图像进行展示,分别多列柱状图和堆积柱状图。
(1)绘制多列柱状图
#多列柱状图
#1、导入可视化库,并设置中文字体
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=df.groupby('Sex').agg({'Survived':'count'}).rename(columns={'Survived':"总人数"})
data1=df.groupby('Sex').agg({'Survived':'sum'}).rename(columns={'Survived':"生存人数"})
f_data=pd.merge(data,data1,on='Sex')
f_data["死亡人数"]=f_data["总人数"]-f_data["生存人数"]
x=np.arange(0,2)
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(6,7),dpi=70) #画布的设计
total_width,n=0.6,2 # 有两种类型的数据,n设置为2
width=total_width/n # 每种类型的柱状图宽度
x=x-(total_width-width)/2 # 重新设置x轴的坐标
plt.bar(x,f_data["死亡人数"],width=width,color='green',label="死亡人数") #死亡人数
plt.bar(x+width,f_data["生存人数"],width=width,color='red',label="生存人数") #生存人数
#5、图例注释等装饰
x_labels=data.index
plt.xticks(x+0.15,x_labels) #使用plt.xticks()可以把0,1替换成female,male
for a,b in zip(x,f_data["死亡人数"]): #柱子上的死亡人数数字显示
plt.text(a,b+0.01,'%d'%b,ha='center',va='bottom',fontsize=15)
for a,b in zip(x+width,f_data["生存人数"]): #柱子上的生存人数数字显示
plt.text(a,b+0.01,'%d'%b,ha='center',va='bottom',fontsize=15)
plt.ylabel('人数',size=12,color="blue")
plt.xlabel('性别',size=12,color="blue")
plt.title('泰坦尼克号数据集中男女中生存人数 & 死亡人数分布情况')
plt.legend()
plt.show()
(2)绘制堆积柱状图
#1、导入可视化库,并设置中文字体
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=df.groupby('Sex').agg({'Survived':'count'}).rename(columns={'Survived':"总人数"})
data1=df.groupby('Sex').agg({'Survived':'sum'}).rename(columns={'Survived':"生存人数"})
f_data=pd.merge(data,data1,on='Sex')
f_data["死亡人数"]=f_data["总人数"]-f_data["生存人数"]
x=np.arange(0,2)
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(6,7),dpi=70) #画布的设计
total_width,n=0.6,2 # 有两种类型的数据,n设置为2
width=total_width/n # 每种类型的柱状图宽度
x=x-(total_width-width)/2 # 重新设置x轴的坐标
plt.bar(x,f_data["死亡人数"],width=width,color='y',label="死亡人数") #死亡人数
#堆积比例图
plt.bar(x,f_data["生存人数"],width=width,color='c',label="生存人数",bottom=f_data["死亡人数"]) #生存人数
#5、图例注释等装饰
x_labels=data.index
plt.xticks(x,x_labels) #使用plt.xticks()可以把0,1替换成female,male
plt.ylabel('人数',size=12,color="blue")
plt.xlabel('性别',size=12,color="blue")
plt.title('泰坦尼克号数据集中男女中生存人数 & 死亡人数分布情况')
plt.legend()
plt.show()
绘制堆积柱状图,是在前一个柱状图的基础上累加,即需要设置bottom参数。在本图中就是把生存人数堆积到死亡人数上bottom=f_data["死亡人数"]
【扩展】
1、功能1:使用plt.xticks()代码可以把0, 1, ...替换成第1组, 第2组...
plt.xticks(ticks=None, labels=None) ticks表示将要标注的标签的坐标轴位置,labels表示要替换成的标签名称2、功能2:显示具体的数字在柱状图中,可以在plt.legend()前添加plt.text()代码
plt.text(x, y, s, fontdict=None) x, y表示坐标位置,s表示要写入的字符串3、颜色:color=[‘grey’,‘gold’,‘darkviolet’,‘turquoise’,‘r’,‘g’,‘b’, ‘c’, ‘m’, ‘y’,‘k’,‘darkorange’,‘lightgreen’,‘plum’, ‘tan’,‘khaki’, ‘pink’, ‘skyblue’,‘lawngreen’,‘salmon’]
2.4.3 可视化泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况【男女中生存人与死亡人数分布情况图像信息】
在上一节中,我们是用groupby求出了男女存活人数和死亡人数的具体数据。但相比于本节用柱状图的形式,图像更能直观地表达数据的强烈对比差异,从生存人数 & 死亡人数分布情况可以看出,
1、女性死亡人数远小于男性死亡人数。
2、在男性总人数接近是女性的两倍时,最后女性存活人数反而比男性存活人数2倍还多。
3、女性存活率占全部女性的74.2%,男性存活率占全部男性为18.9%,女性存活率远高于男性。
step1:求出不同票价的生存人数、死亡人数
data=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_f=pd.merge(data,data1,on='Fare')
data_f["死亡人数"]=data_f["总人数"]-data_f["生存人数"]
data_f
step2:绘制折线图
未排序折线图:
#1、导入可视化库,并设置中文字体
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_f=pd.merge(data,data1,on='Fare')
data_f["死亡人数"]=data_f["总人数"]-data_f["生存人数"]
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(20,10),dpi=70) #画布的设计
total_width,n=0.6,2 # 有两种类型的数据,n设置为2
width=total_width/n # 每种类型的柱状图宽度
x=x-(total_width-width)/2 # 重新设置x轴的坐标
plt.plot(data.index,data_f["死亡人数"],linestyle='-') #死亡人数
plt.plot(data.index,data_f["生存人数"],linestyle='-') #生存人数
#5、图例注释等装饰
plt.ylabel('生存人数',size=12)
plt.xlabel("票价",size=12)
plt.legend(labels=["死亡人数","生存人数"])
plt.show()
已排序折线图:
#1、导入可视化库,并设置中文字体
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Fare',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_f=pd.merge(data,data1,on='Fare')
data_f["死亡人数"]=data_f["总人数"]-data_f["生存人数"]
sort_data_survived=data_f["生存人数"].sort_values(ascending=False)
sort_data_death=data_f["死亡人数"].sort_values(ascending=False)
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(20,10),dpi=70) #画布的设计
plt.plot(data_f.index,sort_data_death,linestyle='-',linewidth=3) #死亡人数
plt.plot(data_f.index,sort_data_survived,linestyle='-',linewidth=3) #生存人数
#5、图例注释等装饰
plt.ylabel('人数',size=12)
plt.xlabel("票价",size=12)
plt.legend(labels=["死亡人数","生存人数"])
plt.show()
2.4.4 可视化泰坦尼克号数据集中不同仓位等级的人生存和死亡人数分布情况
step1:求出不同仓位等级的生存人数、死亡人数
data=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_pclass=pd.merge(data,data1,on='Pclass')
data_pclass["死亡人数"]=data_pclass["总人数"]-data_pclass["生存人数"]
data_pclass
step2:绘制多列柱状图、堆积柱状图
(1)多列柱状图
#多列柱状图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_pclass=pd.merge(data,data1,on='Pclass')
data_pclass["死亡人数"]=data_pclass["总人数"]-data_pclass["生存人数"]
x=np.arange(0,3)
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(6,7),dpi=70) #画布的设计
total_width,n=0.6,3 # 有两种类型的数据,n设置为3
width=total_width/n # 每种类型的柱状图宽度
x=x-(total_width-width)/2 # 重新设置x轴的坐标
plt.bar(x,data_pclass["死亡人数"],width=width,color='green',label="死亡人数") #死亡人数
plt.bar(x+width,data_pclass["生存人数"],width=width,color='red',label="生存人数") #生存人数
#5、图例注释等装饰
x_labels=data.index
plt.xticks(x+0.15,x_labels) #使用plt.xticks()可以把0,1替换成female,male
for a,b in zip(x,data_pclass["死亡人数"]): #柱子上的死亡人数数字显示
plt.text(a,b+0.01,'%d'%b,ha='center',va='bottom',fontsize=15)
for a,b in zip(x+width,data_pclass["生存人数"]): #柱子上的生存人数数字显示
plt.text(a,b+0.01,'%d'%b,ha='center',va='bottom',fontsize=15)
plt.ylabel('人数',size=12,color="blue")
plt.xlabel('仓位',size=12,color="blue")
plt.title('泰坦尼克号数据集中不同仓位等级中生存人数 & 死亡人数分布情况')
plt.legend()
plt.show()
(2)堆积柱状图
#堆积柱状图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#2、数据导入,3、作图数据
data=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1=pd.pivot_table(df,index='Pclass',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_pclass=pd.merge(data,data1,on='Pclass')
data_pclass["死亡人数"]=data_pclass["总人数"]-data_pclass["生存人数"]
x=np.arange(0,3)
#4、选择可视化的图表类型并实现
fig=plt.figure(figsize=(6,7),dpi=70) #画布的设计
total_width,n=0.6,3 # 有两种类型的数据,n设置为3
width=total_width/n # 每种类型的柱状图宽度
x=x-(total_width-width)/2 # 重新设置x轴的坐标
plt.bar(x,data_pclass["死亡人数"],width=width,color='green',label="死亡人数") #死亡人数
plt.bar(x,data_pclass["生存人数"],width=width,color='red',label="生存人数",bottom=data_pclass["死亡人数"]) #生存人数
#5、图例注释等装饰
x_labels=data.index
plt.xticks(x,x_labels) #使用plt.xticks()可以把0,1替换成female,male
plt.ylabel('人数',size=12,color="blue")
plt.xlabel('仓位',size=12,color="blue")
plt.title('泰坦尼克号数据集中不同仓位等级中生存人数 & 死亡人数分布情况')
plt.legend()
plt.show()
【思考】看到这个前面几个数据可视化,说说你的第一感受和你的总结
2.4.5 可视化泰坦尼克号数据集中不同年龄的人生存和死亡人数分布情况思考题回答
1、图像比具体数据更能直观表达信息。
2、同一数据可根据要对比的信息不同绘制不同的图。
3、男性总人数接近是女性的两倍,最后女性存活人数反而比男性存活人数2倍还多;女性存活率占全部女性的74.2%,男性存活率占全部男性为18.9%,女性存活率远高于男性。
4、票价越低死亡人数远大于生存人数,而票价越高生存人数大于死亡人数。
5、仓位越低,总人数越多;仓位越高时,生存人数占总人数的比重越大,死亡人生占总人数的比重越小。
step1:求出不同年龄的生存人数、死亡人数
#不同年龄的人生存与死亡人数
data_age=pd.pivot_table(df,index='Age',values='Survived',aggfunc='count').rename(columns={'Survived':"总人数"})
data1_age=pd.pivot_table(df,index='Age',values='Survived',aggfunc='sum').rename(columns={'Survived':"生存人数"})
data_f_age=pd.merge(data_age,data1_age,on='Age')
data_f_age["死亡人数"]=data_f_age["总人数"]-data_f_age["生存人数"]
data_f_age
从上表可以看出,一共有88个不同年龄的数据,如果用我们之前的柱状图、折线图等方法来展示数据,会弄巧成拙,显得整个图像十分的混乱,从而得不出什么有用的信息。 故这里采用核密度图,该图可看做是概率密度图,其纵轴可以粗略看做是数据出现的次数,与横轴围成的面积是一.
step2:绘制核密度图
facet = sns.FacetGrid(df,hue="Survived",aspect=4) facet.map(sns.kdeplot,'Age',shade=True) facet.set(xlim=(0,df['Age'].max())) facet.add_legend()2.4.6 可视化泰坦尼克号数据集中不同仓位等级的人年龄分布情况
与2.4.5同理,不同仓位中的不同年龄个数有很多,一一列出其年龄标签,会导致图像无法提供直观有用的信息,失去数据可视化的意义。 故这里也采用核密度图。
df.Age[df.Pclass == 1].plot(kind='kde')
df.Age[df.Pclass == 2].plot(kind='kde')
df.Age[df.Pclass == 3].plot(kind='kde')
plt.xlabel("年龄")
plt.legend((1,2,3),loc="best")
【思考】上面所有可视化的例子做一个总体的分析,你看看你能不能有自己发现
思考题回答
1、女性生存率远高于男性
2、票价越高,生存率越高
3、仓位等级越高,生存概率越大
4、年龄越小的集中在高等级仓位,年龄越大的集中在低等级仓位。
【总结】 动手学数据分析(四)是对数据进行可视化,针对不同的数据要求,利用可视化工具对处理过后的数据进行绘图,重点在于绘制柱状图、多列柱状图、堆积柱状图、折线图、核密度图等图像。通过可视化的图像,直观快速地获取数据所表达的信息。



