대용량 데이터 분석하기
Mdis 인구이동 데이터 분석하기
분석할 데이터
•
cvs란?
메타 데이터
•
데이터(data)에 대한 데이터
•
데이터에 관한 구조화된 데이터로, 다른 데이터를 설명해 주는 데이터
파일 읽기
FileReader 함수
•
한 문자 씩 읽기
•
기본 문자 인코딩으로만 작동하는 파일에서 문자 스트림을 읽기 위한 편리한 클래스
•
read() 메소드를 사용
◦
char를 한 글자씩 읽기 가능
◦
int값 반환 char타입 형변환 필요
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("파일 경로");
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
}
Java
복사
파일의 글자를 한글자씩 읽어서 출력, stream의 끝에서 -1을 리턴하므로,
read()의 값이 -1이면, 더 이상 파일을 읽지 않고, 반복문을 종료
bufferedReader 함수
•
한 줄씩 읽기
•
FileReader보다 좀 더 효율적으로 파일을 읽어오기 가능
•
LeadLine() 메소드 사용
◦
리턴값 String 고정으로 다른 타입은 형변환 필요
◦
예외처리 필수 - 대개 throws IOException을 통하여 작업
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(
new FileReader("파일 경로")
);
String str;
while ((str = reader.readLine()) != null) {
System.out.println(str);
}
reader.close();
}
Java
복사
텍스트 파일을 한 줄씩 읽어서 리턴, 더 이상 읽을 내용이 없으면, null을 리턴
Parsing
parsing이란?
•
split() 함수
◦
구분자를 기준으로 문자열을 잘라 배열로 리턴
사용 방법
public PopulationMove parse(String data) {
// String data = "50,130,62000,2021,12,,,,"
String[] splittedLine = data.split(",");
return new PopulationMove(splittedLine[6], splittedLine[0]); // 전to, 전출from
}
Java
복사
- parse() 메소드 사용 : 전입, 전출 코드 구분
- split() 함수 사용 : 문자열을 쉼표(,)를 기준으로 나누어 배열(Array)에 저장해 리턴
파일 저장
File
•
Java.io 패키지는 기존의 파일이나 폴더에 대한 제어를 하는데 사용하는 File 클래스 제공
•
File클래스 : 파일 또는 폴더에 대한 정보를 제공
public void createAFile(String filename) {
File file = new File(filename);
try{
file.createNewFile();
}catch(IOException e){
throw new RuntimeException(e);
}
}
Java
복사
파일 쓰기
BufferedWriter
•
많은 양 출력 시 사용
•
flush() : 해당 버퍼 비우기
•
close() : 버퍼 닫기
•
개행 기능이 없음 - \n 사용
public void write(List<String> strs, String filename){
File file = new File(filename);
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
for(String str:strs){
writer.write(str);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Java
복사
count 후 저장
Map
map이란?
•
키와 값을 한 쌍으로 저장하는 방식 (Key- Value 방식)
•
Key는 vlue를 찾기 위한 이름의 역할
특징
◦
저장 순서 유지 X
◦
Key : 중복 허용X , value : 중복 허용O
public Map<String, Integer> getMoveCntMap(List<PopulationMove> pml){
Map<String, Integer> moveCntMap = new HashMap<>();
for (PopulationMove pm : pml){
String key = pm.getFromSido() + "," + pm.getToSido();
if(moveCntMap.get(key) == null){
moveCntMap.put(key,1);
}
moveCntMap.put(key, moveCntMap.get(key)+1);
}
return moveCntMap;
}
Java
복사
key: “전입,전출” , value : 이사 횟수
List<PopulationMove>을 통해 key 생성, key에 해당 값 없는 경우 value 생성
실습 코드
File 읽기
1. 전입시도 전출시도를 알고 이사한 개수를 알아보기
From → To
서울 경기도
Java
복사
•
전입 시도 : 서울 / 전출 시도 : 경기도
•
서울에서 경기도로 이사온 가구의 횟수를 count할 것입니다.
•
가장 많이 이사간 지역은 어디인지 알아내는 것이 최종 목표
2. 데이터 파일에서 데이터를 읽어오기 (*.csv로 작성된 파일)
•
cvs란? Comma Separated Value. 콤마로 값을 분리한 데이터 파일을 의미합니다.
•
한 줄씩 읽어오기 위해 BufferedReader 사용
◦
한 줄씩 값을 읽어오는 클래스
•
읽어올 파일의 주소(address)를 반드시 지정해야한다.
•
실습 코드
PopulationStatistics.java
3. populationmove 클래스를 생성
•
생성자 : 파일을 한 줄 한 줄 읽을 때마다 바뀌게 될 전입 시도/ 전출 시도를 초기화하는 역할
•
getter : private 필드에 접근하기 위한 메소드
•
실습 코드
populationMove.java
읽어온 문자열 분해
1. parsing을 하는 메소드를 만들기
•
이때 parsing 이란 ? 간단하게 말해서 구문 분석이라고 하며 자료에서 원하는 정보만 가공하고 추출해서 불러 오는 것이다. 해당 과정에서는 csv 파일을 , 를 기준으로 데이터를 분해하는 것을 목표로 한다.
•
메소드를 설계할 때 고려사항
1. 단일 책임의 원칙(Single Responsibility Principle) : 하나의 메소드엔 하나의 기능 구현
2. 메소드 이름 작성 시 기능을 파악할 수 있게 작성
3. return의 유무, return 데이터 타입
4. 파라미터로 무엇을 받을 것인가
Java
복사
1. 메소드 확장 : 여러 기능이 하나의 메소드에 묶여있으면 이후 확장하기 까다롭다.
2. 중복코드 방지 : 메소드를 여러 번 재사용할 경우 사용되지 않을 코드의 반복을 막는다.
•
실습 코드
PopulationStatistics.java
PopulationMove.java
2.
Parse()를 적용한 PopulationMove 객체를 List에 저장
•
while문 안에서 600만 건의 문자열을 처리한다.
•
실습코드
PopulationStatistics.java
파일에 저장
1.
파일 생성 메소드
public void createAFile(String filename) { // 파일을 생성하는 메소드
File file = new File(filename);
try{
file.createNewFile();
}catch(IOException e){
throw new RuntimeException(e);
}
}
Java
복사
PopulationStatics.java
2.
파일 쓰기 (BufferedWriter)
•
파일 작성 메소드
public void write(List<String> strs, String filename) { // 파일에 작성하는 메소드
File file = new File(filename);
try{
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
for(String str : strs){
writer.write(str);
}
writer.close();
}catch (IOException e){
e.printStackTrace();
}
}
Java
복사
•
실습 코드
PopulationStatistics.java
3. 저장한 파일 불러와서 파싱하기
•
parse() 로직 변경
•
public PopulationMove parse(String str) {
String[] splittedLine = str.split(",");
return new PopulationMove(splittedLine[0], splittedLine[1]); // 변경
}
Java
복사
•
실습 코드
PopulationStatistics.java
4.
시도 코드는 총 몇 개 사용되었을까요?
•
Set을 이용해 사용된 시도코드를 1개씩만 뽑아 봅니다
public static void main(String[] args) throws IOException {
String address = "./FromSidoToSido.txt";
PopulationStatistics statistics = new PopulationStatistics (address);
List<PopulationMove> pml = statistics.readFileByLine(address);
Set<Integer> sidoCodes = new HashSet<>();
for(PopulationMove pm : pml){
sidoCodes.add(pm.getFromSido());
sidoCodes.add(pm.getToSido());
}
System.out.println(sidoCodes);
}
}
/*
[36, 41, 42, 11, 43, 44, 45, 46, 47, 48, 50, 26, 27, 28, 29, 30, 31]
*/
Java
복사
Map을 사용하여 어디로 많이 이사갔는지 개수 세기
1.
이사 횟수를 count하는 메소드 생성
•
map으로 key ="전입시도,전출시도"형태를 만들고 key가 해당될 때마다 value를++한다.
public Map<String, Integer> getMoveCntMap(List<PopulationMove> pml) {
Map<String, Integer> moveCntMap = new HashMap<>();
for(PopulationMove pm : pml){
String key = pm.getFromSido() + ","+pm.getToSido();
if(moveCntMap.get(key) == null){ // moveCntMap에서 해당 key에 해당하는 Object가 없으면 생성
moveCntMap.put(key, 1); // 1로 초기화
}
moveCntMap.put(key, moveCntMap.get(key)+1); //value++
}
return moveCntMap;
}
Java
복사
•
실습코드
PopulationStatistics.java
2.
HeatMap 형식 맞추기
메소드
public Map<String, Integer> heatmapIdxMap() {
Map<String, Integer> heatMap = new HashMap<>();
heatMap.put("11",0); // 서울특별시
heatMap.put("26",1);
heatMap.put("27",2);
heatMap.put("28",3);
heatMap.put("29",4);
heatMap.put("30",5);
heatMap.put("31",6);
heatMap.put("36",7);
heatMap.put("41",8);
heatMap.put("42",9);
heatMap.put("43",10);
heatMap.put("44",11);
heatMap.put("45",12);
heatMap.put("46",13);
heatMap.put("47",14);
heatMap.put("48",15);
heatMap.put("50",16);
return heatMap;
}
Java
복사
PopulationStatistics.java
도전 과제
1.
시도 매핑
2.
Context를 이용해 객체지향적 코드 작성
3.
bar chart / Heat Map 으로 시각화
•
21년 서울에서 가장 많이 이사간 지역은 ? (1. 서울 2. 경기도)