数据清洗
什么是数据清洗
1.数据清洗(Data cleaning)– 对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性。
数据清洗从名字上也看的出就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。
为什么进行数据清洗
因为数据仓库中的数据是面向某一主题的数据的集合,这些数据从多个业务系统中抽取而来而且包含历史数据,这样就避免不了有的数据是错误数据、有的数据相互之间有冲突,
这些错误的或有冲突的数据显然是我们不想要的,称为“脏数据”
我们要按照一定的规则把“脏数据”“洗掉”,这就是数据清洗。
而数据清洗的任务是过滤那些不符合要求的数据,将过滤的结果交给业务主管部门,确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。
数据清洗是与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成
2.数据清洗的步骤
数据清洗的步骤相对较为简单与清晰,有两个阶段:
第一步:偏差检测(Discrepancy Detection):即检查导致偏差的因素,并识别离散值与噪声值
例如我们采取的数据是否具有代表性,数据量是否足够,偶然因素,其他因素等的影响,这些都是能够体现数学模型上的离散值和噪声值
第二步:数据清洗(Data Cleansing):即处理缺失值与噪声。
3.数据清洗的方法
缺失数据填补
填补缺失值的方法有如下3大类:
直接删除:
可以删除带有缺失值的记录,也可直接删除有缺失值的属性。但在实际中不太有效,尤其是在缺失值变化多,跨多个自变量的情况下。
人工填写:
用人手工填写上确实的值,听上去就不实际且费时间。大数据的分析可以直接忽略这个方法。
自动填充:
这个方法是目前用的最为广泛的。顾名思义,用某些值自动填充缺失值。依照自动填充的值不同做出清洗
4.那么我们该怎么实现数据清洗呢?
备注:其实不需要我们干,因为这些往往都是有专门的岗位或者部门进行的,例如算法工程师出算法,大数据工程师进行实现,运用大数据的相关框架/知识进行清洗。
ps:那么我们该怎么实现数据清洗呢,我们的做法是对爬虫获取到的数据实现统计求和或者去重排序等
java 利用爬虫清洗的步骤
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @desc poi实现数据写入excel中
* @author WYH
* @time 2019-10-13
*/
public class Test {
public static void main(String[] args) throws IOException {
//1.poi核心类的实例化
HSSFWorkbook workBook=new HSSFWorkbook();
//2.创建sheet
HSSFSheet sheet = workBook.createSheet();
//3.创建表头
HSSFRow row = sheet.createRow(0);
String []biaoTou={"编号","名字"};
for (int i = 0; i
{
HSSFCell cell = row.createCell(i);
cell.setCellValue(biaoTou[i]);
}
//3.填充20行数据
for(int i =1;i
{
HSSFRow row2 = sheet.createRow(i);//从第二行开始创建新的一行
HSSFCell cell2=row2.createCell(0);//为新创建的行创建第一列
cell2.setCellValue(i); //给新创建的第一列赋值
HSSFCell cell3 = row2.createCell(1);
cell3.setCellValue("00-"+i);
}
File file =new File("F:/20191013.xls");
FileOutputStream outputStream = new FileOutputStream(file);
workBook.write(outputStream);
outputStream.flush();
outputStream.close();
workBook.close();
System.out.println("使用POI写入数据成功了.....");
}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ss.usermodel.Workbook;
/**
* @desc 数据的清洗
* @author WYH
* @time 2019-10-13
*/
public class Test {
public static void main(String[] args) throws IOException {
List> list=new ArrayList>();
for (int i = 1; i
{
String pathname="D:/zp/excel/zhyc-java0-"+i+".xls";
ExcelUtils excelUtils=new ExcelUtils();
Workbook workBook = excelUtils.getWorkBook(pathname);
// String result = excelUtils.getCell(workBook,int sheetNum,int beginColumn,int endColumn);
List resultList = excelUtils.getCell(workBook,0,2,2);
list.add(resultList);
System.out.println(resultList);
}
int h=0,m=0,w=0;
for(int i =0;i
{
List everyResultList = list.get(i);
for(int k =0;k
{
String everyResult = everyResultList.get(k);
if (!(everyResult.startsWith("其他")||everyResult.startsWith("面议")||everyResult.startsWith("薪")))
{
int st = everyResult.lastIndexOf("-");//注意这个-建议要粘贴excel中的
String ft = (String) everyResult.subSequence(0, st);
//System.out.println(ft);
if (Integer.parseInt(ft)>=12000)
{
h++;
}
else if ((Integer.parseInt(ft)>=8000)&&(Integer.parseInt(ft)
{
m++;
}
else
{
w++;
}
}
}
}
System.out.println("12000元以上的有:"+h+"人");
System.out.println("8000-12000元之间的有:"+m+"人");
System.out.println("8000元以下的有:"+w+"人");
}
}
数据可视化的操作
1.数据可视化
是关于数据视觉表现形式的科学技术研究。其中
这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。
它是一个处于不断演变之中的概念,其边界在不断地扩大。主要指的是技术上较为高级的技术方法,而这些技术方法允许利用图形、图像处理、计算机视觉以及用户界面,通过表达、建模以及对立体、表面、属性以及动画的显示,对数据加以可视化解释。与立体建模之类的特殊技术方法相比,数据可视化所涵盖的技术方法要广泛得多
2.数据可视化的分类
1)广义上,可视化无处不在。网站是数据可视化, 背后是数据库密密麻麻的数据表, 到了浏览器就是浅显易懂的页面;淘宝是商品的可视化, 上面有价格、发货地种种过滤器;微信是实时数据的可视化, 围起了你的社交网络, 让你一眼看到最新的消息流。
2)狭义上的数据可视化, 更多是纯图形去代表数据
poi写入数据
package com.rj.bd.pois.poi01;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @desc poi实现数据写入excel中
* @author WYH
* @time 2019-10-13
*/
public class Test {
public static void main(String[] args) throws IOException {
//1.poi核心类的实例化
HSSFWorkbook workBook=new HSSFWorkbook();
//2.创建sheet
HSSFSheet sheet = workBook.createSheet();
//3.创建表头
HSSFRow row = sheet.createRow(0);
String []biaoTou={"编号","名字"};
for (int i = 0; i
{
HSSFCell cell = row.createCell(i);
cell.setCellValue(biaoTou[i]);
}
//3.填充20行数据
for(int i =1;i
{
HSSFRow row2 = sheet.createRow(i);//从第二行开始创建新的一行
HSSFCell cell2=row2.createCell(0);//为新创建的行创建第一列
cell2.setCellValue(i); //给新创建的第一列赋值
HSSFCell cell3 = row2.createCell(1);
cell3.setCellValue("00-"+i);
}
File file =new File("F:/20191013.xls");
FileOutputStream outputStream = new FileOutputStream(file);
workBook.write(outputStream);
outputStream.flush();
outputStream.close();
workBook.close();
System.out.println("使用POI写入数据成功了.....");
}
}
poi读取数据
package com.rj.bd.pois.poi01;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
/**
* @desc 利用POI实现读取excel中的数据
* @author WYH
* @time 2019-10-13
*/
public class Test02 {
public static void main(String[] args) throws IOException {
String pathname="F:/20191013.xls";
//将需要解析的excel转为流进行输出
FileInputStream fileInputStream=new FileInputStream(pathname);
//实例化POI的核心类
HSSFWorkbook workBook=new HSSFWorkbook(fileInputStream);
//获取当前工作簿中的第一个sheet也就是第一页
HSSFSheet sheet = workBook.getSheetAt(0);
//获取当前sheet中有多少个行
int totalRowNums = sheet.getPhysicalNumberOfRows();
for(int i =0;i
{
HSSFRow row = sheet.getRow(i);//取出每一行
int totalCellNums = row.getPhysicalNumberOfCells();//获取一共有多少列
for(int k=0;k
{
Cell cell = row.getCell(k);
//System.out.print(cell.getStringCellValue());
String cellValue = getValue(cell);
System.out.print(cellValue+"\t");
}
System.out.println();
}
}
/**
* @desc 格式化输出
* @param cell
* @return
*/
private static String getValue(Cell cell) {
if (cell.getCellType()==Cell.CELL_TYPE_NUMERIC)
{
int d = (int)cell.getNumericCellValue();
return String.valueOf(d);
}
else if (cell.getCellType()==Cell.CELL_TYPE_BOOLEAN)
{
String.valueOf(cell.getBooleanCellValue());
}
return cell.getStringCellValue();
}
}