27. EDA-6

wonny_·2023년 8월 6일
0

EDA

목록 보기
6/10
  • Python 모듈 설치

    • pip 명령

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

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

  • Python 반복문

for문 예제

for n in range(0, 10):
    print(n ** 2)

위 코드를 한 줄로

[n ** 2 for n in range(0, 10)]

  • Pandas에 잘 맞춰진 반복문용 명령 iterrows()

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

  • Google Maps API 설치

    windows: conda install -c conda-forge googlemaps

import googlemaps
gmaps_key = "본인 키 입력"
gmaps = googlemaps.Client(key-gmaps_key)

  • Google Maps를 이용한 데이터 정리

구글맵 API 단순 테스트

gmap.geocode("서울영등포경찰서", language="ko")

구글맵 API에서 데이터 얻기:
-전체 결과 크기가 1인 list형이어서 tmp[0] 접근
-큰 list안의 dict형
-dict형에서 데이터를 얻는 get()명령 사용
-위도["lat"] 경도["lng"]

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

전체 주소에서 필요한 구 이름만 가져오기
-splict() : 띄어쓰기

tmp = tmp[0].get("formatted_address")
tmp.split()

tmp.split()[2]

구, 위도, 경도 컬럼에 추가

crime_station["구별"] = np.nan
crime_station["lat"] = np.nan
cirme_station["lng"] = np.nan
crime_station.head()

경찰서 전체에 대해 Google Map을 이용해 주소와 위치 정보 얻기

count = 0

for idx, rows in crime_station.iterrows():
    station name = "서울" + str(idx) + "경찰서"
    tmp = gmaps.geocode(station_name, language="ko")
    
    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_staion.loc[idx, "구별"] = tmp_gu.split()[2]
    
    print(count)
    count = count + 1

데이터 확인

crime_station.head()

멀티 컬럼 합치기

tmp = [
    crime_station.columns.get_level_values(0)[n]
    + crime_station.columns.get_level_values(1)[n]
    for n in range(0, len(crime_starion.columns.get_level_values(0)))
]
crime_staion.columns = tmp
crime_station.head()

데이터 저장

crime_station.to_csv("../data/02. crime_in_seoul_raw.csv", sep=",", encoding="utf-8")

  • 구 별로 데이터 정리

데이터 읽기

crime_anal_station = pd.read_csv(
    "../data/02. crime_in_Seoul_raw.csv", index_col=0, encoding="utf-8"
)
crime_anal_station.head()

piviot_table 이용해서 구별 정리
-piviot_table의 func을 sum으로 잡고 필요없는 컬럼 제거(del)

crime_anal_gu = pd.pivot_table(crime_anal_station, index="구별", aggfunc=np.sum)
del crime_anal_gu["lat"]
del crime_anal_gu["lng"]
crime_anal_gu.head()

검거율

crime_anal_gu["강도검거"] / cime_anal_gu["강도발생']

하나의 컬럼을 다른 컬럼으로 나눌 때

crime_anal_gu[["강도검거", "살인검거"]].div(crime_anal_gu["강도발생"], axis=0)

다수의 컬럼을 다른 컬럼으로 나눌 때

num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]

crime_anal_gu[num].div(crime_anal_gu[den].values)

다수의 컬럼을 다수의 컬럼으로 나눌 때

target = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
num = ["강간검거", "강도검거", "살인검거", "절도검거", "폭력검거"]
den = ["강간발생", "강도발생", "살인발생", "절도발생", "폭력발생"]

crime_anal_gu[target] = crime_anal_gu[num].div(crime_anal_gu[den].values) * 100

100보다 큰 숫자 찾아서 바꾸기

crime_anal_gu[crime_anal_gu[target] > 100] = 100
crime_anal_gu.head()

컬럼 이름 변경
rename(columns={},inplace=True)

crime_anal_gu.rename(
     columns={"강간발생": "강간", "강도발생": "강도", "살인발생":"살인", "절도발생":"절도", "폭력발생":"폭력"},
     inplace=True,
)
crime_anal_gu.head()


  • 범죄 데이터 정렬을 위한 데이터 정리

정규화: 최고값 1, 최소값 0
컬럼 각각의 values을 컬럼에서 제일 큰 값으로 나누기

col = ["살인", "강도", "강간", "절도", "폭력"]
crime_anal_norm = crime_anal_gu[col] / crime_anal_gu[col].max()
crime_anal_norm.head()

검거율 컬럼 추가

col2 = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm[col2] = crime_anal_gu[col2]
crime_anal_norm.head()

인구수와 CCTV 데이터 추가

result_CCTV = pd.read_csv(
     "../data/01. CCTV_result.csv", encoding="UTF-8", index_col="구별"
)
crime_anal_norm[["인구수", "CCTV"]] = result_CCTV[["인구수", "소계"]]
crime_anal_norm.head()

정규화된 범죄발생 건수 전체의 평균을 구해 범죄컬럼 대표값으로 사용

col = ["강간", "강도", "살인", "절도", "폭력"]
crime_anal_norm["범죄"] = np.mean(crime_anal_norm[col], axis=1)
crime_anal_norm.head()

검거율 평균을 구해 검거의 대표값으로 사용

col = ["강간검거율", "강도검거율", "살인검거율", "절도검거율", "폭력검거율"]
crime_anal_norm["검거"] = np.mean(crime_anal_norm[col], axis=1)
crime_anal_norm.head()


  • numpy

np.array() : 행열 형태로 만들어줌
np.mean(계산할 행열 상태의 것, axis = 1)
numpy axis = 1 행, axis = 1열
pandas axis = 1 열, axis = 1행


profile
파이팅

0개의 댓글