728x90
반응형

🎄 Machine Learning 개요

🎄 Machine Learning이란?

  • 알고리즘(algorithms) : 어떠한 문제를 해결하기 위한 일련의 절차나 방법
  • 유튜브는 개인이 유튜브 영상을 보는 패턴에 대해 학습하는 프로그램(머신러닝)을 만든 다음 그 패턴(알고리즘)에 맞게 다음 영상을 계속 추천해 준다.
  • 머신러닝을 통해 데이터를 훈련시켜서 패턴을 파악한다. 그 후 파악되는 패턴을 통해 미래를 예측하는 방법을 사용한다.
  • 머신러닝이 필수인가? 데이터를 분석할 때 머신러닝을 사용하는 회사가 존재한다.
    • 설문조사(리서치) 회사 - 탐색적 데이터 분석을 통해 데이터의 인사이트 도출,  파이썬을 통해 예측
    • 데이터 분석 및 예측  회사 - 데이터의 흐름을 가지고 미래 예측. 예를 들어, 기상청은 지형지물에 대한 영상을 보고 어떠한 형태인지 파악 후 미래 날씨 예측
    • 영상에서 통해 수집되는 행위분석(이미지분석) 회사 - 딥러닝, CCTV를 통해 물건을 훔치는 모션이 정보로 들어오면 스스로 신고하게하는 행위

  • 인공지능 :  스스로 학습하고 스스로 판단하게 하는 능력을 가지는 것으로 인공지능으로 가려면 데이터 분석이 필요하다.
  • ICBMS : 4차 산업을 이끄는 핵심기술 (IoT / Cloud / Big Data / Mobile / Security)
  • 사이킷런(scikit-learn) : 머신러닝 프레임워크, 실제 머신러닝 모델을 생성하고 데이터에 적용할 수 있도록 도와주는 도구

  • 머신러닝(machine learning) : 기계가 패턴을 학습하여 자동화하는 알고리즘, 데이터를 컴퓨터에 학습 시켜 그 패턴과 규칙을 컴퓨터가 스스로 학습하도록 만드는 기술
    • 이전에는 사람이 지식을 직접 데이터베이스화한 후 컴퓨터 가 처리하도록 프로그램으로 만듦
    • 머신러닝은 데이터를 분류하는 수학적 모델을 프로그래밍 하여, 데이터만 입력하면 이미 만들어진 수학 모델이 규칙으로 적용되어 여러 문제를 풀 수 있음
  • 딥러닝(deep learning) : 머신러닝 기법 중 신경망(neural network)을 기반으로 사물이나 데이터를 군집화하거나 분류하는데 사용하는 기술
  • 인공지능 ⊃ 머신러닝 ⊃ 딥러닝

 

 

🎄머신러닝의 학습 프로세스와 종류

 

  • 모델과 알고리즘
    •  ‘모델’은 ‘수식’이나 ‘통계 분포’, ‘알고리즘’은 모델을 산출하기 위해 규정화된 과정(훈련과정 = 학습)
    • 보통 하나의 모델은 다양한 알고리즘으로 표현할 수 있다
    • 때때로 ‘알고리즘’은 하나의 ‘수식’으로 표현 가능하다

  • 그림 1 : 모델을 훈련시킨다.
    • 원천데이터 전처리 가공 후 머신러닝이라는 알고리즘에 넣어줌(라이브러리 활용, 라이브러리에는 계산 공식이 들어 있음 ) > 넣어준 데이터를 가지고 훈련시킴 > 훈련을 통해 가장 정확한 것 같은 패턴을 파악 
    • 선형예측, 회귀예측, 분류예측

  • 머신러닝의 종류(데이터 종류)
    • 지도학습(supervised learning) : 문제와 답을 함께 학습
    • 비지도학습(unsupervised learning) : 조력자의 도움 없 이 컴퓨터 스스로 학습. 컴퓨터가 훈련 데이터를 이용 하여 데이터들 간의 규칙성을 찾아냄
    • 실제 답(ground truth) 의 존재 여부에 따라 구분

x = 넣어준 데이터(문제, 독립변수)

y = 문제에 대한 답으로 구성된 데이터(정답, 종속변수)

x와 y 사이의 패턴 파악
새로운 x값을 넣어주면, 스스로 y값을 도출해냄


  • 회귀(regression)
    • 독립변수 x와 종속변수 y의 관계를 함수식으로 설명
    • 추세선을 표현하는 수학적 모델을 만드는 기법
    • 사용하는 데이터 : 연속형 데이터(나이, 키, 몸무게)


우상향, 선형
x(키), y(몸무게) 값을 넣어줌.
a, b를 대표하는 값을 찾아내기 위해 컴퓨터를 훈련시킴.
빨간색 = 추세선 알아내고 x 값을 넣었을 때 y값을 도출해냄

 


  • 분류(classification)
    • 데이터를 어떤 기준(패턴)에 따라 나눔
    • 이진분류(binary classification) : 2개의 값 중 1개를 분류 
    • 다중분류(multi-class classification) : 3개 이상 분류 실행
    • 사용하는 데이터 : 범주형 데이터(성별, 형태를 구분하는 것)


x(키), y(몸무게)의 패턴값을 확인해서 분포를 확인.
스스로 학습하여 확률적으로 패턴확인.
그리고 구분선(빨간색)을 그려 분류하고 성별을 분류하여 알아냄 

 


 

  • 군집(clustering)
    • 기존에 모여 있던 데이터에 대해 따로 분류 기준을 주지 않고 모델이 스스로 분류 기준을 찾아 집단을 모으는 기법
    • 비슷한 수준의 농구팀 3개 만들기
    • 사용하는 데이터 : 연속형 / 범주형 데이터
    • 비지도 학습은 분류를 하기 위해 사용하기 때문에 대부분 범주형 데이터를 주로 사용

 

집단을 나누는 것.

집단의 갯수는 따로 지정할 수 있음.

갯수에 대한 범주를 스스로 만들어 군집을 만들어 냄

중복되는 부분(이상데이터)은 해소시켜줘야 함

     > 데이터를 제거? 추가? 추가한다면 어느 군집으로 넣을 것인가? 


 

 

🐟 Machine Learning 실습

🐟 생선구분하기_K최근접이웃모델

  • 데이터 처리
    • 빙어와 도미 데이터
    • 생선의 종류를 분류(구분)하기 위한 모델 생성을 위해 독립변수와 종속변수로 데이터를 가공해야함
    • 독립변수(x) : 길이, 무게
    • 종속변수(y) : 생선종류(빙어 또는 도미)

 

  • 훈련모델 처리 절차
    1. 데이터 전처리
    2. 데이터 정규화
    3. 훈련 : 검증 : 테스트 데이터로 분류 (또는 훈련 : 테스트 데이터로 분류)
      >>  6 : 2 : 2 또는 7 : 2 : 1, 데이터가 적은 경우에는 8 : 2 또는 7 : 3 정도로 분류
    4. 모델 생성
    5. 모델 훈련(fit) (훈련 데이터와 검증 데이터 사용, 또는 테스트 데이터)
    6. 모델 평가 (모델 선정, 검증데이터)
    7. 하이퍼파라미터 튜닝
    8. 5번 ~ 6번 진행
    9. 최종 테스트(예측, predict) (테스트 데이터 또는 새로운 데이터로 사용)

 

 

I want to be good at machine learning!

 

728x90
반응형
728x90
반응형

2024 정보처리기사 일정이 올라왔습니다.

사전에 준비하셔서 좋은 결과 얻으시길 바랍니다!

🌳정기시험 수험원서 접수 방법🌳

✏️수험원서 접수방법 (인터넷 접수만 가능)
 원서접수홈페이지: www.Q-net.or.kr

 

Q-Net 자격의 모든 것

 

www.q-net.or.kr

 

✏️ 수험원서 접수시간
원서접수 첫날 10:00부터 원서접수 마지막 날 18:00까지

* 일부 등급별 원서접수 시작 시간이 구분될 수 있음

✏️ 수험원서 접수기간
필기시험 대상자: 해당 종목 필기시험 원서접수기간
실기(면접)시험 대상자: 해당 종목 실기(면접)시험 원서접수기간

🌳정보처리기사 원서접수 일정 및 시험일정🌳

 

 

🌳 기사 응시자격 안내🌳

  • 1. 산업기사 등급 이상의 자격을 취득한 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 1년 이상 실무에 종사한 사람
  • 2. 기능사 자격을 취득한 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 3년 이상 실무에 종사한 사람
  • 3. 응시하려는 종목이 속하는 동일 및 유사 직무분야의 다른 종목의 기사 등급 이상의 자격을 취득한 사람
  • 4. 관련학과의 대학졸업자등 또는 그 졸업예정자
  • 5. 3년제 전문대학 관련학과 졸업자등으로서 졸업 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 1년 이상 실무에 종사한 사람
  • 6. 2년제 전문대학 관련학과 졸업자등으로서 졸업 후 응시하려는 종목이 속하는 동일 유사 직무분야에서 2년 이상 실무에 종사한 사람
  • 7. 동일 및 유사 직무분야의 기사 수준 기술훈련과정 이수자 또는 그 이수예정자
  • 8. 동일 및 유사 직무분야의 산업기사 수준 기술훈련과정 이수자로서 이수 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 2년 이상 실무에 종사한 사람
  • 9. 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 4년 이상 실무에 종사한 사람
  • 10. 외국에서 동일한 종목에 해당하는 자격을 취득한 사람
  •  
더 확실한 방법은

마이페이지 > 응시자격 > 응시자격 자가진단

에서 본인 학력정보와 경력정보 입력 후 확인 가능합니다.

 

🌳 CBT 필기시험 시험시간🌳

 

더 자세한 정보는 큐넷 ( www.Q-net.or.kr ) 홈페이지 공지사항에 PDF 파일로 올라와있습니다.

728x90
반응형

'Certificate' 카테고리의 다른 글

정보처리기사 합격자가 되...  (7) 2024.07.15
728x90
반응형

📝문제

더보기

1. 문제 설명

 고객의 약관 동의를 얻어서 수집된 1 ~ n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

 

 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.

당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

 

모든 달은 28일까지 있다고 가정합니다.

 

다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

약관 종류 유효기간
A 6 달
B 12 달
C 3 달
 번호 개인정보 수집 일자 약관 종류
1 2021.05.02 A
2 2021.07.01 B
3 2022.02.19 C
4 2022.02.20 C
  • 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.

따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.

 

 오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.


2. 제한사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

3. 입출력 예

today terms privacies result
"2022.05.19" ["A 6", "B 12", "C 3"] ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"] [1, 3]
"2020.01.01" ["Z 3", "D 5"] ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"] [1, 4, 5]

4. 입출력 예 설명

  • 입출력 예 #1
    문제 예시와 같습니다.

  • 입출력 예 #2
약관 종류 유효기간
Z 3 달
D 5 달
번호 개인정보 수집 일자 약관 종류
1 2019.01.01 D
2 2019.11.15 Z
3 2019.08.02 D
4 2019.07.01 D
5 2018.12.28 Z

 

오늘 날짜는 2020년 1월 1일입니다.

  • 첫 번째 개인정보는 D약관에 의해 2019년 5월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 Z약관에 의해 2020년 2월 14일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 D약관에 의해 2020년 1월 1일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 네 번째 개인정보는 D약관에 의해 2019년 11월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 다섯 번째 개인정보는 Z약관에 의해 2019년 3월 27일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.

📝 작성한 코드 

terms의 약관 종류와 privacies의 약관 종류가 같은 값을 찾고 해당 privacies 값의 수집된 날짜가 오늘의 날짜 + terms의 유효기간 이내인지 확인한다. 유효기간이 지났으면 폐기한다.

import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
       List<Integer> answerList = new ArrayList<>();
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");

        for (int j = 0 ; j < terms.length; j++){            
            for (int k = 0 ; k < privacies.length; k++){
                if (terms[j].charAt(0) == privacies[k].charAt(11)) {
                    LocalDate date = LocalDate.parse(privacies[k].substring(0, 10), formatter);
                    int monthsToAdd = Integer.parseInt(terms[j].replaceAll("[^0-9]", ""));
      
                    // System.out.println("Adding months: " + monthsToAdd);
    
                    LocalDate resultDate = date.plusMonths(monthsToAdd);
                    String resultStr = resultDate.format(formatter);
                    // System.out.println(resultStr);
                    
                        if (today.compareTo(resultStr) >= 0) {
                        int index = k + 1;
                        answerList.add(index);
                        // System.out.println(index);
                    }
                }
            }
        }
        int[] answer = answerList.stream().mapToInt(Integer::intValue).toArray();
        Arrays.sort(answer);

        return answer;
    }
}

 

< 코드 설명 >

  • List<Integer> answerList = new ArrayList<>();
    answerList라는 이름의 ArrayList를 생성한다. 이 리스트에는 조건을 만족하는 index 값들이 추가된다.
  • DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
    날짜 형식을 지정
  •  for (int j = 0 ; j < terms.length; j++){
    terms 배열의 각 요소(terms[j])에 대해 다음을 수행
  • for (int k = 0 ; k < privacies.length; k++){
    privacies 배열의 각 요소(privacies[k])에 대해 다음을 수행
  • if (terms[j].charAt(0) == privacies[k].charAt(11)) {
    만약 terms의 현재 요소의 첫 번째 문자(terms[j].charAt(0))와 privacies의 현재 요소의 12번째 문자(privacies[k].charAt(11))가 같다면 다음을 수행
  • LocalDate date = LocalDate.parse(privacies[k].substring(0, 10), formatter);
    현재 privacies 요소의 첫 10자(privacies[k].substring(0, 10))를 날짜로 변환한다. 이 날짜는 앞서 생성한 DateTimeFormatter를 사용하여 LocalDate 객체로 파싱된다.
  • int monthsToAdd = Integer.parseInt(terms[j].replaceAll("[^0-9]", ""));
    Terms의 현재 요소에서 숫자만 추출하여 monthsToAdd에 저장한다. 이를 위해 정규 표현식을 사용하여 숫자가 아닌 문자를 제거하고, 남은 숫자 문자열을 정수로 변환한다.
  • LocalDate resultDate = date.plusMonths(monthsToAdd);
    추출한 월 수(monthsToAdd)를 현재 날짜(date)에 더한다.
  • String resultStr = resultDate.format(formatter);
    더한 날짜(resultDate)를 다시 문자열 형태로 변환(resultStr)한다.
  • if (today.compareTo(resultStr) >= 0) {
    today가 resultStr보다 크거나 같은지를 확인하는 조건이다. 
    • A.compareTo(B) : A.compareTo(B)는 A와 B를 비교하는 메서드
      →  A가 B보다 작으면 음수 값을 반환
      →  A가 B와 같으면 0을 반환
      →  A가 B보다 크면 양수 값을 반환
      →  이 메서드를 사용하여 날짜를 비교할 때, 반환된 값을 기반으로 조건문을 작성할 수 있다.
  •  int index = k + 1; answerList.add(index);
    만약 today가 resultStr보다 이후라면, 현재 privacies 요소의 인덱스(k + 1)를 answerList에 추가한다. 이 인덱스는 privacies 배열에서 0부터 시작하므로, 실제 인덱스는 k + 1이 된다.
  • int[] answer = answerList.stream().mapToInt(Integer::intValue).toArray();
    Stream API를 사용하여 answerList라는 Integer 객체의 ArrayList를 int 형태의 배열로 변환하는 과정을 나타낸다.
    • answerList.stream() : answerList를 Stream 형태로 변환한다. Stream은 데이터의 흐름을 나타내며, 다양한 연산(필터링, 매핑, 정렬 등)을 수행할 수 있다.
    • .mapToInt(Integer::intValue) : Stream 내의 각 요소를 int 형태로 변환한다. Integer::intValue는 Integer 객체를 int 형태로 변환하는 메서드 참조이다. 즉, 이 코드는 answerList의 각 Integer 요소를 int 형태로 변환하는 매핑 연산을 수행한다.
    • .toArray() : Stream을 배열로 변환한다. mapToInt에 의해 생성된 IntStream (int 요소의 Stream)은 toArray를 호출하면 int 배열로 변환된다.
728x90
반응형
728x90
반응형

데이터프레임 시각화 정리

1. 데이터프레임 정리

🍒행단위 합치기

  • 임시 데이터 생성
# 임시 데이터 1
data = [["Dog", 3], ["Cat", 5], ["Tiger", 2]]
index = [0, 1, 2]
columns = ["동물", "나이"]

df_temp1 = pd.DataFrame(data,
                       index=index,
                       columns=columns)
# 임시 데이터 2
data = [["집", 0], ["초원", 0], ["초원", 1]]
index = [0, 1, 2]
columns = ["사는 곳", "뿔의 갯수"]

df_temp2 = pd.DataFrame(data,
                       index=index,
                       columns=columns)

 

  • df_temp1과 df_temp2를 행단위로 합치기(행으로 추가)
result_df = pd.concat([df_temp1, df_temp2], axis=0, ignore_index=True)
result_df

 

🍒 열단위 합치기

  • 열단위로 합칠 때는 행의 갯수가 동일해야 함
pd.concat([df_temp1, df_temp2], axis=1)

 

🍒 열단위 합치기 : 키값을 이용해서 합치는 방식

  • 임시 데이터 생성
# 임시데이터
# 딕셔너리형태로 생성 
# key = columns
data1 = {"국적코드" : [1001, 1002, 1003],
       "국가" : ["한국", "미국", "인도"]}
df_info1 = pd.DataFrame(data1)

data2 = {"국적코드" : [1001, 1002, 1005],
       "인구" : [100, 200, 300]}
df_info2 = pd.DataFrame(data2)
df_info1, df_info2

  • 국적코드 같은 값들에 대해서 합치기
    - merge() : 같은 컬럼끼리 합치기
    - 기준은 df_info1
pd.merge(left=df_info1,
        right=df_info2,
        how="inner",
        left_on="국적코드",
        right_on="국적코드")

 

  • 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
    - 기준 =  df_info1
pd.merge(left=df_info1,
        right=df_info2,
        how="left",
        left_on="국적코드",
        right_on="국적코드")

  • 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
    - 기준 =  df_info2
pd.merge(left=df_info1,
        right=df_info2,
        how="right",
        left_on="국적코드",
        right_on="국적코드")

 

2. 전처리

🍒 bicycle.csv 파일 읽어들이기

df = pd.read_csv("./data/bicycle.csv",
                encoding="euc_kr")

 

🍒 결측치 확인

df.info()

 

  • 결측치 데이터 확인하기
    - 결측 데이터 값 True, 정상 데이터는 False
df.isnull()

❗결측치 처리 방법
1. 결측치가 있는 부분의 데이터를 사용할지 / 말지 결정
2. 사용 안한다면 컬럼과 행 주엥 어느 부분을 제거할지 결정
3. 사용한다면 어떻게 대체할지 결정

 대체 방법
3.1. 결측치가 있는 해당 컬럼의 평균으로 모두 대체
3.2. 범주형 데이터인 경우에는 범주의 비율대비로 대체
3.3. 숫자값인 경우 모두 0으로 대체
3.4. 결측데이터가 속한 주변 컬럼들의 데이터 유형과 유사한 데이터들의 평균으로 대체
3.5. 결측치가 있는 컬럼의 직전/직후 데이터의 평균으로 대체

 

  • 결측 데이터 현황 확인
    - 컬럼별 결측 현황
    - sum(0) : 0의 의미는 각 열의 행단위를 의미
    df.isnull().sum(0)​



    - 행별 결측 현황
    - sum(1) : 1의 의미는 각 행의 컬럼 단위를 의미
    df.isnull().sum(1)​

🍒 결측치 처리

  • 결측치가 있는 모든 행들 삭제하기
df_drop = df.dropna(axis=0)
df_drop.info()

 

  •  결측치가 있는 모든 컬럼 삭제하기
df_drop_col = df.dropna(axis=1)
df_drop_col.info()

 

  • 결측치 대체하기
# null값 0으로 대체
df["이용거리"].fillna(0)

# null값 문자로 대체
df["이용거리"].fillna("missing")

# null값 평균으로 대체
df["이용거리"].fillna(df["이용거리"].mean())

 

🍒 중복데이터 처리

  • 중복데이터가 있는 행의 위치 확인하기
    - True - 중복
df.duplicated(["이용거리"])​

 

  • 중복데이터 데이터프레임 형식으로 확인하기
    - 162개
df[df.duplicated(["이용거리"])]​

 

  • keep : 중복 중에 몇 번째 중복을 False(남겨 둘 것인지)로 할 것인지 설정
  • keep : first, last, False
    - first : 첫번째만 False (뒤쪽 중복 데이터는 모두 True), default, 생략가능
    - last : 마지막만 False (앞쪽 중복 데이터는 모두 True)
    - False : 중복데이터 전체 True 
df.duplicated(["이용거리"], keep="first")
df.duplicated(["이용거리"], keep="last")
df.duplicated(["이용거리"], keep="False")

 

  • 중복데이터 삭제
    - 중복 데이터는 사용할지 말지만 결정하면 된다.
    - 전체 행 420개에서 중복 행162개 삭제 > 258 행 남음
df.drop_duplicates(["이용거리"])

 

🍒 이상데이터 처리

  • 이상 데이터 처리 순서
    1. 결측치 처리가 선행되어야 한다.
     - 결측치도 데이터로 인식되기 때문이다.
    2. 이상데이터에는 범주형, 숫자형 데이터 처리 방식이 다르다.
     - 일반적으로 이상데이터는 숫자형 데이터 처리를 주로 한다.
    3. 이상 데이터 확인은 시각화(boxplot)를 통해서 확인한다.
    4. 실제 처리는 계산에 의해 처리된다.
  • 데이터 불러와서 전처리
### 시각화 라이브러리 :
import matplotlib.pyplot as plt

### 사용할 데이터 읽어 들이기
df = pd.read_csv("./data/bicycle_out.csv",
                encoding="euc_kr")
                
### 결측치 처리하기
df["대여거치대"] = df["대여거치대"].fillna(int(df["대여거치대"].mean()))
df["반납거치대"] = df["반납거치대"].fillna(int(df["반납거치대"].mean()))
df["이용시간"] = df["이용시간"].fillna(int(df["이용시간"].mean()))
df["이용거리"] = df["이용거리"].fillna(int(df["이용거리"].mean()))
df.info()

### 행단위 중복체크
# - 중복 없음
df.duplicated().value_counts()

 

  • 이상치 확인
    - 나이 max 값
df.describe()

 

  • 나이 데이터를 기준으로 이상데이터 시각적으로 확인하기
    - 박스플롯(boxplot)을 용해서 시각화
    - 주황색 선 : 중앙값
plt.boxplot(df["나이"])
plt.show()

 

 

 - 박스 상 선 : Max Outliers
 - 박스 하단 선 : Min Outliers
 - 이상치로 의심되는 데이터 : Max 및 Min Outlier를 벗어난 데이터들 
 - 주황색 선 : 중앙값

 

 

 

 

 

 

 

 

❗이상치 계산을 위한 그림 설명

 

 

<이상치 계산 공식>

IQR = Q3 - Q1

최대 = Q3 + (1.5 * IQR)
최소 = Q1 - (1.5 * IQR)

 

 

 

 

 

 

 

  • 이상치 계산 하기
import numpy as np

### 25% 및 75% 시점의 값 추출하기
q1, q3 = np.percentile(df["나이"], [25, 75])

### IQR 계산
iqr = q3 - q1

### max outliers 계산
upper_bound = q3 + (1.5 * iqr)

### min outliers
lower_bound = q1 - (1.5 * iqr)

upper_bound, lower_bound

 

  • 이상치로 의심되는 max 또는 min을 벗어나는 데이터 추출하기
    - max값을 벗어난다고 해도 무조건 이상치로 처리 하지 않는다. 나이를 보면 60대일 경우는 이상치로 보긴 어렵다.
    - 이상치 처리는 필터링으로 하면 된다.
df[((df["나이"] > upper_bound) | (df["나이"] < lower_bound))]

728x90
반응형
728x90
반응형

영화 긍정 / 부정 리뷰 데이터 빈도 분석 및 워드 클라우드 시각화

 

1. 데이터 전처리

🧀데이터 셋 읽어들이기

### 라이브러리 정의하기
import pandas as pd

# 데이터프레임 변수명 : df_org
file_path = "./data/df_new.csv"
df_org = pd.read_csv(file_path)
df_org


🧀 긍정 및 부정에 대해서만 각각 데이터 필터링하기

 

  • 긍정 리뷰 데이터 필터링
  • 데이터 프레임 변수명 : pos_reviews
pos_reviews = df_org[df_org["label"] == 1]
pos_reviews

 

  • 부정 리뷰 데이터 필터링
  • 데이터 프레임 변수명 : neg_reviews
neg_reviews = df_org[df_org["label"] == 0]
neg_reviews

 


🧀 리뷰데이터 전처리

  • 긍정 및 부정 리뷰 데이터에서 한글 이외 모두 제거하기
  • 정규표현식 라이브러리 활용
import re

 

  • 긍정 리뷰에서 한글 이외 모두 제거 처리하기
    • re.sub(pattern, replace, text)
      : text 중 pattern에 해당하a는 부분을 replace로 대체한다.
    • 코드에선 "ㄱ-ㅣ가-힣"가  아닌 것은 " "로 대체
    • [^] : 부정
pos_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in pos_reviews["comment"]]
pos_reviews

 

  • 부정 리뷰에서 한글 이외 모두 제거 처리하기
neg_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in neg_reviews["comment"]]
neg_reviews


🧀긍정 및 부정 리뷰 형태소 추출하기

  • 형태소 분석 라이브러리
# jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
# - konlpy는 java로 만들어진 라이브러리
import jpype

# Okt : 한국어 형태소 분석 라이브러리
# - Okt(Open Korean Text) : 대표적 한글 형태소 분석기
from konlpy.tag import Okt

 

  • 형태소 분석기 객체 생성하기
okt = Okt()
okt

 

  • 긍정 리뷰 데이터에서 명사만 추출하기
## - 명사만 담아 놓을 리스트 변수 선언
pos_comment_nouns = []

for cmt in pos_reviews["comment"] :
    #print(okt.nouns(cmt)) # 리스트 형태로 뽑아줌
    pos_comment_nouns.extend(okt.nouns(cmt))

print(pos_comment_nouns)

 

 부정 리뷰 데이터도 똑같이 생성


🧀 긍정 및 부정 리뷰 데이터에서 1글자는 모두 제외 시키기

  • 긍정 리뷰 명사 데이터에서 1글자 모두 제외하기
pos_comment_nouns2 = [word for word in pos_comment_nouns if len(word) > 1]
print(pos_comment_nouns2)

 

→ 부정 리뷰 데이터도 똑같이 생성


🧀긍정 및 부정 명사들의 빈도 분석

  • 리뷰 명사들에 대한 워드 카운트
from collections import Counter
  • 긍정 명사 워드카운트 처리
  • 딕셔너리 형태로 추출 된다.
pos_word_count = Counter(pos_comment_nouns2)
print(pos_word_count)

 

→ 부정 명사 워드카운트도 똑같이 생성


🧀긍정 및 부정 워드카운트 상위 20개 단어만 추출

  • 긍정 > 워드카운트 상위 20개 단어 추출
  • Count() 지원 함수 중에 내림차순 함수 : most_common(20) > 내림차순 후에 상위 20개 추출하는 함수임
pos_top_20 = {}

# - 1
for k, v in pos_word_count.most_common(20) :
    pos_top_20[k] = v
print(pos_top_20)

# - 2
pos_top_20 = {k:v for k, v in pos_word_count.most_common(20)}

 

→ 상위 20개 부정 명사 워드카운트도 똑같이 생성

 

 

2. 데이터 시각화(1) - 막대 그래프

🧀긍정 및 부정 상위 20개 명사에 대한 빈도 시각화

  • 시각화 라이브러리
### 시각화 라이브러리
import matplotlib.pyplot as plt

### 폰트 설정 라이브러리
from matplotlib import font_manager, rc

### 폰트 설정
plt.rc("font", family="Malgun Gothic")

### 마이너스 기호 설정
plt.rcParams["axes.unicode_minus"] = False

 

  • 긍정 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10, 5))

### 제목 넣기
plt.title(f"긍정 리뷰의 단어 상위 (20개) 빈도 시각화", fontsize=17)

### 막대그래프 그리기
for key, value in pos_top_20.items() :
    ### 영화라는 단어는 의미가 없을 것으로 여겨지기때문에 제외 시키기
    if key == "영화" :
        continue
        
    plt.bar(key, value, color="lightgrey")

### x축과 y축 제목 넣기
plt.xlabel("리뷰 명사")
plt.ylabel("빈도(count)")

### x축 각도 조절
plt.xticks(rotation=70)

### 그래프 나타내기
plt.show()

 

→ 부정 리뷰의 막대 그래프도 똑같이 생성

 

3. 데이터 시각화(2) - 워드 클라우드

🧀긍정 및 부정 리뷰 단어 워드클라우드(wordcloud) 시각화

  • 워드클라우드 라이브러리
from wordcloud import WordCloud
  • 긍정 리뷰 단어 워드 클라우드 시각화
plt. figure(figsize=(8, 8))

### 그래프 제목
plt.title("[긍정] 리뷰 단어 워드클라우드 시각화")

### 사용할 폰트 파일 지정하기
# font_path = "C:/Windows/Fonts/malgunsl.ttf"
font_path = "C:/Users/user/Desktop/KCC-Ganpan.ttf"

### 워드클라우드 속성 설정
wc = WordCloud(
                ### 폰트 지정
                font_path=font_path,
                ### 배경색 지정
                background_color="ivory",
                ### 그래프 너비
                width=800,
                ### 그래프 높이
                height=600
            )

### 워드클라우드 그래프에 데이터 넣기
# - generate_from_frequencies() : 워드클라우드 이미지로 반환해줌
# cloud = wc.generate_from_frequencies(pos_top_20)

### 긍정 전체 단어 넣어보기
cloud = wc.generate_from_frequencies(pos_word_count)

### 워드클라우드 이미지 보여주기
plt.imshow(cloud)

### x, y좌표축 제외시키기
plt.axis("off")

### 저장하기
plt.savefig("./img/긍정_리뷰_단어_워드클라우드_시각화.png")

plt.show()

 

→ 부정 리뷰의 워드클라우드도 똑같이 생성

728x90
반응형
728x90
반응형

아래 글에 이어서 진행

https://mzero.tistory.com/98

 

[데이터 수집][Crawling] 영화 데이터 전처리 및 시각화

영화 데이터 전처리 및 시각화 1. 외부파일 읽어들이기 제목 : "title" , 평점 : "score", 리뷰 : "comment", 긍정/부정 : "label" ### 라이브러리 정의 # - 행렬데이터 처리 라이브러리 import pandas as pd file_path =

mzero.tistory.com

 

6. 영화별 평점 평균 시각화 (3) - 원형 그래프 그리기

🌳긍정, 부정, 기타에 대한 원형 그래프 시각화하기

fig, axs = plt.subplots(5, 2, figsize=(15, 25))

axs = axs.flatten()

### 빈도 비율별 색상 정의
colors = ["pink", "gold", "whitesmoke"]

### 라벨 정의(파이 쪼개기)
labels_dict = {0 : "부정(1~4점)", 1 : "긍정(8~10점)", 2 : "기타(5~7점)"}

### 긍정/부정에 대한 원형 그래프 그리기
for title, ax in zip(avg_score.keys(), axs) :
    ### 영화별 건수 필터링하기
    num_reviews = len(df_new[df_new["title"] == title])
    # print(f"num_reviews = {num_reviews}")

    ### label 컬럼의 범주별로 갯수 필터링 하기
    # df_new["title"]==title 이 값을 만족하는 데이터만 추출
    values = df_new[df_new["title"]==title]["label"].value_counts()
    #print(f"values = {values}")

    ### 원형 그래프에 표시할 라벨값 정의하기
    # - 영화별로 긍정 또는 부정 또는 기타 중에 하나라도 없으면 처리가 필요함
    label_list = df_new[df_new["title"]==title]["label"].unique()
    labels=[]
    for k in label_list : 
        ### 영화별 실제 존재하는 긍정/부정/기타 라벨 정의하기
        labels.append(labels_dict[k])
    
    ### 각 그래프 제목 넣기
    ax.set_title(f"{title} ({num_reviews}명)", fontsize=15)
    
        ### 원형(pie) 그래프 그리기
    ax.pie(values, 
          # 원형그래프에 표시할 라벨 지정
          labels = labels,
          # 원형 그래프에 표시할 값의 소숫점 자리수 지정
          autopct = "%1.1f%%",
          # 원형 그래프 각 영역의 색상 지정
          colors=colors,
          # 그림자 효과 지정하기
          shadow=True,
          # 그래프의 시작위치를 12시 방향으로
          startangle=90)

### 이미지 저장하기
plt.savefig("./img/긍정_부정_원형그래프_시각화.png")    

plt.show()

 

🌳 최종 전처리된 데이터는 파일로 관리하기

  • 파일명 df_new.csv
  • 인덱스 미포함
  • 저장 위치 : data 폴더
df_new.to_csv("./data/df_new.csv", index=False)

728x90
반응형

+ Recent posts