- 데이터분석 라이브러리를 포함한 데이터 전처리 기법에 익숙하고, 생각한 것을 구현할 수 있는 기술이 중요함
- 어떤 점을 찾아야 데이터 분석에서 중점적인 내용이 나올지? -> 잘하는 사람들의 EDA를 많이 참고
# 데이터들을 불러와봅시다.
file_list = sorted(glob('./data/상가(상권)정보_20230630/*.csv'))
# 함수의 파라미터로 파일 이름 규칙을 주면, 규칙에 해당하는 파일 이름을 모두 가져와주는 함수(특징: 정렬필요!!!)
data = pd.DataFrame()
for file in file_list:
temp = pd.read_csv(file)
data = pd.concat([data, temp], axis=0)
data
# pd.read_csv("./data/상가(상권)정보_20230630/소상공인시장진흥공단_상가(상권)정보_서울_202306.csv")
# 1. 사용할 column을 찾기 위해 데이터의 일부를 사용
# df = data[:10000]
df = data.sample(n=10000, random_state=42)
df
# 2. 사용할 column 슬라이싱
df.iloc[:, 1:11] # 상권업종중분류명
df.iloc[:, 11:15] # 시도명 # 상호명
# 3. 사용할 column 인덱스로 지정
data = data[['상호명','상권업종대분류명','상권업종중분류명','시도명']]
data
# 1. 한식 / 일식 / 중식 음식점 비율 찾기
korea = data.loc[data["상권업종중분류명"]=='한식']
japan = data.loc[data["상권업종중분류명"]=='일식']
china = data.loc[data["상권업종중분류명"]=='중식']
food = data.loc[data["상권업종대분류명"]=='음식']
print("한식 비율 : %.2f%%" % (len(korea) / len(food)*100))
print("일식 비율 : %.2f%%" % (len(japan) / len(food)*100))
print("중식 비율 : %.2f%%" % (len(china) / len(food)*100))
# 2. 각 지역별 음식점 비율 계산해보기
# 대분류명 "음식"을 기준으로 각 지역별 데이터 개수에서 "음식" 데이터 개수를 나누면 계산 가능
시도명 = data["시도명"].unique()
for 시도 in 시도명:
sido = data.loc[data["시도명"]==시도]
sido_hansik = sido.loc[sido["상권업종중분류명"]=="한식"]
print(f"{시도} 한식비율 : {(len(sido_hansik)/len(sido)*100) : .2f}%")
# 시도명, 상권업종중분류명을 기준으로 업종명 카운트
# unstack으로 index로 있던 상권업종중분류명을 column으로 올림
category_count = df.groupby(['시도명','상권업종중분류명'])['상호명'].count().unstack()
category_count
# train.csv 파일 불러오기
titanic = pd.read_csv('./data/titanic/train.csv')
titanic
- 결측치가 존재하는지 (결측지와 숫자가 아닌 데이터 있는지 확인)
- 머신러닝은 숫자만 사용 가능
- dtype이 object인 column이 있는지
- 머신러닝은 숫자만 사용 가능
- target value (예측 대상) 의 distribution이 어떻게 되는지
titanic[titanic.isnull().any(axis=1)]
#titanic.info()
titanic.columns[titanic.dtypes=='object']
titanic.Survived.value_counts()
sns.countplot(data=titanic, x="Survived")
corr = titanic.corr()
sns.heatmap(data=corr, annot=True, fmt ='.3f', cmap="Blues")
cabin = titanic.loc[~titanic['Cabin'].isnull()] # cabin이 nan이 아닌 데이터 (~ 또는 notnull)
cabin_nan = titanic.loc[titanic['Cabin'].isnull()] # cabin이 nan인 데이터
📝 cabin 과 cabin_nan의 차이점을 확인 (display 함수 사용하면 두 개 다 확인 가능) => Cabin값이 존재하면 생존률이 높다. --> 새로운 feature인 is_cabin으로 만들어보자
display(cabin.describe())
cabin_nan.describe()
- Age -> Age의 평균값으로 대체
- Embarked -> drop
# 1. 결측치에 대한 전처리 : cabin => is_cabin
# is_cabin : 0 / 1
titanic['is_cabin'] = ~titanic.Cabin.isnull()*1 # cabin 1 / 0 으로 대체 => # 1 - titanic.Cabin.isnull()*1
titanic['Age'] = titanic.Age.fillna(titanic['Age'].mean()) # Age의 평균값으로 대체
titanic = titanic.drop(columns = ["PassengerId", "Name", "Ticket", "Cabin"])
titanic = titanic.dropna()
titanic
- Ordinal Encoding(모두 숫자로 변환)
# 2. dtype이 object인 column들에 대한 전처리 : Ordinal Encoding(모두 숫자로 변환)
titanic.Sex = pd.factorize(titanic.Sex)[0]
titanic.Embarked = pd.factorize(titanic.Embarked)[0]
titanic