• 数据分析--观察数据处理异常值


    引包:

    1. import pandas as pd
    2. import numpy as np

    读取文件

    df=pd.read_csv('./HR.csv')

    文件见绑定资源(来自kaggle的HR.csv)

    处理过程:

    一、从df中拿出处理对象

    二、找出缺失值的位置并删除

    1. s1_s=df['satisfaction_level']
    2. # s1_s.isnull()
    3. #查找空值
    4. print(s1_s[s1_s.isnull()])
    5. # 查看空值的具体情况
    6. print(df[df['satisfaction_level'].isnull()])
    7. # 删除空值
    8. s1_s=s1_s.dropna()
    9. # print(s1_s)

    三、观察数据组成情况

    (均值。中位数、最大值最小值、标准差、偏度和峰度.......)

    1. print(s1_s.mean())#均值
    2. print(s1_s.median())#中位数
    3. print(s1_s.std())#标准差
    4. print(s1_s.max())#最大值
    5. print(s1_s.min())#最小值
    6. print(s1_s.quantile(q=0.25))#下四分位数
    7. print(s1_s.quantile(q=0.75))#上四分位数
    8. print(s1_s.skew())#偏度=-0.4763...为负偏--均值偏小,大部分数大于均值
    9. print(s1_s.kurt())#峰度=-0.67...-->相对于正态分布来说属于比较平缓的状态

    (获取离散化的分布用numpy.histogram)

    1. 获取离散化的分布用numpy.histogram
    2. s=np.histogram(s1_s.values,bins=np.arange(0.0,1.1,0.1))
    3. # series的值 bins:切分的临界
    4. print(s)
    5. # 输出: (array([ 195, 1214, 532, 974, 1668, 2146, 1972, 2074, 2220, 2004],
    6. # dtype=int64), array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]))

    其他列的数据也是同上三部的操作代码如下:

    (多了一个删除异常值)

    1. le_s=df['last_evaluation']
    2. print(le_s[le_s.isnull()])
    3. print(le_s.mean())#均值
    4. print(le_s.std())#标准差
    5. print(le_s.max())#最大值
    6. print(le_s.min())#最小值
    7. print(le_s.median())#中位数
    8. print(le_s.skew())#偏度
    9. print(le_s.kurt())#峰度
    10. print(df['last_evaluation'].describe())
    11. print(df.describe())
    12. q_low=le_s.quantile(q=0.25)
    13. q_high=le_s.quantile(q=0.75)
    14. q_interval=q_high-q_low
    15. k=1.5
    16. le_s=le_s[le_sq_low-k*q_interval]
    17. print(le_s)
    18. print(np.histogram(le_s.values,bins=np.arange(0.0,1.1,0.1)))
    19. #处理number_project
    20. np_s=df['number_project']
    21. print(np_s[np_s.isnull()])
    22. np_s=np_s.dropna()
    23. print('====')
    24. print(np_s)
    25. # print(np_s.skew())
    26. k=1.5
    27. np_s1=np_s.quantile(0.25)
    28. np_s2=np_s.quantile(0.75)
    29. np_ss=np_s2-np_s1
    30. np_s=np_s[np_snp_s1-k*np_ss]
    31. print(np_s)
    32. print(np_s.describe())
    33. # 查看数据的个数
    34. print(np_s.value_counts())
    35. # 查看各个数据所占的比例
    36. print(np_s.value_counts(normalize=True))
    37. # normalize:输出占比比例
    38. # 按照index排序和values排序
    39. print(np_s.value_counts(normalize=True).sort_index())
    40. print(np_s.value_counts(normalize=True).sort_values())
    41. # 处理average_montly_hours
    42. amh_s=df['average_montly_hours']
    43. # print(amh_s)
    44. print(amh_s[amh_s.isnull()])
    45. amh_s=amh_s.dropna()
    46. # print('===\n',amh_s[amh_s.isnull()])
    47. # print(amh_s)
    48. # print(amh_s.describe())
    49. Upper_q=amh_s.quantile(q=0.75)
    50. Lower_q=amh_s.quantile(q=0.25)
    51. q=Upper_q-Lower_q
    52. amh_s=amh_s[amh_s<=Upper_q+q*1.5][amh_s>=Lower_q-q*1.5]
    53. print(amh_s)
    54. # 输出偏度和峰度
    55. print(amh_s.skew(),amh_s.kurt())

    观察数值的分布情况

    使用了histogram和可视化两个方法

    1. # 方法一
    2. print(np.histogram(amh_s.values,bins=10))
    3. # print(np.histogram(amh_s.values,bins=np.arange(amh_s.min(),amh_s.max()+10,10)))
    4. # # 方法二:画图--利用直方图来观察数据的分布情况
    5. # import matplotlib.pyplot as plt
    6. # plt.hist(amh_s.values,np.arange(amh_s.min(),amh_s.max()+10,10))
    7. # plt.show()

    其他列的简单操作大部分都是删除空值

    1. tsc_s=df['time_spend_company']
    2. # print(tsc_s)
    3. x=tsc_s[tsc_s.isnull()]
    4. # print(x)
    5. tsc_s=tsc_s.dropna()
    6. # print(tsc_s)
    7. print(tsc_s.min(),tsc_s.max(),tsc_s.kurt(),tsc_s.skew(),tsc_s.std())
    8. uper_q=tsc_s.quantile(q=0.75)
    9. lower_q=tsc_s.quantile(q=0.25)
    10. q=uper_q-lower_q
    11. tsc_s=tsc_s[tsc_s1.5][tsc_s>lower_q-q*1.5]
    12. print(tsc_s)
    13. print(tsc_s.min(),tsc_s.max(),tsc_s.kurt(),tsc_s.skew(),tsc_s.std())
    14. print(tsc_s.value_counts().sort_index())
    15. print(np.histogram(tsc_s.values,bins=np.arange(tsc_s.min(),tsc_s.max()+1,1)))
    16. wa_s=df['Work_accident']
    17. print(wa_s)
    18. wa_s.value_counts()
    19. wa_s=wa_s[wa_s==0.0]
    20. print(wa_s)
    21. lf_s=df['left']
    22. print(lf_s)
    23. lf_s=lf_s[lf_s==1.0]
    24. print(lf_s)
    25. print(lf_s.value_counts())
    26. pro_s=df['promotion_last_5years']
    27. print(pro_s)
    28. pro_s=pro_s[pro_s==0.0]
    29. print(pro_s)
    30. print(pro_s.value_counts())
    31. s_s=df['salary']
    32. print(s_s)
    33. s_s=s_s.dropna()
    34. print(s_s)
    35. print(s_s.value_counts())
    36. dpt_s=df['sales']
    37. print(dpt_s)
    38. dpt_s=dpt_s.dropna()
    39. print(dpt_s)
    40. dpt_s.where()
    41. print(dpt_s.value_counts())
    42. say_s=df['salary']

    其实删除空值只需一行代码上面是为了一列一列的观察数据查看还有没有其他的异常值: 

    df=df.dropna(axis=0,how='any')

     意思是删除只要有空值的行。

    对比分析:

    (将不同列放在一起观察并分析数据)

    这里的代码类似与sql的DQL代码

    1. df=df.dropna(axis=0,how='any')
    2. # print(df)
    3. df1=df.groupby('sales').min()
    4. print(df1)
    5. df2=df.loc[:,['satisfaction_level','sales']].groupby('sales').mean()
    6. print(df2)
    7. print('=====')
    8. # 输出极差
    9. df3=df.loc[:,['average_montly_hours','sales']].groupby('sales')['average_montly_hours'].apply(lambda x:x.max()-x.min())
    10. print(df3)
    11. print(df['salary'].value_counts())
    12. print(len(df['salary'].value_counts()))

    简单的可视化操作:

    这里用到的是matplotlib

    1. import matplotlib.pyplot as plt
    2. plt.title('salary')
    3. plt.xlabel('salary_zhonglei')
    4. plt.ylabel('shuliang')
    5. plt.xticks(np.arange(len(df['salary'].value_counts())),df['salary'].value_counts().index)
    6. # bottom=['low','medium','high']
    7. plt.axis([-1,3,0,10000])
    8. plt.bar(np.arange(len(df['salary'].value_counts())),df['salary'].value_counts(),width=0.4)
    9. for x,y in zip(np.arange(len(df['salary'].value_counts())),df['salary'].value_counts()):
    10. plt.text(x,y,y,ha='center',va='bottom')
    11. # ha = 'center', va = 'bottom'
    12. plt.show()

  • 相关阅读:
    【构建ML驱动的应用程序】第 1 章 :从产品目标到 ML 框架
    20232937文兆宇 2023-2024-2 《网络攻防实践》实践七报告
    Kafka SASL认证授权(五)ACL源码解析
    对话MySQL之父:一个优秀程序员可抵5个普通程序员
    Java:什么是Java中的构造函数?
    2310D导入c部分可用
    山东大学项目实训十——Android开发环境搭建
    PyTorch学习笔记-Non-linear Activations与Linear Layers
    使用golang+antlr4构建一个自己的语言解析器(二)
    Ubuntu中Python3找不到_sqlite3模块
  • 原文地址:https://blog.csdn.net/qq_46103282/article/details/133466053