如果你完成了数据的审查,确认了第0步中每个问题的答案,这份数据的确符合你的需求。接下来就要审核一下数据中存在的问题了。
一份原始的脏数据可能存在多少种问题?
那恐怕是数也数不清的,常见的大概有:
- 空白值与缺失值——数据空白——程序是区分不出空白值和缺失值的,只能由你区分
- 错误值与极端值——错误或超出合理范围的取值——什么叫“合理”也是你来定义的
- 重复值——重复变量和重复个案
- 多值——某个变量在某个个案上有多个值——这是没法进入数据分析的,多半会被程序识别成字符串
- 数据类型、格式错误
这些问题,如果样本量少,变量也不太多的话,人工扫视过去大概就能发现问题。
但如果有几百个变量,几万条数据呢?
所以,我们需要先搞一个简单粗暴的描述性统计,帮助我们对数据进行一个描摹,找到问题所在。
简单粗暴的描述性统计
这个描述性统计的要求:
1、不需要对原始数据进行太多的处理,比如挨个指定数据类型——如果这样的话,我干嘛不直接用某个统计软件开始处理呢?
2、能够给出所有有价值的描述性统计信息,这包括:
- 所有变量——样本量、有效值数量、缺失值/空白值数量
- 所有变量——不同的取值有多少个、重复最多的取值重复了多少次、只出现了一次的值有多少个
- 数值型变量——最大值、最小值、范围
- 数值型变量——平均数、标准差、四分位数、众数
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 21 11:58:17 2020
@author: weisssun
"""
import pandas as pd
import numpy as np
input_path = r'D:\Python\data_analysis\原始数据.xlsx'
output_path = r'D:\Python\data_analysis\简单粗暴的描述性统计.xlsx'
input_data = pd.read_excel(input_path)
output_data = pd.DataFrame()
input_col_name = input_data.columns.tolist()
print(input_col_name)
sample_size = len(input_data)
# 总体样本数量
print(sample_size)
def freq_count(var1):
valid_size = var1.count ()
print('非空值数量', valid_size)
# 非空值数量
values_freq = var1.value_counts()
print('频数统计', values_freq)
# 不同取值的频数
#print(type(values_freq))
#print(values_freq.values)
unique_values = len(values_freq)
print('不同取值个数', unique_values)
# 不同取值个数
one_time_values = len(values_freq[values_freq == 1])
print('仅出现一次的值个数', one_time_values)
# 仅出现一次的值个数
max_freq = values_freq.max()
print('重复最多的值出现次数', max_freq)
# 重复最多的值出现次数
min_freq = values_freq.min()
print('重复最少的值出现次数', min_freq)
# 重复最少的值出现次数
return valid_size, unique_values, one_time_values, max_freq, min_freq
for col in input_col_name:
data_type = input_data[col].dtypes
print(col, data_type)
i = input_col_name.index(col)
valid_size, unique_values, one_time_values, max_freq, min_freq = freq_count(input_data[col])
output_data.loc[i, '变量名'] = col
output_data.loc[i, '数据类型'] = data_type
output_data.loc[i, '样本数量'] = sample_size
output_data.loc[i, '非空值数量'] = valid_size
output_data.loc[i, '覆盖率'] = (valid_size / sample_size)*100
output_data.loc[i, '不同取值个数'] = unique_values
output_data.loc[i, '#独特性'] = (unique_values / valid_size)*100
output_data.loc[i, '仅出现一次的值个数'] = one_time_values
output_data.loc[i, '重复最多的值出现次数'] = max_freq
output_data.loc[i, '#重复性'] = (max_freq / valid_size)*100
output_data.loc[i, '重复最少的值出现次数'] = min_freq
if data_type in ['float64', 'int64']:
col_des = input_data[col].describe()
#print(col_des)
#print(type(col_des))
output_data.loc[i, '平均值'] = col_des['mean']
output_data.loc[i, '标准差'] = col_des['std']
output_data.loc[i, '最小值'] = col_des['min']
output_data.loc[i, '25%位数'] = col_des['25%']
output_data.loc[i, '中位数'] = col_des['50%']
output_data.loc[i, '75%位数'] = col_des['75%']
output_data.loc[i, '最大值'] = col_des['max']
output_data.loc[i, '范围'] = col_des['max'] - col_des['min']
output_data.loc[i, '众数'] = input_data[col].mode()[0]
output_data.to_excel(output_path)