pd.concat()
pd.merge()
pd.join()
pd.merge(left, right)
# 딕셔너리 안의 리스트 형태
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")
pd.merge(left, right, how="right", on="key")
pd.merge(left, right, how="outer", on="key")
del data_result["2013년도 이전"]
del data_result["2014년"]
data_result.head(3)
data_result.drop(["2015년", "2016년"], axis=1, inplace=True)
data_result.head()
data_result.set_index("구별", inplace=True)
data_result.head()
data_result.corr()
data_result.info()
data_result["CCTV비율"] = data_result["소계"] / data_result["인구수"]
data_result["CCTV비율"] = data_result["CCTV비율"] * 100
data_result.head()
data_result.sort_values(by="CCTV비율", ascending=False).head()
data_result.sort_values(by="CCTV비율", ascending=True).head()
matplotlib 그래프 기본 형태
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])
plt.show()
import numpy as np # numpy를 사용하기위한 불러오기
t = np.arange(0, 12, 0.01)
y = np.sin(t)
plt.figure(figsize=(10, 6)) # figsize=(가로, 세로)
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.show() # 그래프로 출력하여 보여주는 코드
def drawGraph():
plt.figure(figsize=(10, 6))
plt.plot(t, np.sin(t), label="sin")
plt.plot(t, np.cos(t), label="cos")
plt.grid(True) # 격자무늬 추가
plt.legend(loc=2) # 범례 (선 데이터 의미 구분) / loc로 범례의 위치 지정 가능
plt.title("Example of sinewave") # 그래프 제목
plt.xlabel("time") # x축 제목
plt.ylabel("Amplitude") # 진폭(y축 제목)
plt.show()
drawGraph()
t = np.arange(0, 5, 0.5)
plt.figure(figsize=(10, 6))
plt.plot(t, t, "r--") # red ----
plt.plot(t, t ** 2, "bs")
plt.plot(t, t ** 3, "g>")
plt.show()
# t = [0, 1, 2, 3, 4, 5, 6]
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="--",
marker="o",
markerfacecolor="blue",
markersize=10,
)
plt.xlim([-0.5, 6.5])
plt.ylim([0.5, 9.5])
plt.show()
drawGraph()
t = np.array(range(0, 10))
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
def drawGraph():
plt.figure(figsize=(10, 6))
plt.scatter(t, y)
plt.show()
drawGraph()
colormap = t
def drawGraph():
plt.figure(figsize=(10, 6))
plt.scatter(t, y, s=150, c=colormap, marker="<")
# s(마커 사이즈)
plt.colorbar()
plt.show()
drawGraph()
data_result.head()
# 판다스 데이터 불러오기
data_result["인구수"].plot(kind="bar", figsize=(10, 10));
data_result["인구수"].plot(kind="barh", figsize=(10, 10));
import matplotlib.pyplot as plt
# import matplotlib as mpl
from matplotlib import rc
plt.rcParams["axes.unicode_minus"] = False # 마이너스 부호 때문에 한글이 깨질 수가 있어 주는 설정
rc("font", family="Arial Unicode MS") # Windows: Malgun Gothic
# %matplotlib inline (쥬피터 노트북의 시각화를 위한 기본설정)
get_ipython().run_line_magic("matplotlib", "inline") (쥬피터 노트북의 시각화를 위한 기본설정)
data_result.head()
data_result["소계"].plot(kind="barh", grid=True, figsize=(10, 10));
# Pandas DataFrame은 데이터 변수에서 바로 plot() 명령을 사용할 수 있다
# 그리고 데이터(컬럼)가 많은 경우 정렬한 후 그리는 것이 효과적일 때가 많다
def drawGraph():
data_result["소계"].sort_values().plot(
kind="barh",
grid=True,
title="가장 CCTV가 많은 구",
figsize=(10, 10)
);
drawGraph()
data_result.head()
def drawGraph():
data_result["CCTV비율"].sort_values().plot(
kind="barh", grid=True, title="가장 CCTV가 많은 구", figsize=(10, 10));
drawGraph()
data_result.head()
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
drawGraph()
import numpy as np
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1) # polyfit에서 찾은 계수를 넣어서 함수 완성
# 인구 400,000인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수를 알고 싶다면?
f1(400000)
fx = np.linspace(100000, 700000, 100)
# 100000 부터 700000 사이의 100개의 데이터를 생성
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")
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
drawGraph()
그래프 다듬기
경향과의 오차 만들기
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
# np.polyfit(x 데이터, y 데이터, 1 : 1차원 배열)
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)
data_result.head(3) # 앞 3개의 데이터 출력
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head(1)
# 경향과 비교해서 데이터의 오차가 너무 나는 데이터를 계산
df_sort_f = data_result.sort_values(by="오차", ascending=False) # 내림차순
df_sort_t = data_result.sort_values(by="오차", ascending=True) # 오름차순
# 경향 대비 CCTV를 많이 가진 구
df_sort_f.head()
# 경향 대비 CCTV를 적게 가진 구
df_sort_t.head()
from matplotlib.colors import ListedColormap
# color map 을 사용자 정의(user define)로 세팅
# 색상을 지정해주기위한 설정
color_step = ["#e74c3c", "#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)
# s : 마커의 크기 ,c : color 세팅에 방금 계산한 경향과의 오차를 적용 ,cmap : 사용자 정의한 맵을 적용
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
for n in range(5):
# 오차가 큰 데이터 아래 위로 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()
# CSV파일로 데이터 저장
data_result.to_csv("../data/01. CCTV_result.csv", sep=",", encoding="utf-8")