数据分析学习笔记---碎片知识总结

解决juyter notebook中print时省略显示问题

pd.set_option("display.max_columns",100)     # 最大显示列数
pd.set_option("display.max_rows",100)        # 最大显示行数

字体设置

#1.1
import matplotlib
font = {“family”:“MicroSoft YaHei”,“weight”:“bold”}
matplotlib.rc(“font”,**font)
#1.2
plt.rcParams[“font.sans-serif”] = “SimHei” # 中文显示问题
plt.rcParams[“axes.unicode_minus”] = False #解决负数坐标显示问题

可在Jupyter notebook中可以进行多次自动print操作

from IPython.core.interactiveshell  import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

对于info信息无法展示的情况使用

"""   info(verbose=True,null_counts=True)              """

警告信息的忽视

import warnings 
warnings.filterwarnings("ignore")

numpy中使用get_values ,pandas中使用values

自动获取相应1的各种类型数据

"""  num_features = train.select_dtypes(include=[np.number/np.object]).columns   """

cut/qcut分桶操作时,需要加入参数labels=False,不然出现的就是区间形式

 bin = [i*10 for i in range(20)]

data["new_feature"] = pd.cut(data["power"],bin,labels=False)

对于特征的新增组合

 data["new"+feature] = data.groupby(feature)[target].transform("mean/max/min").values

关于get_dummies编码

“”"

dum = pd.get_dummies(data['col1',"col2"])
data = data.join(dum)
data = data.drop(["col1","col2"],axis=1)

get_dummies()里面的参数可以传入prefix=“前缀描述”:即新增特征的名字的前缀描述

“”""

在图例里面放入名字参数

  plt.legend(["name1","name2"],loc="upper right")

""" 

关于pd.read_csv的参数:
	sep="" 确定切分格式
	headers=None  默认没有首行信息 , names参数:添加首航信息,列表形式
	index_col=0 :使用第一列作为默认索引
	parse_dates=[0]  :使日期规范化

“”"

“”"
利用groupby的时候最好使用一个reset_index(),重排列索引,避免乱序问题
利用pd.concat拼接的时候也是同理,需要用到reset_index,防止出现不必要的错误,可能出现index列,删除即可!
pd.concat([],axis=0/1)
np.concatenate([])

“”"

“”"
处理数据包括:
1.检查数据
2.清理数据
3.测试数据

一般而言检查数据希望回答一下问题:1.数据格式有什么问题? 2.数据的数值有什么问题? 3.数据需要修复或者删除嘛?

干净数据:每一列代表一个特征,每一行代表一个样例

很难判断异常值是由于测量误差引起的,或者是不正确的单位及库数据,或者真正的异常,如果我们决定排除任何数据,
需要记录排除的数据并提供排除的理由。

数据探索的核心:
1.数据质量分析
2.数据特征分析:分布、对比、周期性、相关性、常见统计量等。

“”"

“”"
jieba分词系列以及wordcolud词云图分析
lcut:为精确模式,返回的是一个列表
cut:添加参数cut_all=False才为精确模式,返回的是一个迭代器
wordcolud为自己统计词频,并且绘制出词云图,可以加载停用词表。

“”"

“”"

使用add_subplot进行改变图形区域

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
cars.plot(x,y,kind="scatter",ax=ax1)

“”"

模型的评价指标

from sklearn.metrics import mean_squared_error ,mean_absolute_error ,roc_auc_score ,roc_curve

“”"

np.random.shuffle()  # 对数据进行洗牌,不会返回值
np.random.permuation()  # 对索引进行洗牌,会返回值,传入的数据是索引,或者数字

“”"

进行交叉验证的一般做法:先对原始数据进行洗牌,然后分别利用索引分成n快,下次洗牌重复操作

交叉验证系列 ---------------现在都在model_selection模块下面
from sklearn.model_selection import KFold,train_test_split,cross_val_score

kf = KFold(n,n_folds,random_state,shuffle)

“”"
机器学习中不识别object字符类型,需要转换为数值型

机器学习关心的是数值,不同的浮动范围的特征,需要进行初始化处理

当用机器学习算法得到一个不满意的结果时,先找数据方面的问题,比如:数据与label之间的关系,数据内部是否有什么问题,
当作数据预处理时是否哪块处理错了,最后采取找模型的参数、算法、评价标准方面的错误。
“”"

“”"
pandas_profiling库的使用

pandas_profiling.ProfileReport(player) #自动生成报表视图

“”"

“”"
#流程:
1.数据背景介绍
2.数据读取与预处理
3.数据切分模块
4.缺失值可视化分析
5.特征可视化展示
6.多个特征之间关系分析
7.报表可视化分析
8。探索有意义变量之间的关系
“”"

“”"
pd.crosstab:用于计算因子的频率表

pd.crosstab(index,columns,values,aggfunc)

如果crosstab只接收两个Series,它将提供一个频率表,用a作为唯一值,统计b唯一值的出现次数

pd.pivot_table透视表是一种进行分组统计的函数,而交叉表时特殊的透视表,当只统计分组频率时更方便。

pd.pivot_table参数如下:

data:DataFrame对象
values:要聚合的列或列的列表
index:数据透视表的index,从原数据的列中筛选
columns:数据透视表的columns,从原数据的列中筛选
aggfunc:用于聚合的函数,默认为numpy.mean,支持numpy计算方法
fill_value: 用于替换缺失值的值
margin: 添加所有行/列
dropna: 不包括条目为 NaN的列,默认为True
margin_name: 当margin为True时,将包含总计的行/列的名称

pd.crosstab()参数:

index::要在行中分组的值
columns:要在列中分组的值
values:根据因子聚合的值数组,需指定aggfunc
aggfunc:如指定,还需指定value
normalize:将所有值除以值的总和进行归一化 ,为True时候显示百分比
如果crosstab只接收两个Series,它将提供一个频率表。用A的唯一值,统计B唯一值的出现次数:

“”"

legend中的参数设置

plt.legend(loc=“upper right”,fancybox=True,fontsize=8)

random.randint()和np.random.randint()

random.randint()结果为左闭右闭,np.random.randint()结果为左闭右开。

关于子图的设置
fig = plt.figure(figsize,dpi)
ax1 = fig.add_subplot(2,1,1)
ax1.plot(np.random.randint(1,5,5),np.arange(5))

三种常见操作

1.split:从左到右寻找以某个元素为中心,将左右分割成两个元素放入列表中。
2.数据合并之join,join默认吧行行索引相同的数据合并在一起
3.merge:则是按照指定的列将数据按照一定的方式合并在一起,默认合并方式是inner(交集).

pivot_table中实现计数要用 aggfunc=["count“]形式(numpy中无直接的计数形式)


索引重排

1.reset_index() 把索引变成列
2.set_index() 把列变成索引

添加哑变量


```python
categorical_vars = [“col1","col2","col3"]
for var in categorical_vars:
	raw = pd.concat([raw,pd.get_dummies(row[var],prefix=var)],1)
	raw= raw.drop(var,1)

dropna的使用

dropna(axis=0/1,how="any/all",inplace=True)

plt.xticks(range(minruntime,maxruntime+5,5))


pd.DataFrame(np.zeros(shape(df.shape[0],len(genre),dtype=int),columns=genre)

map映射函数

label_map = {"汽车”:1,“财经":2,"科技":3}

df["label"] = df["label"].map(label_map)

添加图例的方法

1.现在plt.plot中添加label参数
2.再用plt.legend()

plt.plot(x,y,label="name")

plt.legend(loc="best")

_xtick_labels = [“hello{}”.format(i) for i in range(32)]

pd.to_datetime的使用

pd.date_range(start,end,period,freq=“D”)
1.start,end,freq配合
2.start、periods、freq配合

np.logspace创建等比数列

在logspace中,开始和结束点是10的幂,
例如 a=np.logspace(0,9,10) ,0表示10的0次方,9表示10的9次方。
若想改变底数,可使用base参数:
a= np.logspace(0,9,base=2)

分两次plot,即可实现一张表出现两条线关于一个变量

plt.xlabel("epoch")
plt.ylabel("MAE")
plt.plot(train_mae_loss,label="train")
plt.plot(test_mae_loss,label="test")
plt.legend()

plt.xticks(旧坐标,新坐标,rotation=旋转角度)

plt.xticks(range(len(_x)),_x,rotation=45)
xticks中的rotation具有倾斜属性

若dataframe中有数值型特征columns,数值型特征column则保留原始值,get__dummies只会改变分类变量object类型。

添加新列

data["new"] = data[["col1","col2"]].mean(axis=1)

Series要变成array,则可以通过np.array()方式实现

data.groupby("col1").agg({column:"nunique" for column in columns_list})

在字典中,若出现重复的键,则位于后面的键值会覆盖前面重复的键值。

关于合并

使用np.c_和np.r_
np.c_ 列向合并 吕
np.r_ 横向合并 口口

此时的合并与以往的合并不同,此时建立的是一种列表关系:
即:
a=[1,2,3,4,5]
b = [6,7,8,9,0]
np.c_[a,b] 可得【【1,6】,【2,7】,【3,8】,【4,9】,【5,0】】
建立了一种一一对应的列表关系
满足你的特殊需求,说不定哪天就遇见这种问题了。

目前已知的有一下集中合并方式

  • 1.np.concatenate(axis=0/1)
  • 2.np.vstack() np.hstack()
  • 3.np.c_ ///np.r_
  • 4.pd.concat() axis=0/1

ravel函数,降维,按行拉直降为一维的形式。

np.ravel和np.flattern的联系与区别

联系:都是将多维数组降为一维
区别:np.flattern()返回的是一份拷贝,不影响原始的数据
np.ravel()返回的是视图,会影响原始矩阵
pd.DataFrame([x,examples.count(x)] for x in set(example)],columns=["words","count"])

统计学习方法由模型、策略、方法构成。

模型就是索要学习的条件概率分布或者决策函数,模型的假设空间就是包含所有可能的条件概率分布或者决策函数,有了模型的假设空间,接下来就要考虑按什么样的准则学习或者选择最优的模型。

统计学习基于训练数据集,从假设空间中选择最优的模型,最后需要考虑什么样的计算方法求解最优模型。

模型选择旨在避免过拟合并提高模型的预测能力。

监督学习:从给定的有限的训练数据出发,假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使他对已给的训练数据以及未知的测试数据,再给定的评价标准意义下有最准确的预测。

data["col"].value_counts().reset_idnex().sort_values("index")
# 通过设置reset_index来设置其Series变成了dataFrame类型。
#dataframe使用其他列的情况进行修改
data["col1"][data["gender"]==1] = data["col2"][data["gender"==1].apply(lambda x: 0 if x<100 else 0 ]

python中apply、map、applymap的使用方法

  • 当我们对数据框中的数据按行或者列操作时用apply,
data.apply(lambda x:x.max() ,axis=0/1)
  • 当我们对数据框中的每一个数据进行操作时用applymap,返回dataframe类型
data.applymap(lambda x:1 if x>0 else 0)

data[["m","s","h"]] = data[["col1","col2","col3"]].applymap(lambda x:2015 if pd.isnull(x)==1 or x==-1 else x)

  • 当我们对于Series类型进行处理的时候对每一个数据进行操作时用map。
data["col"].map(lambda x:1 if x>0 else 0)

要想数据实现就地修改,需要先定位到数据,再用条件定位到需要进行改变的数据,实现新的复制与筛选。

one-hot编码
将数字型进行onehot编码,(但是onehot编码默认为字符型object类型),所以需要对数据先变成str类型,以及使用join方法加入到原数据框,并删除原来的变量。

data[["province","martial"]] = data[["province","mortal"]].applymap(lambda x:str(x))
dum = pd.get_dummies(data[["province","mortal"]])
data = data,join(dum)
data = data.drop(["province","mortal"],axis=1)

data["notrepaired"].replace("-",np.nan,replace=True)

EDA目标

  • 1.载入各种库:numpy、pandas、matplotlib、seaborn、scipy库等。
  • 2.载入数据集:pd.read_csv() 简要观察数据(head() +info()) head().append(df.tail())
data.head().append(data.tail())
data.info()
  • 3.数据总览:通过describe()来熟悉数据的相关统计量。通过info()来熟悉数据的类型,还可以查看不符合实际的异常类型。data.select_dtypes(include=[“object”])
data.info(verbose=True,null_counts=True)   #防止数据太多不显示具体信息

  • 4.判断数据的确实情况。df.isnull().sum((),查看每列数据的缺失情况,进行异常值检测(初步检测,识别明显的异常值)
#1.使用missingno来识别缺失数据的可视化
import missingno as msno 
msno.matrix(data.sample(500))
msno.matrix(data.sample(500))

#2.使用plt的可视化操作
df = data.isnull().sum()
df = df > 0 
plt.bar(df.idnex,df.values,color="r")

  • 5.了解预测值的分布:总体的分布概况。df[‘label’].describe()。查看数据的偏度和峰度:scipy.stats.skew(),scipy.stats.kurtosis(),进一步对数据进行log变换或者box-cox变换。查看预测值的具体频数,利用直方图或者条形图箱型图之类的。
sns.distplot(data["label"],kde=False,fit=stats.johsonsu)
sns.distplot(data["label"],kde=False,fit=stats.lognorm)

  • 6.特征分类:分为数字特征和分类特征,或者时间、地理特征等。
num_features = data.select_dtypes(include=[np.number])
catrgorical_features = data.select_dtypes(include=[np.object])
  • 7.数字特征分析:相关性分析-绘制热力图(pearson/spearman相关系数)。每个数字特征的分布可视化,可以使用顶级绘图函数会哦这利用迭代的方式。数字特征之间关系的可视化,多变量互项回归关系的可视化操作。
# 相关性分析
numeric = data[numeric_features]
correlation = numeric.corr()
correlation["price].sort_values(ascending=False)
sns.heatmap(correlation,square=True,vmax=0.8)
  • 8.类别特征的可视化分析:unique分许分析-箱型图、条形图、小提琴图,类别频数的可视化,sns.countplot(),plt.bar()给出的时类别的均值。
# 1.使用低配版plt实现可视化操作
plt.rcParams["font.sans-serif"] = "SimHei"
plt.figure(figsize=(10,10))
i=1 
for i in range(len(cate_features)):
	plt.subplots(5,2,i)
	v = data[cat_features[i]].value_counts()
	fig = sns.bar(v.idnex,v.values)
	i+=1
	for  item in fig.getxtickslabel():
		item.set_rotation(90)
plt.light_layout()
plt.show()

# 使用melt顶级绘图函数,pd.melt,sns.FacetGrid(),map实现
def boxplot(x,y,**kwargs):
	sns.boxplot(x=categorical_feature,y="label",data=train)
	x = plt.xticks(rotation=90)
	# 单开一个函数主要是为了设置倾斜属性
f = pd.melt(train,vale_vars=categorica_features,id_vars=["label"])
g = sns.FacetGrid(f,col="variable",col_wrap=2,sharex=False,sharey=False,size=5)
g = g.map(bar_plot,"value","label")

#----------------------------------------------------------------
# 使用distplot直方图函数
f = pd.melt(data,value_vars=numeric_features)
g = sns.FacetGrid(f,col="variable",col_wrap=3,sharex=False,sharey=False)
g = g.map(sns.distplot,"value")

特征的unique分布

for cat_fea in categorical_features:
	print("{}特征有{}个不同的值“.format(cat_fea,data[cat_fea].nunique())
	print(data[col_fea].value_counts())
  • 9.可以使用pandas-profile生成数据分析报告。–数据量大的时候直接崩溃。
import pandas_prodiling 
pfr = pandas_profiling.ProfileReaport(data)
pfr.to_file("./filename.html")

FacetGrid主要用于再数据集的子集中分别可视化变量的分布或者多个变量之间的关系,基本过后哦你工作流程时FacetGrid使用数据集和用于构造网格的变量初始化对象,然后可以通过调用FacetGrid.map()或者将一个或者多个绘图函数用用于每个子集FacetGrid.ma_dataframe().

pairplot参数
参数palette=“husl”
markers = [“o”,“s”,“D”,"+"]
diag_kind =“kde” 改变对角图
kind ="reg"使用回归

特征工程:对于特征进一步分析,并对数据进行处理

常见的特征工程包括:
1.异常处理

  • 通过箱型图3-sigma分析删除异常值
  • box-cox变换处理有篇分布
  • 长尾阶段

2.特征归一化/标准化

  • min-max ------ standardscale

3.数据分桶:

  • 等距分桶
  • 等频分桶
  • 卡方分桶

4.缺失值的处理:

  • 不处理(针对类似xgb等树模型自动处理缺失数据)
  • 删除(确实太多时30%)
  • 插值补全(均值中位数众数等
  • 分箱/或者说高维映射

5.特征构造:

  • 构造特征统计量,包括计数、求和、比例、标准差等
  • 时间特征:包括相对时间和绝对时间,节假日、双休日等
  • 地理特征:分箱或者分布编码
  • 非线性变换:包括log/平方/根号等
  • 特征组合:这得靠自己得理解结合有业务背景知识。

6.特征筛选

  • 过滤式(filter):先对数据进行特征选择,常见方法有相关系数法、方差最大法
  • 包裹式(wrapping):直接把最终要使用的学习器的性能作为特征子集的评价准则常见方法有lvm
  • 嵌入式(embedding):结合过滤式和包裹式,学习器训练过程中自动进行特征选择,常见的lasso回归。

7.降维:

  • pca ---------LDA-------------ICA

你可能感兴趣的:(数据分析)