◆ 콘다에서 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
◆ 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