본문 바로가기
IT/개발

파이썬 2주차 개발일지 (12/27~1/2)

by 멍치킨 2022. 1. 5.

2주차

데이터 분석의 4단계 - 데이터 불러오기, 데이터 살펴보기, 데이터 가공하기, 데이터 시각화

 

어울리는 그래프 찾기 - 그래프( 항목들의 수치와 순위를 ), 라인 그래프(이전 항목들 혹은 흐름에 따라 데이터의 관계를 ), 파이 차트(비율을 ), 히트맵( 개의 축의 수치를 한 눈에 ), 지도(지리 정보를 한 눈에 )


[상권 데이터] 전처리하기

NaN Not a Number

 

라이브러리 불러오기

import pandas as pd

 

데이터 불러오기

commercial = pd.read_csv('./data/commercial.csv')

commercial

데이터 살펴보기

commercial.tail(5)

 

컬럼 살펴보기

list(commercial), len(list(commercial))

 

살펴볼 컬럼 정하기

상가업소번호 - 가게가 중복이 되는지 확인할 때 필요

commercial.groupby('상가업소번호')['상권업종소분류명'].count().sort_values(ascending=False) -내림차순

중복제거는 set

상권업종소분류명 - 치킨집을 분류하기 위한 이름

category_range = set(commercial['상권업종소분류명'])

category_range

-후라이드/양념치킨

 

서울에 치킨집이 몇 개 있는가

서울: 도로명주소 - 치킨집의 위치를 파악하기 위해 필요, 서울특별시의 구 별 데이터가 필요, 우리가 가진 데이터는 시군구 데이터 → 데이터 전처리 필요

치킨집: 소분류명

: 있는 고유값

 

도로명 잘라 정리하기

str을 가지고 쪼갤 수 있다 split(문자열 나누기, 문자열 쪼개기)

무엇을 기준으로 쪼갤건지, 몇번 쪼갤건지

commercial[['시', '구', '상세주소']] = commercial['도로명'].str.split(' ', n=2, expand=True)

commercial.tail(5)

 

서울시 데이터만 남기기

seoul_data = commercial[ commercial['시'] == '서울특별시' ]

seoul_data

진짜 서울특별시만 남겼는지 확인하는 방법 (데이터 검증)

city_type = set(seoul_data['시'])

city_type, len(city_type)

{'서울특별시'} 1 이라고 뜨면 성공

 

'후라이드/양념치킨' 데이터만 남기기

seoul_chicken_data = seoul_data[ seoul_data['상권업종소분류명'] == '후라이드/양념치킨' ]

set(seoul_chicken_data['상권업종소분류명'])

 

구 별로 정리하기

groupdata = seoul_chicken_data.groupby('구')

group_by_category = groupdata['상권업종소분류명']

chicken_count_gu = group_by_category.count()

sorted_chicken_count_gu = chicken_count_gu.sort_values(ascending=False)

sorted_chicken_count_gu

 


[상권 데이터] 시각화

sorted_chicken_count_gu

 

바 그래프 그리기

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = "AppleGothic"

 

1. 크기

2. 그래프 종류

3. 제목

4.x축 돌아감

5.show()

plt.figure(figsize=(10,5)) # 그래프의 사이즈

plt.bar(sorted_chicken_count_gu.index, sorted_chicken_count_gu)

plt.title('구에 따른 치킨가게 수의 합계') # 그래프의 제목

plt.xticks(rotation = 90)

plt.show() # 그래프 그리기

 

지도에 그리는 방법

folium설치:

conda install -c conda-forge folium

 

# 라이브러리 가져오기

import folium

import json

 

seoul_state_geo = './data/seoul_geo.json'

geo_data = json.load(open(seoul_state_geo, encoding='utf-8'))

geo_data

map = folium.Map(location=[37.5502,126.982], zoom_start=11)

map

 

folium.Choropleth(geo_data=geo_data,

                 data=chicken_count_gu,

                 columns=[chicken_count_gu.index, chicken_count_gu],

                 fill_color='PuRd',

                 key_on='properties.name').add_to(map)

map

 

 


[유동인구 데이터] 전처리 및 시각화하기

라이브러리 불러오기

import pandas as pd

 

데이터 불러오기

population = pd.read_csv('./data/population07.csv')

population

 

데이터 살펴보기

population.tail(5)

 

컬럼 살펴보기

list(population), len(list(population))

# ['일자', '시간(1시간단위)', '연령대(10세단위)', '성별', '시', '군구', '유동인구수']

 

살펴볼 컬럼 정하기

구 별로 얼마만큼의 유동인구가 있는 가

set(population['연령대(10세단위)']), len(set(population['연령대(10세단위)']))

# {20, 30, 40, 50, 60, 70}

set(population['시'])

# {'서울'}

set(population['군구']), len(set(population['군구']))

 

구 별로 정리하기

긴 버전.

groupdata = population.groupby('군구')

count = groupdata['유동인구수']

sum_of_groupdata = count.sum()

간소화 버전.(chaining)

sum_of_populaiton_by_gu = population.groupby('군구')['유동인구수'].sum()

sum_of_population_by_gu

 

폰트 설정

import matplotlib.pyplot as plt

plt.rcParams['font.family'] = "AppleGothic"

sum_of_populaiton_by_gu

 

plt.figure(figsize=(10,5))

plt.bar(sum_of_populaiton_by_gu.index, sum_of_populaiton_by_gu)

plt.title('2020년 7월 서울 군구별 유동인구 수')

plt.xlabel('군구')

plt.ylabel('유동인구 수(명)')

plt.xticks(rotation= -45)

plt.show()

 

정렬

sorted_sum_of_populaiton_by_gu = sum_of_populaiton_by_gu.sort_values(ascending=True)

 

plt.figure(figsize=(10,5))

plt.bar(sorted_sum_of_populaiton_by_gu.index, sorted_sum_of_populaiton_by_gu)

plt.title('2020년 7월 서울 군구별 유동인구 수')

plt.xlabel('군구')

plt.ylabel('유동인구 수(명)')

plt.xticks(rotation= -45)

plt.show()

 

강남구 일별로 유동량 그리기

population_gangnam = population[ population['군구'] == '강남구' ]

population_gangnam

populaion_gangnam_daily = population_gangnam.groupby('일자')['유동인구수'].sum()

populaion_gangnam_daily

 

라인 그래프

plot(ploting  선그래프)

 

# 날짜를 string 타입으로 변경해야 숫자로 인식하지 않아 값이 줄여지지 않습니다.

plt.figure(figsize=(10,5))

 

date = []

for day in populaion_gangnam_daily.index:

    print(day)

    date.append(str(day))

 

plt.plot(date, populaion_gangnam_daily)

plt.title('2020년 7월 서울 강남구 날짜별 유동인구 수')

plt.xlabel('날짜')

plt.ylabel('유동인구 수(천만명)')

plt.xticks(rotation=-90)

plt.show()

=주말 유동인구 적음

 

 

지도

# 라이브러리 가져오기

import folium

import json

 

# 지도 만들어주기

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='stamentoner')

map

 

보강 버전

map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='stamentoner')

  • folium.Map 은 설정값을 넣어주어야 합니다.
  • 위도 경도를 나타내 주는, location
  • 지도의 초기 확대 정도를 나타내주는 zoom_start
  • tiles='stamentoner' 옵션 값은 지도의 길과 강 위주로 보여줍니다.

seoul_state_geo = './data/seoul_geo.json'

geo_data = json.load(open(seoul_state_geo, encoding='utf-8'))

folium.Choropleth(geo_data=geo_data, 

                 data=sum_of_populaiton_by_gu,

                 columns=[sum_of_populaiton_by_gu.index, sum_of_populaiton_by_gu],

                 fill_color='PuRd',

                 key_on='properties.name').add_to(map)

map

Folium 참고 링크: https://python-visualization.github.io/folium/modules.html#module-folium.map

 

folium — Folium 0.12.1 documentation

folium Make beautiful, interactive maps with Python and Leaflet.js class folium.folium.GlobalSwitches(no_touch=False, disable_3d=False) Bases: branca.element.Element class folium.folium.Map(location=None, width='100%', height='100%', left='0%', top='0%', p

python-visualization.github.io

 


상권과 유동인구 같이 분석

데이터 합치기

  • 구 이름을 기준으로 합쳐 놓았던 데이터를 다시 행과 열의 데이터로 만들어 주어야 합니다.

new_chicken_count_gu = pd.DataFrame(chicken_count_gu).reset_index()

new_chicken_count_gu

 

new_sum_of_population_by_gu = pd.DataFrame(sum_of_populaiton_by_gu).reset_index()

new_sum_of_population_by_gu

 

합침

gu_chicken = new_chicken_count_gu.join(new_sum_of_population_by_gu.set_index('군구'), on = '구')

gu_chicken

 

구별 치킨집 당 유동인구 수

gu_chicken['유동인구수/치킨집수'] = gu_chicken['유동인구수'] / gu_chicken['상권업종소분류명']

gu_chicken = gu_chicken.sort_values(by='유동인구수/치킨집수')

gu_chicken

By: ascending, decending

 

그래프

plt.figure(figsize=(10,5))

plt.bar(gu_chicken['구'], gu_chicken['유동인구수/치킨집수'])

plt.title('치킨집 당 유동인구수')

plt.xlabel('구')

plt.ylabel('유동인구수/치킨집수')

plt.xticks(rotation=90)

plt.show()

 

의미 파악하기

  • 유동인구가 많은 곳은 장사가 잘 되나요? 모릅니다
  • 치킨집이 적은 곳은 장사가 잘 되나요? 모릅니다
  • 적당히 치킨집은 적으면서 유동인구가 많은 곳은 없나요? 
  • 치킨집 당 유동인구의 노출되는 값이라는 것은 어떤 의미일까요? 
  • 치킨집 당 유동인구의 노출되는 값이 높으면 장사가 잘 되나요? 아니요

 

그래프 두개 그릴때는 하나 그리고 덧대어서 하나 그림