python基础笔记(六)_数据清洗及建模

数据特征分析

分布分析

  • 研究数据的分布特征和分布类型
  • 定量数据
    • 极差 : max - min
    • 通过直方图直接判断分组组数
      • 简单查看数据分布,确定分布组数
      • 一般8-16即可
    • 求出分组区间
      • pd.cut(x, bins, right)
      • 按照组数对x分组,且返回一个和x同样长度的分组dataframe
      • right:是否包含右边,默认为True
      • 通过groupby查看不同组的数据频率分布
    • 求出目标字段下频率分布的其他统计量 → 频数,频率,累计频率
    • 绘制频率直方图、饼图
  • 定性数据
    • 绘制频率直方图;根据不可用数据描述的特征,例如朝向
    • 通过计数统计判断不同类别的频率

对比分析

  • 两个互相联系的指标进行比较
  • 绝对数比较(相减)
    • 相互对比的指标在量级上不能差别过大
    • 折线图比较
    • 多系列柱状图比较
    • 柱状图堆叠图+差值折线图比较
  • 相对数比较(相除)
    • 有联系的指标综合计算后的对比,数值为相对数
    • 结构分析
      • 各组总量指标与总体的总量指标对比,计算出各组数量在总量中所占比重
      • 反映总体的内部结构
    • 比例分析
      • 将总体不同部分的指标数值进行对比,其相对指标一般称为“比例相对数”
      • 比例相对数 = 总体中某一部分数值 / 总体中另一部分数值
    • 空间比较分析(横向对比分析)
      • 同类现象在同一时间不同空间的指标数值进行对比,反应同类现象在不同空间上的差异程度和现象发展不平衡的状况
      • 空间比较相对数 = 甲空间某一现象的数值 / 乙空间同类现象的数值
    • 动态对比分析(纵向对比分析)
      • 同一现象在不同时间上的指标数值进行对比,反应现象的数量随着时间推移而发展变动的程度及趋势
      • 最基本方法,计算动态相对数 → 发展速度
      • 动态相对数(发展速度) = 某一现象的报告期数值 / 同一现象的基期数值
      • 基期:用来比较的基础时期
      • 报告期:所要研究的时期,又称计算期

统计分析

  • 统计指标对定量数据进行统计描述
  • 集中趋势度量
    • 指一组数据向某一中心靠拢的倾向,核心在于寻找数据的代表值或中心值
    • 算数平均数
      • 简单算术平均值:总和 / 样本数量 (不涉及权重)
      • 加权算术平均值:(x1f1 + x2f2 + ... + xnfn) / (f1 + f2 + ... + fn)
    • 位置平均数
      • 众数 : 出现次数最多的数
      • 中位数 : 排序后处于中间的数
  • 离中趋势度量
    • 指一组数据中各数据以不同程度的距离偏离中心的趋势
    • 极差:最大值 - 最小值
    • 分位差:data['75%'] - data['25%']
    • 方差:各组中数值与算数平均数离差平方的算术平均数
    • 标准差
      • 方差的平方根
      • 标准差越大,离中趋势越明显
      • 最常用的离中趋势指标

帕累托分析

  • 贡献度分析
  • 帕累托法则:20/80定律
  • 客观存在的无法解释的不平衡
  • 多数,造成少许的影响
  • 少数,造成主要的、重大的影响
  • 分析步骤:
    • 1.根据值从大到小排列,绘制柱状图
    • 2.创建累计占比cumsum,
    • 3.找到累计占比超过80%时候的index和索引位置
    • 4.绘制累计占比曲线(y副坐标轴)
    • 5.突出显示累计占比超80%的点

正太性检验

  • 定义:利用观测数据判断总体是否服从正态分布
  • 直方图初判
    • 根据数据绘制直方图
    • 绘制密度曲线
  • QQ图判断
    • 把测试样本数据的分位数与已知分布相比较
    • 散点图,由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图
    • 参考直线:四分之一分位点和四分之三分位点这两点确定,看散点是否落在这条线的附近
    • 绘制步骤
      • 1.数据清洗后,对数据进行排序
      • 2.计算每个数据对应的百分位:p(i)=(i-0.5)/n 
      • 3.绘制直方图和QQ图
  • K-S检测
    • from scipy import stats
    • stats.kstest(df['value'],'norm',(u,std))
      • .kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
      • 结果返回两个值:statistic → D值,pvalue → P值
      • p值大于0.05,为正态分布

相关性分析

  • 分析连续变量之间的线性相关程度的强弱
  • 图示初判
    • 变量之间的线性相关性
      • 正线性相关
      • 负线性相关
    • 散点图矩阵初判多变量间关系
  • Pearson相关系数
    • 算法:r = data['(x-u1)*(y-u2)'].sum() / np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum())
    • data.corr():data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
  • Sperman秩相关系数
    • 算法
      • 1.对每列数据按照从小到大排序,分别设定秩次index
      • 2.求得秩次差的平方,
      • 3.rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1))
        • n 为数据个数
        • data['d2'] :秩次差的平方
    • data.corr(method='spearman')

数据处理

缺失值处理

  • 判断是否有缺失值
    • isnull:缺失值为True,非缺失值为False
    • notnull:缺失值为False,非缺失值为True
  • 删除缺失值
    • data.dropna()
      • 可直接用于Series,Dataframe
      • inplace参数,默认False → 生成新的值
  • 填充缺失值
    • s.fillna(value,inplace = True,method='pad')
      • value 为填充值
      • inplace 为 True 时替换源数据
      • method参数
        • pad / ffill → 用之前的数据填充
        • backfill / bfill → 用之后的数据填充
  • 替换缺失值
    • df.replace(to_replace=None, value=None, inplace=False,)
    • to_replace → 被替换的值
    • value → 替换值
  • 缺失值插补
    • 均值/中位数/众数插补
      • u = s.mean() # 均值
      • me = s.median() # 中位数
      • mod = s.mode() # 众数
        • mod.tolist() : 转换为列表,可能不仅一个
  • 临近值插补
    • 修改method参数
      • pad / ffill → 用之前的数据填充
      • backfill / bfill → 用之后的数据填充
  • 拉格朗日插值法
    • from scipy.interpolate import lagrange
    • lagrange(x,y):输出值为多项式的n个系数,y = a0 * x**2 + a1 * x + a2
    • lagrange(x,y)(10):插值10为:y = a0 * 10**2 + a1 * 10+ a2

异常值处理

  • 定义
    • 指样本中的个别值,其数值明显偏离其余的观测值
    • 异常值也称离群点,异常值的分析也称为离群点的分析
  • 异常值分析
    • 3σ原则
      • 如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值
      • p(|x - μ| > 3σ) ≤ 0.003
      • 分别找出正常值和异常值,绘制散点图
      • 绘制密度曲线,辅助标注3σ和-3σ垂直线
    • 箱型图分析
      • 计算分位差:iqr = s['75%'] - s['25%']
      • 计算内限
        • 下限:mi = q3 - 1.5 * iqr
        • 上限:mi = q3 + 1.5 * iqr
      • 借用散点图和箱形图
  • 异常值处理方法
    • 删除
    • 修正填补

数据归一化

  • 将数据按比例缩放,使之落入一个小的特定区间
  • 去除数据的单位限制,将其转化为无量纲的纯数值
  • 不同单位或量级的指标能够进行比较和加权
  • 归一化处理,[0,1]区间映射
    • Z-score标准化
      • z=(x-μ)/σ:其中x为某一具体分数,μ为平均数,σ为标准差
      • 是一个分数与平均数的差再除以标准差的过程
      • Z值的量代表着原始分数和母体平均值之间的距离,是以标准差为单位计算
      • 数学意义:一个给定分数距离平均数多少个标准差?
      • 经过处理的数据符合标准正态分布,即均值为0,标准差为1
    • 0-1标准化:
      • x = (x - Min) / (Max - Min)

数据连续属性离散化

  • 连续属性变换成分类属性
    • 等宽法 → 将数据均匀划分成n等份,每份的间距相等
      • cats = pd.cut(ages,bins)
        • bins 为分组依据或个数
        • 可以设置自己的区间名称,用labels参数
      • cats.codes:分组后的区间,用代号来注释数据对应区间,结果为ndarray
      • cats.categories:四个区间,结果为index
      • pd.value_counts(cats):按照区间计数
    • 等频法 → 以相同数量的记录放进每个区间
      • cats = pd.qcut(s,4)
      • 按照四分位数切割,可以修改值
      • 根据样本分位数对数据进行面元划分,得到大小基本相等的面元

数学建模

线性回归

  • 概念
    • 因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的
    • 使用最佳的拟合直线(也就是回归线)在因变量(Y)和一个或多个自变量(X)之间建立一种关系
  • 类型
    • 简单线性回归
      • 数据示例
        • from sklearn.linear_model import LinearRegression
        • np.random.RandomState → 随机数种子
        • model = LinearRegression()
        • 线性回归评估器,用于拟合数据得到拟合直线
        • model.fit(x,y) → 拟合直线,参数分别为x与y
        • x[:,np.newaxis] → 将数组变成(n,1)形状
        • model.predict(xtest) → 预测
        • 绘制散点图和线性回归拟合直线
      • 误差
        • plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'gray')
          • 分别计算拟合值和实际值
          • 绘制误差线
      • 求解a,b
        • 斜率a为:model.coef_[0]
        • 截距b为:model.intercept_
    • 多元线性回归
      • 绘制散点矩阵
      • model = LinearRegression()
      • model.fit(df[['b1','b2','b3','b4']],df['y'])
      • 其它参数设置同一元线性回归

模型评估

  • SSE(和方差、误差平方和):The sum of squares due to error
  • MSE(均方差、方差):Mean squared error
  • RMSE(均方根、标准差):Root mean squared error
  • R-square(确定系数) Coefficient of determination
  • 步骤方法
    • from sklearn import metrics
    • ytest = model.predict(xtrain[:,np.newaxis])        # 求出预测数据
    • mse = metrics.mean_squared_error(ytrain,ytest)     # 求出均方差
    • rmse = np.sqrt(mse)                                # 求出均方根
    • ssr = ((ytest - ytrain.mean())**2).sum()  # 求出预测数据与原始数据均值之差的平方和
    • sst = ((ytrain - ytrain.mean())**2).sum()  # 求出原始数据和均值之差的平方和
    • r = model.score(xtrain[:,np.newaxis],ytrain)     # 求出确定系数
    • r2 = ssr / sst # 求出确定系数

KNN分类

  • 在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别
  • 电影分类
    • from sklearn import neighbors
    • knn = neighbors.KNeighborsClassifier();建模
    • knn.fit(data[['fight','kiss']],data['type']);拟合数据
    • knn.predict([[18,90]]);预测未知数据
    • 绘制图表可视化
  • 植物分类
    • from sklearn import datasets
    • iris = datasets.load_iris();加载数据
    • 转换为DataFrame数据结构
    • knn = neighbors.KNeighborsClassifier();建模
    • knn.fit(iris.data,df['target_names']);拟合训练数据
    • knn.predict(pre_data);预测数据

聚类(PCA主成分分析)

  • 最广泛无监督算法 + 基础的降维算法
  • 通过线性变换将原始数据变换为一组各维度线性无关的表示,用于提取数据的主要特征分量 → 高维数据的降维
  • 二维数据降维
    • 创建数据df
    • rom sklearn.decomposition import PCA:加载主成分分析模块PCA
    • pca = PCA(n_components=1) # n_components = 1 → 降为1维
    • pca.fit(df) # 构建模型
    • pca.explained_variance_
      • # 输出特征值
      • explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比
    • pca.components_
      • # 输出特征向量
      • 返回具有最大方差的成分
    • pca.n_components:# 输出成分的个数
    • x_pca = pca.transform(df) # 数据转换,主成分分析,生成新的向量x_pca,为降维后的数据:fit_transform(X)
    • x_new = pca.inverse_transform(x_pca) # 将降维后的数据转换成原始数据
    • 绘制图表
  • 多维数据降维
    • from sklearn.datasets import load_digits digits = load_digits():加载数据
    • pca = PCA(n_components=2) # 降为2维
    • projected = pca.fit_transform(digits.data)
    • pca.explained_variance_ # 输出特征值
    • pca.components_.shape # 输出特征向量形状:降维后,得到2个成分,每个成分有64个特征向量
    • 主成分筛选
      • pca = PCA(n_components=10)
      • projected = pca.fit_transform(digits.data)
      • 降维后,得到10个成分,每个成分有64个特征向量
      • 做贡献率累计求和,构建DataFrame
      • 寻找贡献率超过85%时的成分,即主要成分

K-means聚类

  • 概念
    • 典型的基于距离的聚类算法
    • K均值: 基于原型的、划分的距离技术,它试图发现用户指定个数(K)的簇
    • 以欧式距离作为相似度测度
  • 步骤方法
    • from sklearn.datasets.samples_generator import make_blobs:make_blobs聚类数据生成器
    • x,y_true = make_blobs()
      • n_samples → 待生成的样本的总数
      • n_features → 每个样本的特征数
      • centers → 类别数
      • cluster_std → 每个类别的方差,如多类数据不同方差,可传入列表
      • random_state → 随机数种子
      • x → 生成数据值, y → 生成数据对应的类别标签
    • 绘制图表显示
  • 构建K均值模型
    • from sklearn.cluster import KMeans  #导入模块
    • kmeans = KMeans(n_clusters = 4)
    • kmeans.fit(x)
    • y_means = kmeans.predict(x
    • centriods = kmeans.cluster_centers_:得到不同簇的中心点

蒙特卡罗模拟

  • 概念理解
    • 又称随机抽样或统计试验方法,以概率和统计理论方法为基础
    • 使用随机数(或更常见的伪随机数)
    • 用电子计算机实现统计模拟或抽样,以获得问题的近似解。
  • 案例
    • π的计算
      • from matplotlib.patches import Circle
      • numpy.random.uniform(low,high,size) → 从一个均匀分布[low,high)中随机采样,均匀分布
      • 在正方形区域内随机投点
      • 计算点到圆心的距离
      • 统计落在圆内的点的数目
      • 绘图
        • plt.plot(x,y,'ko',markersize = 1)
        • circle = Circle(xy=(a,b),radius=r,alpha = 0.5,color = 'red')
        • axes.add_patch(circle)
    • 计算积分 y = x**2
    • 排队上厕所问题:理论联系实际。将实际问题转换建模分析。通过大量数据以近似值逼近真实值

 

你可能感兴趣的:(python)