목표
Pandas 기초
Python에서 R 만큼의 강력한 데이터 핸들링 성능을 제공하는 모듈
단일 프로세스에서는 최대 효율
코딩 가능하고 응용 가능한 엑셀로 받아들여도 됨
누군가 스테로이드를 맞은 엑셀로 표현함
CTV_Seoul = pd.read_csv("../data/01. Seoul_CCTV 복사본.csv", encoding="utf-8")
CCTV_Seoul.head()
CCTV_Seoul.tail()
CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0]: "구별"}, inplace=True)
# 마지막에 inplace=True를 넣어줘야 원본 데이터가 변경된다
import pandas as pd
import numpy as np
pd.Series([1,2,3,4])
[실행결과]
0 1
1 2
2 3
3 4
dtype: int64
dates = pd.date_range("20200101",periods=6)
dates
[실행결과]
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame( value, index, columns)
df.loc["20200102":"20200104",["A","D"]]
df.iloc[3:5,0:2]
df["E"].isin(["two","five"])
del df["E"]
df.drop(["20200104"],axis=0)
left = pd.DataFrame({
"key":["K0","K4","K2","K3"],
"A":["A0","A1","A2","A3"],
"B":["B0","B1","B2","B3"]
})
left
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"}
])
right
pd.merge(left, right, how="inner", on="key")
pd.merge(left, right, how="left", on="key")
matplotlib 기초
matplotlib 그래프 기본 형태
plt.figure(figsize=(10,6))
plt.plot(x,y)
plt.show
import matplotlib.pyplot as plt # pyplot의 시각화 기능을 사용함
from matplotlib import rc
rc("font", family="Arial Unicode MS") # 한글 설정
# %matplotlib inline 이거 혹은 아랫줄 둘중 하나로 쓰면 됨
get_ipython().run_line_magic("matplotlib","inline")
plt.figure(figsize=(10,6)) # 도화지 사이즈
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()
import matplotlib.pyplot as plt
plt.rcParams["axes.unicode_minus"] = False # 마이너스 부호 때문에 한글이 깨질 수가 있어 주는 설정
rc("font", family="Arial Unicode MS")
%matplotlib inline
def drawGraph():
data_result["CCTV비율"].sort_values().plot(
kind="barh",grid=True,title="인구 대비 CCTV가 가장 많은 구",figsize=(10,10));
drawGraph()
np.polyfit(): 직선을 구성하기 위한 계수를 계산
np.poly1d(): polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어주는 기능
np.linspace(a,b,n): a부터 b까지 n개의 등간격 데이터 생성
위의 함수를 이용하여 경향선을 생성해주고 인구수와 소계(CCTV개수)를 이용하여 scatter plot을 만든 후 하나의 그래프로 나타내준다
def drawGraph():
plt.figure(figsize=(14,10))
plt.scatter(data_result["인구수"],data_result["소계"],s=50)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw는 굵기
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
drawGraph()
'오차 = 구별CCTV개수 - f1(인구수)'
이다data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
colormap
을 이용하여 보기쉽게 나타내주고 차이가 많이나는 상위 5개, 하위 5개는 그래프에 이름을 따로 찍어준다from matplotlib.colors import ListedColormap
# colormap을 사용자 정의(user define)로 세팅
color_step = ["#e74c3e","#2ecc71","#95a9a6","#2ecc71","#3498db","#3498db"]
my_cmap = ListedColormap(color_step)
def drawGraph():
plt.figure(figsize=(14,10))
plt.scatter(data_result["인구수"],data_result["소계"],s=50, c=data_result["오차"], cmap=my_cmap)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
for n in range(5):
# 상위 5개
plt.text(
df_sort_f["인구수"][n] * 1.02, # x좌표(데이터의 이름을 찍어줌 / 마크에서 조금 떨어진 곳에 표시하기 위해 숫자를 곱해줌)
df_sort_f["소계"][n] * 0.98, # y좌표
df_sort_f.index[n], # title
fontsize=15
)
# 하위 5개
plt.text(
df_sort_t["인구수"][n] * 1.02,
df_sort_t["소계"][n] * 0.98,
df_sort_t.index[n],
fontsize=15
)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.colorbar()
plt.grid(True)
plt.show()
drawGraph()