import pandas as pd, numpy as np, warnings
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 230)
import seaborn as sns
from scipy import stats, integrate
import matplotlib.pyplot as plt
from scipy.stats import shapiro, kstest
from scipy.stats import norm, skew
warnings.filterwarnings("ignore", category=DeprecationWarning)
注:本文案例所选取的特征列本身长尾很严重,所以效果看着不是很好。需要的可以自取文中方法用之
tttdata['display_nums_yesterday'].describe()
分布直方图
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
判断是否符合正太分布
# pvalue > 0.05,不拒绝原假设。因此上面的数据服从正态分布。且一般情况下,
# stats.kstest(df[‘value’], ‘norm’, (u, std))一条语句就得到p值的结果。
print('display_nums_yesterday : ', kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
# display_nums_yesterday : 0.0
箱线图剔除异常值
https://blog.csdn.net/qq_42363032/article/details/116696592
正态化的方法
标准化
# 标准化缩放
def standar(data, column):
mean = data[column].mean()
std = data[column].std()
print('列:{},均值:{},标准差:{}'.format(column, mean, std))
data[column] = data[column].apply(lambda x: (x-mean)/std)
return data, mean, std
data, mean, std = standar(tttdata, 'display_nums_yesterday')
sns.distplot(data['display_nums_yesterday'], hist=True)
print(kstest(data['display_nums_yesterday'], 'norm', (u, std))[1])
取对数
# 取对数
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: np.log(x))
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: np.log(1+x))
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
开平方
# 开平方
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: np.sqrt(x))
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
取倒数
# 取倒数
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: 1/x)
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
平方根后取倒数
# 平方根后取倒数
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: 1/np.sqrt(x))
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
平方根反正弦变换
# 平方根反正弦变换
tttdata['display_nums_yesterday'] = tttdata['display_nums_yesterday'].apply(lambda x: np.arcsin(np.sqrt(x)))
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
Box-Cox变换
# Box-Cox变换
tttdata['display_nums_yesterday'], lambda_=stats.boxcox(tttdata['display_nums_yesterday'])
sns.distplot(tttdata['display_nums_yesterday'], hist=True)
print(kstest(tttdata['display_nums_yesterday'], 'norm', (u, std))[1])
注:本文案例所选取的特征列本身长尾很严重,所以效果看着不是很好。需要的可以自取文中方法用之
参考:
https://blog.csdn.net/weixin_43899514/article/details/115215980
https://blog.csdn.net/lamusique/article/details/96495077
https://blog.csdn.net/qq_40587575/article/details/84349900
boxcox变换:https://www.it610.com/article/1274721947090960384.htm