EDA常用步骤

文章目录

    • 读取数据
      • kaggle读取数据
    • 数据结构查看
      • 列变量信息
      • dataframe维度信息
      • 统计变量中不同分类个数
      • 查看列变量基本情况
      • 缺失值情况
      • 查看5个样本
    • 删除不需要的数据
    • 修改列名
    • 改变变量属性
    • 合并不同dataframe
    • 缺失值
      • 众数插补
      • 均值插补
      • 中位数插补
      • 直接删除缺失值
    • 重复数据
      • 1. 查看重复行
      • 2.删除重复行
    • 异常值
    • 分类数据数量化
      • 性别变量转换为1、0
      • 单热变量: one-hot
    • 数据型数据转换
      • log转换
      • 归一化
      • 标准化
    • 画图
      • 直方图和拟合曲线
      • 直方图和正态曲线
      • 分类数据条形图
      • 数值型数据条形图(直方图)
      • 热力图
      • 直方图
      • 散点图
      • boxplot
    • 正态化
      • 偏度和峰度
      • P-P图 Q-Q图
      • 正态的非参数检验
        • Shapiro-Wilk test(S-W检验)
        • Kolmogorov-Smirnov(K-S检验)
      • 偏度调整

读取数据

kaggle读取数据

输出结果即为文件目录

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
# 输出结果即为文件目录

将输出结果读取为dataframe格式

df1 = pd.read_csv('/kaggle/input/titanic-text-data/train.csv')

数据结构查看

列变量信息

df.info()

返回结果为
各列变量名称,缺失情况,数据类型
EDA常用步骤_第1张图片

dataframe维度信息

df.shape

返回(891, 12),第一个数字表示行数,第二个数字表示列数

统计变量中不同分类个数

df['A'].value_counts()

用于对分类型变量进行分类统计
EDA常用步骤_第2张图片

查看列变量基本情况

返回最大值,最小值,均值,标准差, 四分位数,中位数

df.A.describe()

缺失值情况

df1.isnull().sum()

统计各列变量中缺失值情况
EDA常用步骤_第3张图片

查看5个样本

# 随机抽取5个样本
df.sample(5)
# 前5个样本
df.head(5)
# 后5个样本
df.tail(5)

删除不需要的数据

第一种:指定删除某些变量

# 删除不太重要且缺失严重的变量df['Cabin‘']
df1.drop(columns=["Cabin"],inplace = True)
df2.drop(columns=['Cabin'],inplace = True)

第二种:指定删除某些范围的变量
此处删除了第16个变量之后的所有变量

df.drop(list(df)[16:],axis=1,inplace=True)

修改列名

修改列名。有两种思路:
方法一: 直接以属性赋值的方式,一次将全部的列名进行重新定义
方法二:通过pandas的rename方法修改列名

# 方法一
# 直接以属性赋值的方式,一次将全部的列名进行重新定义
data.columns = ['city','name','post','pay','request','number']
# 方法二
#使用pandas的rename方法修改列名,新旧列名称按照字典形式成对,columns={'旧的列名': '新的列名'}
data.rename(columns={'城市': 'city'}, inplace=True)
#同时修改多个字段名
data.rename(columns={'城市': 'city','公司名称': 'name'}, inplace=True)

修改列名

改变变量属性

通过data.info()可以查看变量属性

#将变量A的属性调整为int
data['A'] = data['A'].astype('int')

合并不同dataframe

即Excel中的VLOOKUP,在pandas中通过merge实现

data1 = data1.merge(data2, on=['A','B'],how=left)
# how=left、right、inner、outer
data3 = pd.merge(data1, data2, on=['A','B'], how= left)

merger

缺失值

众数插补

# 用df1['age']的众数来填补df1['age']和df2['age']的缺失值
df1['Age'] = df1['Age'].fillna(value = df1.loc[df1['Age'].isnull() == False,'Age'].mode()[0])
df2['Age'] = df2['Age'].fillna(value = df1.loc[df1['Age'].isnull()==False,'Age'].mode()[0])

均值插补

# 统计数值型数据的均值时会自动忽略缺失值
df['B'].fillna(df['B'].mean(), inplace=True)

中位数插补

df['C'].fillna(df['C'].median(),inplace=True)

直接删除缺失值

df.dropna(inplace=True)
df['D'].dropna(inplace=True)

重复数据

1. 查看重复行

df.duplicate()

2.删除重复行

df = df.drop_duplicates()
df.drop_duplicaes(inplace=True)

异常值

def up_low_value(df):
	q1 = df.quantile(0.25)
	q3 = df.quantile(0.75)
	IQR = q3 - q1
	up_value = q3 + 1.5*IQR
	low_value = q1 - 1.5*IQR
	return up_value, low_value
up1, low1 = up_low_value(df['A'])
df.loc[(df['A']>up1)|(df['A']<low1),'A'] = None
df['A'].fillna(df['A'].mean(), inplace= True))

异常值检测常用的方法:
聚类、箱线图、3sigma准则

分类数据数量化

性别变量转换为1、0

df['A'].unique() #列出分类变量所有分类
size_mapping ={'M':0,'男':0,'F':1,'女':1}
df['Gender'].map(size_mapping, inplace=True)

单热变量: one-hot

单热变量的实质是:把分类变量的特征通过多列数值型数据:1、0的形式表示出来。
好处:对于以数值型变量作为输入的算法可以保留分类变量的信息不丢失

df = pd.get_dummies(df, columns=['A','B'], drop_first=True)

数据型数据转换

log转换

df['log'] = df['B'].transform(np.log)
df['log+1'] = (df['B'] +1).transform(np.log)
df['log(x- min(x)+1)'] = (df['B']-df['B'].min() +1).transform(np.log)

归一化

把数据归一到 0-1之间

df['normalized'] = (df['A'] - df['A'].min())/(df['A'].max()-df['A'].min())

标准化

又称zscore归一化

df['standardized'] = (df['A'] - df['A'].mean())/df['A'].std()

画图

直方图和拟合曲线

构造直方图和拟合曲线kde

import seaborn as sns 
sns.set_palette("hls") #设置所有图的颜色,使用hls色彩空间
sns.histplot(train.log_density,color="r",bins=30,kde=True)
plt.show()

EDA常用步骤_第4张图片

直方图和正态曲线

同时绘制直方图和正态曲线

# 绘制直方图
n, bins,patches = plt.hist(train.log_density, 50, density=True,stacked=True,facecolor='blue', alpha=0.5)
# 绘制理想正态曲线
import matplotlib.mlab as mlab
from scipy.stats import norm
mu =train.log_density.mean()  
sigma =train.log_density.std()
y = norm.pdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.subplots_adjust(left = 0.15)
plt.show()

EDA常用步骤_第5张图片

分类数据条形图

num = train.state.value_counts().shape[1]
train.state.value_counts().nlargest(51).plot(kind='bar', figsize=(10,5))
plt.title("Number of state")
plt.ylabel('Number of state')
plt.xlabel('state')

数值型数据条形图(直方图)

对如年龄这种离散型数据,还需要按照离散型数据的先后进行排序

df2['Fare'].value_counts()
# 查看数据分布情况
print(df2.Fare.nunique())
df2.Fare.value_counts().sort_index().plot(kind='bar',figsize=(20,6),color=['lightgreen']) 
# sort_index()来实现离散型数据排序
plt.show()

热力图

可以很形象的展示任意两列的相关性,格子中的值代表某两列的皮尔逊相关系数。

皮尔逊相关系数的取值介于[-1,1]之间,反映两个变量之间的线性相关性。当取值为1或者-1时,假设两个变量分别为x,y则它们满足:y=kx+b

plt.figure(figsize=(10,5))
c= df.corr()# 默认是皮尔逊相关系数
sns.heatmap(c,cmap="BrBG",annot=True)
c

直方图

bins 参数越大,画的图越细致

plt.figure(figsize=(12,10))## 设置画布",
plt.hist(train.microbusiness_density,bins=1000)
plt.show()

散点图

fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(df['HP'], df['Price'])
ax.set_xlabel('HP')
ax.set_ylabel('Price')
plt.show()

EDA常用步骤_第6张图片

boxplot

import seaborn as sns
#其中month,log_density均为train中的列名
ax = sns.boxplot(x='month', y='log_density', data=train)
ax.figure.set_size_inches(20,10) # 设置画布大小

EDA常用步骤_第7张图片

正态化

偏度和峰度

正态分布: 峰度 = 3。
厚尾分布:峰度 > 3。
瘦尾分布:峰度 < 3。
正态分布:偏度 = 0,两侧尾部长度对称。
右偏分布(正偏分布):偏度 > 0,右侧(正方向)尾部较长。
左偏分布(负偏分布):偏度 < 0,左侧(负方向)尾部较长。
0<|SK|<=0.5 低度偏态分布
0.5<|SK|<=1 中等偏态分布
|SK|>1 高度偏态分布

#skewness and kurtosis
print("Skewness: %f" % df_train['SalePrice'].skew())
print("Kurtosis: %f" % df_train['SalePrice'].kurt())

P-P图 Q-Q图

P-P图反映了变量的实际累积概率与理论累积概率的符合程度;
Q-Q图反映了变量的实际分布与理论分布的符合程度;
两者意义相似,都可以用来考察数据是否服从某种分布类型。若数据服从正态分布,则数据点应与理论直线基本重合。

# QQ图
import statsmodels.api as sm
sm.qqplot(y,line='s')

# PP图
from scipy import stats
stats.probplot(x, dist="norm", plot=plt)

正态的非参数检验

Shapiro-Wilk test(S-W检验)

属于专门用来做正态性检验的模块
其原假设:样本数据符合正态分布。
注:适用于小样本

S,P = scipy.stats.shapiro(x)

x参数为样本值序列,返回值中第一个为检验统计量,第二个为P值,当P值大于指定的显著性水平,则接受原假设。

Kolmogorov-Smirnov(K-S检验)

可以检验多种分布,不止正态分布
其原假设:数据符合正态分布
注:适用于大样本

# K,P = scipy.stats.kstest(rvs,cdf,alternative,mode)
from scipy import stats
mu = train.log_density.mean() # 计算mu
std = train.log_density.std() # 计算std
K,P = stats.kstest(train['log_density'],'norm',(mu,std))
if P>0.5:
    print('接受正态假设')
else:
    print('拒绝正态假设')

rvs:待检验数据。
cdf:检验分布,例如’norm’,‘expon’,‘rayleigh’,'gamma’等分布,设置为’norm’时表示正态分布。
alternative:默认为双侧检验,可以设置为’less’或’greater’作单侧检验。
model:‘approx’(默认值),表示使用检验统计量的精确分布的近视值;‘asymp’:使用检验统计量的渐进分布。
其返回值中第一个为统计量,第二个为P值
有关正态性检验详细文章
KS检验以及3sigma准则

偏度调整

除了sklearn提供的minmaxscaler,standardscaler,对于不同的skewed data我们可以有不同的操作

左偏/left-skewed/negative skewed

  • square:x–>x^2
  • log
  • cube root

右偏/right-skewed/positive skewed

  • square root:x—>x^(1/2)
  • cube root:x—>x^(1/3)
  • log:x—>log(x)/ln(x)
    待续

你可能感兴趣的:(数据分析,python,人工智能)