Be Brave, Be Humble

빅데이터 분석기사 실기 Part4. 파이썬으로 초보 분석가 되기 (프리렉) 본문

Statistics/Data Science

빅데이터 분석기사 실기 Part4. 파이썬으로 초보 분석가 되기 (프리렉)

해쨔니 2022. 10. 25. 17:19

Open in Colab 누르면 코랩으로 이동 가능

이번 포스팅도 스파이더로 작성하여 블록 구분 없는 점 미리 머리 박습니다.. 

 

 
In [ ]:
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 17 21:19:28 2022

@author: FullSun

"""

###############################################
#####   Part4. 파이썬으로 초보 분석가 되기  #####
###############################################
''' 작업형 제1유형을 위한 챕터
    작업형 제1유형은 데이터 전처리에 초점이 맞추어져 있으며,
    주어진 2차원 데이터셋을 가공하여 최종 결과를 print()하면 됨!!
    
    출력시 중간 출력 결과는 삭제or주석처리 한 후 최종 결과만 print'''
    
#---------------------------------------------
#             1. 단순한 데이터 분석
#---------------------------------------------

#--------- <1-1> Top10 구하기 ---------#
''' Q1. boston data set의 MEDV 칼럼에 대해서 가장 작은 값부터 순서대로
        10개 행을 출력. 즉, 오름차순으로 정렬된 MEDV값에서 top 10 구하시오 '''
##### 내가 쓴 답안
import pandas as pd
data = pd.read_csv("C:/Users/boston.csv")
print(pd.DataFrame(sorted(data['MEDV'])).head(10))

##### 책 해설
import pandas as pd
# data 변수 상위 5개 행 출력
print(data.head())
# sort_values() 함수 사용하여 정렬
print(data.sort_values(by = "MEDV"))
# MEDV 칼럼만 추출
print(data.sort_values(by = 'MEDV')['MEDV'])
# 상위 10개만 추출
print(data.sort_values(by = 'MEDV')['MEDV'].head(10))

## 최종 제출 코드
import pandas as pd
print(data.sort_values(by = 'MEDV')['MEDV'].head(10))


#--------- <1-2> 결측치 확인하기 ---------#
''' Q2. boston data set의 RM칼럼에 대한 결측치 처리를 평균값으로 대치하거나 삭제할 수 있다.
        평균값으로 대치한 후 산출된 표준편차 값과
        결측치를 삭제한 후에 산출된 표준편차 값의 차이를 구하시오.
        단, 결과값은 양수 '''
##### 내 답안
data.isnull().sum() # 15개 존재
rm_mean1 = data['RM'].mean()
RM1 = data['RM'].fillna(rm_mean1)
RM2 = data['RM'].dropna()

print(RM2.std() - RM1.std()) # 0.010595546094104624

##### 책 해설
import pandas as pd
print(data.isnull()) # data 결측치 여부 확인
print(data.isnull().sum())
# RM 칼럼 추출 후 data_mean에 저장
data_mean = data['RM'].copy()
# data_mean 변수에서도 결측치 확인
print(data_mean.isnull().sum())
# data_mean의 상위 3개 확인
print(data_mean.head(3))
# data_mean 평균
rm_mean = data_mean.mean()
print(rm_mean)
# data_mean 변경 결과 저장하지 않고 결측치 평균값 대치
print(data_mean.fillna(rm_mean, inplace = False)) # inplace=False는 변경 결과를 변수에 반영하지 않는 것.
# 변동결과 저장하고 결측치 평균으로 대체
data_mean.fillna(rm_mean, inplace = True)
# 확인
print(data_mean.isnull().sum())
# RM 칼럼 추출 후, data_del에 저장
data_del = data['RM'].copy()
# data_del의 구조 확인
print(data_del.shape) # (506,)
# data_del의 저장과 함께 결측치 삭제
data_del.dropna(inplace = True)
# 확인
print(data_del.shape) # (491,)
# 표준편차 구하기
print(data_mean.std())
print(data_del.std())
# 표준편차 뺀 후 abs() 사용하여 절대값 취하기
print(abs( data_mean.std() - data_del.std() )) # 0.010595546094104624

## 최종 제출 코드
import pandas as pd
data_mean = data['RM'].copy()
rm_mean = data_mean.mean()
data_mean.fillna(rm_mean, inplace=True)
data_del = data['RM'].copy()
data_del.dropna(inplace=True)

print(abs(data_mean.std()-data_del.std()))


#--------- <1-3> 이상값 확인하기 ---------#
''' Q3. boston의 ZN칼럼을 대상으로 ZN 값의 평균값에서 표준편차의 1.5배보다
        크거나 작은 ZN값의 합계를 구하시오 '''
##### 내 답안
import pandas as pd
print(data['ZN'].describe())
zn_mean = data['ZN'].mean()
zn_std = data['ZN'].std()
high = data['ZN'][ data['ZN'] > (zn_mean + 1.5*zn_std) ].sum()
low = data['ZN'][ data['ZN'] < (zn_mean - 1.5*zn_std) ].sum()

print(high+low) # 3462.5

## 내 최종 코드
import pandas as pd
#print(data['ZN'].describe())
zn_mean = data['ZN'].mean()
zn_std = data['ZN'].std()
high = data['ZN'][ data['ZN'] > (zn_mean + 1.5*zn_std) ].sum()
low = data['ZN'][ data['ZN'] < (zn_mean - 1.5*zn_std) ].sum()
print(high+low) # 3462.5

##### 책 해설
import pandas as pd
# 평균, 표준편차 구하기
zn_mean = data['ZN'].mean()
zn_std = data['ZN'].std()
# 상한, 하한 구하기
zn_max = zn_mean + (1.5 * zn_std)
print(zn_max)
zn_min = zn_mean - (1.5 * zn_std)
print(zn_min)
# zn_max 보다 큰 지 여부 확인
print(data['ZN'] > zn_max)
# ZN 칼럼이 zn_max보다 큰 값들만 확인하기
print(data[data['ZN'] > zn_max ])
# ZN 칼럼만 추출 후, 해당 데이터를 zn_max2 변수에 저장
zn_max2 = data[data['ZN'] > zn_max]['ZN']
print(zn_max2)
# ZN 칼럼이 zn_min보다 작은 값들만 확인하기
print(data[data['ZN'] < zn_min]) # 없음
print(sum(zn_max2)) # 3462.5

## 최종 제출 코드
import pandas as pd
zn_mean = data['ZN'].mean()
zn_std = data['ZN'].std()
zn_max = zn_mean + (1.5 * zn_std)
zn_min = zn_min - (1.5 * zn_std)
zn_max2 = data[data['ZN'] > zn_max]['ZN']

print(sum(zn_max2)) # 3462.5


#--------- <1-4> 사분위수 구하기 ---------#
''' Q4. boston에서 CHAS 칼럼과 RAD 칼럼을 제외한 칼럼에 한해서
        칼럼별 IAR 값을 구하시오.
        단, 출력 구조는 2열이고 1열은 보스턴 데이터 세트의 칼럼 이름 '''
##### 내 풀이
print(data.info()) # 전부 연속형
data_IQR = data.drop(columns = ['CHAS', 'RAD'])
print(data_IQR.describe().loc['75%'])
type(data_IQR.describe().loc['75%'])
print(data_IQR.describe().loc['75%'] \
        - data_IQR.describe().loc['25%'])

## 내 최종 코드
data_IQR = data.drop(columns = ['CHAS', 'RAD'])
print( data_IQR.describe().loc['75%'] \
        - data_IQR.describe().loc['25%'] )

##### 책 해설
print(data.shape)
print(data.drop(columns = ['CHAS', 'RAD']))
data_col12 = data.drop(columns = ['CHAS', 'RAD'])
print(data_col12.shape)
# 기초통계량 저장하기
data_col12_desc = data_col12.describe()
print(data_col12_desc)
# 4번행, 6번행 가져오기
print(data_col12_desc.iloc[[4,6]]) # 한번 감싸면 4행 6열
# 행렬 구조 변환
print(data_col12_desc.iloc[[4,6]].T)
# 행렬 구조 변환한 데이터 저장하기
data_col12_desc_T = data_col12_desc.iloc[[4,6]].T
print(data_col12_desc_T) # DF
# IQR 구하기
print(data_col12_desc_T['75%'] - data_col12_desc_T['25%'])

## 최종 제출 코드
data_col12 = data.drop(columns = ['CHAS', 'RAD'])
data_col12_desc = data_col12.describe()
data_col12_desc_T = data_col12_desc.iloc[[4,6]].T
print(data_col12_desc_T['75%'] - data_col12_desc_T['25%'])


#--------- <1-5> 순위 구하기 ---------#
''' Q5. boston set의 MEDV 칼럼을 기준으로 30번째로 큰 값을
        1~29번째로 큰 값에 적용한다.
        그리고 MEDV 칼럼의 mean, median, min, max을 한 줄에 출력하시오. '''

##### 내 풀이
data_MEDV = data['MEDV']
print( data_MEDV.sort_values(ascending = False) ) #시리즈라 by 안 씀
data_MEDV2 = pd.DataFrame( data_MEDV.sort_values(ascending = False) )
print( data_MEDV2.iloc[29] ) # 0부터니까 idx29가 30번째로 큰 값..
print( data_MEDV2[0:29] ) # 1~29번째로 큰 값 (range는 끝번호-1 주의!!!!!)
data_MEDV2[0:29] = 41.7
print(data_MEDV2) #확인
#print( data_MEDV2.mean(), data_MEDV2.std(), data_MEDV2.min(), data_MEDV2.max())
# 위처럼 쓰면 한 줄에 출력이 안 됨

print( data_MEDV2.mean()[0], data_MEDV2.std()[0], data_MEDV2.min()[0], data_MEDV2.max()[0])
#뭐지,, 시리즈 상태에서 뭐가 안 돼서 DF로 바꿨는데 책 해설 보니 되네.. 쩝

## 내 최종 코드
data_MEDV = data['MEDV']
data_MEDV2 = pd.DataFrame( data_MEDV.sort_values(ascending = False) )
data_MEDV2[0:28] = data_MEDV2.iloc[29]
print( data_MEDV2.mean()[0], data_MEDV2.std()[0], data_MEDV2.min()[0], data_MEDV2.max()[0])

##### 책 해설
print(data['MEDV'].head(3))
data_new = data['MEDV'].sort_values(ascending = False)
print(data_new.head(30))
print(data_new.iloc[29]) #30번째로 큰 값
print(data_new.iloc[0:29]) # range는 끝번호-1
data_new.iloc[0:29] = 41.7
print(data_new.iloc[0:29])
print(data_new.mean(), data_new.std(), data_new.min(), data_new.max())

## 최종 제출 코드
data_new = data['MEDV'].sort_values(ascending = False)
data_new.iloc[0:29] = 41.7
print(data_new.mean(), data_new.std(), data_new.min(), data_new.max())



#---------------------------------------------
#             2. 복잡한 데이터 분석
#---------------------------------------------

#--------- <2-1> 그룹별 집계/요약하기 ---------#
''' Q1. boston 데이터셋의 TAX 칼럼이 TAX 칼럼의 중위값보다 큰 데이터를 대상으로,
        CHAS 칼럼과 RAD 칼럼 순으로 그룹을 지은 후 
        각 그룹의 데이터 개수를 구하시오. 단 CHAS,RAD 칼럼별 데이터 개수는
        COUNT라는 칼럼으로 출력합니다.
        
        ** groupby 함수 문법
        DataFrame.groupby([그룹화할 컬럼]).[수행할 컬럼].수행할 작업()
        그룹화할 컬럼으로 그룹을 만든 후, 수행할 컬럼으로 추가 작업 수행.'''

##### 내 풀이
import pandas as pd
data = pd.read_csv("C:/Users/boston.csv")
data.head()
data.info()

print(data.median().loc['TAX'])
data_TAX = data[data['TAX']>330.0]
print(data_TAX.loc[:,['CHAS', 'RAD']]) # = data_TAX[['CHAS', 'RAD']]
print(data_TAX.groupby(['CHAS', 'RAD']).count())

## 내 최종 코드
#print(data.median().loc['TAX'])
data_TAX = data[data['TAX']>330.0]
print(data_TAX.groupby(['CHAS', 'RAD']).count())
'''  ============== 틀림!! 이유: 문제 이해를 잘못함 ============== '''

##### 책 해설
tax_median = data['TAX'].median()
print(tax_median)
print(data['TAX'] > tax_median) # TAX칼럼에서 중위값보다 큰 지 확인. False/True로 표시됨
print(data[data['TAX'] > tax_median]) # True인 값 추출
print(data[data['TAX'] > tax_median][['CHAS', 'RAD']]) # CHAS, RAD열 추출
data_new = data[data['TAX']> tax_median][['CHAS', 'RAD']]
# grouping 전 CHAS 칼럼에 있는 데이터 종류 확인하기
print(data_new['CHAS'].unique()) # [0, 1]
print(data_new['RAD'].unique()) # [ 3  4  5  6  2  1 24]
''' 이번 문제에서는 CHAS 칼럼과 RAD칼럼으로 그룹화한 결과에 count만 수행하면 되므로
    RAD칼럼이나 CHAS 칼럼 둘 중 어떤 거로 수행해도 결과는 동일함 '''
data_new2 = data_new.groupby(['CHAS', 'RAD'])['RAD'].count()
print(data_new2)
data_new.groupby(['CHAS', 'RAD'])['CHAS'].count() # 결과 같음
# 비어있는 칼럼 이름에 count 채우기
print(type(data_new2)) # 시리즈 -> 1개의 칼럼만을 가지고 있다는 뜻!!
# Series를 DF로 변환하여 칼럼 이름 변경
data_new3 = pd.DataFrame(data_new2)
data_new3.columns = ['COUNT']

## 최종 제출 코드
tax_median = data['TAX'].median()
data[data['TAX'] > tax_median]
data_new = data[data['TAX'] > tax_median][['CHAS', 'RAD']]
data_new2 = data_new.groupby(['CHAS', 'RAD'])['RAD'].count()
data_new3 = pd.DataFrame(data_new2)
data_new3.columns = ['COUNT']
print(data_new3)


#--------- <2-2> 오름차순/ 내림차순 정렬하기 ---------#

''' Q2. boston 데이터셋의 TAX 칼럼을 오름차순으로 정렬한 결과와 내림차순으로
        정렬한 결과를 각각 구한다. 그리고 각 순번에 맞는 오름차순 값과
        내림차순 값의 차이를 구하여 분산 값을 출력하시오.
        
        ** concat 함수 문법
        pd.concat([데이터프레임1, 데이터프레임2], axis = 합칠 기준) '''

'''  ============== 틀림!! 이유: 절대값^^,, ============== '''
##### 내 풀이
print(data.sort_values(by = 'TAX')) # 오름차순
print(data.sort_values(by = 'TAX', ascending = False)) # 내림차순
data_asc = data.sort_values('TAX', ignore_index = True) 
data_desc = data.sort_values(by = 'TAX', ascending = False, ignore_index = True)
print(data_asc['TAX'] - data_desc['TAX'])
''' sort_value하면 index가 다시 매겨지는 것이 아니기 때문에
    data_acs - data_desc 하면 전부 0으로 출력됨.
    사칙연산은 같은 인덱스(위치)끼리 계산되기 때문에,
    따라서 ignore_index = True 옵션을 주어 랭크에 따라 index를 다시 매겨줌 '''
#print( ( data_asc['TAX'] - data_desc['TAX']     ).var() ) # 101954.72
print( abs( data_asc['TAX'] - data_desc['TAX']     ).var() )

## 내 최종 코드
data_asc = data.sort_values('TAX', ignore_index = True)
data_desc = data.sort_values('TAX', ascending = False, ignore_index = True)
#print( ( data_asc['TAX'] - data_desc['TAX'] ).var() ) # 101954.72
print(  abs( data_asc['TAX'] - data_desc['TAX']     ).var() )

##### 책 해설
data_asc = data['TAX'].copy()
data_desc = data[['TAX']].copy()
print(data_asc.sort_values(ascending = True))
# 정렬된 데이터를 저장하기
data_asc.sort_values(inplace = True)
data_desc.sort_values(ascending = False, inplace = True)
# 뒤섞인 인덱스 재설정하기
data_asc.reset_index(drop = True, inplace = True) # drop=True : 원래 인덱스 삭제
data_desc.reset_index(drop = True, inplace = True)
# 두 데이터셋을 칼럼 기준으로 통합하기
data_concat = pd.concat([data_asc, data_desc], axis = 1) # axis=1: 열기준, axis=0: 행기준
print(data_concat)
print(data_concat.iloc[:, 0]) # 첫 번째 열 추출
print(data_concat.iloc[:, 1]) # 두 번째 열 추출
# difference 구한 후 >절대값< 구하여 세 번째 열로 저장
data_concat['diff'] = abs(data_concat.iloc[:, 0] - data_concat.iloc[:, 1])
print(data_concat)
print(data_concat['diff'].var()) # 분산 구하기

## 최종 제출 코드
data_asc = data['TAX'].copy()
data_desc = data['TAX'].copy()
data_asc.sort_values(inplace = True)
data_desc.sort_values(ascending = False, inplace = True)
data_asc.reset_index(drop = True, inplace = True)
data_desc.reset_index(drop = True, inplace = True)
data_concat = pd.concat([data_asc, data_desc], axis = 1)
data_concat['diff'] = abs( data_concat.iloc[:, 0] - data_concat.iloc[:, 1] )
print( data_concat['diff'].var() )


#--------- <2-3> 최소최대 변환하기 ---------#
''' Q3. boston의 MEDV 칼럼을 최소최대 척도로 변환한 후 0.5보다 큰 값을 가지는
    레코드 수를 구하시오. '''

##### 내 풀이
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
print(scaler.fit_transform(data[['MEDV']]))
data_MEDV = scaler.fit_transform(data[['MEDV']])
data_MEDV2 = pd.DataFrame(data_MEDV) 
data_MEDV2.columns = ['MEDV_new']
print( data_MEDV2[ data_MEDV2['MEDV_new'] > 0.5 ].count() )

## 내 최종 코드
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data_MEDV = scaler.fit_transform(data[['MEDV']])
data_MEDV2 = pd.DataFrame(data_MEDV)
data_MEDV2.columns = ['MEDV_new']
print( data_MEDV2[ data_MEDV2['MEDV_new'] > 0.5 ]['MEDV_new'].count() )

##### 책 해설
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data_minmax = scaler.fit_transform(data) # 모든 변수를 각각 스케일링
print(type(data_minmax))
data_minmax = pd.DataFrame(data_minmax, columns = data.columns)
# columns = data.columns 옵션: data의 column을 그대로 사용하기 위해
print(data_minmax.head(3))
print(data_minmax['MEDV'].describe()) # 기초통계량 확인 => min~max : 0~1
print(data_minmax['MEDV'] > 0.5) # True/ False
print(data_minmax[data_minmax['MEDV'] > 0.5]) # True값만 출력
print(data_minmax[data_minmax['MEDV'] > 0.5]['MEDV']) # True인 MEDV열만 출력
# 0.5 초과하는 MEDV 값의 개수 세기
print(data_minmax[data_minmax['MEDV'] > 0.5]['MEDV'].count())

## 최종 제출 코드
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data_minmax = scaler.fit_transform(data)
data_minmax = pd.DataFrame(data_minmax, columns = data.columns)
print(data_minmax[ data_minmax['MEDV'] > 0.5]['MEDV'].count() )


#--------- <2-4> 빈도값 구하기 ---------#
''' Q4. boston 데이터셋의 AGE 칼럼을 소수점 첫 번째 자리에서 반올림하고,
        가장 많은 비중을 차지하는 AGE 값과 그 개수를 차례대로 출력하시오.
        즉, AGE 칼럼의 최빈값과 그 개수를 출력하시오. '''

##### 내 풀이
print(data.head()['AGE'])
print(round(data['AGE'], 0))
data_round = round(data[['AGE']], 0)
print(type(data_round)) # DF
print(data_round.groupby(['AGE'])['AGE'].count())
data_round2 = pd.DataFrame(data_round.groupby(['AGE'])['AGE'].count().sort_values())
data_round2.columns = ['COUNT']
print('최빈값:', data_round2.index[-1], 'count:', data_round2['COUNT'].iloc[-1])

## 내 최종 코드
data_round = round(data[['AGE']], 0)
data_round2 = pd.DataFrame(data_round.groupby(['AGE'])['AGE'].count().sort_values())
data_round2.columns = ['COUNT']
print('최빈값:', data_round2.index[-1], 'count:', data_round2['COUNT'].iloc[-1])

##### 책 해설 
##### 방법 1)
print(data['AGE'])
print(round(data['AGE'], 0))
data2 = round(data['AGE'], 0)
data2 = pd.DataFrame(data2) # Series -> DF 변경
# AGE로 그룹화 하고, 그룹별 AGE 칼럼 수 세기
print(data2.groupby(['AGE'])['AGE'].count())
data3 = data2.groupby(['AGE'])['AGE'].count()
print(data3) # AGE칼럼 기준으로 데이터가 정렬되어 있고, 칼럼의 빈도수가 섞여있음
print(type(data3)) # 시리즈
data3 = pd.DataFrame(data3) # Series -> DF 변경
print(type(data3))
# data3 변수의 칼럼 이름 확인하기
print(data3.columns)  # col이름이 인덱스인 AGE와 동일하므로 변경 필요
data3.columns = ['COUNT']
print(data3.head())
# 기존 AGE인덱스를 칼럼으로 사용하고, 새로운 index 부여하기
data3.reset_index(drop = False, inplace = True)
print(data3.head())
''' ** reset_index
    - drop=False : 기존 AGE 인덱스를 삭제하지 않고 칼럼으로 만듦
    - inplace=True : data3에 즉시 저장 '''
# 내림차순 정렬
data3.sort_values(by = 'COUNT', ascending = False, inplace = True)
print(data3.head())
# 최빈값과 개수 출력하기
print(data3.iloc[0,0], data3.iloc[0,1])


##### 방법 2)
from scipy.stats import mode
data2 = round(data['AGE'], 0)
print(mode(data2)) # ModeResult(mode=array([100.]), count=array([43]))
# 최빈값은 100이고, 개수는 43
print(mode(data2)[0], mode(data2)[1]) # 숫자만 출력하기
print(type(mode(data2)[0])) #ndarray
# 숫자만 남기기 위해, 정수형으로 변환하여 데이터 타입 변환
print(int(mode(data2)[0]))
print(int(mode(data2)[1]))
print( int(mode(data2)[0]), int(mode(data2)[1]) )

## 최종 제출 코드
from scipy.stats import mode
print( int(mode( round(data['AGE'], 0) )[0]) ,
      int(mode( round(data['AGE'], 0) )[1]) )


#--------- <2-5> 표준 변환하기 ---------#
''' Q5. boston 데이터셋의 DIS 칼럼을 표준화 척도로 변환 후,
        0.4보다 크면서 0.6보다 작은 값들에 대한 평균을 구하시오.
        단, 소수점 셋째자리에서 반올림하여 소수점 둘째 자리까지 출력하시오. '''

##### 내 풀이
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_scale = scaler.fit_transform(data)
data_scale = pd.DataFrame(data_scale, columns = data.columns)
print(data_scale.describe())
data_cut = data_scale[ data_scale['DIS'] > 0.4 ]
data_cut = data_cut[ data_cut['DIS'] < 0.6 ]
# ** => print( data[ (data['DIS'] > 0.4) & (data['DIS'] < 0.6) ] )
print( round( data_cut['DIS'].mean(), 2 ) )

## 내 최종 코드
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_scale = pd.DataFrame(scaler.fit_transform(data), columns = data.columns)
#print(data_scale.describe()['DIS'])
data_scale = data_scale[ data_scale['DIS'] > 0.4 ]
data_scale = data_scale[ data_scale['DIS'] < 0.6 ]
print( round( data_scale['DIS'].mean() ,2) )

##### 책 해설
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_stdd = scaler.fit_transform(data)
print(type(data_stdd))
data_stdd = pd.DataFrame(data_stdd, columns = data.columns)
print( (data_stdd['DIS'] > 0.4) & (data_stdd['DIS'] < 0.6 ))
# data_stdd 변수의 DIS 칼럼이 0.4~0.6인 값 출력하기
print(data_stdd[ (data_stdd['DIS'] > 0.4) & (data_stdd['DIS'] < 0.6) ])
data_stdd = data_stdd[ (data_stdd['DIS'] > 0.4) & (data_stdd['DIS'] < 0.6) ]
print(data_stdd['DIS'].mean())
print( round(data_stdd['DIS'].mean(), 2) )

## 최종 제출 코드
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data_stdd = scaler.fit_transform(data)
data_stdd = pd.DataFrame(data_stdd, columns = data.columns)
data_stdd = data_stdd[ (data_stdd['DIS'] > 0.4) & (data_stdd['DIS'] < 0.6) ]
print( round( data_stdd['DIS'].mean(), 2 ) )


#--------- <2-6> 유니크한 값 구하기 ---------#
''' Q6. boston 데이터셋의 전체 칼럼에 대해서 중복을 제거한 유니크한 값을 구한 후,
        칼럼별로 유니크한 값의 개수를 기준으로 평균값을 구하시오. '''

##### 내 답안
print(data.columns.size) # data의 column 수 구하기 <- 분모
# 14개의 열이 있음. => col인덱싱은 0~13이 됨. 13-0+1=14
a = []

for i in range(0, data.columns.size) :
    #range(0,14)인데 끝번호 -1이니까 0~13까지 돌아감.
    a.append(data.groupby(data.columns[i])[data.columns[i]].count().size)
print(a)
print(sum(a) / data.columns.size)

## 내 최종 코드
#print(data.columns.size)
a = []
for i in range(0, data.columns.size) :
    a.append( data.groupby([data.columns[i]])[data.columns[i]].count().size )
print( sum(a)/ data.columns.size )                            
    
##### 책 해설
##### 방법 1)
print(data.columns) # 칼럼 목록 확인
data_col = data.columns # 칼럼 저
print(data_col.size) # 칼럼 수 확인
print(data['CHAS'].unique()) 
print(pd.DataFrame(data['CHAS'].unique())) # DF로 변환
print(pd.DataFrame(data['CHAS'].unique()).count())
# ㄴ 건수 확인 -> 0    2 -> 2건이란 뜻. 0은 인덱스
print( int( pd.DataFrame( data['CHAS'].unique() ).count() ) )
# 2건이라는 값만 추출하기 위해 데이터 타입을 int로 변경 !!
# pd.DataFrame( data['CHAS'].unique() ).count()[0] 

# 14개의 칼럼에 같은 작업 반복
print( 
      ( int(pd.DataFrame( data.groupby(['CRIM'])['CRIM'].unique() ).count()) +
        int(pd.DataFrame( data.groupby(['ZN'])['ZN'].unique() ).count()) +
        int(pd.DataFrame( data.groupby(['INDUS'])['INDUS'].unique()).count())+
        int(pd.DataFrame( data.groupby(['CHAS'])['CHAS'].unique() ).count()) +
        int(pd.DataFrame( data.groupby(['NOX'])['NOX'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['RM'])['RM'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['AGE'])['AGE'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['DIS'])['DIS'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['RAD'])['RAD'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['TAX'])['TAX'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['PTRATIO'])['PTRATIO'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['B'])['B'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['LSTAT'])['LSTAT'].unique() ).count() ) +
        int(pd.DataFrame( data.groupby(['MEDV'])['MEDV'].unique() ).count() )
       ) / data.columns.size
      )
      
##### 방법 2)
data_col = data.columns
sum = 0
for i in data_col:
    sum = sum + int( pd.DataFrame(data.groupby([i])[i].unique() ).count() )
    
print(sum)
print(sum / data.columns.size)

## 최종 제출 코드
data_col = data.columns
sum = 0
for i in data_col:
    sum = sum + int( pd.DataFrame(data.groupby([i])[i].unique()).count() )    
print( sum / data.columns.size)
Comments