数据清洗

什么是数据清洗

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();
	}
  
}