1) [단지별 공통 정보]와 [단지 상세 정보]를 분리하기
2) 범주형 변수의 category 수 줄이기
3) [단지별 공통 정보]의 중복행 제거
4) [단지 상세 정보] 집계를 통해 단지별 정보 구하기 전용면적 구간별 총 세대수 단지별 임대보증금, 임대료 임대건물구분 비율 (면적 비율) 공급 유형 비율 (면적 비율)
5) [단지별 공통 정보]와 [단지 상세 정보]의 집계 내용을 합치기
1) 라이브러리 불러오기
[1]
import pandas as pdimport
numpy as np
import matplotlib.pyplot as pltimport
seaborn as sns
# 아래 필요한 라이브러리, 함수를 추가하시오.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 아래 필요한 라이브러리, 함수를 추가하시오.
[2]
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False
[3]
file = "registered_parking_car.csv"
## 코드 입력
data =
data.head()
[ ]
## shape
## 코드 입력
(2597, 15)
[ ]
## head
## 코드 입력
[ ]
## columns
## 코드 입력
Index(['단지코드', '총세대수', '임대건물구분', '지역', '공급유형', '전용면적', '전용면적별세대수', '공가수',
'자격유형', '임대보증금', '임대료', '도보 10분거리 내 지하철역 수(환승노선 수 반영)',
'도보 10분거리 내 버스정류장 수', '단지내주차면수', '등록차량수'],
dtype='object')
[ ]
## info, isna
## 코드 입력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2597 entries, 0 to 2596
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 단지코드 2597 non-null object
1 총세대수 2597 non-null int64
2 임대건물구분 2597 non-null object
3 지역 2597 non-null object
4 공급유형 2597 non-null object
5 전용면적 2597 non-null float64
6 전용면적별세대수 2597 non-null int64
7 공가수 2597 non-null float64
8 자격유형 2597 non-null object
9 임대보증금 2070 non-null object
10 임대료 2070 non-null object
11 도보 10분거리 내 지하철역 수(환승노선 수 반영) 2418 non-null float64
12 도보 10분거리 내 버스정류장 수 2593 non-null float64
13 단지내주차면수 2597 non-null float64
14 등록차량수 2597 non-null float64
dtypes: float64(6), int64(2), object(7)
memory usage: 304.5+ KB
(None,
단지코드 0
총세대수 0
임대건물구분 0
지역 0
공급유형 0
전용면적 0
전용면적별세대수 0
공가수 0
자격유형 0
임대보증금 527
임대료 527
도보 10분거리 내 지하철역 수(환승노선 수 반영) 179
도보 10분거리 내 버스정류장 수 4
단지내주차면수 0
등록차량수 0
dtype: int64)
[단지별 공통 정보]
[단지 상세 정보]
[ ]
## 단지별 공통 정보
danji_vars = ['단지코드', '총세대수', '지역', '공가수', '도보 10분거리 내 지하철역 수(환승노선 수 반영)','도보 10분거리 내 버스정류장 수', '등록차량수']
danji_main = data[danji_vars].copy()
# 단지 상세 정보
danji_detail_vars = ['단지코드', '임대건물구분', '공급유형', '전용면적', '전용면적별세대수', '임대보증금', '임대료']
danji_detail = data[danji_detail_vars].copy()
[ ]
## 컬럼 변경 하기 : rename
## 코드 입력
danji_main
[ ] ## 중복행 제거 : drop_duplicates
## 코드 입력
danji_main.head()
[ ]
# 단지 코드별 행 개수를 체크하여 중복 제거가 잘 되었는지 확인 : groupby 활용
# groupby로 count한 값이 1보다 큰 출력값은 중복임
## '단지코드'별로 그룹핑하여 '총세대수' 열의 개수를 세기 (count)
## unique_check 변수에 저장하기
unique_check = danji_main.groupby( , as_index = False)
# unique_check 데이터프레임의 컬럼명을 ['단지코드','count']로 컬럼 이름 바꾸기
unique_check.columns = ['단지코드', 'count']
# unique_check 데이터프레임 중 'count'열이 1보다 큰 경우를 조회하기
unique_check.loc[unique_check['count']>1]
## [단지 상세 정보] '공급유형'의 category 확인하기 : value_counts
## 코드 입력
data['공급유형'].value_counts()
## ['공공임대(10년)', '공공임대(50년)', '공공임대(5년)', '공공임대(분납)'] ==> '공공임대'로 수정
change_list = ['공공임대(10년)', '공공임대(50년)', '공공임대(5년)', '공공임대(분납)']
# value 값 바꾸는 것 -> replace()
change_list =['공공임대(10년)', '공공임대(50년)', '공공임대(5년)' '공공임대(분납)']
danji_detail['공급유형'] = danji_detail['공급유형'].replace(change_list, '공공임대')
## 코드 입력
danji_detail.loc[danji_detail['임대보증금'] == '-'] = 0
danji_detail.loc[danji_detail['임대료'] == '-'] = 0
## 확인 : value_counts()
danji_detail['공급유형'].value_counts()
## 코드 입력
[ ]
## [단지 상세 정보]에서 숫자형이어야 하는데 object형으로 보이는 컬럼은 무엇인가요? : info()
## 코드 입력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2597 entries, 0 to 2596
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 단지코드 2597 non-null object
1 임대건물구분 2597 non-null object
2 공급유형 2597 non-null object
3 전용면적 2597 non-null float64
4 전용면적별세대수 2597 non-null int64
5 임대보증금 2070 non-null object
6 임대료 2070 non-null object
dtypes: float64(1), int64(1), object(5)
memory usage: 142.2+ KB
## 숫자가 아닌 데이터를 찾고 있는 행 찾기 #1
## 코드 입력
danji_detail[ ]
## 숫자가 아닌 데이터를 찾고 있는 행 찾기 #2
## 코드 입력
danji_detail[ ]
## 숫자가 아닌 데이터가 있는 열을 0으로 대체하기
## loc를 활용하는 경우
## 코드 입력
danji_detail.loc[] =
danji_detail.loc[] =
## 해당 칼럼에 데이터 중 '-' 가 있는지 확인하기
## 코드 입력
danji_detail[ ]
## 해당 칼럼의 dtype을 object --> float로 수정하기 : astype
## 코드 입력
danji_detail = danji_detail.astype({'임대보증금': float, '임대료': float})
## 확인하기 : info
## 코드 입력
danji_detail.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2597 entries, 0 to 2596
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 단지코드 2597 non-null object
1 임대건물구분 2597 non-null object
2 공급유형 2597 non-null object
3 전용면적 2597 non-null float64
4 전용면적별세대수 2597 non-null int64
5 임대보증금 2070 non-null float64
6 임대료 2070 non-null float64
dtypes: float64(3), int64(1), object(3)
memory usage: 142.2+ KB
## [단지 상세 정보]에서 단지코드, 전용면적, 전용면적별세대수 만을 추출하여 base_5_1 에 저장하기
base_5_1 = danji_detail[['단지코드', '전용면적', '전용면적별세대수']].copy()
# base_5_1['전용면적'] 데이터의 기초 통계량 확인
display(base_5_1['전용면적'].describe().T)
# base_5_1['전용면적]' 데이터 분포 시각화 확인 (sns.histplot)
sns.histplot(x = '전용면적', data = base_5_1, kde = True, bins=50)
plt.grid()
plt.show()
## 전용 면적을 의미있는 구분할 수 있는 구간 나눠보고, 그에 맞는 라벨 설정하기## 코드 입력bins = [10, 30, 40, 50, 100, 1000]labels = ['전용면적_10_30', '전용면적_30_40', '전용면적_40_50', '전용면적_50_100', '전용면적_100이상',]## base_5_1 '전용면적'을 정해진 bins/labels 기준으로 나누고, '전용면적구간'이름으로 추가하기## 코드 입력base_5_1['전용면적구간'] = pd.cut(base_5_1['전용면적'], bins=bin, labels=label)## 확인base_5_1.head()
base_5_1['전용면적구간'] = pd.cut(base_5_1['전용면적'], bins=bin, labels=label)
## 확인
base_5_1.head()
## 전용면적 구간별 세대수 집계하기 : groupby
## 결과를 group_5_1에 저장하기
## 코드 입력
group_5_1 = base_5_1.groupby( , as_index = False)
## group_5_1 값 확인하기
group_5_1.head()
## 단지 코드를 index로, 전용면적 구간을 컬럼(열)으로 하여 전용면적별세대수 구하기 (pivot)
## 결과를 result_5_1 저장
## 단지 코드를 index --> 컬럼으로 변경하기 : reset_index, drop=False, inplace=True
## 코드 입력
result_5_1 = group_5_1.pivot()
result_5_1.reset_index(inplace = True, drop=False)
result_5_1.head()
## [단지 상세 정보]에서 단지코드, 임대보증금, 임대료 정보 추출하기 : base_5_2 에 저장
## 코드 입력
base_5_2 =
## 단지별 임대보증금, 임대료 평균값 구하기 : groupby, mean
## group_5_2_mean 저장
## 코드 입력
group_5_2_mean =
group_5_2_mean
## 단지별 임대보증금, 임대료 중앙값 구하기 : groupby, median
## group_5_2_median 저장
## 코드 입력
group_5_2_median =
group_5_2_median
## [임대보증금, 임대료] * 전용면적별세대수 ==> [세대수X임대보증금, 세대수X임대료] 구하기
## 코드 입력
## 단지별 [세대수X임대보증금, total_임대료] 합계 구하기 : groupby
## group_5_2_weighted_mean 에 저장
## 코드 입력
## 단지별 [total_임대보증금, total_임대료] 합계를 단지별 총 전용면적별세대수로 나눠 가중 평균 구하기
## 코드 입력
## danji_main 데이터에 합칠 정보는 무엇인가?
## 1) 평균 2) 중앙값 3) 가중평균
## 선택된 정보를 result_5_2 저장하기
## 코드 입력
result_5_2 =
result_5_2
## [단지 상세 정보]의 ['단지코드', '임대건물구분', '공급유형', '전용면적', '전용면적별세대수'] 열을 base_5_3 변수에 저장
## 코드 입력
## 전용면적 * 전용면적별세대수 구하기 (열 이름 : 세대수X전용면적)
## 코드 입력
임대건물구분별 면적 비율
## 단지코드와 임대건물구분으로 '세대수X전용면적' 집계하기
## group_5_3에 저장
## 코드 입력
## 단지코드를 index로 임대건물구분을 열로, 총 면적을 값으로 pivot table 구하기
## pivot_5_3 에 저장
## 코드 입력
## index로 적용된 단지코드를 열로 변경 : reset_index
## 코드 입력
## pivlot table의 NaN값으로 0으로 대체하기
## 코드 입력
## pivlot table에서 단지별 총 면적 구하기 : 상가면적 + 아파트 면적
## 코드 입력
## pivlot table에서 상가비율, 아파트비율 구하기 : 상가면적 / (상가+아파트), 아파트면적 / (상가+아파트)
## 코드 입력
## pivot table의 ['단지코드', '상가비율', '아파트비율'] 정보를 result_5_3에 저장하기
## 코드 입력
## 단지코드와 공급유형별로 총면적 집계하기
## group_5_4 저장
## 코드 입력
## 단지코드를 index로 공급유형을 열로, '세대수X전용면적'을 값으로 pivot table 구하기
## pivot_5_4 저장
## 코드 입력
# index에 적용된 단지코드를 컬럼으로 변경하기 : reset_index
## 코드 입력
## pivlot table의 NaN값으로 0으로 대체하기
## 코드 입력
## pivot table의 공급유형별 면적을 모두 더해 '총면적' 구하기
## 코드 입력
## pivot_5_4에서 공규유형별 면적 비율 구하기 : 각 면적 / 총면적
## 코드 입력
## 단지 코드의 공급유형별 면적 비율을 result_5_4에 저장하기
## 코드 입력
## result 변수에 저장하기
## 코드 입력
result = pd.merge( )
result.head()
## 코드 입력
result = pd.merge()
result.head()
## 코드 입력
result = pd.merge( )
result.head()
## 코드 입력
result = pd.merge( )
result.head()
## 코드 입력
result.to_csv( , index=False)