데이터 취업 스쿨 스터디 노트 - 알고리즘 문제풀이, CCTV (7주차)

박해민·2024년 4월 22일

데이터 분석

목록 보기
7/8

◆ 콘다에서 jupyter notebook / VScode 실행하기

 (1) 주피터 실행 
     - conda activate ds_study
     - jupyter notebook

 (2) VScode 실행
     - cd Documents/ds_study
     - code . 

◆ matplotlib 한글 설정하기

- import matplotlib.pyplot as plt
  %matplotlib inline
  plt.title("데이터사이언스")

- from matplotlib import font_manager

  f_path = "C:\Windows\Font\malgun.ttf"
            font_manager.FontProperties(fname=f_path).get_name()

- from matplotlib import rc
  rc("font", family="Arial Unicode MS")
  
  import matplotlib as mpl  # 기본 설정 
  
  

◆ matplotlib 한글 설정하기 (in Colab)

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
%matplotlib inline

!apt-get update -qq
!apt-get install fonts-nanum* -qq

fe =               
 fm.FontEntry(fname=r'/usr/share/fonts/truetype/nanum/NanumGothic.ttf', name='NanumGothic')
fm.fontManager.ttflist.insert(0, fe)  
plt.rcParams.update({'font.size': 10, 'font.family': 'NanumGothic'})

plt.title("데이터사이언스");

◆ 모듈 사용

 - import MODULE:
 - import MODULE as md (앞으로 md로 명칭하겠다~)
 - froma MODULE import function (모듈 속 function 함수만 사용하겠다~~)

   ^구조^ : column Name / Index / Values / Column

◆ 서울시 CCTV 현황 분석) 데이터 읽기

 (1) 데이터 불러오기
     - import panda as pd
     - CCTV_Seoul = pd.read_csv("C:/Users/USER/Documents/ds_study/data/01. Seoul_CCTV.csv")
       ※ 주소 오류날 시 해당 파일 속성의 주소 리체크
       ※ 한글이 깨질경우 : CCTV_Seoul = pd.read_csv("주소", encoding="utf-8")
       ※ 텍스트 파일 불러오기 : pd.read_csv("C:파일주소/파일명.txt", sep= "\t", engine="python", encoding="utf-8")

 (2) head() & tail()
      - CCTV_Seoul.head()      ← 불러온 데이터의 상단 5개의 데이터를 보여줌
        CCTV_Seoul.head(7)     ← 불러온 데이터의 상단 7개의 데이터를 보여줌
      - CCTV_Seoul.tail()      ← 불러온 데이터의 하단 5개의 데이터를 보여줌
                                                                         (전체 데이터 행의 개수 확인 가능)
 (3) 컬럼명 조회 & 변경
      - CCTV_Seoul.columns               ← 컬럼명이 리스트 형태로 반환
      - CCTV_Seoul.columns[0]            ← 첫항목 기관명 반환
      - CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0], "구별"}, inplace=True)
           ← 0번 컬럼명을 구별로 변경한뒤,inplace=True로 그 값을 원본 데이터에도 저장

 (4) 타 엑셀파일 불러오기
     - pop_Seoul = pd.read.excel("../data/01. Seoul_Population.xls")
     - pop_Seoul = pd.read.excel(
                   "../data/01. Seoul_Population.xls", header=2, usecols="B, D, G, J, N"))
                       ← 옵션 정해 불러오기 (header 몇번째부터 불러올지, 어떤 칼럼을 불러올지 체크)
      - pop_Seoul.rename(
                      columns={
                              pop_Seoul.columns[0]: "구별",
                              pop_Seoul.columns[1]: "인구수",
                              pop_Seoul.columns[2]: "한국인",
                              pop_Seoul.columns[3]: "외국인",
                              pop_Seoul.columns[4]: "고령자",},
                        inplace=True
                        )

          pop_Seoul.head()                                         ← 각 인덱스별 칼럼명을 수정한뒤 다시 반환
   

◆ 서울시 CCTV 현황 분석 ) pandas 기초

(1) 문서화
    - # 블라블라~      ← 내용 앞뒤로 esc를 붙여서  타이핑 내용 문서화 / #이 더 붙을수록 글자가 작아짐

(2) 불러오기
    - import pandas as pd
      import numpy as np
  • 메소드 괄호 안에서 shift tap : 해당 데이터타입의 정보 확인 가능
  • --- 후 문법 실행 시 실선 생김

◆ series 데이터 타입

       # index와 value로 이루어짐 / 1개의 데이터 타입만 가질 수 있음

       - pd.Series([1, 2, 3, 4], dtype=np.float64)         ← 인덱스 1~4까지 소수형 숫자를 반환 / int와 object(str) 형태로도 반환 가능
          
          ex)))      pd.Series([1, 2, 3, 4], dtype=str)
                        pd.Series(np.arrat[1, 2, 3]))                   ← int 타입 행렬 데이터 반환
                        pd.Series({"Key" : "Value"})
                        pd.Series([1, 2, 3, 4, "5"])                      ← 전체가 str 타입으로 반환됨
  
      (4) 날짜 데이터 반환
            - pd.date("20210101", period=6)           ← 시작일 20210101부터 순차적으 로 날짜 6개 반환                     

◆ DataFrame

- 형태: pd.DataFrame(data, index, columns)
- np.random.randn(6, 4)                    ← 표준정규분포에서 샘플링한 난수 생성 (6 * 4 행렬)
- pd.dataframe(data, index=dates, columns=["A", "B", "C", "D"])
   ↑ 인덱스가 dates인 컬럼 A, B, C, D 데이터 만들기
           # date와  randn 인덱스 개수는 맞춰줘야 함

◆ DataFrame 정보 탐색

- df.head()  /    df.tail()
-리스트 형으로 반환 | df.index / df.columns / df.values
- df.info()
- df의 기술 정보 확인 | df.describe()
  * count, mean, std, min, 25% 등 확인 가능

  (1) 데이터 정렬
       - df.sort_values(by="???")                ← by 기준으로 데이터 정렬 / 기본 오름차순으로 정렬
       - df.sort_values(by="???"), head(5)  ← by 기준, 오름차순으로 데이터 정렬 후 5개값만 반환 
        - df.sort_values(by="???", ascending=False)    ← by 기준으로 데이터 정렬 / 내림차순으로 정렬

  (2) 선택
        - df["A"]             ← A 컬럼의 index와 value 반환 (series 데이터 타입)
                                 / str 데이터 타입은 df.A 이런 식으로도 반환 가능
        - df[["A", "B"]]      ← 2개 이상 선택 시 리스트 형태로 담아야함

  (3) 슬라이싱
        - offset index 기능
          :  df[n:m]          ← n부터 m-1까지 선택해서 슬라이싱
                                 (인덱스 or 칼럼 이름으로 슬라이스 하는 경우는 끝 문자까지 포함)

        - loc (location 기능)  
           : index 이름으로 특정 행, 열 선택 
           : df.loc[:, ["A", "B"]]                                        ← A와 B 컬럼만 가져오기
           : df.loc["20210102":"20210104", "A":"B"]      ← 2~4일에 해당하는 A~D컬럼 가져오기


        - iloc 기능
          : 컴퓨터가 인식하는 인덱스 값으로 선택
          : df.iloc[3:5, 0:2]       <-0~4인덱스에 해당하는 칼럼 0~1까지의  가져오기

        - condition
          : df["A"] > 0         ← A컬럼에서 0보다 큰 숫자 (양수) 선택   (결과값: bool 값으로 반환)
          : df[df["A"] > 0]    ← 마스킹해서 전체 데이터에서 A칼럼이 0보다 큰걸 반환 

   (4) 컬럼 추가
         - df["E"] = ["zero", "one", "two", "three", "four", "five"]
           <- 새로 추가하는 E 컬럼에 zero~five에 해당하는 행 추가
              (이때 행은 기존있던 다른 컬럼들과 개수가 동일해야 함)

          - 동일하게 다시 실행 시 삽입했던 컬럼 수정 가능 (덮어쓰기)

   (5) isin() - 특정 요소 있는지 확인하기
        - df["E"].isin(["two", "three"])        ← bool형 결과값 반환
        - df[df["E"].isin(["two", "three"])]    ← 전체 마스킹 시 true 값만 반환해줌

   (6) del(), drop - 특정 컬럼 제거
       - del df["E"]                     ← E라는 컬럼 제거
       - df.drop(["D"], axis=1)          ← 세로 축에 있는 D 컬럼 제거
       - df.drop(["20210104"])           ← 가로 축에 있는 20240104 행 제거

        ※ axis는 가로세로 축을 의미 / axis = 0 (가로), axis = 1 (세로)

   (7) apply() - 전체 데이터에 일괄적으로 특정 함수값 적용
       - df["A"].apply("sum")         ← 덧셈 값 반환
       - df["A"].apply("mean")        ← 평균 값 반환
       - df["A"].apply("max")         ← 덧셈 값 반환
       - df["A", "D"].apply("sum")    ← 덧셈 값 반환
       - df["A"].apply(np.sum)        ← 덧셈 값 반환
       - def plusminus(num):
             return "plus" if num > 0 else "minus"
         df["A"].apply("plusminus") ← 함수를 만들고 바로 그 함수값을 반환
          
         df["A"].apply(lambda num: "plus" if num > 0 else "minus")             ← 위와 동일

◆ 인구현황 데이터 탐색

(1) 중복없이 나타난 고유 값들만 반환
    - pop_Seoul["구별"].unique(
    - len(pop_Seoul["구별"].unique())         ← 고유 값들의 개수 확인

◆ 데이터 생성하기

(1) 딕셔너리 안에 리스트 형태로 데이터 생성
    - left = pd.DataFrame:({
                "key" : {["K0", "K4", "K2", "K3"]
                "A" : ["A0", "A1", "A2", "A3"],
                "B" : ["B0", "B1", "B2", "B3"]
      })
      left
      -> key, A, B를 각각 칼럼으로 가진 left 데이터 프레임 생성

(2) 리스트 안에 딕셔너리 형태로 데이터 생성
    - right = pd.DataFrame:([
           {"key":"K0", "C":"C0", "D":"D0"},
           {"key":"K1", "C":"C1", "D":"D1"},
           {"key":"K2", "C":"C2", "D":"D2"},
           {"key":"K3", "C":"C3", "D":"D3"},     
     ]) 
          -> key, C, D를 각각 칼럼으로 가진 right 데이터 프레임 생성

◆ pandas에서 데이터 프레임 병합하기

 (1) pd.merge(left, right)
     - 두 데이터 프레임에서 키값 (기준이 되는 칼럼 or index)을 기준으로 잡고 병합하는 방법
       ※ 기준 키값은 두 데이터 프레임에 모두 포함되어 있어야 함
     - pd.merge(left, right, on='"key") 
       = pd.merge(left, right, how="inner", on='"key")         
         ↑ 공통된 key 칼럼을 기준으로 두 데이터의 공통 값(교집합)만 추출
      - pd.merge(left, right, how='left', on='"key")         <- left 데이터의 key 칼럼을 기준으로 두 데이터의 공통값 추출
      - pd.merge(left, right, how="outer", on='"key")   
        ↑ left 데이터의 key 칼럼을 기준으로 두 데이터의 모든값(합집합) 추출
           ※ 값 없는 부분은 NaN으로 출력
           
   (2) reset_index() : 기본 인덱스 (0, 1, 2.. 값으로 재정렬)

   (3) set_index() : 인덱스 변경
       - 선택한 칼럼을 데이터 프레임의 인덱스로 지정
       - data_result.set_index("구별", inplace=True)       ← data_result 데이터의 인덱스를 구별 칼럼으로 지정


   (3) corr(): 상관계수
       - data_result.corr()         ← 상관계수 값 반환 
       - 상관계수가 0.2 이상인 데이터를 비교
       - data_result["CCTV비율"] = data_result["소계"] / data_result["인구수"]
         data_result["CCTV비율"] = data_result["CCTV비율"] * 100

0개의 댓글