스터디노트(EDA 1)

zoe·2023년 3월 28일
0

작성한 코드 보면서 다시보기!

02 - 03 서울시 CCTV 현황 분석 : 데이터 읽기

https://data.seoul.go.kr/dataList/419/S/2/datasetView.do
https://data.seoul.go.kr/dataList/OA-2734/F/1/datasetView.do

  • import : 원하는 모듈이 설치되어 있다면 import 명령을 통해 사용하겠다고 선언
    - import MODULE : MODULE을 사용하겠다 (사용 : MODULE.function)
    - import MODULE as md : MODULE을 사용하는데 md라는 이름으로 부르겠다 (사용 : md.function)
    - from MODULE import function : MODULE에 포함된 function 함수만 사용 (사용 : function)
  • encoding = "utf-8" : 한글을 깨지지 않도록 encoding 설정 (필수)
  • !conda install -y pandas : 판다스 파일 설치
  • ../data/~~ : .. → 상위 폴더로 이동
  • head() : 위의 데이터가 보여짐 기본 값은 5 rows, 숫자 입력시 숫자만큼의 rows만 볼 수 있음
  • tail() : 끝에 있는 데이터가 보여짐, 기본 값은 5 rows
  • columns : 컬럼을 볼 수 있음
    - 컬럼의 특정 항목 조회, 리스트 index 이용, 리스트로 반환
  • python에는 엑셀과 같은 병합기능이 없어 다 풀어져서 보여짐
  • rename(colums = {변경할 컬럼(인덱스표시):변경할 컬럼명}) : 컬럼의 이름 변경
  • inplace = True : 변경 사항 저장
  • head() : 자료를 읽기 시작할 행(header) 지정
  • header = n : n번째 행부터 가져오기
  • usecols = " a, b, c..." : 읽어올 엑셀의 컬럼 지정(선택한 열만 가져오기)

04 - 06 서울시 CCTV 현황 분석 : Pandas 기초

  • Pandas : Python에서 R 만큼의 강력한 데이터 핸들링 성능을 제공하는 모듈
    - 단일 프로세스에서는 최대 효율
    - 코딩이 가능하고 응용 가능한 엑셀로 받아들여도 됨
  • ※ 함수()에서 () 사이에 커서를 두고 shift + tab을 누르면 함수 관련 설명이 보임
  • Series : index와 value로 이루어짐, 한 가지 데이터 타입만 가질 수 있음
    - Series : Pandas의 데이터형을 구성하는 기본
  • ※ pandas는 통상 pd, numpy는 통상 np
  • DataFrame : pd.Series() → index, value / pd.DataFrame(index, value, column) → index, value, column
    - pd.Series({"key":"value"}) : dataframe 형태에 key → index, value → 값으로 입력됨
    - 하나의 값이라도 str 형태가 있으면 dafaframe type = object가 됨
  • date_range("날짜", periods = n) : 날짜를 이용하여 dataframe 생성 가능
  • np.random.randn() : 표준정규분포에서 샘플링한 난수 생성
  • .head() : 상위 5개의 데이터 보여줌, () 안에 숫자를 입력하면 입력한 숫자만큼의 rows를 보여줌
  • .tail() : 하위 5개의 데이터 보여줌, () 안에 숫자를 입력하면 입력한 숫자만큼의 rows를 보여줌, 하위의 마지막 rows의 개수를 볼 수 있음
  • .index : 리스트 형태로 index 값 반환
  • .columns : 리스트 형태로 index 값 반환
  • .values : 리스트 형태로 value 값 반환
  • .info() : dataframe의 기본 정보 확인 가능, 각 컬럼의 크기와 데이터 형태를 확인
  • .describe() : dataframe의 기술통계정보 확인
  • .sort_values() : 특정 컬럼(열)을 기준으로 데이터를 정렬
  • inplace = True : 데이터 변경사항 저장
  • [한 개의 컬럼 선택]
    - dataframe.선택열 : dataframe["선택열"]와 같음, 단, 선택하는 열의 이름이 문자일 경우만 해당됨,
    - 선택된 열이 하나일 땐 data type = Series임, (dataframe = series가 모여서 만들어진 것)
  • [두 개 이상 컬럼 선택]
    - dataframe[["선택열1", 선택열1"]] : 괄호를 안에 하나 더 해주어야 함
  • [offset index]
    - [n:m] : n부터 m - 1 까지, 인덱스나 컬럼의 이름으로 slice 하는 경우는 끝을 포함
  • loc : location의 약자, index 이름으로 특정 행, 열을 선택
  • iloc : integet location, 컴퓨터가 인식하는 인덱스 값으로 선택
  • df["A"]>0 : A 컬럼에서 0보다 큰 숫자(양수)만 선택
  • df[df>0] : 조건에 부합하지 않는 데이터는 NaN 값으로 반환 (NaN : Not a Number)
  • 컬럼 추가 : 기존 컬럼이 없으면 추가, 있으면 수정이 됨
  • isin() : 특정 요소가 있는지 확인
  • del dataframe["선택열"] : del 특정 컬럼 삭제
  • dataframe.drop([지울컬럼], axis = 0) : drom 특정 컬럼 삭제
    - axis = 0 → 가로, axis = 1 → 세로
  • apply() : 함수 적용 메서드



# np.random.randn() : 표준정규분포에서 샘플링한 난수 생성


data = np.random.randn(6,4)
data
dates=pd.date_range("20210101", periods = 6)
dates
df = pd.DataFrame(data, index = dates, columns=["A","B","C","D"])
# df.head() : 상위 5개의 데이터 보여줌, () 안에 숫자를 입력하면 입력한 숫자만큼의 rows를 보여줌


df.head()
# df.tail() : 하위 5개의 데이터 보여줌, () 안에 숫자를 입력하면 입력한 숫자만큼의 rows를 보여줌, 하위의 마지막 rows의 개수를 볼 수 있음


df.tail()
# df.index : 리스트 형태로 index 값 반환

df.index
# df.columns : 리스트 형태로 index 값 반환

df.columns
# df.values : 리스트 형태로 value 값 반환

df.values
# df.info() : dataframe의 기본 정보 확인 가능

df.info()
# df.describe() : dataframe의 기술통계정보 확인

df.describe()
df
# df.sort_values() : 특정 컬럼(열)을 기준으로 데이터를 정렬
# inplace = True : 데이터 변경사항 저장

df.sort_values(by="B", ascending=False, inplace = True)
df
# 한 개의 컬럼 선택

# dataframe.선택열 : dataframe["선택열"]와 같음, 
# 단, 선택하는 열의 이름이 문자일 경우만 해당됨, 
# 선택된 열이 하나일 땐 data type = Series임, (dataframe = series가 모여서 만들어진 것)


df["A"]
type(df["A"])
# dataframe.선택열 : dataframe["선택열"]와 같음, 
# 단, 선택하는 열의 이름이 문자일 경우만 해당됨, 

df.A
#### 두 개 이상 컬럼 선택

#dataframe[["선택열1", 선택열1"]] : 괄호를 안에 하나 더 해주어야 함

df[["A","B"]]
#### offset index

# [n:m] : n부터 m - 1 까지
# 인덱스나 컬럼의 이름으로 slice 하는 경우는 끝을 포함
df
df[0:3]
df["20210101":"20210104"]
# loc : location의 약자
# index 이름으로 특정 행, 열을 선택

df.loc[:,["A","B"]]
df.loc["20210102":"20210104",["A","D"]]
df.loc["20210102":"20210104","A":"D"]
df.loc["20210102",["A","B"]]
# iloc : integet location
# 컴퓨터가 인식하는 인덱스 값으로 선택

df.iloc[3]
df.iloc[3, 2]
df.iloc[3:5,0:2]
df.iloc[[1, 2, 4],[0,2]]
df.iloc[:,1:3]
df
# A 컬럼에서 0보다 큰 숫자(양수)만 선택

df["A"]>0
df[df["A"]>0]
df[df>0] # 조건에 부합하지 않는 데이터는 NaN 값으로 반환 (NaN : Not a Number)
df
df["E"] = ["one","one","two","three","four","six"]
df
# isin() : 특정 요소가 있는지 확인

df["E"].isin(["two"])
df["E"].isin(["two","five"])
df["E"].isin(["two","five","three"])
# 조건에 부합하는 데이터만 반환

df[df["E"].isin(["two","five","three"])]
# del dataframe["선택열"] : del 특정 컬럼 삭제

del df["E"]
df
# dataframe.drop([지울컬럼], axis = 0) : drom 특정 컬럼 삭제,
# axis = 0 → 가로, axis = 1 → 세로

df.drop(["D"], axis = 1)
df.drop(["20210104"]) # index 값을 입력하면 해당 행 삭제
df
df["A"].apply("sum")
df["A"].apply("mean")
df["A"].apply("min"), df["A"].apply("max")
df[["A","D"]].apply("sum")
df["A"].apply(np.sum)
df["A"].apply(np.mean)
df["A"].apply(np.std)
df.apply(np.sum) # 전체 설정도 가능
df
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") # ★

07 - 08 CCTV 데이터와 인구현황 데이터 훑어보기

  • unique() : 중복된 값을 없앤 모든 값 반환
  • len() : 길이 반환

09 - 11 Pandas 데이터 합치기

  • pandas에서 dataframe 병합하는 방법
    - pd.concat()
    - pd.merge()
    - pd.join()
  • pd.merge() : 두 데이터 프레임에서 컬럼이나 인덱스를 기준으로 잡고 병합하는 방법
    - 기준이 되는 컬럼이나 인덱스를 키값이라고 한다
    - 기준이 되는 키값은 두 데이터 프레임에 모두 포함되어 있어야 한다
    • pd.merge( dataframe1, dataframe2, on="key" ) : key값을 기준으로 병합
      • pd.merge( dataframe1, dataframe2, how = "inner", on="key" ) 와 동일, how="inner" 기본 값임
        - pd.merge( dataframe1, dataframe2, how="left", on="key" ) : 왼쪽에 있는 dataframe의 key값을 기준으로 병합
        - pd.merge( dataframe1, dataframe2, how="right", on="key" ) : 오른쪽에 있는 dataframe의 key값을 기준으로 병합
        - pd.merge( dataframe1, dataframe2, how="outer", on="key" ) : key값을 기준으로 모두 다 병합
  • set_index() : 선택한 컬럼을 데이터 프레임의 인덱스로 지정
  • corr() : correlation의 약자, 상관계수, 숫자형만 가능



# 딕셔너리 안의 리스트 형태
left = pd.DataFrame({"key":["K0","K4","K2","K3"],
                     "A":["A0","A1","A2","A3"],
                     "B":["B0","B1","B2","B3"]})

# 리스트 안의 딕셔너리 형태
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"}])
left, right
# pd.merge( dataframe1, dataframe2, on="key" ) : key값을 기준으로 병합
# pd.merge( dataframe1, dataframe2, how = "inner", on="key" ) 와 동일, how="inner" 기본 값임

pd.merge(left, right, on="key")
# pd.merge( dataframe1, dataframe2,  how="left", on="key" ) : 
#왼쪽에 있는 dataframe의 key값을 기준으로 병합

pd.merge(left, right, how="left", on="key")
# pd.merge( dataframe1, dataframe2, how="right", on="key" ) : 
#오른쪽에 있는 dataframe의 key값을 기준으로 병합

pd.merge(left, right, how="right", on="key")
# pd.merge( dataframe1, dataframe2, how="outer", on="key" ) : 
# key값을 기준으로 모두 다 병합

pd.merge(left, right, how="outer", on="key")

12 - 14 matplotlib 기초

  • matplotlib : 파이썬의 시각화 도구
    - matplotlib은 plt로 많이 naming한다
    - jupyter notebook 유저의 경우, matplotlib의 결과가 out session에 나타나는 것이 유리하므로 %matplotlib inline 옵션을 사용

  • matplotlib의 기본 형태
    - plt.figure(figsize=(10,6)
    - plt.plot(x, y)
    - plt.show()




    ※ 예제 참고

import matplotlib.pyplot as plt # pyplot : matlab에 사용하는 시각화 프로그램이 있음
from matplotlib import rc

rc("font", family="Malgun Gothic") # mac은 다름, Arial Unicode MS

# %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]) 
# plot : 그래프의 형태, ()안에는 데이터 입력

plt.show() # plt.show() : 데이터를 저장한 후 보여줌
  • 그래프 기초
# 삼각함수 그리기

# numpy 함수
# np.arange(a, b, s) : a부터 b까지의 s의 간격
# np.sin(value) : sin 함수(삼각함수)

import numpy as np

t = np.arange(0, 12, 0.01)
y = np.sin(t)
plt.figure(figsize = (10, 6))
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.show()
# 1. 격자무늬 추가
# 2. 그래프 제목 추가
# 3. x축, y축 제목 추가
# 4. 주황색, 파란색 선 데이터 의미 구분

def drawGraph():

    plt.figure(figsize = (10, 6))
    plt.plot(t, np.sin(t))
    plt.plot(t, np.cos(t))
    plt.grid(True) # 격자 무늬
    plt.title("Example of sinewave") # 그래프 제목 추가
    plt.xlabel("time") #  x축 제목 추가
    plt.ylabel("Amplitude") # amplitude : 진폭  # y축 제목 추가

    plt.legend(labels=["sin","cos"], loc=2) # 범례, 각 선이 어떤 것을 의미하는지 설정 필요
    # 주황색, 파란색 선 데이터 의미 구분, 
    # legend() : 괄호 안에 아무것도 설정하지 않으면 가장 민 공간에 범례가 출력
    # .legend(loc = "" ) : 범례 위치 설정 가능 ex) loc = 2, loc = upper right....
    # plt.plot(t, np.sin(t), label="sin") 위의 것과 같음
    # plt.plot(t, np.cos(t), label="cos") 위의 것과 같음
    plt.show()
drawGraph()


  • 그래프 커스텀
t = np.arange(0, 5, 0.5)

def drawGraph():
    plt.figure(figsize = (10, 6))

    plt.plot(t, t, "r--") # "r--" : red 색으로 -- 점선 표시를 해라

    plt.plot(t, t ** 2, "bs") # "bs" : blue square
    plt.plot(t, t ** 3, "g^") # "g^" : green ^방향의 삼각형
    plt.show()
drawGraph()

t = list(range(0, 7))
y = [1, 4, 5, 8, 9, 5, 3]
def drawGraph():
    plt.figure(figsize=(10, 6))
    plt.plot(t, y, color="red", linestyle="dashed", # dash : 점선,  = -- 같음
             marker="o", markerfacecolor="blue", markersize=12)
    plt.xlim([-0.5, 10]) # x축 설정
    plt.ylim([0.5, 9.5]) # y축 설정

    plt.show()
drawGraph()


  • scatter plot
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])

# scatter는 점을 뿌리듯이 그리는 그림
def drawGraph():
    plt.figure(figsize=(20, 6))
    plt.scatter(t, y)
    plt.show()
drawGraph()
colormap = t

def drawGraph():
    plt.figure(figsize=(20, 6))
    plt.scatter(t, y, s = 100, c=colormap, marker=">") # s =  : size
    plt.show()
drawGraph()


  • pandas에서 plot 그리기
# matplotlib을 가져와서 사용

data_result.head()
# pandas에서 plot 그리기
data_result["인구수"].plot(kind="barh",figsize=(10,10))

15 - 16 CCTV 데이터와 그래프로 표현하기

  • plt.rcPrams["axes.unicode_minus"] = False : minus 부호 때문에 한글 깨지는 것을 방지
  • rc("font", family="Malgun Gothic") # mac : Arial Unicode MS, 한글 폰트 설정

17 - 18 데이터의 경향을 그려보자

  • umpy를 이용한 1차 직선 만들기
    - np.polyfit : 직선을 구성하기 위한 계수 계산, y절편과 기울기를 알 수 있음
    - np.poly1d : polyfit으로 찾은 계수로 python에서 사용할 함수로 만들어 줌
    - np.linspace(a, b, n) : a부터 b까지 n개의 등간격 데이터 생성, 경향선을 그리기 위해 X 데이터 생성

19 - 20 경향에서 벗어난 데이터 강조하기

  • color_step = ["#e74c3c","#2ecc71","#95a5a6","#2ecc71","#3498db","#3498db"] : color map을 사용자 정의(user define)으로 세팅
  • s : 마커의 크기
  • c : color 세팅
  • text() : 그래프에 글자 입력
    - plt.text(X, Y, Text, 설정)

💻 출처 : 제로베이스 데이터 취업 스쿨

profile
#데이터분석 #퍼포먼스마케팅 #데이터 #디지털마케팅

0개의 댓글