本文使用numpy、pandas、scipy等依赖包,利用python制作数据分析工具,了解数据的特征分布、缺失、异常情况,实现数据的预处理。常用的描述性统计指标主要包括基本均值、中位数、最大最小值、计数类等。
数据获取:https://www.kaggle.com/c/santander-customer-satisfaction/data
0、依赖包导入
# -*-coding:utf-8-*-
from __future__ import division
import pandas as pd
import numpy as np
from scipy import stats
1、数据读取
##Read Data##
df = pd.read_csv("train.csv")
label = df['TARGET']
df = df.drop(['ID','TARGET'],axis=1)
2、缺失值设置
##Basic Analysis##
#Missing Value#
missSet = [np.nan,9999999999,-999999]
3、计数类
#Count distinct#
len(df.iloc[:,0].unique())
count_un = df.iloc[:,0:3].apply(lambda x:len(x.unique())) #apply函数:遍历每一列
4、0值出现次数
#Zero Values#
np.sum(df.iloc[:,0] ==0)
count_zreo = df.iloc[:,0:3].apply(lambda x:np.sum(x == 0))
5、均值
#Mean Values#
np.mean(df.iloc[:,0]) #没有去除缺失值之前的均值很低
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)] #去除缺失值
np.mean(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]) #去除缺失值后进行均值计算
df_mean=df.iloc[:,0:3].apply(lambda x:np.mean(x[~np.isin(x,missSet)]))
6、中位数
#Median Values#
np.median(df.iloc[:,0]) #没有去除缺失值之前
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)] #去除缺失值
np.median(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])
df_median=df.iloc[:,0:3].apply(lambda x:np.median(x[~np.isin(x,missSet)])) #去除缺失值之后进行计算
7、众数和众数比例
#Mode Values#
df_mode = df.iloc[:,0:3].apply(lambda x: stats.mode(x[~np.isin(x,missSet)])[0][0])
#Mode Percentage#
df_mode_count = df.iloc[:,0:3].apply(lambda x: stats.mode(x[~np.isin(x,missSet)])[1][0])
df_mode_perct = df_mode_count/df.shape[0]
8、最大最小值
#Min Values#
np.min(df.iloc[:,0])
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)] #去除缺失值
np.min(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])
df_min = df.iloc[:,0:3].apply(lambda x:np.min(x[~np.isin(x,missSet)]))
#Max Values#
np.max(df.iloc[:,0])
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]
np.max(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])
df_max=df.iloc[:,0:3].apply(lambda x:np.max(x[~np.isin(x,missSet)]))
9、分位点
#quantile values分位点#
np.percentile(df.iloc[:,0],(1,5,25,50,75,95,99))
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]
np.percentile(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)],(1,5,25,50,75,90,99))
#无法做apply操作
json_quantile = {} #定义一个字典存储遍历结果
for i,name in enumerate(df.iloc[:,0:3].columns):
print('the {} columns: {}'.format(i,name))
json_quantile[name]= np.percentile(df[name][~np.isin(df[name],missSet)],(1,5,15,25,75,95,99))
#对返回结果重新排序并转置,便于后期拼接
df_quantile = pd.DataFrame(json_quantile)[df.iloc[:,0:3].columns].T
10、频数
#Frequent Values
df.iloc[:,0].value_counts().iloc[0:5,]
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#去除缺失值
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)].value_counts()[0:5]
json_fre_name = {}
json_fre_count = {}
def fill_fre_top_5(x):
if len(x) <= 5:
new_array = np.full(5,np.nan)
new_array[0:len(x)] = x
return new_array
df['ind_var1_0'].value_counts()
df['imp_sal_var16_ult1'].value_counts()
for i,name in enumerate(df[['ind_var1_0','imp_sal_var16_ult1']].columns):
#Index Name
index_name = df[name][~np.isin(df[name],missSet)].value_counts().iloc[0:5,].index.values
#if the length of array is less than 5
index_name = fill_fre_top_5(index_name)
json_fre_name[name]=index_name
#Value Count
values_count = df[name][~np.isin(df[name], missSet)].value_counts().iloc[0:5,].values
#if the length of array is less than 5
values_count = fill_fre_top_5(values_count)
json_fre_count[name] = values_count
df_fre_name = pd.DataFrame(json_fre_name)[df[['ind_var1_0','imp_sal_var16_ult1']].columns].T
df_fre_count = pd.DataFrame(json_fre_count)[df[['ind_var1_0','imp_sal_var16_ult1']].columns].T
df_fre = pd.concat([df_fre_name,df_fre_count],axis =1)
11、缺失值统计
#Miss Values
np.sum(np.isin(df.iloc[:,0],missSet))#统计缺失值
df_miss = df.iloc[:,0:3].apply(lambda x:np.sum(np.isin(x,missSet)))#遍历每个遍历的缺失值情况
12、方差和标准差
标准差(或方差)分为 总体标准差(方差)和 样本标准差(方差)。
其中,前者分母为n,后者为n-1。后者是无偏的。
pandas里的 .std() 和 .var() 都是无偏的;.values.mean(),.values.std(), .values.var()都是有偏的。
#方差
np.std(df.iloc[:,0]) #没有去除缺失值之前的方差
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)] #去除缺失值
np.std(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]) #去除缺失值后进行均值计算
df_std=df.iloc[:,0:3].apply(lambda x:np.std(x[~np.isin(x,missSet)]))
#标准差
np.var(df.iloc[:,0]) #没有去除缺失值之前的方差
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)] #去除缺失值
np.var(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]) #去除缺失值后进行均值计算
df_var=df.iloc[:,0:3].apply(lambda x:np.var(x[~np.isin(x,missSet)]))
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦