sns数据分析

探索性数据分析

这一部分目的在于了解数据 ,包括数据是什么类型 ,数据有什么特点

数据信息

python 复制代码
print(data.shape)
data.info()

python 复制代码
(1086, 12)
<class 'pandas.core.frame.DataFrame'>
Index: 1086 entries, 2020/7/1 0:00 to nan
Data columns (total 12 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   水生根茎类    1060 non-null   float64
 1   花叶类      1037 non-null   float64
 2   花菜类      1080 non-null   float64
 3   茄类       1066 non-null   float64
 4   辣椒类      1080 non-null   float64
 5   食用菌      1074 non-null   float64
 6   水生根茎类类别  1085 non-null   object 
 7   花叶类类别    1085 non-null   object 
 8   花菜类类别    1085 non-null   object 
 9   茄类类别     1085 non-null   object 
 10  辣椒类类别    1085 non-null   object 
 11  食用菌类别    1085 non-null   object 
dtypes: float64(6), object(6)
memory usage: 110.3+ KB

分开数值列和类别列:

data.select_dtypes(include='float64')去挑选数值类型等于include的行

python 复制代码
numeric_cols=data.select_dtypes(include='float64').columns# df
category_cols=data.select_dtypes(include='object').columns
numeric_cols,category_cols

统计学描述

data.drop(columns=numeric_col+'z-score',inplace=True)

python 复制代码
numeric_data.describe()

数据预处理环节

数据清洗环节

获取缺失值
null_counts=data.isnull().sum():返回一个Series
null_counts_nonzero=null_counts_nonzero.sort_values(ascending=False)排序更加直观

数据可视化:

以下是一个描绘一个缺失值大小和占比图像的代码

python 复制代码
"""可视化缺失数据"""
plt.rcParams['font.family'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
def show_missing_values(data):
    null_counts=data.isnull().sum()    
    
    null_counts_nonzero=null_counts[null_counts>0]
    
    null_counts_nonzero=null_counts_nonzero.sort_values(ascending=False)
    print(type(null_counts_nonzero))
    
    plt.figure(figsize=(10,6))
    if not null_counts_nonzero.empty:
        ax=sns.barplot(x=null_counts_nonzero.values,y=null_counts_nonzero.index,palette="viridis")
    
        # palette调色板 data参数需要传入的是一个DataFrame,可以不传入,传入错误绘图有问题
        # sns中大部分参数会返回ax,可以用来设置标题,添加文本,设置限制和标签与图例
        ax.set_title('null number statics')
    
        for i,value in enumerate(null_counts_nonzero.values):
            ax.text(value+1,i,f'{value}',va='center')
        
        null_counts_nonzero=null_counts_nonzero[numeric_cols] 
        plt.figure(figsize=(10,6))
        plt.pie(x=null_counts_nonzero.values,labels=null_counts_nonzero.index,autopct='%1.1f%%')
        plt.title('null number distribution-pie figure')
        plt.show()
    else:
        print('暂未发现缺失值!绘图提前结束!')
show_missing_values(data)


异常值处理环节

np.where函数,类似倒置的if条件语句cond,true,false

python 复制代码
np.where(data[numeric_col+'z-score']<-3,
                     mean-3*std,    data[numeric_col]
                )
  • 异常值处理1:直接丢弃
  • 异常值处理2:变为上限值

异常值处理可以优化我们的数据,增强数据的可分析性

python 复制代码
"""异常值处理:Z-score>3"""
def abnormal_data_process(data):
    # 异常值处理前的图像
    plt.figure(figsize=(12,8))
    ax=sns.lineplot(data=data,x=np.arange(1,len(data)+1),\
                    y=data[numeric_cols[0]],color='cornflowerblue',linewidth=2,\
                    marker='o',markersize=4,markerfacecolor='white',markeredgecolor='blue')
    
    ax.set_title(f'日期-{numeric_cols[0]}的销售量',fontsize=20)
    ax.set_xlabel(f'日期',fontsize='20')
    ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')
    ax.set_yticks(np.arange(1,140,10))
    
    # 异常值处理
    for numeric_col in numeric_cols:
        #计算每列的z-score
        mean=data[numeric_col].mean()
        std=data[numeric_col].std()
        data[numeric_col+'z-score']=(data[numeric_col]-mean)/std
        
        # np.where(cond,true,false)
        
        data[numeric_col]=np.where(data[numeric_col+'z-score']>3,mean+3*std,
            np.where(data[numeric_col+'z-score']<-3,
                     mean-3*std,    data[numeric_col]
                )
            )
        data.drop(columns=numeric_col+'z-score',inplace=True)# 丢弃掉不需要的列
    
    # 异常处理后的图像
    plt.figure(figsize=(12,8))
    ax=sns.lineplot(data=data,x=np.arange(1,len(data)+1),y=data[numeric_cols[0]],
                    color='deepskyblue',
                    marker='o',markersize=4,markerfacecolor='white',
                    markeredgecolor='deepskyblue')# marker='o',markersize=1
    
    ax.set_title(f'日期-{numeric_cols[0]}的销售量',fontsize=20)
    ax.set_xlabel(f'日期',fontsize='20')
    ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')
    ax.set_yticks(np.arange(1,140,10))
    return data
data=abnormal_data_process(data)

处理前的图像:

处理后的图像:

seaborn绘图

plt中绘制子图

先讲一下怎么绘制子图

python 复制代码
fig,axes=plt.subplots(5,1)

返回一个可以索引的axes对象,可以进行plt的各种操作
注意subplot函数与其类似,但是功能不相同

sns.xxx函数的返回值

大部分sns.xxx返回一个ax对象 ,这个对象有很多操作:设置标题,添加文本,设置横纵坐标上下界,设置图例

其中这样理解:使用set_XXX的都是主动操作,不使用的都视作ax本身的属性

  • ax.set_title('null number statics')
  • ax.set_xlabel(f'日期',fontsize='20')
  • ax.set_ylabel(f'{numeric_cols[0]}的销售量',fontsize='20')
  • ax.set_yticks(np.arange(1,140,10))
  • ax.legend():label=str属性一起使用,往往与text或者axvline函数配合
  • ax.text()
  • ax.axvline(x=q,color='black',linestyle='--',label=f'Quantile{i:}-{q:.2f}')

对于ax.legend()函数:

python 复制代码
 for i,q in zip(quantities_indices,quantities):
     ax.axvline(x=q,color='black',linestyle='--',label=f'Quantile{i:}-{q:.2f}')
     ax.legend()

label=str属性一起使用,往往与text或者axvline函数配合


对于ax.text()函数:

python 复制代码
ax.text(x,y,f'label',va='center',ha='center')
  • x和y是注释的位置:对于object数据来说,直接使用[0,n]的数据进行代替,而不是使用名称进行索引
  • label:是一个字符串,建议使用f{str}
  • va='center',ha='center'默认设置即可

对于ax.axvline()/ax.axhline()函数

python 复制代码
ax.axv/hline(x/y,color=,linestyle=,label=str)
  • 如果是竖线则绘制竖线的x坐标 ,为横线则为横线的y坐标
  • linestyle最好设置为虚线
  • label='str':字符串形式
python 复制代码
ax=sns.barplot(x=null_counts_nonzero.values,y=null_counts_nonzero.index,palette="viridis")
    
        # palette调色板 data参数需要传入的是一个DataFrame,可以不传入,传入错误绘图有问题
        # sns中大部分参数会返回ax,可以用来设置标题,添加文本,设置限制和标签与图例
        ax.set_title('null number statics')
    
        for i,value in enumerate(null_counts_nonzero.values):
            ax.text(value+1,i,f'{value}',va='center')

sns.xxx的通用格式

python 复制代码
ax=sns.barplot(
	x=,y=,data=,
	color=,linewidth=,
	palette=,
	marker=,markersize=,markefacecolor=,markeredgecolor=)
  • data:必须接受一个DataFrame参数 ,否则会出现意料之外的错误,可以不设置这个参数
  • x:横轴数据;y:纵轴数据。可以接受object对象,可以接受ndarray,series ,一般不接受dataframe
  • palette:调色板对象,一般使用palette='viridis' VIRIDIS
  • marker一类:marker='o',其余两个是标记本身和标记边缘的颜色,一般将边缘颜色设置为与color一致

histogram直方图

python 复制代码
ax=sns.histplot(x=sale_data,kde=True,color='purple',bins='auto')
  • kde:核密度曲线是否绘制
  • bins:一般默认auto
  • x:接受series或者ndarray

boxplot

python 复制代码
ax=sns.boxplot(data=data,orient='h',palette="viridis",fliersize=2,flierprops=flierprops)
  • 只需要传入data
  • orient:朝向水平h或者垂直v
  • flier过滤点一类的参数:
python 复制代码
    flierprops={'marker':'o','markerfacecolor':'black','markeredgecolor':'white',
                'markersize':4
                }

heatmap

python 复制代码
sns.heatmap(corr_matrix,fmt='.2g',cmap='Reds',annot=True)
  • fmt:小数格式
  • cmap:映射
  • annot:数值注释

pie

sns没有绘制pie的函数,但是绘制pie的函数与其通用格式非常像

python 复制代码
 plt.pie(x=null_counts_nonzero.values,labels=null_counts_nonzero.index,autopct='%1.1f%%')
  • x:ndarray或者series
  • label:标签
  • autopct:小数格式
相关推荐
dundunmm27 分钟前
数据挖掘之认识数据
人工智能·机器学习·信息可视化·数据挖掘
chenchihwen32 分钟前
数据分析时的json to excel 转换的好用小工具
数据分析·json·excel
江南野栀子13 小时前
数据可视化-1. 折线图
信息可视化·数据挖掘·数据分析
反方向的钟儿13 小时前
非结构化数据分析与应用(Unstructured data analysis and applications)(pt3)图像数据分析1
人工智能·计算机视觉·数据分析
感谢地心引力14 小时前
【数据分析】层次贝叶斯
机器学习·数据分析·概率论
【建模先锋】15 小时前
故障诊断 | 一个小创新:特征提取+KAN分类
人工智能·分类·数据挖掘
殇淋狱陌20 小时前
第四章 列表(List)&元组(Tuple)以及代码格式基础语法及操作
数据结构·python·数据分析·list·元组
dundunmm21 小时前
机器学习之KNN算法
人工智能·算法·机器学习·数据挖掘·knn·分类算法
胡耀超1 天前
如何从全局视角规划项目与战略决策(“精准接送”案例、技术架构设计与选型、业务逻辑及产品商业模式探讨)
大数据·数据挖掘·软件架构·商业模式·数据管理
标贝科技1 天前
标贝科技受邀出席2024ADD数据应用场景大会 共议数据要素发展新契机
大数据·数据库·人工智能·科技·语言模型·数据挖掘