본문 바로가기
[python]데이터 분석/[python]데이터 분석

[데이터 분석] 행정구역 정보를 읽고, 분석하기(1/2)

by 코드몽규 2022. 2. 11.
반응형

data_draw_korea.csv
0.01MB

 

 

오늘은 위의 첨부한 파일을 갖고 정보를 읽고, 분석하는 작업을 해보겠다. 작업 순서는 아래와 같다.

 제목 [행정구역 정보를 읽고, 분석하기]
 
 목차  
1. read_csv()함수로 csv file 읽어오기
2. 특정행과 열을 선택하기
3. 컬럼명변경
4. 상관관계 분석 (인구수와 면적간의 상관관계)
5. 시각화

[1]. 데이터 읽어오기

import pandas as pd

data = pd.read_csv('data_draw_korea.csv')
#print(data)

data.sample(3)
	Unnamed: 0	인구수	shortName	x	y	면적	광역시도	행정구역
17	17	39668	횡성	10	5	997.82	강원도	횡성군
115	115	292375	부산북구	9	16	38.30	부산광역시	북구
106	106	321618	대전유성	4	13	177.16	대전광역시	유성구

[2]. 특정행과 열을 선택하기

 

1. 데이터 .describe()으로 살펴보기 *describe()를 통해 max(), min(), mean(), std()등에 해당하는 정보를 한 번에 볼 수 있음.

data.describe()
Unnamed: 0	인구수	x	y	면적
count	229.000000	2.290000e+02	229.000000	229.000000	229.000000
mean	114.000000	2.110898e+05	6.117904	11.262009	435.419795
std	66.250786	2.074378e+05	3.320469	6.040898	381.612549
min	0.000000	8.392000e+03	0.000000	0.000000	2.800000
25%	57.000000	4.955900e+04	3.000000	6.000000	54.000000
50%	114.000000	1.401590e+05	6.000000	11.000000	436.400000
75%	171.000000	3.216180e+05	9.000000	16.000000	692.800000
max	228.000000	1.125461e+06	13.000000	25.000000	1817.940000

2.. unique()를 통해 '광역시도'칼럼에 해당하는 정보 나열

data['광역시도'].unique()
array(['강원도', '경기도', '경상남도', '경상북도', '광주광역시', '대구광역시', '대전광역시', '부산광역시',
       '서울특별시', '세종특별자치시', '울산광역시', '인천광역시', '전라남도', '전라북도', '제주특별자치도',
       '충청남도', '충청북도'], dtype=object)

3. '광역시도'가 서울특별시인 행과 열 모두 출력하기. 인구수를 기준으로 내림차순으로 다시 인덱스 해서 출력

ata.loc[data['광역시도']=='서울특별시'].sort_values(by='인구수',ascending=False).reset_index(drop=True)
Unnamed: 0	인구수	shortName	x	y	면적	광역시도	행정구역
0	141	615487	서울송파	8	6	33.90	서울특별시	송파구
1	127	554709	서울강서	4	4	41.40	서울특별시	강서구
2	132	547202	서울노원	6	1	35.44	서울특별시	노원구
3	124	526157	서울강남	6	7	39.50	서울특별시	강남구
4	128	484478	서울관악	5	6	29.60	서울특별시	관악구
5	145	464236	서울은평	4	3	29.70	서울특별시	은평구
6	142	453634	서울양천	4	5	17.40	서울특별시	양천구
7	140	434061	서울성북	6	2	24.57	서울특별시	성북
.
.
.
....

연습문제

Q1.

경상북도에 속한 행정구역의 행정구역, 인구수, 면적을 출력하기
data.loc[data['광역시도']=='경상북도',['행정구역','인구수','면적']].sort_values(by='인구수',ascending=False).reset_index(drop=True)
행정구역	인구수	면적
0	포항시	488395	1127.00
1	구미시	396685	616.10
2	경산시	251220	411.58
3	경주시	242618	1323.85
4	안동시	157317	1519.00
5	김천시	127941	1009.56
6	칠곡군	112446	451.00
7	영주시	101612	668.45
.
.
.
.....

Q2.

iloc 사용하기

data의 20~25행을 선택하고 1~4열의 데이터만 출력
data.iloc[20:25,1:4]

data.iloc[20:25,1:4]

Q3.

인구수가 전국 평균보다 작은 지역선택하고 결과를 액셀로 저장하기

1.전국 평균 인구수를 구해준다.
2.전국 평균 인구수보다 작은 지역을 선택한다. [인구수,행정구역,면적,광역시도]에 해당하는 컬럼만 선택
3.결과를 액셀로 저장한다.
pop_mean_value = data['인구수'].mean()
print([pop_mean_value])


[211089.77729257641]
pop_mean_under = data.loc[data['인구수'] <= pop_mean_value, ['인구수','행정구역','면적','광역시도']]

pop_mean_under.to_excel('전국인구평균미만지역.xls')


[3]. 칼럼명 변경

data.head()

unnamed:0을 바꾸어주자

data.rename(columns={'Unnamed: 0':'num'})

잘 변경되었다.


[4]. 상관관계 분석

1. 경기도에서 인구수가 많은 행정 구역 순서 구하기 

data.loc[data['광역시도'] == '경기도', ['행정구역','인구수']]\
    .sort_values(by='인구수',ascending=False)\
    .reset_index(drop=True)

연습문제

Q1.

광역시도를 argument로 받아서 광역시도중 가장 인구가 많은 행정구역을 반환하는 함수 정의하기
def find_city_max(city):
    # city=str(input(''))
    pop_max_value = data.loc[data['광역시도'] == city,'인구수'].max()
    return data.loc[(data['광역시도'] == city ) & (data['인구수'] == pop_max_value),['광역시도','행정구역','인구수']]

find_city_max('경기도')

Q2.

광역시도별 인구수가 가장 큰 행정구역 출력
for city in data['광역시도'].unique():
    
    print(find_city_max(city))
    print(type(find_city_max(city)))

print(find_city_max(city))

 


print(type(find_city_max(city)))으로 출력되는 값의 Type을 보면 DataFrame인 것을 알 수 있다.

우리는 그럼 출력된 값을 갚고 새로운 DataFrame을 만들 수 있다.

 

  • 새로운 dataframe 객체 생성
pop_max_city_df = pd.DataFrame(columns=['광역시도','행정구역','인구수'])

for city in data['광역시도'].unique():
    pop_max_city_df = pop_max_city_df.append(find_city_max(city))
    
print(pop_max_city_df.reset_index(drop=True))

 

위의 새로운 dataframe을 갖고 재미난 미션 2가지를 해보자!!

 

  • Mission 1 : 광역시도별로 각각 인구수가 가장 많고, 면적이 가장 넓은 행정구역은 어디인가?

1차시도

def find_city_two_max(city):
    pop_max_land = data.loc[data['광역시도'] == city,'면적'].max()
    pop_max_value = data.loc[data['광역시도'] == city,'인구수'].max()
    return (data.loc[(data['광역시도'] == city ) & (data['면적'] == pop_max_land),['광역시도','행정구역','면적']] ,
            data.loc[(data['광역시도'] == city ) & (data['인구수'] == pop_max_value),['광역시도','행정구역','인구수']])


pop_land_city_max_df = pd.DataFrame(columns=['광역시도','행정구역','인구수','면적'])
for city in data['광역시도'].unique():
    pop_land_city_max_df = pop_land_city_max_df.append(find_city_two_max(city))


print(pop_land_city_max_df.reset_index(drop=True).fillna(0))

위에서 사용한 함수를 억지로 이용해서 만들려고 하다 보니까 광역시도별 인구수. max()와 면적. max()에 해당하는

행정구역은 뽑아낼 수 있었지만 인구수. max()에는 면적 cloumn의 값이 나오지 않았으며 반대도 똑같았다.

실패(1)

2차시도

import numpy as np
import pandas as pd

def max_function(city):
    max_temp = data.loc[data['광역시도'] == city]
    max_people = max_temp['인구수'].max()
    max_land = max_temp['면적'].max()
    
    result = max_temp.loc[(max_temp['인구수'] == max_people) | (max_temp['면적'] == max_land),['광역시도','행정구역','인구수','면적']]
    return result

pop_max_city = pd.DataFrame(columns=['광역시도','행정구역','인구수','면적'])
for i in data['광역시도'].unique():
    pop_max_city = pop_max_city.append(max_function(i))
    
pop_max_city.reset_index(drop=True)

 

max_temp를 통해 광역시도를 비교하는 변수를 설정하고

이를 이용해서 max_people, max_land와 같은 변수를 간단히 설정한다. 

 

또한 비교 연산자를 통해 인구수가. max() 이거나 면적이. max()인 행정구역을 하나씩 반환하는 return값을 만든다.

 이후 pop_max_city라는 새로운 dataframe 객체를 만들고 칼럼은 '광역시도', '행정구역', '인구수', '면적'으로 설정해준다.

foir문을 통해 max_function에 해당하는 결괏값을 pop_max_city dataframe에 넣어준다. 

 


  • 데이터 프레임의 인덱스를 1부터 시작하는 방법 

위에서 만든 dataframe pop_max_city를. reset_index를 통해 인덱싱을 새롭게 해 준 다음 출력했더니 0부터 시작이다.

이를 다시 1부터 시작으로 바꾸어 보자

 

print(len(pop_max_city))
pop_max_city.index

 

len을 통해 dataframe의 index 수와. index를 통해 인덱스 목록을 살펴보았다.

pop_max_city.index = np.arange(1, len(pop_max_city)+1)

numpy기능인 arrange를 통해 떨어져 있는 숫자들을 일정 형태로 출력해준다.

 

* numpy.arrange([start, ] stop, [step, ] dtype=None)

pop_max_city

 

np.arrange 해준 후 확인해보니 index 값이 1부터 올바르게 시작하고 있다.

 


여기까지 아래 3개의 회차에 해당하는 내용을 풀이해보았다.

1. read_csv() 함수로 csv file 읽어오기
2. 특정행과 열을 선택하기
3. 칼럼명 변경 및 인덱스 1로 바꿔주기

 

포스팅이 너무 길어져서 아래 2개에 대한 풀이는 다음 글로 넘어가 진행해보겠다.

 

4. 상관관계 분석 (인구수와 면적 간의 상관관계)
5. 시각화

반응형

댓글