데이터 취업 스쿨 스터디 노트 - (8주차)

박해민·2024년 5월 1일

데이터 분석

목록 보기
8/8

[8주차 Study Note]

◆ matplotlib 활용

(1) 기본 그래프 그리기 (figure / plot / show)
    - import matplotlib.pyplot as plt
      from matplotlib import rc

      rc("font", family="Malgun Gothic")
      matplotlib inline 혹은 get_ipython().run_line_magic("matplotlib", "inline")
       ↑ 주피터 내에서 그래프를 그리면 나타나게 하는 코드

      plt.figure(figsize=(10, 6))           ← x축, y축 도화지 사이즈 지정해주기
      plt.plot([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 1, 2, 3, 4, 2, 3, 5, -1, 3])    ← x축, y축 데이터 값 지정
      plt.show()
              
(2) 그래프 기초
    1) 삼각함수 그리기    / np.arange(a, b, s) : a부터 b까지 s 간격
                                                   np.sin(value)

      - import numpy as np

        t = np.arange(0, 12, 0.01)
        y = np.sin()

        plt.figure(figsize=(10, 6))     ← 10 x 6 도화지 사이즈 지정
        plt.plot(t, np.sin(t))      ← 가로 12에 세로는 sin값 출력
        plt.plot(t, np.cos(t)])     ← 가로 12에 세로는 cos값 출력
        plt.show()

     2) 격자무늬 추가
        - plt.grid(True) 

     3) 그래프 제목 추가
        - plt.title("~~~")

     4) x축, y축 제목 추가
        - plt.xlabel("~~~")
        - plt.ylabel("~~~")

     5) 주황, 파랑 선 데이터 의미 구분
        - plt.legend(labels=["sis", "cos"])

          = plt.plot(t, np.sis(t), label="sis")
            plt.plot(t, np.cos(t), label="cos")
            ※ 데이터의 의미 구분은 그래프 상 공백에 자동으로 그려짐

        - plt.legend(loc="upper right") 추가
          ↑ 우측 상단으로 위치 지정하여 데이터 구분 의미 삽입

     6) 함수에 담아서 사용
        - def drawgraph():
              ~~~~~

        
(3) 그래프 커스텀
    예제 1) plt.figure(figsize=(10, 6))
           plt.plot(t, t, "r--")            ← red 색상 / -- 형태의 선 생성 
           plt.plot(t, t ** 2, "bs")        ← blue 색상 / square 형태의 선 생성 
           plt.plot(t, t ** 3, "g^")        ← green 색상 / 삼각형(^모양) 형태의 선 생성 
           plt.show()

    예제  2) t = list(range(0, 7))
        y = [1, 4, 5, 8, 9, 5, 3]
        plt.figure(figsize=(10, 6))
        plt.plot(
                 t,
                 y,
                 color="green",              
                 linestyle="dashed"           ← 점선 형태로 출력 (실선은 -)
                 marker="0",                     ← 선 사이 값들이 마킹됨
                 markerfacecolor="blue",
                 markersize=15
                 )
        
        plt.xlim([-0.5, 6.5])                 ← 도화지 (여백까지 설정)
        plt.ylim([0.5, 9.5])                  ← 도화지 (여백까지 설정)
        plt.show()

     예제 3) scatter plot
             - t = np.array(range(0, 10))
               y = np.array([9, 8, 4, 3, 4, 6]) 
                   
               def drawGraph(): 
                   plt.figure(figsize=(10, 6))
                   plt.scatter(t, y)          ← t * y 값을 기준으로 마커만 출력
                   plt.show()
                   
               *** marker 옵션 변경 시
                   :  colormap = t

                      def drawGraph(): 
                          plt.figure(figsize=(10, 6))
                          plt.scatter(t, y, s=50, c=colormap, marker=">")                         
                          ↑ t * y 값을 기준으로 마커만 출력 / s는 마커 사이즈
                          plt.colorbar()
                          plt.show()


 (4) pandas에서 matplotlib 사용
     - data_result["인구수"].plot(kind="bar", figsize=(10, 10))
       ↑  인구수 칼럼에 대한 세로 바 형태의 그래프 출력
           (가로바 출력시 kind="barh"로 넣어주면 됨)


***공식 홈페이지의 갤러리 확인 시 그릴 수 있는 그래프의 모양 확인 가능***

◆ CCTV 데이터와 그래프로 표현하기

  (1) import matplotlib.pyplot as plt       
      (= from matplotlib import rc)

      plt.rcParams["axes.unicode_minus] = False 
      ↑  부호로 한글이 깨지는 현상을 방지하기 위 설정 코드
      rc("font", family="Malgun Gothic")

      get_ipython().run_line_magic("matplotlib", "inline")       
      (= matplotlib inline)


  (2) '소계' 컬럼 시각화
      def drawGraph():
          data_result["소계"].sort_values().plot(
                                                 kind="barh", grid=True, title="가장 CCTV가 많은 구", figsize=(10, 10)):
   ↑ 뒤에 세미콜론 없으면 그래프 상단에 문장이 뜸
      drawGraph()

***pandas dataframe 등 pandas 홈페이지에서 확인 가능***

◆ 데이터의 경향 표시

 (1) Numpy 이용 1차 직선 만들기
     - np.polyfit(): 직선을 구성하기 위한 계수 계산
     - enp.poly1d(): polyfit으로 찾은 계수를 활용해 파이썬에서 사용 가능한 함수로 만들어주는 기능

     (예시) fpl = np.polyfit(data_result["인구수"], data_result["소계"], 1)
           f1=  np.polyid(fpl)
           fa(400000)
           => 결과값 출력
           ↑ 인구가 40만인 구에서 서울시 전체 경향에 맞는 적당한 CCTV 수는?   - > 결과값

     - np.linspace(a, b,n ) : 경향선을 그리기 위한 x 데이터  (a~b까지 n개의 등간격 데이터) 생성

◆ 데이터 강조하기

 (1) 색상 강조 (오차 범위가 높음 기준)
     - from matplotlib.colors import ListedColormap       <-colormap 사용자 지정

       color_step = ["색상 코드", "색상 코드", "색상 코드", "색상 코드"]
       my_cmap = ListedColormap(color_step)

       (scatter 코드에 색상 내용 추가)

       plt.scatter(data_result["인구수"], data_result["소계"], s=50, c=data_result["오차"], cmap=my_cmap)

  (2) 오차값이 큰 구에 텍스트 달아주기
       plt.text(df_sort_f["인구수"][0] * 1.02, df_sort_f["소계"][0] * 0.98, df_sort_f.index[0], fontsize=15)
       **** 각 좌표에 값을 곱하면 텍스트와 좌표 사이 간격이 벌어져 더 보기 편함

  (3) 오차값 상위 5개만들기
      - for n in range(5):
            plt.text(
                     df_sort_f["인구수"][n] * 1.02,              < -x 좌표
                     df_sort_f["소계"][n] * 0.98,                 < -y 좌표
                     df_sort_f.index[n], 
                     fontsize=15
                      )

***상위 5개는내림차순, 하위 5개는 오름차순으로 구하면 됨***

  (4) 프로젝트 결과 저장
        - data_result.to_csv("../data/01. CCTV_result.csv", sep=",", encoding="utf-8)

[서울 범죄현황 데이터 분석]

◆ 강남 3구 범죄현황 데이터 읽어오기

 - import numpy as np
   import pandas as pd

   crime_raw_data = pd.read_csv("../data/02. crime_in_Seoul.csv", thousands=",", encoding="euc-kr)                    <- thousands가 문자로 읽힐 수 있기에 숫자로 읽도록 설정
   crime_raw_data.head() 

◆ pivot table 활용

 - Index, culumns, values, aggfunc

(1) Index 설정
    - pd.pivot_table(df, index="Name")                             ← Name 컬럼을 인덱스로 설정
    - pd.pivot_table(df, index=["Name", "Rep"])                    ← 멀티 인덱스로 설정
    - pd.pivot_table(df, index=["Name", "Rep"], values="Price")    ← 멀티 인덱스와 밸류값 설정
    - df.pivot_table(index=["Name", "Rep"], values="Price", aggfunc=np.sum)    ← Price 컬럼에 sum 연산 적용 (sum 뒤에 len 붙으면 개수 추가로 컬럼 삽입 가능)


(2) columns 설정
    - df.pivot_table(index=["Name", "Rep"], values="Price", columns="Product", aggfunc=np.sum)                                ← Product를 컬럼으로 지정
    - df.pivot_table(index=["Name", "Rep"], values="Price", columns="Product", aggfunc=np.sum, fill_value=0)                  ← Nan값 설정 : fill_value
    - df.pivot_table(index=["Name", "Rep"], values="Price", columns="Product", aggfunc=np.sum, fill_value=0, margins=True)    ← margins로 전체 통합 총계를 추가

◆ 서울시 범죄현황 데이터 정리

(1) 다중 컬럼에서 특정 컬럼 제거
    - crime_station.columns = crime_station.columns.droplevel([0, 1])

◆ python 모듈 설치

mac(m1)은 pip 명령으로 쓰는걸 추천

(1) pip 명령
    - 파이썬 공식 모듈 관리자
    - pip.list
     (= get ipython().system("pip list"))
    - pip install Module_name             ← 모듈 설치
    - pip uninstall Module_name           ← 모듈 삭제

(2) conda 명령
    - 위의 코드 3개와 동일
    - conda install -c channel_name module_name      ← 지정된 배포 채널에서 모듈 설치

◆ Google API 모듈 설치

 (1) 터미널에서 설치
     - conda install -c conda-forge googlemaps

 (2) 주피터 노트북에 불러오기
     - import googlemaps
 
       gmaps_key = "생성한 api 키"
       gmaps = googlemaps.Client(key=gmaps_key)

       gmaps.geocode("서울영등포경찰서", language="ko")

◆ Pandas 반복문

 - 반복문 만들때 itterows() 옵션 사용 
   (받을 때, 인덱스와 내용으로 나누어 받는 것만 주의)

◆ Google maps로 데이터 정리

 - print(tmp[0].get("geometry")["값"], ["값"]        <- 원하는 좌표값 찾기
 - tmp[0].get("formatted_address).split()           <- 띄어쓰기로 나눠져 있는 값을 리스트 형태로 반환 (각 인덱스값 추출이 가능해짐)

 - for idx, rows in crime_station.iterrows():
       station_name = "서울" + str(idx) + "경찰서"
       print(station_name)
       => 서울00경찰서로 출력

0개의 댓글