【小睿的ML之路】Seaborn-单变量分析绘制

发布时间 2023-09-21 22:18:29作者: 郭小睿
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline


x = np.random.normal(size = 100)
print(x)
[ 0.22404072 -1.9394295  -0.32313598 -0.25468579 -0.71927794  0.66163234
 -0.09782319  0.44150068 -0.43913581 -0.99535212 -1.52099548  1.10586407
  1.99739611 -0.20333526  1.95211243  1.62790351  0.17566407  0.7367439
  1.22918265 -0.30148079  0.80212506  2.49887791 -0.96307435  2.39677932
 -2.60058269 -2.32157223 -1.12959309 -0.02223216  0.76995059  0.15995655
 -0.30360913 -1.1984514   0.94165553 -1.73067029 -0.04900799  1.41992771
 -0.29320199 -0.48182442  1.88731008 -0.38295552 -1.29069302  0.88104745
  0.62863433 -0.63252684  1.25865766  1.77507824  0.3238686   0.26133148
 -0.26306752  1.70341709 -1.95998791 -0.92217953  0.21504576  1.2619886
 -0.65072434 -0.32253297 -2.48223873 -1.05107829 -0.04584277  1.15717941
  1.6194882   0.43470289 -0.17545919  0.89913012 -0.3077884  -1.24036827
  1.16542699 -1.54332189  0.11549242  1.26847205 -1.22091417 -0.51731699
 -0.18920906  0.31287551 -0.23093874  0.58638718 -0.50567837  0.99185748
  0.86307229 -0.7683871   0.77650661  0.96928406 -0.34451929 -0.17806966
  0.94265531  0.80095782  0.83518477 -1.97918719 -1.15126041 -1.2010081
 -1.31039485 -0.42574863 -0.86383837  0.1713745   0.61509495  0.26626452
  1.16467297  0.40480644 -1.55330148 -1.50325382]
sns.displot(x,kde=False)
<seaborn.axisgrid.FacetGrid at 0x206c5c43a60>

sns.displot(x,kde=False,bins=20)
<seaborn.axisgrid.FacetGrid at 0x206cb4f9f60>

数据分布情况

通过使用distplot()来拟合出一个数据集的参数分布,直观上来评估其余观测数据是否关系密切。

from scipy import stats

x = np.random.gamma(6, size=200)
# print(x)
sns.distplot(x, kde=False, fit=stats.gamma);
C:\Users\Administrator\AppData\Local\Temp\ipykernel_4588\2584871392.py:5: UserWarning: 

`distplot` is a deprecated function and will be removed in seaborn v0.14.0.

Please adapt your code to use either `displot` (a figure-level function with
similar flexibility) or `histplot` (an axes-level function for histograms).

For a guide to updating your code to use the new functions, please see
https://gist.github.com/mwaskom/de44147ed2974457ad6372750bbe5751

  sns.distplot(x, kde=False, fit=stats.gamma);

以下这段代码主要做了以下几件事情:

  1. 定义了一个均值 mean 和协方差矩阵 cov
  2. 使用 np.random.multivariate_normal 函数生成了一个二维多元正态分布的随机样本 data
  3. 将随机样本转换成 Pandas DataFrame df

具体解释如下:

  • mean, cov = [0,1],[(1,.5),(.5,1)]:这行代码定义了一个均值 mean 和协方差矩阵 covmean 是一个包含两个元素的列表,分别是均值的两个维度,这里是 [0, 1]cov 是一个二维列表,表示协方差矩阵。在这个例子中,协方差矩阵是一个对角阵,对角线上的元素分别为 11,非对角线上的元素分别为 0.5,表示两个维度间的协方差。

  • data = np.random.multivariate_normal(mean, cov, 200):使用 np.random.multivariate_normal 函数生成符合多元正态分布的随机样本 data。参数 mean 是指定的均值向量,参数 cov 是协方差矩阵,参数 200 指定生成的样本数。

  • df = pd.DataFrame(data, columns=["x", "y"]):将生成的随机样本 data 转换成 Pandas DataFrame,其中 "x" 和 "y" 是列名。生成的 DataFrame df 包含两列,分别为 "x" 和 "y",对应多元正态分布的两个维度。

这段代码的最终目的是生成一个包含 200 个多元正态分布样本的 DataFrame,并命名两个维度为 "x" 和 "y"。

mean, cov = [0,1],[(1,.5),(.5,1)]

data = np.random.multivariate_normal(mean,cov,200)
df = pd.DataFrame(data,columns=["x","y"])
df
x y
0 -0.651501 1.753638
1 1.058182 0.658726
2 0.160683 0.167273
3 1.073369 2.482252
4 0.501297 0.753138
... ... ...
195 0.664084 1.882779
196 0.385395 1.137191
197 0.204888 1.780196
198 1.528779 1.244423
199 -0.094580 0.473490

200 rows × 2 columns

观测两个变量之间的分布关系最好用散点图

sns.jointplot(x="x",y="y",data=df)
<seaborn.axisgrid.JointGrid at 0x206cbd836a0>

hex图(数据量较大时使用)

这段代码主要实现了以下功能:

  1. 生成符合多元正态分布的随机样本 xy
  2. 使用 seaborn 库绘制二维散点图,并采用六边形图显示点的分布密度。

具体解释如下:

  • x, y = np.random.multivariate_normal(mean, cov, 1000).T:这行代码使用 np.random.multivariate_normal 函数生成符合多元正态分布的随机样本,其中 mean 是均值向量,cov 是协方差矩阵,1000 是生成的样本数。.T 是转置操作,将生成的样本进行转置,使得 xy 分别存储多元正态分布的两个维度的样本。

  • with sns.axes_style("white")::这行代码使用 seaborn 库中的 axes_style 函数,指定绘图时的风格,这里选择了白色背景。

  • sns.jointplot(x=x, y=y, kind="hex", color="k"):这行代码使用 seaborn 库中的 jointplot 函数绘制二维散点图,并使用六边形图 (kind="hex") 来显示点的分布密度。xy 分别是两个维度的数据,color="k" 表示六边形图的颜色为黑色。

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")