[TIL] ols : 변수명의 공백과 특수문자 해결하기

회귀분석 실습 오류

ols 모듈을 이용해 파이썬으로 회귀분석을 실습해 보았다.

import pandas as pd
from statsmodels.formula.api import ols
data5 = pd.read_excel("야매 데이터.xlsx")

불러 온 파일은, 실습을 위해 임의로 만든 데이터...
선호도를 종속변수로 회귀 분석을 하려 했다.

res5 = ols('선호도 ~ 빵,케잌 맛 + 커피 맛(아메리카노 기준) + 콘센트 적합도 + 화장실 퀄리티 + 공부 분위기 + 접근성 + 가격',
           data = data5).fit()

그런데 웬걸! SyntaxError ㅠㅠ column명에 공백이 있어서 그런 모양..


실습 오류 해결기 0 : 방향 잡기

column 이름 자체를 변경하면 될 것 같았다.
오류가 나는 공백을 처리하기로 했다.

실습 오류 해결기 1 : 공백 치환

먼저 데이터의 모든 column명을 list에 넣고,
list comprehension으로 공백을 언더바로 바꿔주었다.

col_list = list(data5.columns)
col_list = [k.replace(" ","_") for k in col_list]
['카페_이름',
 '빵,케잌_맛',
 '커피_맛(아메리카노_기준)',
 '콘센트_적합도',
 '화장실_퀄리티',
 '공부_분위기',
 '접근성',
 '가격',
 '선호도']

데이터의 column명도 앞서 만든 리스트로 업데이트한다.

data5.columns = col_list

다시 ols에 넣어보지만,
res5 = ols('선호도 ~ 카페_이름 + 빵,케잌_맛 + 커피_맛(아메리카노_기준) + 콘센트_적합도 + 화장실_퀄리티 + 공부_분위기 + 접근성 + 가격',
           data = data5).fit()

여전한 오류.
특수문자 때문인 것.
쉼표와 괄호도 처리해야 한다...
이 역시도 replace를 써서 앞선 과정을 응용할 수 있다.

col_list= [k.replace(",","_") for k in col_list]

하지만 괄호 ()도 처리해 주어야 하는 걸?

실습 오류 해결기2 : 정규표현식

깔끔하고 간편한 코드를 위해 정규표현식을 써보기로 했다.

re.sub(정규표현식, 치환 값, 문자)

해당 문자의 정규표현식에 해당하는 값을,
원하는 문자로 치환할 수 있다!

여기서는 '_'로 바꾸지만 ''로 바꿔서 아예 없애도 된다.

import re
for k in range(len(col_list)):
    filtered_col = re.sub(r'[^\d\w]', '_',col_list[k])
    col_list[k] = filtered_col

^는 제외한다는 표시
d와 w는 각각 숫자와 문자 (공백은 s)

collist[k]의 숫자와 문자를 제외하고 ''로 변경하라는 명령

즉. 특수문자와 공백은 '_'로 바꿔라

['카페_이름',
 '빵_케잌_맛',
 '커피_맛_아메리카노_기준_',
 '콘센트_적합도',
 '화장실_퀄리티',
 '공부_분위기',
 '접근성',
 '가격',
 '선호도']

잘 변경했다면 잊지말고 데이터 column에 넣어주기. 그래야 ols 구문을 적용할 수 있다.
data5.columns = col_list
res5 = ols('선호도 ~ 빵_케잌_맛 + 커피_맛_아메리카노_기준_ + 콘센트_적합도 + 화장실_퀄리티 + 공부_분위기 + 접근성 + 가격',
           data = data5).fit()

다시 넣어주면 오류 없이 넘어간다.
1번 과정은 버리고, 2번 과정 하나만 거치면 된다!!!


정리하자면

data5 = pd.read_excel("야매 데이터.xlsx")
col_list = list(data5.columns)

import re
for k in range(len(col_list)):
    filtered_col = re.sub(r'[^\d\w]', '_',col_list[k])
    col_list[k] = filtered_col

data5.columns = col_list

이렇게 해서 column명을 처리할 수 있다

추가로

독립변수 쓸 때, column명 출력해서 복붙하면, 작은 따옴표 지우랴 쉼표 지우랴 귀찮으니까...

column명을 join해주면,

text_join = ' + '.join(data5.columns)
text_join
'카페_이름 + 빵_케잌_맛 + 커피_맛_아메리카노_기준_ + 콘센트_적합도 + 화장실_퀄리티 + 공부_분위기 + 접근성 + 가격 + 선호도'

깔끔하게 +로 연결되어서 나온다.
'선호도'는 종속변수니까 지우고
ols 독립변수 자리에 붙여넣기 하면 된다. (종속변수 제외하고 join하는 것도 코드로 짤 수 있을 것 같은데 더 생각해보지 않았다)
(f-string도 될 것 같은데 생각하기 귀찮다)

첫 TIL 끝! 다음에는 더 빠르게 쓰고 싶어요 ..

좋은 웹페이지 즐겨찾기