5주 - chap3. 시 범죄데이터 현황

daye·2023년 4월 2일

01

thousands=','

  • read_csv를 사용해 파일을 읽을 때, 숫자값들이 콤마(,)를 사용하고 있어서 문자로 인식될 수 있다.
  • 천단위 구분(thousands=',')이라고 알려주면 콤마를 제거하고 숫자형으로 읽는다

notnull()

unique()

: array 목록이 뜬다

isnull()

: nan 항목이 있는지 확인

  • 엑셀(실제 데이터)에서 읽을 때는 정상이지만, index가 큰 크기를 가지게 되면서 실제 value와의 크기 차이가 발생했기 때문에 많은 nan 데이터가 보인다.
  • 이럴 때는 nan을 제거하는 것이 아니라, nan이 아닌 데이터만 가져오는 것이 좋다.

notnull()

: null이 아닌 데이터만 모은다.

03

Pandas Pivot Table

pivot_table()

  • Name을 인덱스로 두고 재정렬
df = pd.read_excel(~~경로/파일명)
pd.pivot_table(df, index=["Name"])
  • 인덱스를 여러개 지정할 수 있음
pd.pivot_table(df, index=["Name", "Rep", "Manager"])
  • values를 지정할 수 있음
pd.pivot_table(df, index=["Manager", "Rep"], values=["Price"])
  • 중복된 데이터를 정리하는 옵션의 디폴트는 평균값이다.
  • 다른 함수를 적용하고 싶다면 aggfunc옵션을 지정한다.
# 1
pd.pivot_table(df, index=["Manager", "Rep"], values=["Price"], aggfunc=np.sum)
# 2
pd.pivot_table(df, index=["Manager", "Rep"], values=["Price"], aggfunc=[np.mean, len])
  • 분류를 지정(columns)
  • NaN에 대한 처리: fill_value=0
pd.pivot_table(
	df,
    index=["Manager", "Rep"],
    values=["Price"],
    columns=["Product"],
    aggfunc=np.sum,
    fill_value=0,
)

05

  • Multi Columns Index
  • pivot_table을 적용하면 column이나 index가 다중으로 잡힌다
  • Multi Index에 대한 접근
crime_station["sum", "건수", "강도", "검거"]
  • 다중 컬럼에서 특정 컬럼 제거
crime_station.columns = crime_station.columns.droplevel([0, 1])

07

Python 모듈 설치

  • Python 자체가 항상 사용할 모듈을 직접 설치해야 한다.
  • anaconda라는 것이 많은 모듈을 포함하고 있기 때문에 설치하지 않았던 것이다.

pip 명령

: 모듈 개발자가 명시해놓은 dependency(의존성)을 참조해서 관련 모듈을 따라 설치할 수 있다.
이 부분에서 문제가 될 수 있는 것이, 어떤 모듈이든 Python 버전이 바뀐다던지 하게 되면 그에 대한 dependency가 꺠질 수 있다. 여기서 오류가 나게되고, 이런 일은 빈번하게 발생한다. 그래서 보통 공동 작업을 하게되면 버전을 정해놓고 작업하게 된다.

  • Python의 공식 모듈 관리자
  • pip list: 현재 설치된 모듈 리스트 반환
  • pip install module_name: 모듈 설치
  • pip uninstall module_name: 설치된 모듈 제거

jupyter notebook에서는 '!'를 쓰면 os 레벨의 명령을 쓸 수 있다.

!pip list

'!' 명령을 선호하지 않는 경우: jupyter notebook을 통하지 않고 바로 코드를 export 시켜서 사용하려고 할 때, !명령은 에러가 난다.

get_ipython().system("pip list")

conda 명령

: anaconda에서 배포한 모듈 관리자. pip를 사용하면 conda 환경에서 dependency 관리가 정확하지 않을 수 있다. anaconda에서는 가급적 conda 명령으로 모듈을 관리하는 것이 좋다.
: pip 명령과 다른 점은 채널의 존재이다. 예를 들어, 맥 M1 유저들은 암 계열의 모듈을 설치해야 한다. 그럴 때는 그런 모듈들만 모여있는 채널을 conda에서 별도로 운영한다. 그 채널의 이름을 별도로 지정해 주는 것.
: 내가 설치할 모듈을 conda 명령으로 설치할 것이라면 채널을 어떻게 하면 좋은가? -> 검색을 통해 설치할 필요가 있다.

  • conda list: 설치된 모듈 리스트
  • conda install module_name: 모듈 설치
  • conda uninstall module_name: 모듈 제거
  • conda install -c channel_name module_name
    : 지정된 배포 채널에서 모듈 설치

그러나 모든 모듈이 conda로 설치되는 것은 아니다.

08

Google Maps API 설치

: google의 api 공부 가능
모든 모듈이 깔끔하게 설치되지는 않는다. Python 세계의 모듈 간 dependency 문제와 개인PC 환경의 indivisual difference로 인한 문제가 있다. MS Visual Studio와 같은 깔끔함이 없어 불편할 수 있지만, 이렇게 강력한 도구를 무료로 사용하는 댓가라고 생각해야 한다.

10

For - loop

  • MATLAB
    : 반복, 조건, 함수 모두 end로 끝나게 해서 구분한다.
  • C/C++
    : 중괄호로 구문의 시작과 끝을 구분.
  • Python
    : 들여쓰기(intent)로 구분.

interrows() : Pandas에 잘 맞춰진 반복문용 명령

  • Pandas 데이터 프레임은 대부분 2차원
  • 이럴 때 for문을 사용하면, n번째라는 지정을 반복해서 가독률이 떨어짐.
  • Pandas 데이터 프레임으로 반복문을 만들 때 interrows()라는 옵션을 사용하면 편함.
  • 받을 때, 인덱스와 내용으로 나누어 받는 것만 주의.

12

Google Map을 이용해 주소와 위치 정보 얻기

  • 구글맵 import
import googlemaps
gmaps_key = "발급받은 Geocoding API key값 입력"
gmaps = googlemaps.Client(key=gmaps_key)
  • 구글맵 단순 테스트
    : 주소 정보, 위도 경도 (데이터는 리스트형으로 나오고, 리스트 내에는 dic형으로 나온다.)
gmaps.geocode("서울영등포경찰서", language="ko")
tmp = gmaps.geocode("서울영등포경찰서", language="ko")
print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
print(tmp[0].get("formatted_address"))
  • 전체 주소에서 필요한 구이름만 가져오기
tmp.split()[2]

14

  • crime_station에서 index(idx)와 나머지(rows)를 받아서 반복문을 수행
  • station_name: 구글 검색을 용이하게 하기 위해 검색어를 가급적 상세하게 잡아줌
  • 앞서 수행한 formatted_address에서 구 이름 잡는 과정은 그대로

lat = ~

  • loc 옵션을 사용
  • 행(idx)과 열('lat', 'lng', '구별')을 지정해서 구글 검색에서 얻은 정보를 기록
count = 0
for idx, rows in crime_station_iterrows():
	station_name = "서울" + str(idx) + "경찰서"
    tmp = gmaps.geocode(station_name, language="ko")
    
    tmp[0].get("formatted_address)
    tmp_gu = tmp[0].get("formatted_address")
    
    lat = tmp[0].get("geometry")["location"]["lat"]
    lng = tmp[0].get("geometry")["location"]["lng"]
    
    crime_station_loc[idx, "lat"] = lat
    crime_station_loc[idx, "lng"] = lng
    crime_station_loc[idx, "구별"] = tmp_gu.split()[2]
    
    print(count)
    count = count + 1

16

정규화

18

seaborn

  • matplotlib와 함께 사용되는 툴. matplotlib 만으로도 그림을 만들 수 있지만 이 툴이 더 편하다.
  • matplotlib와 함께 실행된다.
  • import하는 것만으로도 matplotlib의 그래프 스타일이 seaborn 스타일로 바뀐다
import matplotlib.pyplot as plt
import seaborn as sns

# %metplotlib inline
get_ipython().run_line_magic("matplotlib", "inline")

linspace()

# 0부터 14까지 100개의 데이터를 만들어라
x = np.linspace(0, 14, 100)
  • seaborn은 실습용 데이터가 몇개 내장되어 있다.
  • 이 중 tips를 불러온다
tips = sns.load_dataset("tips")
tips.head()
  • boxplot을 그려볼 수 있다.

22

24

지도 시각화 - Folium

  • conda install -c conda-forge folium

  • 기본적으로 크롬에서 동작이 가장 좋음

  • 사용 편의성이나 활발한 기능 개선 등으로 만족도가 높은펴

  • 근본적으로 그냥 위도, 경도를 알려주며 된다

  • 지도를 html로 저장 가능

  • circle()

29

31

0개의 댓글