[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경찰서로 출력