EDA_3 Analysis Seoul Crime

이병찬·2024년 3월 12일

EDA

목록 보기
3/7

천단위 구분 삭제 및 숫자형 인식, thousands=","

  • 숫자값들이 콤마(,)를 사용하고 있어 문자로 인식 될 가능성이 있음
  • 천단위 구분(thousands=",")임을 인식시켜 콤마를 삭제하고 숫자형으로 읽기

데이터 프레임 정보 읽기, .info()

데이터 프레임의 컬럼의 고유값 확인, .unique()

df[column name].unique()

NaN값 확인, isnull().sum()

df[df[column name].isnull()] NaN값의 항목 확인

df[column name].isnull().sum() NaN값의 수 합계 확인

NaN값을 제외한 데이터 가져오기, .notnull()

df = df[df[column name].notnull()]

하나라도 nan값을 가지는 행은 모두 삭제, .dropna()

df = df.dropna()

Pandas pivot_table(재정렬)

간단한 예시

Manager, Rep을 인덱스로 한 Price values 정리, df.pivot_table(index=["columnName"], values="columnName")

df.pivot_table(index=["Manager", "Rep"], values="Price")

aggfunc 옵션을 통한 values에 다양한 함수 적용

Price 컬럼 sum 연산 적용

df.pivot_table(index=["Manager", "Rep"], values="Price", aggfunc=np.sum)

values에 여러가지 연산 넣기

df.pivot_table(index=["Manager", "Rep"], values="Price", aggfunc=[np.sum, len])

특정 colum 고유값들로 column 지정

df.pivot_table(index=["Manager", "Rep"], values="Price", columns="Product", aggfunc=np.sum)

NaN값 설정, fill_value = "0"

df.pivot_table(index=["Manager", "Rep"], values="Price", columns="Product", aggfunc=np.sum, fill_value=0)

aggfunc 2개 이상 설정 및 총계(All) 추가, margins=True

df.pivot_table(
    index=["Manager", "Rep", "Product"], 
    values=["Price", "Quantity"], 
    aggfunc=[np.sum, np.mean], 
    fill_value=0,
    margins=True)

서울시 범죄현황 데이터 정리

데이터 현황

pivot_table 적용

crime_station = crime_raw_data.pivot_table(
    crime_raw_data, 
    index="구분", 
    columns=["죄종", "발생검거"], 
    aggfunc=[np.sum])
crime_station.head()

Multi Column index

Multi Column index에서 특정 Column 제거, .droplevel([,])

.droplevel([?, ?, ..]) : 다중 컬럼에서 특정(=?) 컬럼 제거, 여기선 level 0 (=0번째) sum과 level 1 (=1번째) 건수 제거

crime_station.columns = crime_station.columns.droplevel([0, 1]) 


인덱스 확인

pip 명령

for문을 통한 리스트 만들기[i for i in range()]

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

Google Maps API 설치

import googlemaps
gmaps_key = ""
gmaps = googlemaps.Client(key=gmaps_key)
gmaps.geocode("서울영등포경찰서", language="ko")

간단한 예제(이번에 찾고자 하는 주소)

googlemaps를 통한 예제에서 주소 얻기, .get(), .split()

tmp = gmaps.geocode("서울영등포경찰서", language="ko") # tmp변수에 담아주기
print(len(tmp)) 
type(tmp[0].get("geometry")["location"])
# 1개의 [] = 리스트 형태의 데이터, 큰 리스트 안에 {?:?} =dict형 으로 존재

print(tmp[0].get("geometry")["location"]["lat"])
print(tmp[0].get("geometry")["location"]["lng"])
# tmp (= gmaps.geocode("서울영등포경찰서", language="ko")) 데이터에서 
# get 명령어를 통해 dict형태의 데이터 추출 
# -> get 명령어를 통해 geometry안 location 의 lat, lng 데이터 추출

print(tmp[0].get("formatted_address").split())
print(tmp[0].get("formatted_address").split()[2])
# tmp[0].get("formatted_address")는 '대한민국 서울특별시 영등포구'
# 하나의 문자열 리스트로 특정 단어 추출을 위해 나눠줄 필요가 있음
# .split() : 문자열을 일정한 규칙(공란이면 띄어쓰기)으로 잘라서 리스트로 만들어 주는 함수
# [?] : ?번째 단어 추출

데이터 현황에 구별, lat, lng 컬럼 추가 후 for문과 iterrows()로 데이터 추가

crime_station.head()

crime_station["구별"] = np.nan
# 구별 칼럼이 없으므로 추가하고 내부 데이터는 전부 nan값 입력
crime_station["lat"] = np.nan
crime_station["lng"] = np.nan
# crime_station["lng"] = None 와도 동일

iterrows() : 데이터프레임의 idx(index) 와 idx(index)를 제외한 나머지(rows) 나누어 추출

count = 0 

for idx, rows in crime_station.iterrows():
    # idx(index) 와 idx(index)를 제외한 나머지(rows) 나누어 추출
    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]
    # loc[index, column]로 지정
    
    print(count)
    count = count + 1 

데이터 현황 컬럼 수정

crime_station.columns.get_level_values(0)

crime_station.columns.get_level_values(1)

crime_station.columns.get_level_values(0)[2] + crime_station.columns.get_level_values(1)[2]

len(crime_station.columns.get_level_values(0))

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

tmp, len(tmp), len(crime_station.columns.get_level_values(0))

crime_station.columns = tmp 

crime_station.head()

데이터 저장, to_csv()

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

구별 데이터 정리

원하는 컬럼 인덱스 지정, index_col=지정할 컬럼 순서

crime_anal_station = pd.read_csv(
    "../data/02. crime_in_Seuol_raw.csv", index_col=0, encoding="utf-8") 
    # index_col = ? -> ?번째 컬럼을 인덱스로 설정
crime_anal_station.head()

컬럼 삭제

crime_anal_gu = pd.pivot_table(crime_anal_station, index="구별", aggfunc=np.sum)

del crime_anal_gu["lat"] # del을 통한 컬럼(열) 삭제
crime_anal_gu.drop("lng", axis=1, inplace=True) # drop 를 통한 컬럼(열) 삭제

crime_anal_gu.head()

하나의 컬럼을 하나의 컬럼으로 나누기 , df[column1] / df[column2]

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

다수의 컬럼을 하나의 다른 컬럼으로 나누기, div()

df[['col1', 'col2'...]].div(df[col3], axis = 0)

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

다수의 컬럼을 다수의 컬럼으로 나누기

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

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

컬럼 이름 변경 .rename(colums={ A : A' , B : B', ..})

# 컬럼 이름 변경 

crime_anal_gu.rename(columns={"강간발생": "강간", "강도발생": "강도", "살인발생": "살인", "절도발생": "절도", "폭력발생": "폭력"},
                     # {기존값:변경값} 형태이며, 딕셔너리형태로 지정된 변수가 있다면 변수만 지정해줘도 변경 가능
                    inplace=True)
crime_anal_gu.head()

최대값으로 각각 나눠서 정규화(최고값을 '1'로 최소값을 '0'으로 지정)

.max() : 데이터프래임 지정 컬럼의 최대값 설정

crime_anal_gu["강도"] / crime_anal_gu["강도"].max() 

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

profile
비전공 데이터 분석가 도전

0개의 댓글