[EDA] 01. 서울시 CCTV 현황 분석 8 ~14

쩡이·2023년 8월 1일

EDA

목록 보기
2/12

keyword
데이터/인구현황 훑어보기, 데이터 병합, matplotlib 기초

2. 데이터 훑어보기

#이전 글에서 CCTV_Seoul을 정의했으므로 생략함
#처음과 끝의 데이터를 통해 총 데이터 양이 얼마나 되는지 대충 파악
CCTV_Seoul.head()
CCTV_Seoul.tail()


#소계 컬럼을 기준으로 오름차순 정렬하여, 상위 5개만 출력
#ascending=True가 기본값임
#가장 작은 값 5개 파악
CCTV_Seoul.sort_values(by="소계", ascending=True).head(5)

#가장 큰 값 5개 파악
CCTV_Seoul.sort_values(by="소계", ascending=False).head(5)

#최근 증가율을 보고 싶어서 해당 칼럼 추가
#기존 컬럼 없으면 추가, 있으면 수정
CCTV_Seoul["최근증가율"] = (
    (CCTV_Seoul["2014년"] + CCTV_Seoul["2015년"] + CCTV_Seoul["2016년"])/CCTV_Seoul["2013년도 이전"] * 100
)
CCTV_Seoul.head()

#증가율을 내림차순으로 정렬해서 상위5개만 출력
CCTV_Seoul.sort_values(by="최근증가율",ascending=False).head()

3. 인구현황 데이터 훑어보기

#이전 글에서 pop_Seoul를 정의했기때문에 생략함
#인구수에 대한 상위5개, 하위5개 값을 훑어봄
pop_Seoul.head()
pop_Seoul.tail()


CCTV 데이터는 25개인데, 인구수는 26개이므로 인구수에서 합계 데이터를 삭제함

pop_Seoul.drop([0], axis=0, inplace=True)
#unique(): 어떤 값들이 한번 이상 나타났는지 중복없이 보여주는 메서드
pop_Seoul["구별"].unique()

array(['종로구', '중구', '용산구', '성동구', '광진구', '동대문구', '중랑구', '성북구', '강북구',
       '도봉구', '노원구', '은평구', '서대문구', '마포구', '양천구', '강서구', '구로구', '금천구',
       '영등포구', '동작구', '관악구', '서초구', '강남구', '송파구', '강동구'], dtype=object)
       
       
#unique 매서드에서 나온 값을 이용하여 구의 갯수 파악
len(pop_Seoul["구별"].unique())


#외국인비율, 고령자비율
#비율 컬럼은 없으므로 추가됨
pop_Seoul["외국인비율"] = pop_Seoul["외국인"] / pop_Seoul["인구수"] * 100
pop_Seoul["고령자비율"] = pop_Seoul["고령자"] / pop_Seoul["인구수"] * 100
pop_Seoul.head()


#원하는 값을 기준으로 내림차순 정렬
pop_Seoul.sort_values(["인구수"], ascending=False).head()
pop_Seoul.sort_values(["외국인"], ascending=False).head()
pop_Seoul.sort_values(["외국인비율"], ascending=False).head()
pop_Seoul.sort_values(by="고령자", ascending=False).head()
pop_Seoul.sort_values(by="고령자비율", ascending=False).head()

4. 두 데이터 합치기

Pandas에서 데이터프레임을 병합하는 방법

  • concat()
  • merge()
  • join()
# 딕셔너리 안의 리스트 형태 데이터 -> 열을 기준으로 데이터 생성
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"}
])


pd.merge()

  • 두 데이터 프레임에서 컬럼이나 인덱스를 기준으로 잡고 병합하는 방법
  • 기준이 되는 컬럼이나 인덱스를 키값이라고 한다
  • 기준이 되는 키값은 두 데이터 프레임에 모두 포함되어 있어야 한다
  • merge(left, right, how, on)
    : how="inner"가 디폴트 값이라서 how를 적지 않으면 inner로 인식함. inner는 왼쪽 오른쪽의 공통 부분만 나옴
    on은 기준이 되는 키값을 넣어줌
#양쪽 데이터에서 key라는 컬럼을 기준 키값으로 잡고 병합
#how="inner"가 디폴트값으로 돼있어서 공통부분만 나옴
pd.merge(left, right, on="key")

#key라는 컬럼을 left 기준 키값으로 잡고 병합
#오른쪽에 없는 값들은 NaN으로 출력
pd.merge(left, right, how="left", on="key")

#key라는 컬럼을 right기준 키값으로 잡고 병합
#왼쪽에 없는 값들은 NaN으로 출력
pd.merge(left, right, how="right", on="key")
#CCTV와 인구수를 "구별" 컬럼을 기준으로 병합
# CCTV와 인구수 모두 공통된 구를 갖고 있어서 빠지는 값 없이 출력됨
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on="구별")


#년도별 데이터 칼럼 삭제
#del , drop()
del data_result["2013년도 이전"]
del data_result["2014년"]
data_result.drop(["2015년", "2016년"], axis=1, inplace=True)


인덱스 변경

  • set_index() : 선택한 컬럼을 데이터 프레임의 인덱스로 지정

상관계수

  • corr() : correlation의 약자
  • 상관계수가 0.2이상인 데이터를 비교
  • 연산을 할 수 있는(int,float) 타입만 연산가능, object타입이 있다면 불가능
#CCTV 비율 구하기
data_result["CCTV비율"] = data_result["소계"] / data_result["인구수"] * 100
#데이터 정렬을 통해 비율 파악
data_result.sort_values(by="CCTV비율", ascending=False).head()
data_result.sort_values(by="CCTV비율", ascending=True).head()

5. matplotlib 기초

import matplotlib.pyplot as plt
from matplotlib import rc
rc("font", family="Malgun Gothic")

%matplotlib inline
or
get_ipython().run_line_magic("matplotlib", "inline")

matplotlib 그래프 기본 형태

  • plt.figure(figsize=(10,6)) : 그래프 사이즈 결정
  • plt.plot(x,y)
  • plt.show() : 위 내용을 반영한 그래프 그리는 호출

1) 그래프 기초

삼각함수 그리기

  • np.arrange(a, b, s): a부터 b까지 s의 간격

  • np.sin(value)

    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()

그래프 정보 추가

  • 격자무늬 추가 : plt.grid(True가 디폴트값), plt.grid(False)-격자 없앨때
  • 그래프 제목 추가 : plt.title()
  • x,y축 제목 추가 : plt.xlabel(), plt.ylabel()
  • 그래프 선 데이터 의미 구분(범례):plt.plot(x,y,label="") 또는 plt.legend(labels=[])
  • 범례 위치선정 : plt.legend(loc= "upper left" or 2 ) 가능한 위치나 숫자는 독스트링(shift+tap) 참고
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()
    plt.legend(loc=2) #범례, 위치 선정 loc= "upper left" or 2 독스트링 참고
    plt.title("Example of sinewave")
    plt.xlabel("time")
    plt.ylabel("Amplitude") #진폭
    plt.show()
    
drawGraph()

2) 그래프 커스텀

t = np.arange(0, 5, 0.5)
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()


t = [0, 1, 2, 3, 4, 5, 6]
or
t = list(range(0, 7))
y = [1, 4, 5, 8, 9, 5, 3]

def drawGraph():

    plt.figure(figsize=(10, 6))
    plt.plot(
        t, #x
        y, #y
        color="green", #선의 색은 그린
        linestyle="dashed", #점선으로
        marker="o", #표식은 o모양으로
        markerfacecolor="blue", #표식색깔 블루
        markersize=15, #표식 사이즈 15
    )
    plt.xlim([-0.5, 6.5])  #x축 범위
    plt.ylim([0.5, 9.5])   #y축 범위
    plt.show()
    
drawGraph()


3) scatter plot

t = np.array(range(0, 10))
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])

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:마커사이즈 
    plt.colorbar()
    plt.show()
    
drawGraph()


4)Pandas에서 plot 그리기
: matplotlib을 가져와서 사용함

#kind="bar" 세로형태 바
data_result["인구수"].plot(kind="bar", figsize=(10,10))

#kind="barh" 가로형태 바
data_result["인구수"].plot(kind="barh", figsize=(10,10))

0개의 댓글