seaborn和pandas-missingno 的数据可视化--使用画图--缺失值分析

目录

0、seaborn包基本使用

1 pandas打印报表(推荐使用)

2 缺失值分析--Missingno

1,对于每一列数据进行分析缺失值

矩阵图

柱状图

热力图

3.画分布图--比如正太分布图seaborn

4、数据可视化--

1,热度图seaborn--满足条件的数据的个数如年龄段为2的女生有多少人

2、柱状图(查看其中一个特征的每一个种类有多少--比如男性有多少,女性有多少)

seaborn

pandas

5、多变量之间的关系(连续变量)推荐散点图

pandas

seaborn  三个变量(两个连续画点,一个离散分类)

两个变量(点数少)

6、回归画图:(画散点图和拟合直线图)连续值

推荐:lmplot 画散点图和拟合直线图

三个变量(画两条线,(两个连续画点,一个离散分类))

四个变量(多个图显示)

7、多变量之间的关系(一个连续一个离散变量)推荐散点蜂图

三个变量(用颜色区分,两个离散,一个连续)

8、盒图,小提琴图

小提琴图

9、显示值的集中趋势可以用条形图

10、 点图可以更好的描述变化差异

11多重面板:(整合前面的)

12、FacetGrid(干的事情和前面一样,新的方式吧,这个好像很牛逼)

13、热力图(一共三列数据)做成表格


 

可视化使用的数据格式均使用dateframe格式

0、seaborn包基本使用

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

def sinplot(flip=1):
    x = np.linspace(0, 14, 100)
    for i in range(1, 7):
        plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

画图之前先设置画图的风格:'''5种主题风格darkgrid whitegrid dark white ticks'''下面语句只能选择一个风格
	sns.set_style("whitegrid")  #更喜欢这种风格  ,使用sns设置plot画图的风格,但是并没有画图。
	# sns.set() # 设置默认值风格
	# sns.set_context("poster")  # "paper" "talk" "poster" "notebook"  这个指定线条粗细的越来越粗
	sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5}) #font_scale坐标轴数字大小 rc:线条大小
	sns.despine() #设置
	plt.figure(figsize=(8, 6)) #设置图像长宽大小,长8,宽6

画图:
	sinplot()
	sns.boxplot(data=data)
	
画完图设置边界线(去掉上、下左右、边界线):
	sns.despine() # 默认去掉右边和上边的边界线,sns.despine(left=True)这样写是去掉左边的边界线

显示图像:
	plt.show()

对于子图中不同的图像设置不同的风格:用with ,with相当一个域,类似于函数域
	with sns.axes_style("darkgrid"):
		plt.subplot(211)
		sinplot()
	plt.subplot(212)
	sinplot(-1)

关于颜色的选取:离散的颜色,
	current_palette = sns.color_palette() # 默认颜色,
	sns.palplot(sns.color_palette("hls", 8)) #'hls'是一个系统的颜色空间返回8种不同的颜色
	sns.palplot(sns.hls_palette(8, l=.7, s=.9))  # hls_palette()函数来控制颜色的亮度和饱和 l-亮度 lightness ,s-饱和 saturation
	sns.palplot(current_palette) # palplot用来画图的,参数是颜色
	sns.palplot(sns.color_palette("Paired",8)) # 8种颜色,两个两个是一对,深蓝和浅蓝 ...
	# 使用xkcd颜色来命名颜色 xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用的命名颜色。
	plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
	plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
	plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)

关于颜色的选取:连续渐变的颜色
	sns.palplot(sns.color_palette("Blues")) # 正常是离散的传入参数就变成连续的了 由浅到深
	sns.palplot(sns.color_palette("BuGn_r")) # 由深到浅,如果想要翻转渐变,可以在面板名称中添加一个_r后缀
	sns.palplot(sns.light_palette("green")) #由浅到深
	sns.palplot(sns.dark_palette("purple")) # 由深到浅,
	sns.palplot(sns.light_palette("navy", reverse=True)) # 由深到浅,
	
	sns.palplot(sns.color_palette("cubehelix", 8))
	
----------------------------------------------------------------------------------
画图:单特征使用直方图好用,2个特征使用散点图好    --特征就是变量
	x = np.random.normal(size=100)  x是100个随机数字
	sns.distplot(x,kde=False)  #这个函数是画直方图或者柱状图,在特定区间中有多少个数字 ,分成默认个区间
	sns.distplot(x, bins=20, kde=False)  #指定分成20个区间
	x = np.random.gamma(6, size=200)
	from scipy import stats, integrate
	sns.distplot(x, kde=False, fit=stats.gamma)  # 用曲线拟合一下,用到了scipiy这个库 
	
	2变量 举例  数据量比较小用散点图
		mean, cov = [0, 1], [(1, .5), (.5, 1)]
		data = np.random.multivariate_normal(mean, cov, 200)
		df = pd.DataFrame(data, columns=["x", "y"])
		sns.jointplot(x="x", y="y", data=df);  #这个是画出来x和y的三点图,又画出来每一个变量的直方图
		
		数据量比较大,不能用散点图了,看不了,用半透明的图,kind="hex"
		x, y = np.random.multivariate_normal(mean, cov, 1000).T
		with sns.axes_style("white"): 设置风格
			sns.jointplot(x=x, y=y, kind="hex", color="k")
			
	3个以上个变量怎么办?我要看两两变量之间的散点图,单个变量的直方图,这个功能包括了上面的sns.jointplot
		iris = sns.load_dataset("iris") #导入内置数据集,有4列,也就是4个特征
		print(iris)
		sns.pairplot(iris)
-----------------------------------------------
画回归图:两个变量既画散点图,又画回归图,看看是不是线性关系
	例子:regplot 和 lmplot 基本一样,但是开始推荐使用regplot
	tips = sns.load_dataset("tips")
	sns.regplot(x="total_bill", y="tip", data=tips) #这里是dateframe格式,也可以是其他的吧,不知道
	sns.lmplot(x="total_bill", y="tip", data=tips);  # 注意这里两个变量是连续值,如果是离散值就不能用了,很不好看
	sns.regplot(x="size", y="tip", data=tips, x_jitter=.05) #x_jitter  在x的点加上小范围的浮动
	
两个变量有一个是离散值怎么画图:swarmplot 这个好  ,三变量,只不过一个用颜色区分开了
	sns.stripplot(x="day", y="total_bill", data=tips);  #这么画太丑了,不好看,都重叠一起了,
	sns.stripplot(x="day", y="total_bill", data=tips, jitter=True) #x轴左右摇摆一下分开,好一些
	sns.swarmplot(x="day", y="total_bill", data=tips)  #这个蜂图感觉更好
	sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips) #这个更厉害了,将男女都区别开了,用不同的颜色分开
	
盒图/小提琴图(用来画离群点的),小提琴图更好
IQR即统计学概念四分位距,第一/四分位与第三/四分位之间的距离
N = 1.5IQR 如果一个值>Q3+N或 < Q1-N,则为离群点
	sns.boxplot(x="day", y="total_bill", hue="time", data=tips);#菱形,代表离群点
	sns.violinplot(x="total_bill", y="day", hue="time", data=tips); #中间粗,两边细,对称的
	sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True); # 这个不对称,被sex这个给分开了
	
不同的图可以合并,比如蜂图和小提琴图
	sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
	sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5)  #alpha透明度

直方图:条形图
	sns.barplot(x="sex", y="survived", hue="class", data=titanic); x轴是性别,y轴是获救率,  将x轴的人按class划分三个
	
点图可以更好的描述变化差异:折线图,点图,很好用
	sns.pointplot(x="sex", y="survived", hue="class", data=titanic);
	sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"]);
			  
宽形数据:和盒图
	sns.boxplot(data=iris,orient="h"); #orient 这里是横的画
	
多层面板分类图:将前面整合在一起了factorplot
	'''
	Parameters:
	x,y,hue 数据集变量 变量名
	date 数据集 数据集名
	row,col 更多分类变量进行平铺显示 变量名
	col_wrap 每行的最高平铺数 整数
	estimator 在每个分类中进行矢量到标量的映射 矢量
	ci 置信区间 浮点数或None
	n_boot 计算置信区间时使用的引导迭代次数 整数
	units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
	order, hue_order 对应排序列表 字符串列表
	row_order, col_order 对应排序列表 字符串列表
	kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点 size 每个面的高度(英寸) 标量 aspect 纵横比 标量 orient 方向 "v"/"h" color 颜色 matplotlib颜色 palette 调色板 seaborn颜色色板或字典 legend hue的信息面板 True/False legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False share{x,y} 共享轴线 True/False
	'''
	sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips)
	sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")
	sns.factorplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm")
	sns.factorplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5)
			   
			   
非常好用的FacetGrid
	g = sns.FacetGrid(tips, col="time") 先占好位置,y轴tips ,按照time种类分成几类,这里是一个变量
	g.map(plt.hist, "tip");# plt.hist 指定画这种图直方图
	
	g = sns.FacetGrid(tips, col="sex", hue="smoker")
	g.map(plt.scatter, "total_bill", "tip", alpha=.7)
	g.add_legend();
	
	g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
	g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);
	
	g = sns.FacetGrid(tips, col="day", size=4, aspect=.5)
	g.map(sns.barplot, "sex", "total_bill");
	
	from pandas import Categorical
	ordered_days = tips.day.value_counts().index
	print (ordered_days)
	ordered_days = Categorical(['Thur', 'Fri', 'Sat', 'Sun'])
	g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
					  size=1.7, aspect=4,)
	g.map(sns.boxplot, "total_bill");
	
	pal = dict(Lunch="seagreen", Dinner="gray")
	g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
	g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
	g.add_legend();
	
	g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
	g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
	g.add_legend();
	
	with sns.axes_style("white"):
		g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
	g.map(plt.scatter, "total_bill", "tip", color="#334488", edgecolor="white", lw=.5);
	g.set_axis_labels("Total bill (US Dollars)", "Tip");
	g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]);
	g.fig.subplots_adjust(wspace=.02, hspace=.02);
	#g.fig.subplots_adjust(left  = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
	
	iris = sns.load_dataset("iris")
	g = sns.PairGrid(iris)
	g.map(plt.scatter);
	
	g = sns.PairGrid(iris)
	g.map_diag(plt.hist)
	g.map_offdiag(plt.scatter);
	
	g = sns.PairGrid(iris, hue="species")
	g.map_diag(plt.hist)
	g.map_offdiag(plt.scatter)
	g.add_legend();
	
	g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")
	g.map(plt.scatter);
	
	g = sns.PairGrid(tips, hue="size", palette="GnBu_d")
	g.map(plt.scatter, s=50, edgecolor="white")
	g.add_legend();
	
------------------------------------
热度图:
	flights = sns.load_dataset("flights")
	flights.head() #读进一个pandas数据,也就是矩阵,好多行,3列(必须是三列,两列是位置,一列是数值),每个位置有一个点
	flights = flights.pivot("month", "year", "passengers") #转化为,矩阵形式,
	ax = sns.heatmap(flights)  # 画图
	ax = sns.heatmap(flights, annot=True,fmt="d")  #annot每一个位置显示数值 ,
	ax = sns.heatmap(flights, linewidths=.5)  每个格子之间有缝隙
	ax = sns.heatmap(flights, cmap="YlGnBu") #指定颜色,推荐
	ax = sns.heatmap(flights, cbar=False) # 没有条,不要用这个

1 pandas打印报表(推荐使用)

报表功能特别强大,几乎涵盖了前面的所有

注意报表能在notebook使用

import pandas as pd

datefram=pd.read_csv('bigdata1.csv')

import pandas_profiling

a= pandas_profiling.ProfileReport(datefram)

a

pycharm不能打印出来

2 缺失值分析--Missingno

Missingno:这个包是个画图包封装了matplotlib包一条语句分析缺失值

https://github.com/ResidentMario/missingno

1,对于每一列数据进行分析缺失值

矩阵图

import pandas as pd
import numpy as np
import missingno as msno
from matplotlib import pyplot as plt
datefram=pd.read_csv('bigdata1.csv')
msno.matrix(datefram.sample(datefram.shape[0]), figsize=(16, 16), width_ratios=(15, 1))
plt.rcParams['font.sans-serif']=['SimHei']   #这两行用来显示汉字
plt.rcParams['axes.unicode_minus'] = False
plt.show()

柱状图

(将上面的matrix代码换成下面这个)

msno.bar(datefram.sample(datefram.shape[0]), figsize=(12, 7), )

热力图

msno.heatmap(datefram.sample(datefram.shape[0]),figsize=(12, 7), )
 

3.画分布图--比如正太分布图seaborn

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
mu = 0
sigma = 1
sampleNo = 10000
x = np.random.normal(mu, sigma, sampleNo ) #生成10000个数,这10000个数服从标准正太分布
'''
# 纵坐标代表概率密度值,也就是一个数字出现几次,x:数据;bins:本次几个区间;fit=stats.gamma:代表要画出拟合曲线
'''
sns.distplot(x, bins=100, kde=False, fit=stats.gamma) 

plt.show()

4、数据可视化--

1,热度图seaborn--满足条件的数据的个数如年龄段为2的女生有多少人

构建一个矩阵或者表格形式的数据

# 随变找两个离散值的特征,看看每个对应的种类的个数
temp = pd.crosstab(datefram['性别'], datefram['年龄段'])

这是一个表格
	年龄段  2.0  3.0  4.0  5.0  6.0  7.0  8.0
	性别                                    
	女      7  105  150   91   40   12    3
	男     17  221  331  134   38   15    6

画图

sns.heatmap(pd.crosstab(datefram['性别'], datefram['年龄段']), cmap='Blues', annot=True, fmt='d', ax=ax)

2、柱状图(查看其中一个特征的每一个种类有多少--比如男性有多少,女性有多少)

seaborn

注:年龄段一列必须是数值型的一列,否则报错
fig, ax = plt.subplots(figsize=(12, 8))
sns.distplot(datefram['年龄段'], kde=False)
fig.tight_layout()

pandas

# 使用pandas进行打印图像
datefram['年龄段'].value_counts(dropna=False, ascending=True).plot(kind='barh', ax=ax)
print(datefram['年龄段'].value_counts())打印出具体值

5、多变量之间的关系(连续变量)推荐散点图

盒图,小提琴图也可以

pandas

from pandas.tools.plotting import scatter_matrix
fig, ax = plt.subplots(figsize=(10, 10))
scatter_matrix(datefram[['年龄段自定义等级', '年龄段', '自定义报价等级']], alpha=0.2, diagonal='hist', ax=ax)
#对角线处为自己和自己,其他地方是每两个特征之间的关系

seaborn  三个变量(两个连续画点,一个离散分类)

我要看两两变量之间的散点图,

sns.pairplot(iris) # iris为dateframe结构

sns.pairplot(iris) # iris为dateframe结构

两个变量(点数少)

sns.jointplot(x="x", y="y", data=df);  #这个是画出来x和y的三点图,又画出来每一个变量的直方

点数多:

with sns.axes_style("white"): 设置风格
    sns.jointplot(x=x, y=y, kind="hex", color="k")

6、回归画图:(画散点图和拟合直线图)连续值

找到上图的具体的一个线性的  画图

fig, ax = plt.subplots(figsize=(10, 7))
sns.regplot('年龄段', '年龄段自定义等级', data=datefram, ax=ax)
ax.set_ylabel("Height [cm]")
ax.set_xlabel("Weight [kg]")
fig.tight_layout()

sns.regplot(x="total_bill", y="tip", data=tips)  #data为dateframe结构   

推荐:lmplot 画散点图和拟合直线图

sns.lmplot(x="total_bill", y="tip", data=tips); 同理 推荐 tips是dateframe格式,x:‘total_bill’是tips的一个列名;y="tip"也是一个列名

三个变量(画两条线,(两个连续画点,一个离散分类))
 

'''
x,y,hue 都是tips数据dateframe型数据的列名

x和y都必须是数值型的数据,hue一般为离散型非数字型的数据(数值型也可以)
下面例子是smoker有两种吸烟还是不吸烟,分成不同颜色画散点图和拟合直线
'''
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);

四个变量(多个图显示)

sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
#col 离散型的有两个种类就画出两个图,有三个就画三个图

7、多变量之间的关系(一个连续一个离散变量)推荐散点蜂图

sns.swarmplot(x="day", y="total_bill", data=tips) # tips是dataframe格式

三个变量(用颜色区分,两个离散,一个连续)

sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips)

8、盒图,小提琴图

sns.boxplot(x="day", y="total_bill", hue="time", data=tips);

 

小提琴图

sns.violinplot(x="total_bill", y="day", hue="time", data=tips);

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);

9、显示值的集中趋势可以用条形图

sns.barplot(x="sex", y="survived", hue="class", data=titanic);

10、 点图可以更好的描述变化差异

sns.pointplot(x="sex", y="survived", hue="class", data=titanic);

sns.pointplot(x="class", y="survived", hue="sex", data=titanic,

              palette={"male": "g", "female": "m"},

              markers=["^", "o"], linestyles=["-", "--"]);

11多重面板:(整合前面的)

sns.factorplot(x="day", y="total_bill", hue="smoker",

               col="time", data=tips, kind="swarm")

12、FacetGrid(干的事情和前面一样,新的方式吧,这个好像很牛逼)

g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)

g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1);

g = sns.PairGrid(iris, hue="species")

g.map_diag(plt.hist)

g.map_offdiag(plt.scatter)

g.add_legend();

13、热力图(一共三列数据)做成表格

flights = flights.pivot("month", "year", "passengers")  #转换为坐标和对应值关系表格形式

print (flights)

ax = sns.heatmap(flights)

ax = sns.heatmap(flights, annot=True,fmt="d")

ax = sns.heatmap(flights, linewidths=.5)

 

  • 9
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据预处理中查找缺失常用的方法有以下几种: 1. 使用pandas的isnull()函数或notnull()函数,返回一个布尔数据框,表示每个元素是否为空。 2. 使用pandas的sum()函数统计每列的空个数。 3. 使用numpy的isnan()函数统计空个数。 例如: ``` import pandas as pd df = pd.read_csv("data.csv") # 查找缺失 missing = df.isnull() # 统计每列缺失个数 missing_count = missing.sum() # 或者 missing_count = df.isnull().sum() # 或者 missing_count = df.isna().sum() # 或者 import numpy as np missing_count = np.isnan(df).sum() ``` ### 回答2: 在数据预处理过程中,查找并处理缺失是至关重要的。以下是一些常见的方法来查找缺失: 1. 查看数据摘要:使用数据摘要方法(例如描述性统计)来查看每个特征的统计信息,其中包括缺失的数量和百分比。这可以提供一个整体的了解,哪些特征可能有缺失。 2. 可方法:制作可图表(例如直方图、散点图)来查看数据分布。缺失通常以特定形式显示,例如空、NaN等。可方法可以帮助我们直观地观察到缺失存在的情况。 3. 缺失标识:有些数据集在缺失出现时会使用特定的代替符号,通常为非数字符。通过搜索数据集中的这些替代符号,我们可以判断是否存在缺失。 4. 缺失函数:一些编程语言和软件包提供了特定的函数来帮助查找缺失。例如,Python中的pandas库提供了`isnull()`和`isna()`函数用于查找缺失。 5. 数据工具:使用数据工具如Excel、Tableau等,可以直观地显示数据缺失情况。例如,Excel中的条件格式可以将缺失标记为特定的颜色,从而方便查找。 一旦找到缺失,我们可以根据数据的性质和缺失所处的场景来决定处理方式。常见的处理方式包括删除带有缺失数据行、插补缺失(例如均、中位数、众数等)、使用模型预测缺失等。 ### 回答3: 在数据预处理过程中,查找缺失是一个关键步骤。以下是常用的方法来查找缺失: 1. 可方法:通过绘图可帮助我们直观地观察数据中的缺失。例如,通过绘制缺失的热图或柱状图,可以快速分析数据缺失的分布情况。 2. 描述性统计方法:利用描述性统计方法,例如sum()、count()等,可以计算每个特征中缺失的数量。这些统计量可以为我们提供数据缺失的总体概况。 3. 缺失方法:有时候缺失以其他形式出现,例如空字符串、特殊字符等。通过将数据转换为缺失的布尔掩码,我们可以更容易地检测这些缺失。 4. 直接观察方法:通过直接查看数据来检测缺失。这种方法适用于数据量较小的情况下。我们可以逐行或逐列地检查数据,判断是否存在缺失。 5. 使用统计测试方法:例如,利用假设检验方法(如T检验)来检验特征之间的差异,以确定是否存在缺失。如果存在显著的差异,可能表明存在缺失。 总的来说,通过可、描述性统计、布尔掩码、直接观察和统计测试等方法,可以有效地查找数据中的缺失,并为后续的数据处理和分析提供准确的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值