数据分析笔记

数据预处理

在本次数据分析过程中,缺失数据将被进一步划分成为三个部分,一类数据是数据为0的情况,一类是数据为空值的情况,一类是数据为特殊符号,例如“--”的数据。

针对不同的数据缺失情况,本次分析将会采用不同的处理方式:

1、针对数值为0的情况,需要进行实际的分析,回归到原始数据中去,判断该数据为0时是否具有实际意义。如果没有就将其作为缺失值做删除处理

2、针对数据为空值的情况,如果该特征数据缺失情况低于10%,则结合该特征的重要性进行综合判断。如果字段重要性较低,则考虑直接删除,如果字段重要性较高,则进行插值法或者采用数据均值进行填补

3、针对数据为特殊符号的情况,需要结合原始数据判断该数据为缺失值还是异常值。如果是缺失值则如1操作进行处理。如果为异常值,则进行异常值处理,具体异常值处理过程将在下文中进行阐述。

合并表:

XXX=pd.merge(XX,XX,how='left',on='user_id')

计算缺失率:

total = df.isnull().sum().sort_values(ascending=False)

Percent=df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)

missing_data=pd.concat([total,percent],axis=1,keys=['Total','Percent'])

missing_data.head(50)

XXX.apply(lambda x:sum(x.isnull())/len(x))

缺失率可视化:

import missingno as msno

%matplotlib inline

msno.matrix(XXX)

msno.bar(XXX)

删除XX含有空值的行

XXX=XXX.dropna(axis=0,subset = ["XX"])

填充空值

df1.fillna(0,inplace=True)

df2.fillna(method='pad')#用前面的值来填充

df2.fillna(method='bfill',limit=2,axis=1)

使用pandas_profiling生成各个字段的详细报告:

import pandas_profiling

pandas_profiling.ProfileReport(XXX)

相关性热图:

msno.heatmap(XXX)

两个变量的无效相关范围从-1(如果一个变量出现,另一个肯定没有)到0(出现或不出现的变量对彼此没有影响)到1(如果一个变量出现,另一个肯定也是)

数据全缺失或全空对相关性是没有意义的,所以就在图中就没有了,图中大于-1和小于1表示有强烈的正相关和负相关,但是由于极少数的脏数据所以并不绝对,这些例外的少数情况需要在数据加工时候予以注意

方便观察两个变量间的相关性,但是当数据集变大,这种结论的解释性会变差

msno.dendrogram(XXX)

树状图采用由scipy提供的层次聚类算法通过它们之间的无效相关性(根据二进制距离测量)将变量彼此相加。在树的每个步骤中,基于哪个组合最小化剩余簇的距离来分割变量。变量集越单调,它们的总距离越接近0,并且它们的平均距离越接近零

在0距离处的变量间能彼此预测对方,当一个变量填充时另一个总是空的或者总是填充的,或者都是空的

树叶的高度显示预测错误的频率

异常值:

fig, ax = plt.subplots(1, 1, figsize=(8, 5))
df.boxplot(column='Volume', ax=ax)
plt.show()
s = df['Volume']
print(s.describe())
df_= df.copy()
mean1 = df['Volume'].quantile(q=0.25)#下四分位差
mean2 = df['Volume'].quantile(q=0.75)#上四分位差
mean3 = mean2-mean1#中位差
topnum2 = mean2+1.5*mean3
bottomnum2 = mean2-1.5*mean3
print("正常值的范围:",topnum2,bottomnum2)
print("是否存在超出正常范围的值:",any(df['Volume']>topnum2))
print("是否存在小于正常范围的值:",any(df['Volume']<bottomnum2))
import matplotlib.pyplot as plt
plt.boxplot(x=df['Volume'])
plt.show()
replace_value1=df['Volume'][df['Volume']<topnum2].max()
df.loc[df['Volume']>topnum2,'Volume']=replace_value1
replace_value2=df['Volume'][df['Volume']>bottomnum2].min()
df.loc[df['Volume']<bottomnum2,'Volume']=replace_value2

综合模型

import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
from matplotlib import rcParams
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.neural_network import MLPRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import ExtraTreeRegressor
from pylab import mpl
import sklearn as sns
from scipy.stats import norm
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import BaggingRegressor
x1=df1.loc[:,df1.columns!='总价']
y1=df1.loc[:,'总价']
x_dum=pd.get_dummies(x1)
scale_x=StandardScaler()
x2=scale_x.fit_transform(x_dum)
scale_y=StandardScaler()
y1=np.array(y1).reshape(-1,1)
y2=scale_y.fit_transform(y1)
y2=y2.ravel()
y_log=np.log(y)
x3_train,x3_test,y3_train,y3_test = train_test_split(x_dum,y_log,test_size = 0.3,random_state = 1)
from xgboost import XGBRegressor
models=[DecisionTreeRegressor(),RandomForestRegressor(),GradientBoostingRegressor(),BaggingRegressor()]
models_str=['DecisionTree', ' XGBoost','RandomForest' , ' GradientBoost',' Bagging']
score_adapt=[]
ypred=np.zeros(x3_test.shape[0],)
for name, model in zip(models_str, models) :
  print('开始训练模型:'+name+'平滑处理')
  model=model#平熠处理=logy
  model.fit (x3_train,y3_train)
y_pred=model.predict(x3_test)
score=model.score(x3_test,y3_test)
ypred_original=np.e**y_pred
ypred_original=ypred_original*0.2
ypred+=ypred_original
score_adapt. append(str(score)[:5])

posted @ 2021-11-17 23:08  付明旭  阅读(155)  评论(0)    收藏  举报