탐색적 데이터 분석 ( DEA, 표준화, 가중치 )
2. 탐색적 데이터분석(EDA).html
0.53MB
2. 탐색적 데이터분석(EDA).ipynb
0.31MB
In [1]:
import pandas as pd
In [15]:
# sep = "\t" : tab 을 기준으로 데이터를 가지고 옴
df = pd.read_csv("../data_set/3.시각화/report.txt", sep="\t")
df.head()
Out[15]:
기간 | 대분류 | 분류 | 운동을 할 충분한 시간이 없어서 | 함께 운동을 할 사람이 없어서 | 운동을 할 만한 장소가 없어서 | 운동을 싫어해서 | 운동을 할 충분한 비용이 없어서 | 기타 | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019 | 서울시 | 서울시 | 46.8 | 5.0 | 4.3 | 37.3 | 5.2 | 1.4 |
1 | 2019 | 성별 | 남자 | 52.4 | 4.4 | 4.9 | 32.4 | 4.9 | 1.1 |
2 | 2019 | 성별 | 여자 | 42.5 | 5.6 | 3.9 | 41.0 | 5.4 | 1.7 |
3 | 2019 | 연령별 | 10대 | 55.3 | 4.8 | 3.9 | 32.6 | 3.5 | - |
4 | 2019 | 연령별 | 20대 | 46.0 | 4.2 | 4.5 | 38.8 | 6.4 | 0.1 |
In [6]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 52 entries, 0 to 51 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 기간 52 non-null int64 1 대분류 52 non-null object 2 분류 52 non-null object 3 운동을 할 충분한 시간이 없어서 52 non-null float64 4 함께 운동을 할 사람이 없어서 52 non-null float64 5 운동을 할 만한 장소가 없어서 52 non-null float64 6 운동을 싫어해서 52 non-null float64 7 운동을 할 충분한 비용이 없어서 52 non-null float64 8 기타 52 non-null object dtypes: float64(5), int64(1), object(3) memory usage: 3.8+ KB
In [7]:
# 각 컬럼의 결측치 값의 갯수 확인
df.isnull().sum()
Out[7]:
기간 0 대분류 0 분류 0 운동을 할 충분한 시간이 없어서 0 함께 운동을 할 사람이 없어서 0 운동을 할 만한 장소가 없어서 0 운동을 싫어해서 0 운동을 할 충분한 비용이 없어서 0 기타 0 dtype: int64
In [10]:
df.describe()
Out[10]:
기간 | 운동을 할 충분한 시간이 없어서 | 함께 운동을 할 사람이 없어서 | 운동을 할 만한 장소가 없어서 | 운동을 싫어해서 | 운동을 할 충분한 비용이 없어서 | |
---|---|---|---|---|---|---|
count | 52.0 | 52.000000 | 52.000000 | 52.000000 | 52.000000 | 52.000000 |
mean | 2019.0 | 46.267308 | 5.103846 | 4.655769 | 37.153846 | 5.163462 |
std | 0.0 | 10.723709 | 2.211109 | 1.868145 | 8.666217 | 2.020001 |
min | 2019.0 | 10.700000 | 0.400000 | 1.200000 | 17.900000 | 0.900000 |
25% | 2019.0 | 42.775000 | 4.125000 | 3.300000 | 32.550000 | 4.075000 |
50% | 2019.0 | 46.900000 | 4.850000 | 4.400000 | 35.850000 | 5.250000 |
75% | 2019.0 | 52.100000 | 6.050000 | 5.700000 | 39.775000 | 6.250000 |
max | 2019.0 | 69.800000 | 13.900000 | 9.900000 | 68.100000 | 10.900000 |
In [13]:
# 컬럼 확인
# 운동을 할 충분한 시간이 없어서, 함께 운동을 할 사람이 없어서 컬럼 등은
# 내가 운동시설을 만든다고 가정할 때 중요한 컬럼이 아니기 때문에 제거할 것임
df.columns
Out[13]:
Index(['기간', '대분류', '분류', '운동을 할 충분한 시간이 없어서', '함께 운동을 할 사람이 없어서', '운동을 할 만한 장소가 없어서', '운동을 싫어해서', '운동을 할 충분한 비용이 없어서', '기타'], dtype='object')
In [16]:
# 사용하지 않을 컬럼을 label 에 저장
label = ['기간', '분류', '운동을 할 충분한 시간이 없어서', '함께 운동을 할 사람이 없어서',
'운동을 싫어해서', '기타']
# axis=1 로 label 에 들어있는 값을 가진 열을 삭제
df.drop(labels=label, axis=1, inplace=True)
df.columns
Out[16]:
Index(['대분류', '운동을 할 만한 장소가 없어서', '운동을 할 충분한 비용이 없어서'], dtype='object')
In [17]:
df['대분류']
Out[17]:
0 서울시 1 성별 2 성별 3 연령별 4 연령별 5 연령별 6 연령별 7 연령별 8 연령별 9 학력별 10 학력별 11 학력별 12 학력별 13 소득별 14 소득별 15 소득별 16 소득별 17 소득별 18 소득별 19 혼인상태별 20 혼인상태별 21 혼인상태별 22 지역대분류 23 지역대분류 24 지역대분류 25 지역대분류 26 지역대분류 27 종로구 28 중구 29 용산구 30 성동구 31 광진구 32 동대문구 33 중랑구 34 성북구 35 강북구 36 도봉구 37 노원구 38 은평구 39 서대문구 40 마포구 41 양천구 42 강서구 43 구로구 44 금천구 45 영등포구 46 동작구 47 관악구 48 서초구 49 강남구 50 송파구 51 강동구 Name: 대분류, dtype: object
In [20]:
# 대분류의 값이 "구" 로 끝나는 문자가 아닌 값을 가져와라
# ~ 를 앞에 사용하여 "구"로 끝나는 문자가 아닌 것들을 가져옴
del_index = df[ ~df['대분류'].str.endswith("구")].index
del_index
Out[20]:
Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype='int64')
In [23]:
df.loc[ del_index ]
Out[23]:
대분류 | 운동을 할 만한 장소가 없어서 | 운동을 할 충분한 비용이 없어서 | |
---|---|---|---|
0 | 서울시 | 4.3 | 5.2 |
1 | 성별 | 4.9 | 4.9 |
2 | 성별 | 3.9 | 5.4 |
3 | 연령별 | 3.9 | 3.5 |
4 | 연령별 | 4.5 | 6.4 |
5 | 연령별 | 2.9 | 4.5 |
6 | 연령별 | 2.9 | 3.3 |
7 | 연령별 | 4.5 | 5.6 |
8 | 연령별 | 6.6 | 6.6 |
9 | 학력별 | 4.8 | 7.3 |
10 | 학력별 | 5.6 | 5.5 |
11 | 학력별 | 3.3 | 4.6 |
12 | 학력별 | 5.6 | 0.9 |
13 | 소득별 | 9.9 | 9.4 |
14 | 소득별 | 6.0 | 7.4 |
15 | 소득별 | 3.9 | 5.1 |
16 | 소득별 | 4.2 | 4.8 |
17 | 소득별 | 3.3 | 5.3 |
18 | 소득별 | 4.0 | 4.5 |
19 | 혼인상태별 | 4.1 | 4.6 |
20 | 혼인상태별 | 4.0 | 5.6 |
21 | 혼인상태별 | 5.7 | 6.4 |
22 | 지역대분류 | 7.2 | 4.0 |
23 | 지역대분류 | 4.1 | 5.5 |
24 | 지역대분류 | 5.1 | 5.3 |
25 | 지역대분류 | 4.7 | 4.8 |
26 | 지역대분류 | 3.1 | 5.4 |
In [24]:
# 대분류 컬럼의 "구" 로 끝나지 않는 행을 모두 삭제
df.drop( del_index, inplace=True )
df
Out[24]:
대분류 | 운동을 할 만한 장소가 없어서 | 운동을 할 충분한 비용이 없어서 | |
---|---|---|---|
27 | 종로구 | 9.4 | 2.1 |
28 | 중구 | 7.7 | 7.6 |
29 | 용산구 | 4.9 | 2.7 |
30 | 성동구 | 5.7 | 8.7 |
31 | 광진구 | 3.0 | 5.8 |
32 | 동대문구 | 2.7 | 6.2 |
33 | 중랑구 | 6.8 | 10.9 |
34 | 성북구 | 2.6 | 2.0 |
35 | 강북구 | 3.4 | 1.9 |
36 | 도봉구 | 6.2 | 7.6 |
37 | 노원구 | 2.7 | 1.9 |
38 | 은평구 | 7.3 | 6.4 |
39 | 서대문구 | 1.2 | 5.3 |
40 | 마포구 | 4.7 | 3.2 |
41 | 양천구 | 5.9 | 4.1 |
42 | 강서구 | 1.9 | 4.3 |
43 | 구로구 | 5.8 | 2.9 |
44 | 금천구 | 2.3 | 2.3 |
45 | 영등포구 | 3.8 | 5.4 |
46 | 동작구 | 8.4 | 7.6 |
47 | 관악구 | 5.5 | 6.1 |
48 | 서초구 | 4.1 | 3.3 |
49 | 강남구 | 2.0 | 5.2 |
50 | 송파구 | 2.3 | 4.8 |
51 | 강동구 | 4.8 | 8.4 |
In [26]:
# 대분류에 중복된 데이터의 합을 구해옴
# 결과가 0 이므로 대분류 컬럼엔 중복된 데이터가 없음
df["대분류"].duplicated().sum()
Out[26]:
0
In [28]:
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
plt.rc("font", family="Malgun Gothic")
In [53]:
fig, ax = plt.subplots(2,1, figsize=(10,7))
g = sns.barplot( x="대분류", y="운동을 할 만한 장소가 없어서", data=df, ax=ax[0], hue="대분류")
g.set_xticklabels(g.get_xticklabels(), rotation = 30)
g1 = sns.barplot( x="대분류", y="운동을 할 충분한 비용이 없어서", data=df, ax=ax[1], palette="rainbow")
g1.set_xticklabels(g.get_xticklabels(), rotation = 30)
plt.show()
In [56]:
# 운동을 할 만한 장소가 없어서의 데이터를 내림차순 하여 넣어주겠ek
df_sort = df.sort_values(by=["운동을 할 만한 장소가 없어서"], axis=0, ascending=False)
df_sort
Out[56]:
대분류 | 운동을 할 만한 장소가 없어서 | 운동을 할 충분한 비용이 없어서 | |
---|---|---|---|
27 | 종로구 | 9.4 | 2.1 |
46 | 동작구 | 8.4 | 7.6 |
28 | 중구 | 7.7 | 7.6 |
38 | 은평구 | 7.3 | 6.4 |
33 | 중랑구 | 6.8 | 10.9 |
36 | 도봉구 | 6.2 | 7.6 |
41 | 양천구 | 5.9 | 4.1 |
43 | 구로구 | 5.8 | 2.9 |
30 | 성동구 | 5.7 | 8.7 |
47 | 관악구 | 5.5 | 6.1 |
29 | 용산구 | 4.9 | 2.7 |
51 | 강동구 | 4.8 | 8.4 |
40 | 마포구 | 4.7 | 3.2 |
48 | 서초구 | 4.1 | 3.3 |
45 | 영등포구 | 3.8 | 5.4 |
35 | 강북구 | 3.4 | 1.9 |
31 | 광진구 | 3.0 | 5.8 |
37 | 노원구 | 2.7 | 1.9 |
32 | 동대문구 | 2.7 | 6.2 |
34 | 성북구 | 2.6 | 2.0 |
44 | 금천구 | 2.3 | 2.3 |
50 | 송파구 | 2.3 | 4.8 |
49 | 강남구 | 2.0 | 5.2 |
42 | 강서구 | 1.9 | 4.3 |
39 | 서대문구 | 1.2 | 5.3 |
In [58]:
df_sort.rename(columns={
df_sort.columns[0] : "분류",
df_sort.columns[1] : "장소부족",
df_sort.columns[2] : "비용부족"}, inplace=True )
df_sort
Out[58]:
분류 | 장소부족 | 비용부족 | |
---|---|---|---|
27 | 종로구 | 9.4 | 2.1 |
46 | 동작구 | 8.4 | 7.6 |
28 | 중구 | 7.7 | 7.6 |
38 | 은평구 | 7.3 | 6.4 |
33 | 중랑구 | 6.8 | 10.9 |
36 | 도봉구 | 6.2 | 7.6 |
41 | 양천구 | 5.9 | 4.1 |
43 | 구로구 | 5.8 | 2.9 |
30 | 성동구 | 5.7 | 8.7 |
47 | 관악구 | 5.5 | 6.1 |
29 | 용산구 | 4.9 | 2.7 |
51 | 강동구 | 4.8 | 8.4 |
40 | 마포구 | 4.7 | 3.2 |
48 | 서초구 | 4.1 | 3.3 |
45 | 영등포구 | 3.8 | 5.4 |
35 | 강북구 | 3.4 | 1.9 |
31 | 광진구 | 3.0 | 5.8 |
37 | 노원구 | 2.7 | 1.9 |
32 | 동대문구 | 2.7 | 6.2 |
34 | 성북구 | 2.6 | 2.0 |
44 | 금천구 | 2.3 | 2.3 |
50 | 송파구 | 2.3 | 4.8 |
49 | 강남구 | 2.0 | 5.2 |
42 | 강서구 | 1.9 | 4.3 |
39 | 서대문구 | 1.2 | 5.3 |
In [ ]:
In [ ]:
MinMaxScaler(표준화)¶
- 모든 특성이 정확하게 0과 1사이에 위치하도록 데이터를 변경한다
- 가장 작은값을 0, 가장 큰값을 1로 두고 결과를 뽑아
- 영화평점을 매긴다고 할 때 naver 는 1-5점, daum 은 1-10 점을 부여할 수 있다고 가정하면
- 해당 범위를 표준화시켜서 계산해야 한다준다
In [59]:
df_sort.describe()
Out[59]:
장소부족 | 비용부족 | |
---|---|---|
count | 25.000000 | 25.000000 |
mean | 4.604000 | 5.068000 |
std | 2.230187 | 2.473648 |
min | 1.200000 | 1.900000 |
25% | 2.700000 | 2.900000 |
50% | 4.700000 | 5.200000 |
75% | 5.900000 | 6.400000 |
max | 9.400000 | 10.900000 |
In [60]:
from sklearn.preprocessing import MinMaxScaler
In [68]:
movie = {"daum" : [2, 4, 6, 8, 10], "naver" : [1, 3, 3, 2, 5]}
mv = pd.DataFrame(movie)
mv
Out[68]:
daum | naver | |
---|---|---|
0 | 2 | 1 |
1 | 4 | 3 |
2 | 6 | 3 |
3 | 8 | 2 |
4 | 10 | 5 |
In [69]:
# 스케일을 표준화
min_max_scaler = MinMaxScaler()
mv_sc = min_max_scaler.fit_transform(mv)
mv_sc
Out[69]:
array([[0. , 0. ], [0.25, 0.5 ], [0.5 , 0.5 ], [0.75, 0.25], [1. , 1. ]])
In [71]:
# 표준화된 데이터 출력
pd.DataFrame(mv_sc, columns=["daum", "naver"])
Out[71]:
daum | naver | |
---|---|---|
0 | 0.00 | 0.00 |
1 | 0.25 | 0.50 |
2 | 0.50 | 0.50 |
3 | 0.75 | 0.25 |
4 | 1.00 | 1.00 |
In [73]:
# 데이터 표준화
min_max_s = MinMaxScaler()
min_max_df = min_max_s.fit_transform(df_sort[["장소부족", "비용부족"]])
min_max_df
Out[73]:
array([[1. , 0.02222222], [0.87804878, 0.63333333], [0.79268293, 0.63333333], [0.74390244, 0.5 ], [0.68292683, 1. ], [0.6097561 , 0.63333333], [0.57317073, 0.24444444], [0.56097561, 0.11111111], [0.54878049, 0.75555556], [0.52439024, 0.46666667], [0.45121951, 0.08888889], [0.43902439, 0.72222222], [0.42682927, 0.14444444], [0.35365854, 0.15555556], [0.31707317, 0.38888889], [0.26829268, 0. ], [0.2195122 , 0.43333333], [0.18292683, 0. ], [0.18292683, 0.47777778], [0.17073171, 0.01111111], [0.13414634, 0.04444444], [0.13414634, 0.32222222], [0.09756098, 0.36666667], [0.08536585, 0.26666667], [0. , 0.37777778]])
In [74]:
df_replace = pd.DataFrame(min_max_df, columns=["장소부족", "비용부족"])
df_replace
Out[74]:
장소부족 | 비용부족 | |
---|---|---|
0 | 1.000000 | 0.022222 |
1 | 0.878049 | 0.633333 |
2 | 0.792683 | 0.633333 |
3 | 0.743902 | 0.500000 |
4 | 0.682927 | 1.000000 |
5 | 0.609756 | 0.633333 |
6 | 0.573171 | 0.244444 |
7 | 0.560976 | 0.111111 |
8 | 0.548780 | 0.755556 |
9 | 0.524390 | 0.466667 |
10 | 0.451220 | 0.088889 |
11 | 0.439024 | 0.722222 |
12 | 0.426829 | 0.144444 |
13 | 0.353659 | 0.155556 |
14 | 0.317073 | 0.388889 |
15 | 0.268293 | 0.000000 |
16 | 0.219512 | 0.433333 |
17 | 0.182927 | 0.000000 |
18 | 0.182927 | 0.477778 |
19 | 0.170732 | 0.011111 |
20 | 0.134146 | 0.044444 |
21 | 0.134146 | 0.322222 |
22 | 0.097561 | 0.366667 |
23 | 0.085366 | 0.266667 |
24 | 0.000000 | 0.377778 |
In [76]:
# min(최솟값), max(최댓값) 표준화 된 것 확인
# 둘 다 0, 1 로 변경
df_replace.describe()
Out[76]:
장소부족 | 비용부족 | |
---|---|---|
count | 25.000000 | 25.000000 |
mean | 0.415122 | 0.352000 |
std | 0.271974 | 0.274850 |
min | 0.000000 | 0.000000 |
25% | 0.182927 | 0.111111 |
50% | 0.426829 | 0.366667 |
75% | 0.573171 | 0.500000 |
max | 1.000000 | 1.000000 |
In [79]:
# 분류 값을 추가
df_replace = pd.DataFrame(min_max_df, columns=["장소부족", "비용부족"])
df_replace["분류"] = df_sort["분류"].values
df_replace
Out[79]:
장소부족 | 비용부족 | 분류 | |
---|---|---|---|
0 | 1.000000 | 0.022222 | 종로구 |
1 | 0.878049 | 0.633333 | 동작구 |
2 | 0.792683 | 0.633333 | 중구 |
3 | 0.743902 | 0.500000 | 은평구 |
4 | 0.682927 | 1.000000 | 중랑구 |
5 | 0.609756 | 0.633333 | 도봉구 |
6 | 0.573171 | 0.244444 | 양천구 |
7 | 0.560976 | 0.111111 | 구로구 |
8 | 0.548780 | 0.755556 | 성동구 |
9 | 0.524390 | 0.466667 | 관악구 |
10 | 0.451220 | 0.088889 | 용산구 |
11 | 0.439024 | 0.722222 | 강동구 |
12 | 0.426829 | 0.144444 | 마포구 |
13 | 0.353659 | 0.155556 | 서초구 |
14 | 0.317073 | 0.388889 | 영등포구 |
15 | 0.268293 | 0.000000 | 강북구 |
16 | 0.219512 | 0.433333 | 광진구 |
17 | 0.182927 | 0.000000 | 노원구 |
18 | 0.182927 | 0.477778 | 동대문구 |
19 | 0.170732 | 0.011111 | 성북구 |
20 | 0.134146 | 0.044444 | 금천구 |
21 | 0.134146 | 0.322222 | 송파구 |
22 | 0.097561 | 0.366667 | 강남구 |
23 | 0.085366 | 0.266667 | 강서구 |
24 | 0.000000 | 0.377778 | 서대문구 |
In [82]:
# 컬럼의 순서를 변경하여 df_sort 에 저장
df_sort = df_replace[["분류", "장소부족", "비용부족"]]
df_sort
Out[82]:
분류 | 장소부족 | 비용부족 | |
---|---|---|---|
0 | 종로구 | 1.000000 | 0.022222 |
1 | 동작구 | 0.878049 | 0.633333 |
2 | 중구 | 0.792683 | 0.633333 |
3 | 은평구 | 0.743902 | 0.500000 |
4 | 중랑구 | 0.682927 | 1.000000 |
5 | 도봉구 | 0.609756 | 0.633333 |
6 | 양천구 | 0.573171 | 0.244444 |
7 | 구로구 | 0.560976 | 0.111111 |
8 | 성동구 | 0.548780 | 0.755556 |
9 | 관악구 | 0.524390 | 0.466667 |
10 | 용산구 | 0.451220 | 0.088889 |
11 | 강동구 | 0.439024 | 0.722222 |
12 | 마포구 | 0.426829 | 0.144444 |
13 | 서초구 | 0.353659 | 0.155556 |
14 | 영등포구 | 0.317073 | 0.388889 |
15 | 강북구 | 0.268293 | 0.000000 |
16 | 광진구 | 0.219512 | 0.433333 |
17 | 노원구 | 0.182927 | 0.000000 |
18 | 동대문구 | 0.182927 | 0.477778 |
19 | 성북구 | 0.170732 | 0.011111 |
20 | 금천구 | 0.134146 | 0.044444 |
21 | 송파구 | 0.134146 | 0.322222 |
22 | 강남구 | 0.097561 | 0.366667 |
23 | 강서구 | 0.085366 | 0.266667 |
24 | 서대문구 | 0.000000 | 0.377778 |
In [85]:
# 장소부족을 60% 가중치, 비용부족을 40% 가중치를 부여하여
# 종합점수라는 컬럼을 생성하여 저장
df_sort["종합점수"] = df_sort["장소부족"] * 0.6 + df_sort["비용부족"] * 0.4
# 종합점수의 내림차순을 기준으로 정렬
df_sort.sort_values(by="종합점수", ascending=False)
Out[85]:
분류 | 장소부족 | 비용부족 | 종합점수 | |
---|---|---|---|---|
4 | 중랑구 | 0.682927 | 1.000000 | 0.809756 |
1 | 동작구 | 0.878049 | 0.633333 | 0.780163 |
2 | 중구 | 0.792683 | 0.633333 | 0.728943 |
3 | 은평구 | 0.743902 | 0.500000 | 0.646341 |
8 | 성동구 | 0.548780 | 0.755556 | 0.631491 |
5 | 도봉구 | 0.609756 | 0.633333 | 0.619187 |
0 | 종로구 | 1.000000 | 0.022222 | 0.608889 |
11 | 강동구 | 0.439024 | 0.722222 | 0.552304 |
9 | 관악구 | 0.524390 | 0.466667 | 0.501301 |
6 | 양천구 | 0.573171 | 0.244444 | 0.441680 |
7 | 구로구 | 0.560976 | 0.111111 | 0.381030 |
14 | 영등포구 | 0.317073 | 0.388889 | 0.345799 |
12 | 마포구 | 0.426829 | 0.144444 | 0.313875 |
10 | 용산구 | 0.451220 | 0.088889 | 0.306287 |
16 | 광진구 | 0.219512 | 0.433333 | 0.305041 |
18 | 동대문구 | 0.182927 | 0.477778 | 0.300867 |
13 | 서초구 | 0.353659 | 0.155556 | 0.274417 |
21 | 송파구 | 0.134146 | 0.322222 | 0.209377 |
22 | 강남구 | 0.097561 | 0.366667 | 0.205203 |
15 | 강북구 | 0.268293 | 0.000000 | 0.160976 |
23 | 강서구 | 0.085366 | 0.266667 | 0.157886 |
24 | 서대문구 | 0.000000 | 0.377778 | 0.151111 |
17 | 노원구 | 0.182927 | 0.000000 | 0.109756 |
19 | 성북구 | 0.170732 | 0.011111 | 0.106883 |
20 | 금천구 | 0.134146 | 0.044444 | 0.098266 |
In [88]:
# 종합 점수를 기준으로 상위 5항목만 df_top5 에 저잠
df_top5 = df_sort.sort_values(by="종합점수", ascending=False).head()
df_top5
Out[88]:
분류 | 장소부족 | 비용부족 | 종합점수 | |
---|---|---|---|---|
4 | 중랑구 | 0.682927 | 1.000000 | 0.809756 |
1 | 동작구 | 0.878049 | 0.633333 | 0.780163 |
2 | 중구 | 0.792683 | 0.633333 | 0.728943 |
3 | 은평구 | 0.743902 | 0.500000 | 0.646341 |
8 | 성동구 | 0.548780 | 0.755556 | 0.631491 |
In [92]:
# 분류를 그룹을 기준으로 시각화
g = sns.barplot(x="분류", y="종합점수", data=df_top5, hue="분류")
In [96]:
# dataset 다시 들고와서 저장
# 성별을 가져와서 파악해볼 것임
df = pd.read_csv("../data_set/3.시각화/report.txt", sep="\t")
df
Out[96]:
기간 | 대분류 | 분류 | 운동을 할 충분한 시간이 없어서 | 함께 운동을 할 사람이 없어서 | 운동을 할 만한 장소가 없어서 | 운동을 싫어해서 | 운동을 할 충분한 비용이 없어서 | 기타 | |
---|---|---|---|---|---|---|---|---|---|
0 | 2019 | 서울시 | 서울시 | 46.8 | 5.0 | 4.3 | 37.3 | 5.2 | 1.4 |
1 | 2019 | 성별 | 남자 | 52.4 | 4.4 | 4.9 | 32.4 | 4.9 | 1.1 |
2 | 2019 | 성별 | 여자 | 42.5 | 5.6 | 3.9 | 41.0 | 5.4 | 1.7 |
3 | 2019 | 연령별 | 10대 | 55.3 | 4.8 | 3.9 | 32.6 | 3.5 | - |
4 | 2019 | 연령별 | 20대 | 46.0 | 4.2 | 4.5 | 38.8 | 6.4 | 0.1 |
5 | 2019 | 연령별 | 30대 | 59.9 | 5.2 | 2.9 | 27.3 | 4.5 | 0.2 |
6 | 2019 | 연령별 | 40대 | 54.1 | 3.9 | 2.9 | 35.5 | 3.3 | 0.4 |
7 | 2019 | 연령별 | 50대 | 46.1 | 6.2 | 4.5 | 36.8 | 5.6 | 0.8 |
8 | 2019 | 연령별 | 60대 이상 | 26.6 | 6.0 | 6.6 | 48.7 | 6.6 | 5.6 |
9 | 2019 | 학력별 | 중졸 이하 | 24.7 | 6.2 | 4.8 | 48.6 | 7.3 | 8.5 |
10 | 2019 | 학력별 | 고졸 이하 | 44.3 | 5.3 | 5.6 | 38.6 | 5.5 | 0.7 |
11 | 2019 | 학력별 | 대졸 이하 | 53.1 | 4.7 | 3.3 | 34.0 | 4.6 | 0.3 |
12 | 2019 | 학력별 | 대학원 이상 | 61.2 | 3.0 | 5.6 | 29.0 | 0.9 | 0.3 |
13 | 2019 | 소득별 | 100만원 미만 | 10.7 | 8.4 | 9.9 | 50.7 | 9.4 | 10.9 |
14 | 2019 | 소득별 | 100-200만원 미만 | 29.6 | 5.6 | 6.0 | 49.1 | 7.4 | 2.3 |
15 | 2019 | 소득별 | 200-300만원 미만 | 42.8 | 7.3 | 3.9 | 39.5 | 5.1 | 1.4 |
16 | 2019 | 소득별 | 300-400만원 미만 | 50.6 | 4.3 | 4.2 | 35.5 | 4.8 | 0.7 |
17 | 2019 | 소득별 | 400-500만원 미만 | 48.0 | 4.6 | 3.3 | 38.7 | 5.3 | 0.2 |
18 | 2019 | 소득별 | 500만원 이상 | 52.8 | 4.3 | 4.0 | 33.4 | 4.5 | 1 |
19 | 2019 | 혼인상태별 | 기혼 | 48.7 | 4.5 | 4.1 | 37.3 | 4.6 | 0.7 |
20 | 2019 | 혼인상태별 | 미혼 | 50.2 | 4.9 | 4.0 | 35.1 | 5.6 | 0.2 |
21 | 2019 | 혼인상태별 | 이혼/사별/기타 | 31.5 | 7.2 | 5.7 | 42.4 | 6.4 | 6.9 |
22 | 2019 | 지역대분류 | 도심권 | 53.8 | 3.8 | 7.2 | 28.3 | 4.0 | 2.9 |
23 | 2019 | 지역대분류 | 동북권 | 44.5 | 3.5 | 4.1 | 40.6 | 5.5 | 1.8 |
24 | 2019 | 지역대분류 | 서북권 | 50.7 | 6.6 | 5.1 | 31.4 | 5.3 | 0.9 |
25 | 2019 | 지역대분류 | 서남권 | 47.1 | 6.7 | 4.7 | 35.9 | 4.8 | 0.8 |
26 | 2019 | 지역대분류 | 동남권 | 46.3 | 4.7 | 3.1 | 38.9 | 5.4 | 1.5 |
27 | 2019 | 종로구 | 종로구 | 62.2 | 0.4 | 9.4 | 25.9 | 2.1 | - |
28 | 2019 | 중구 | 중구 | 50.3 | 3.0 | 7.7 | 25.7 | 7.6 | 5.7 |
29 | 2019 | 용산구 | 용산구 | 48.9 | 7.5 | 4.9 | 32.6 | 2.7 | 3.4 |
30 | 2019 | 성동구 | 성동구 | 46.5 | 4.3 | 5.7 | 34.2 | 8.7 | 0.6 |
31 | 2019 | 광진구 | 광진구 | 42.0 | 5.7 | 3.0 | 43.5 | 5.8 | - |
32 | 2019 | 동대문구 | 동대문구 | 44.5 | 4.5 | 2.7 | 41.9 | 6.2 | 0.1 |
33 | 2019 | 중랑구 | 중랑구 | 46.7 | 2.2 | 6.8 | 32.8 | 10.9 | 0.5 |
34 | 2019 | 성북구 | 성북구 | 33.3 | 3.4 | 2.6 | 58.0 | 2.0 | 0.7 |
35 | 2019 | 강북구 | 강북구 | 21.3 | 5.3 | 3.4 | 68.1 | 1.9 | - |
36 | 2019 | 도봉구 | 도봉구 | 52.0 | 3.2 | 6.2 | 30.8 | 7.6 | 0.3 |
37 | 2019 | 노원구 | 노원구 | 56.3 | 1.6 | 2.7 | 30.1 | 1.9 | 7.4 |
38 | 2019 | 은평구 | 은평구 | 42.7 | 8.8 | 7.3 | 34.3 | 6.4 | 0.5 |
39 | 2019 | 서대문구 | 서대문구 | 69.8 | 0.8 | 1.2 | 21.9 | 5.3 | 1 |
40 | 2019 | 마포구 | 마포구 | 46.6 | 8.1 | 4.7 | 35.8 | 3.2 | 1.5 |
41 | 2019 | 양천구 | 양천구 | 66.2 | 5.7 | 5.9 | 17.9 | 4.1 | 0.1 |
42 | 2019 | 강서구 | 강서구 | 38.5 | 3.8 | 1.9 | 50.5 | 4.3 | 1 |
43 | 2019 | 구로구 | 구로구 | 45.3 | 5.7 | 5.8 | 39.0 | 2.9 | 1.3 |
44 | 2019 | 금천구 | 금천구 | 53.6 | 2.4 | 2.3 | 37.6 | 2.3 | 1.7 |
45 | 2019 | 영등포구 | 영등포구 | 50.2 | 6.7 | 3.8 | 33.9 | 5.4 | - |
46 | 2019 | 동작구 | 동작구 | 39.1 | 13.9 | 8.4 | 31.1 | 7.6 | - |
47 | 2019 | 관악구 | 관악구 | 44.4 | 8.8 | 5.5 | 34.2 | 6.1 | 1 |
48 | 2019 | 서초구 | 서초구 | 49.9 | 4.3 | 4.1 | 36.6 | 3.3 | 1.8 |
49 | 2019 | 강남구 | 강남구 | 40.7 | 4.2 | 2.0 | 46.4 | 5.2 | 1.6 |
50 | 2019 | 송파구 | 송파구 | 47.6 | 5.0 | 2.3 | 39.4 | 4.8 | 1 |
51 | 2019 | 강동구 | 강동구 | 47.0 | 5.2 | 4.8 | 32.4 | 8.4 | 2.3 |
In [99]:
# 대분류의 성별 의 행만 가져옴
df_gender = df[df['대분류'].isin(["성별"])]
df_gender
Out[99]:
기간 | 대분류 | 분류 | 운동을 할 충분한 시간이 없어서 | 함께 운동을 할 사람이 없어서 | 운동을 할 만한 장소가 없어서 | 운동을 싫어해서 | 운동을 할 충분한 비용이 없어서 | 기타 | |
---|---|---|---|---|---|---|---|---|---|
1 | 2019 | 성별 | 남자 | 52.4 | 4.4 | 4.9 | 32.4 | 4.9 | 1.1 |
2 | 2019 | 성별 | 여자 | 42.5 | 5.6 | 3.9 | 41.0 | 5.4 | 1.7 |
In [100]:
features = [
'운동을 할 충분한 시간이 없어서',
'함께 운동을 할 사람이 없어서'
]
In [102]:
pg = sns.PairGrid( df_gender, y_vars="분류", x_vars=features, height=5, hue="분류")
pg.map(sns.barplot)
Out[102]:
<seaborn.axisgrid.PairGrid at 0x20b60ef5990>
In [103]:
df_age = df[df["대분류"].isin(["연령별"]) ]
df_age
Out[103]:
기간 | 대분류 | 분류 | 운동을 할 충분한 시간이 없어서 | 함께 운동을 할 사람이 없어서 | 운동을 할 만한 장소가 없어서 | 운동을 싫어해서 | 운동을 할 충분한 비용이 없어서 | 기타 | |
---|---|---|---|---|---|---|---|---|---|
3 | 2019 | 연령별 | 10대 | 55.3 | 4.8 | 3.9 | 32.6 | 3.5 | - |
4 | 2019 | 연령별 | 20대 | 46.0 | 4.2 | 4.5 | 38.8 | 6.4 | 0.1 |
5 | 2019 | 연령별 | 30대 | 59.9 | 5.2 | 2.9 | 27.3 | 4.5 | 0.2 |
6 | 2019 | 연령별 | 40대 | 54.1 | 3.9 | 2.9 | 35.5 | 3.3 | 0.4 |
7 | 2019 | 연령별 | 50대 | 46.1 | 6.2 | 4.5 | 36.8 | 5.6 | 0.8 |
8 | 2019 | 연령별 | 60대 이상 | 26.6 | 6.0 | 6.6 | 48.7 | 6.6 | 5.6 |
In [104]:
pg = sns.PairGrid( df_age, y_vars="분류", x_vars=features, height=5, hue="분류")
pg.map(sns.barplot)
Out[104]:
<seaborn.axisgrid.PairGrid at 0x20b611fb2d0>
In [107]:
df_age["운동할 수 있음"] = df_age["운동을 할 충분한 시간이 없어서"].apply(lambda x: 100 - x)
df_age["함께 운동할 수 있음"] = df_age["함께 운동을 할 사람이 없어서"]
f = ["운동할 수 있음", "함께 운동할 수 있음"]
pg = sns.PairGrid( df_age, y_vars="분류", x_vars=features, height=5, hue="분류")
pg.map(sns.barplot)
Out[107]:
<seaborn.axisgrid.PairGrid at 0x20b5cb14790>
In [110]:
df_age["종합점수"] = df_age["운동할 수 있음"] + df_age["함께 운동할 수 있음"]
f = ["운동할 수 있음", "함께 운동할 수 있음", "종합점수"]
pg = sns.PairGrid( df_age, y_vars="분류", x_vars=f, height=5, hue="분류")
pg.map(sns.barplot)
df_age[["분류", "종합점수"]]
Out[110]:
분류 | 종합점수 | |
---|---|---|
3 | 10대 | 49.5 |
4 | 20대 | 58.2 |
5 | 30대 | 45.3 |
6 | 40대 | 49.8 |
7 | 50대 | 60.1 |
8 | 60대 이상 | 79.4 |
728x90
'BE > 머신러닝(ML)' 카테고리의 다른 글
[머신러닝] 과적합 및 하이퍼파라미터 (0) | 2024.05.27 |
---|---|
[머신러닝] 지도학습 ( 분류, 회귀 ), 평가지표 선택하는 방법 (0) | 2024.05.24 |
[머신러닝] 시각화 ( mataplotlib, seaborn ) (0) | 2024.05.24 |
[머신러닝] 실습 예제 및 풀이 (1) | 2024.05.23 |
[머신러닝] 데이터 전처리 ( 그룹 ) (0) | 2024.05.23 |