오늘은 위의 첨부한 파일을 갖고 정보를 읽고, 분석하는 작업을 해보겠다. 작업 순서는 아래와 같다.
제목 [행정구역 정보를 읽고, 분석하기]
목차
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]
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()
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(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의 값이 나오지 않았으며 반대도 똑같았다.
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. 시각화
댓글