미국에서 화제인 메타의 AI 에이전트 앱 뮤즈가 한국 앱스토어에서는 왜 안 보이는지 iTunes Search API와 구글 플레이를 국가별로 직접 조회해 확인한 글입니다. 2026년 9월 29일 기준으로 미국과 캐나다 스토어에는 Muse from Meta가 올라와 있지만 한국 조회 결과에는 나오지 않았고, 메타의 한국 출시 공식 일정도 찾지 못했습니다. 지역을 바꿔 설치하는 방법도 있지만 한국어 개인정보 처리방침이 없는 상태에서 메일과 캘린더, 컴퓨터 조작까지 한 앱에 연결하는 것은 위험이 크다고 봐서 권하지 않습니다. 원글에는 날짜별 출시 경과, 한국에서 바로 써볼 수 있는 대안 3가지, 출시 뒤 계정을 연결하기 전에 볼 점검 항목까지 정리했고 여기에는 직접 돌려본 조회 명령만 옮깁니다. 앱스토어를 국가별로 직접 조회 curl -s "https://itunes.apple.com/search?term=meta+muse&entity=software&country=kr&limit=5" \ | python3 -c "import sys,json; [print(r['trackName'], r['trackId']) for r in json.load(sys.stdin)['results']]" 미국(us)과 캐나다(ca) 조회에는 Muse from Meta(id6760173601)가 나왔는데 한국(kr) 조회 결과에는 없었고, 상위 5개는 Meta AI, ChatGPT, Claude, Grok, Google Gemini였습니다. 구글 플레이도 같은 방식으로 curl -s -A "Mozilla/5.0" "https://play.google.com/store/search?q=muse%20from%20meta&c=apps&gl=KR" \ | grep -c 'details?id=com.facebook.aura' 미국 설정에서는 패키지명 com.facebook.aura인 앱이 검색되지만 한국 설정에서는 나오지 않았습니다. 그래서 지금은 지역을 바꿔 설치하는 대신 한국 스토어에 이미 있는 Meta AI 앱이나 ChatGPT, Claude, Gemini의 계정 연결 기능으로 먼저 경험해보는 쪽을 권합니다. 메일과 캘린더, 컴퓨터 조작까지 한 앱에 묶이는 서비스를 개인정보 처리방침도 없는 상태로 연결하는 것은 편의보다 위험이 크다는 판단입니다. 전체 과정과 실패 사례는 원글에 정리했습니다: https://blog.wonizz.com/2026/09/29/meta-muse-korea-availability/?utm_source=velog&utm_medium=community&utm_campaign=meta-muse-korea-availability&utm_content=daily
1. 토큰화란? 자연어 처리(NLP)에서는 크롤링, 문서 수집, 로그 데이터 등을 통해 얻은 텍스트 데이터인 코퍼스(corpus) 를 그대로 사용하기 어렵다. 목적에 맞게 텍스트를 전처리해야 하며, 대표적인 전처리 과정에는 다음이 있다. 토큰화(Tokenization) 정제(Cleaning) 정규화(Normalization) 이 중 토큰화란 문장이나 문서에서 의미 있는 최소 단위인 토큰(token) 으로 나누는 작업이다. 토큰은 상황에 따라 단어, 형태소, 문장, 서브워드 등이 될 수 있다. wikidocs 예를 들어 다음 문장이 있다고 가정해보자. Time is an illusion. Lunchtime double so! 구두점을 제거하고 공백을 기준으로 단어 토큰화를 하면 다음과 같이 나눌 수 있다. ["Time", "is", "an", "illusion", "Lunchtime", "double", "so"] 하지만 실제 자연어 처리에서는 단순히 공백 기준으로 문장을 나누는 것만으로 충분하지 않다. 줄임말, 구두점, 숫자, 이메일 주소, 날짜, 한국어 조사처럼 예외적으로 처리해야 하는 요소가 많기 때문이다. wikidocs 2. 단어 토큰화 토큰의 기준을 단어로 설정해 나누는 방식을 단어 토큰화(Word Tokenization) 라고 한다. 영어는 띄어쓰기 단위가 단어와 비교적 잘 일치하기 때문에, 기본적인 경우 공백을 기준으로 나누는 방식이 어느 정도 작동한다. 하지만 아포스트로피, 하이픈, 약어, 고유명사, 숫자 표현 등이 등장하면 토큰화 기준을 세밀하게 설정해야 한다. 예를 들어 아래 문장에서 Don't , Jone's 는 어떻게 분리해야 할까? Don't be fooled by the dark sounding name, Mr. Jone's Orphanage. 토큰화 도구별 결과는 다를 수 있다. 도구 Don't 처리 방식 Jone's 처리 방식 word_tokenize Do , n't Jone , 's WordPunctTokenizer Don , ' , t Jone , ' , s text_to_word_sequence don't 유지 jone's 유지 from nltk.tokenize import word_tokenize, WordPunctTokenizer from tensorflow.keras.preprocessing.text import text_to_word_sequence text = "Don't be fooled by the dark sounding name, Mr. Jone's Orphanage." print(word_tokenize(text)) print(WordPunctTokenizer().tokenize(text)) print(text_to_word_sequence(text)) 이처럼 어느 결과가 정답이라고 단정하기보다, 분석 목적과 이후 모델링 방식에 적합한 토큰화 기준을 선택하는 것 이 중요하다. wikidocs 3. 토큰화 시 고려할 점 구두점과 특수문자는 무조건 제거하지 않는다 구두점이나 특수문자는 항상 불필요한 노이즈가 아니다. 문장의 경계나 특정 의미를 표현할 수 있기 때문에, 단순 삭제 전에 데이터의 역할을 확인해야 한다. 다음과 같은 사례가 있다. 표현 의미 주의점 Ph.D. 학위 약어 마침표를 제거하면 약어 정보가 훼손될 수 있음 AT&T 기업명 특수문자가 이름의 일부임 m.p.h 속도 단위 점을 기준으로 분리하면 의미가 달라질 수 있음 $45.55 가격 $ , 소수점이 의미를 가짐 01/02/06 날짜 / 가 날짜 구분자 역할을 함 123,456,789 큰 수 , 가 숫자 단위 표현에 필요함 즉, 구두점 제거는 일괄적으로 수행하기보다 데이터의 도메인과 모델의 목적에 따라 결정해야 한다. 금융 텍스트에서는 금액, 수익률, 날짜, 종목 코드와 같은 정보가 많으므로 숫자·통화기호·소수점·쉼표의 처리 기준을 특히 주의할 필요가 있다. wikidocs 줄임말과 띄어쓰기가 포함된 표현 영어에는 아포스트로피를 통해 단어가 축약되는 경우가 많다. I'm → I am we're → we are what're → what are doesn't → does not 또한 여러 단어가 하나의 의미 단위로 사용되기도 한다. New York rock 'n' roll 따라서 토큰화 과정은 단순히 공백이나 기호를 기준으로 자르는 작업이 아니라, 문맥과 언어 규칙을 고려해 의미 단위를 보존하는 작업 이라고 볼 수 있다. wikidocs Penn Treebank 토큰화 예시 Penn Treebank 토큰화 규칙의 대표적 특징은 다음과 같다. 하이픈으로 연결된 단어는 하나의 토큰으로 유지한다. doesn't 처럼 접어(clitic)가 붙은 축약형은 분리한다. from nltk.tokenize import TreebankWordTokenizer tokenizer = TreebankWordTokenizer() text = ( "Starting a home-based restaurant may be an ideal. " "it doesn't have a food chain or restaurant of their own." ) print(tokenizer.tokenize(text)) 출력 예시는 다음과 같다. [ 'Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.' ] home-based 는 하나의 토큰으로 유지되고, doesn't 는 does 와 n't 로 분리되는 것을 확인할 수 있다. wikidocs 4. 문장 토큰화 문장을 기준으로 텍스트를 나누는 작업을 문장 토큰화(Sentence Tokenization) 또는 문장 분리(Sentence Segmentation)라고 한다. 가장 단순한 방법은 마침표( . ), 물음표( ? ), 느낌표( ! )를 기준으로 나누는 것이다. 하지만 마침표는 문장의 끝뿐 아니라 약어, 이메일 주소, IP 주소, 소수점 등에도 사용된다. 예를 들어 아래 문장을 단순히 마침표 기준으로 나누면 문제가 생긴다. IP 192.168.56.31 서버에 접속해 주세요. 결과는 aaa@gmail.com으로 보내주세요. IP 주소의 점, 이메일 주소의 점, 문장 종결의 점을 모두 같은 방식으로 처리하면 잘못된 문장 분리가 발생할 수 있다. 또 Ph.D. 처럼 약어 내부에 포함된 마침표도 문장 끝으로 판단하면 안 된다. wikidocs NLTK 영어 문장 토큰화 NLTK의 sent_tokenize() 는 단순한 마침표 분할보다 더 정교하게 문장을 나눈다. from nltk.tokenize import sent_tokenize text = ( "I am actively looking for Ph.D. students. " "and you are a Ph.D student." ) print(sent_tokenize(text)) [ 'I am actively looking for Ph.D. students.', 'and you are a Ph.D student.' ] Ph.D. 내부의 마침표를 문장 종결로 오해하지 않고 처리한다. wikidocs 한국어 문장 토큰화 한국어 문장 분리에는 KSS(Korean Sentence Splitter)를 사용할 수 있다. pip install kss import kss text = ( "딥 러닝 자연어 처리가 재미있기는 합니다. " "그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. " "이제 해보면 알걸요?" ) print(kss.split_sentences(text)) [ '딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다.', '이제 해보면 알걸요?' ] 한국어 NLP에서는 한국어의 문장 종결 표현과 문장 부호 특성을 고려한 도구를 사용하는 것이 유리하다. wikidocs 5. 한국어 토큰화가 어려운 이유 한국어는 영어와 달리 단순한 띄어쓰기 기준 토큰화만으로 충분한 결과를 얻기 어렵다. 가장 큰 이유는 한국어가 교착어 이기 때문이다. 교착어는 조사, 어미, 접사 등이 어근이나 명사 뒤에 붙어 문법적 의미를 만드는 언어를 말한다. 예를 들어 다음 문장을 보자. 에디가 책을 읽었다. 띄어쓰기 기준으로 분리하면 다음과 같다. ['에디가', '책을', '읽었다'] 하지만 형태소 단위로 나누면 다음처럼 분석할 수 있다. 에디 / 가 / 책 / 을 / 읽 / 었 / 다 구분 예시 설명 자립 형태소 에디, 책 독립적으로 의미를 지니는 단위 의존 형태소 가, 을, 었, 다 다른 형태소와 결합해 문법적 기능을 하는 단위 한국어 자연어 처리에서는 명사, 동사 어간, 조사, 어미 등을 분리해야 하는 경우가 많다. 따라서 한국어에서는 어절 단위 토큰화보다 형태소 토큰화(Morpheme Tokenization) 가 중요하다. wikidocs 또한 실제 한국어 데이터에는 띄어쓰기 오류가 흔하다. 제가이렇게띄어쓰기를전혀하지않고글을썼다고하더라도 글을이해할수있습니다. 한국어는 띄어쓰기가 완벽하지 않아도 문맥으로 의미를 추론할 수 있는 경우가 많다. 하지만 모델 입장에서는 단어 경계가 불명확해질 수 있으므로, 실제 서비스 데이터에서는 띄어쓰기 교정이나 형태소 분석 품질이 NLP 성능에 영향을 줄 수 있다. wikidocs 6. 품사 태깅 품사 태깅(Part-of-Speech Tagging, POS Tagging) 은 토큰마다 문법적 역할을 부여하는 작업이다. 같은 표기를 가진 단어라도 품사에 따라 의미가 달라질 수 있다. fly 동사: 날다 명사: 파리 한국어도 마찬가지다. 못 명사: 망치로 박는 물건 부사: 어떤 행동을 할 수 없다는 의미 따라서 단어의 문맥상 의미를 이해하거나, 명사만 추출해 키워드 분석을 수행하거나, 동사·형용사 중심의 감성 분석을 수행하려면 품사 정보가 유용하다. wikidocs NLTK 영어 품사 태깅 from nltk.tokenize import word_tokenize from nltk.tag import pos_tag text = "I am actively looking for Ph.D. students." tokens = word_tokenize(text) print(pos_tag(tokens)) [ ('I', 'PRP'), ('am', 'VBP'), ('actively', 'RB'), ('looking', 'VBG'), ('for', 'IN'), ('Ph.D.', 'NNP'), ('students', 'NNS'), ('.', '.') ] 대표적인 Penn Treebank 품사 태그는 다음과 같다. 태그 의미 PRP 인칭대명사 VBP 동사 RB 부사 VBG 현재분사 IN 전치사 NNP 고유명사 NNS 복수 명사 CC 접속사 DT 관사 7. KoNLPy를 이용한 한국어 형태소 분석 한국어 NLP에서는 KoNLPy를 이용해 형태소 분석과 품사 태깅을 수행할 수 있다. KoNLPy에서 활용할 수 있는 대표적인 형태소 분석기는 다음과 같다. Okt(Open Korean Text) Mecab Komoran Hannanum Kkma 대표적으로 Okt 는 다음 메서드를 제공한다. 메서드 기능 morphs() 형태소 추출 pos() 형태소와 품사 태그 추출 nouns() 명사 추출 from konlpy.tag import Okt okt = Okt() text = "열심히 코딩한 당신, 연휴에는 여행을 가봐요" print(okt.morphs(text)) print(okt.pos(text)) print(okt.nouns(text)) 출력 예시는 다음과 같다. # 형태소 분석 ['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요'] # 품사 태깅 [ ('열심히', 'Adverb'), ('코딩', 'Noun'), ('한', 'Josa'), ('당신', 'Noun'), (',', 'Punctuation'), ('연휴', 'Noun'), ('에는', 'Josa'), ('여행', 'Noun'), ('을', 'Josa'), ('가봐요', 'Verb') ] # 명사 추출 ['코딩', '당신', '연휴', '여행'] 같은 문장이라도 분석기마다 결과가 달라질 수 있다. 예를 들어 Okt는 가봐요 를 하나의 동사 형태로 처리할 수 있지만, Kkma는 가보 , 아요 처럼 더 세분화할 수 있다. 따라서 형태소 분석기를 선택할 때는 다음을 기준으로 판단하는 것이 좋다. 처리 속도가 중요한가 신조어·SNS 문체 처리가 중요한가 문어체·뉴스 데이터가 중심인가 명사 추출만 필요한가 세밀한 문법 분석이 필요한가 프로젝트 환경에서 설치와 운영이 쉬운가 특히 대규모 한국어 데이터 처리에서는 처리 속도가 중요한 경우가 많아 Mecab을 고려할 수 있고, SNS·구어체 데이터 분석에서는 Okt를 실험 후보로 사용할 수 있다. wikidocs 8. 정리 토큰화는 텍스트를 모델이 처리할 수 있는 의미 단위로 나누는 NLP 전처리 과정이다. 토큰의 단위는 단어, 문장, 형태소, 서브워드 등 목적에 따라 달라질 수 있다. 구두점, 특수문자, 숫자, 날짜, 통화기호는 무조건 제거하지 않고 의미를 고려해야 한다. 영어는 공백 기반 토큰화가 어느 정도 가능하지만 축약형, 약어, 하이픈 등의 예외 처리가 필요하다. 문장 토큰화에서는 마침표가 약어·이메일·IP 주소·소수점 등에 포함될 수 있음을 고려해야 한다. 한국어는 조사와 어미가 결합하는 교착어이므로, 띄어쓰기 단위보다 형태소 단위 토큰화가 중요하다. 품사 태깅은 단어의 문법적 역할을 부여해 의미 분석, 키워드 추출, 감성 분석 등에 활용할 수 있다. 한국어 형태소 분석기마다 토큰 분리와 품사 태깅 결과가 다르므로, 실제 데이터와 목적에 맞춰 비교·선택해야 한다.
코드잇 데이터분석가 부트캠프를 통해 배우고 느낀 것을 적습니다. 강의/미션/위클리페이퍼/프로젝트로 나누어 작성합니다. 📅 2026.05.21 | 🗺️ 과정: 1개월차 ▓░░░░░░ | 📖 커리큘럼: 미션 4 큰 데이터를 처음부터 끝까지 탐색하며, 그래프가 그려졌다고 분석이 맞는 것은 아니라는 것을 확인한 하루였다. 🗓️ 오늘의 일정 교시 시간 내용 1~3교시 09:00~12:00 미션 진행, 정리와 시각화 4~7교시 13:00~17:00 미션 마무리, 제출, 해설 강의 8~9교시 17:00~19:00 해설과 내 코드 비교, 자습 미션 4는 하루에 끝나서, 진행한 과정부터 해설 비교까지 오늘 한 편에 모두 적는다. 1️⃣ 오늘 진행한 일 어제 배운 EDA 흐름을 큰 규모의 건강검진 데이터에 처음부터 끝까지 적용하는 미션이었다. 데이터를 불러오고 구조와 컬럼 의미를 확인하는 연습 결측치와 이상치, 중복값을 확인하고 처리하는 연습 코드로 적힌 값을 이름표로 바꾸고, 수치형과 범주형의 기술통계를 확인하는 연습 분포, 변수 간 관계, 연령대별 차이, 성별에 따른 생활습관을 시각화하는 연습 체중과 신장으로 새 지표를 만들고, 그 지표를 기준으로 집단을 비교하는 연습 마지막으로 자유롭게 탐색하는 심화 과제 미션에는 탐색하며 알아낸 내용을 보고서로 정리하는 단계도 함께 안내되어 있었다. 2️⃣ 내가 진행한 과정 2-1. 불러오고, 의미를 먼저 확인했다 🛠️ 무엇을 했나. 한글 글꼴을 설치하고 설정하는 셀을 먼저 실행한 뒤, 드라이브를 연결해 파일을 인코딩을 지정해서 불러왔다. 행과 열의 수, 컬럼 이름, 정보 요약을 차례로 확인했다. 숫자로 저장되어 있지만 의미가 범주인 컬럼은 복사본을 만들어 범주형으로 바꾸었다. 성별, 연령대, 청력, 흡연, 음주 컬럼이 여기에 해당한다. 💭 어제 배운 "숫자라고 다 숫자가 아니다"를 바로 써 볼 수 있어서 뿌듯했다. 다만 지역 코드는 범주형 목록에서 빠뜨렸다는 것을 나중에 알았다. 2-2. 결측치를 확인하고 채웠다 🛠️ 무엇을 했나. 컬럼별 결측 개수를 센 뒤, 불리언의 평균이 비율이 된다는 힌트를 이용해 비율도 퍼센트로 확인했다. 결측이 하나라도 있는 행의 수도 따로 세었다. 채울 때는 숫자형 컬럼을 하나씩 돌며 중앙값으로, 범주형 컬럼을 하나씩 돌며 최빈값의 첫 번째 값으로 채웠다. 💭 비율을 보니 결측이 가장 많은 컬럼도 전체에서 아주 작은 부분이라는 것을 알았고 마음이 놓였다. 한편 같은 셀을 복사해서 고쳐 가며 실행하다 보니 비슷한 코드가 여러 셀에 남아서 어느 셀이 최종인지 헷갈렸다. 2-3. 이상치를 확인하고 지웠다 🛠️ 무엇을 했나. 허리둘레, 수축기혈압, 식전혈당의 히스토그램을 한 줄에 세 개로 그리고 기술통계를 확인했다. 이후 키, 체중, 허리둘레, 시력, 혈압, 혈당 컬럼마다 상식적으로 불가능한 범위를 직접 정해서 그 밖의 값이 있는지 먼저 확인했다. 그다음 IQR 경계를 계산해서 경계 밖의 행을 삭제했다. 여덟 개 컬럼을 하나의 반복문에 넣어 차례로 삭제했다. 같은 셀을 다시 돌렸더니 이상치 개수가 모두 영으로 나와서 삭제가 적용된 것을 확인했다. 💭 상식 범위를 컬럼마다 따로 정하는 일이 생각보다 어려웠다. 그리고 반복문 한 번으로 여덟 개 컬럼을 연달아 지우니 행이 눈에 띄게 줄어서, 너무 많이 지우는 것은 아닌지 불안했다. 2-4. 중복을 확인하고 이름표를 붙였다 🛠️ 무엇을 했나. 중복은 안내된 순서대로 여부 확인, 개수 확인, 중복 행 확인, 제거, 인덱스 정리, 크기 확인을 차례로 했고, 중복 개수는 영이었다. 지역 코드와 연령대 코드는 제공된 매핑표를 이용해 새 컬럼으로 바꿨다. 성별 매핑표는 직접 만들어서 같은 방식으로 이름표 컬럼을 붙였다. 💭 중복이 없다는 결과를 보고 허무했지만, 없다는 것을 확인하는 것도 분석의 일부라고 생각했다. 2-5. 기술통계를 보고 분포를 그렸다 🛠️ 무엇을 했나. 숫자형 컬럼만 골라 기술통계를 출력하고, 범주형 컬럼은 반복문으로 컬럼마다 빈도를 출력했다. 이어서 수축기혈압, 신장, 체중, 허리둘레의 히스토그램을 그리고, 신장은 성별로 색을 나누어 다시 그렸다. 색과 테두리를 바꿔 보기도 했다. 체중과 혈압의 성별 비교는 같은 방식으로 반복했고, 박스플롯과 바이올린 플롯도 연습 삼아 시도했다. 그래프마다 아래에 해석을 주석으로 적었다. 💭 그래프를 그리고 곧바로 해석 한두 줄을 적는 습관이 생겨서 만족스러웠다. 다만 바이올린 플롯 셀은 제목과 코드의 대상 변수가 달랐는데, 주석의 해석도 그대로 이어졌다. 2-6. 변수 사이의 관계를 확인했다 🛠️ 무엇을 했나. 그래프에 쓸 표본을 뽑는 셀까지 만들었지만 실제 그래프를 그리는 코드는 주석으로만 남아 있다. 상관계수는 네 개 변수를 골라 계산하고 히트맵으로 그렸다. 체중과 허리둘레의 관계가 가장 강하게 나타났다. 💭 상관 그래프를 반만 완성한 채 지나간 것이 아쉬웠다. 히트맵으로는 강도를 확인했지만 점들이 어떤 모양인지는 보지 못했다. 2-7. 연령대별 차이와 성별 생활습관을 비교했다 🛠️ 무엇을 했나. 연령대별로 평균을 구해 신장, 체중, 허리둘레, 혈압을 막대그래프로 그리고 각각 해석을 적었다. 성별에 따른 흡연과 음주는 교차표로 개수와 비율을 만들고 누적 막대그래프로 나타냈다. 흡연은 남성이 과거와 현재를 합쳐 훨씬 높았고, 음주도 남성이 더 높았다. 💭 교차표에서 비율로 바꾸니 인원수 차이에 가려져 있던 모습이 보였다. 다만 흡연은 원본 표로, 음주는 정리한 표로 그리는 식으로 서로 다른 데이터를 섞어 썼다는 점이 걸린다. 2-8. BMI를 만들고 집단을 비교했다 🛠️ 무엇을 했나. 체중을 신장 제곱으로 나누어 BMI 열을 만들고, 구간을 나누는 함수로 저체중, 정상 체중, 과체중, 비만 열을 만들었다. 그 뒤 BMI 분포, 성별 비교, 연령대별 평균과 비만도 비율, BMI와 다른 지표의 산점도와 상관 히트맵, 비만도별 흡연과 음주 비교까지 이어서 그렸다. 연령대별 해석에는 BMI가 나이가 들수록 올라간다고 적었고, 흡연은 비만일수록 비흡연이 늘어난다고 적었다. 💭 그래프가 계속 그려지니 잘 되고 있다고 믿었다. 해석 문장도 그럴듯하게 이어져서 의심하지 않았다. 2-9. 마지막 심화 과제는 비어 있다 🛠️ 무엇을 했나. 자유롭게 탐색하는 마지막 심화 과제에는 손을 대지 못했다. 💭 시간이 다 되어서 비워 둔 것이 아쉬웠다. 해설을 듣고 나서 처음부터 다시 해 보고 싶다. 3️⃣ 강의에서 배우고 써먹은 점 강의에서 배운 것 미션에서 써먹은 곳 의미가 범주인 숫자는 범주형으로 바꾼다 성별, 연령대, 청력, 흡연, 음주 컬럼 변환 수치형은 중앙값, 범주형은 최빈값으로 채운다 결측치 반복문 처리 이상치는 상식 확인 뒤에 IQR로 본다 컬럼별 비현실 범위 확인과 경계 계산 기술통계표를 질문하며 읽는다 평균과 중앙값, 최솟값과 최댓값 점검 산점도와 히트맵의 역할 구분 상관 히트맵으로 관계의 강도 확인 코드값을 이름표로 바꾸어 읽는다 지역명, 연령대, 성별 컬럼 생성 연령대별 여러 지표를 함께 읽는다 연령대별 신장, 체중, 허리둘레, 혈압 비교 바이올린 플롯으로 분포 모양을 본다 허리둘레의 성별, 연령대별 분포 💡 어제 강의에서 하나씩 배운 것이 미션에서는 한 줄로 이어졌다. 같은 흐름을 한 번 더 직접 돌려 보면서 순서가 몸에 붙는 느낌이 들었다. 4️⃣ 해설 강의에서 배운 것: 질문과 답, 그리고 느낀 점 해설은 정답을 알려 주기보다 왜 그 순서로 하는지를 짚었다. 내가 막힌 곳에 맞춰 정리한다. 4-1. 특수 코드는 결측 처리 전에 분리한다 ❓ 의문. 시력 컬럼은 다른 수치 컬럼처럼 중앙값으로 채우면 되는지 헷갈렸다. 📖 배움. 미션의 데이터 설명에는 시력의 실명을 9.9로 표기한다고 적혀 있었다. 즉 시력에는 측정값이 아닌 특수 코드가 섞여 있었다. 해설은 결측을 채우기 전에 그 코드를 먼저 별도의 표시 열로 남기고, 원래 열에서는 결측으로 바꾼 뒤에 수치형 결측과 함께 처리했다. 순서가 바뀌면 특수 코드가 평균과 중앙값에 섞여 통계가 왜곡된다. import numpy as np import pandas as pd check = pd.DataFrame({'점수': [8.5, 7.0, 99, 6.5]}) # 99는 미응시 표시라고 가정 check['미응시'] = np.where(check['점수'] == 99, 1, 0) # 1단계 표시 열 남기기 check['점수'] = check['점수'].replace(99, np.nan) # 2단계 결측으로 바꾸기 check['점수'] = check['점수'].fillna(check['점수'].median()) # 3단계 중앙값으로 채우기 print(check) 💭 데이터 설명에 분명히 적혀 있었는데도 나는 특수 코드를 따로 확인하지 않고 이상치 삭제 반복문에 그대로 맡겼다. 지워야 할 값이 아니라 의미가 있는 값이었다는 점에서 뼈아팠다. 어제 강의에서 정확히 이 부분을 경고했는데도 놓쳤다. 4-2. 이상치는 탐지 기준일 뿐이다 ❓ 의문. IQR 경계 밖의 값은 모두 지워도 되는지 궁금했다. 📖 배움. IQR은 이상치 후보를 찾는 기준이지 무조건 지우라는 뜻이 아니다. 해설은 가장 기본적인 연습에서는 간단하게 삭제했고, 실무에서는 이상치 집단을 따로 뽑아 특성을 비교하는 확장이 필요하다고 짚었다. 또 해설은 허리둘레, 수축기혈압, 식전혈당 세 컬럼만 대상으로 삼았고, 한 컬럼씩 삭제 뒤의 크기를 확인했다. 💭 나는 여덟 개 컬럼에 같은 기준을 한꺼번에 적용했다. 대상 컬럼을 고르는 것부터가 판단의 일부였다는 것을 알았다. 4-3. 순서가 있는 범주는 순서를 알려 준다 📖 배움. 연령대는 문자열로만 두면 정렬과 그래프에서 순서가 꼬일 수 있다. 순서가 있는 범주라고 지정하면 집계와 그래프가 자연스러운 순서로 나온다. ages = pd.Series(['30대', '10대', '20대']) order = ['10대', '20대', '30대'] ages = pd.Categorical(ages, categories=order, ordered=True) # 순서를 알려 준다 print(pd.Series(ages).sort_values()) 💭 내 데이터에서는 우연히 순서가 맞게 나왔지만, 문자열 정렬에 기대고 있었다는 점이 찜찜했다. 4-4. 집단 차이는 박스플롯이 설명하기 좋다 📖 배움. 성별 차이처럼 두 집단의 차이를 말할 때는 겹쳐 그린 히스토그램보다 박스플롯이 중앙값과 사분위 범위를 한눈에 비교하게 해 주어 설명력이 좋다. 히스토그램은 겹침이 심하면 읽기 어렵다. 💭 나는 히스토그램에 색만 나누어 그렸는데, 비교가 목적이라면 도구도 목적에 맞게 골라야 한다는 것을 배웠다. 4-5. 비율을 볼 때는 어느 쪽 기준인지 정한다 ❓ 의문. 교차표를 비율로 바꿀 때 행 기준과 열 기준의 차이가 무엇인지 헷갈렸다. 📖 배움. 행 기준은 각 집단 안에서 구성비를 보는 것이고, 열 기준은 각 상태 안에서 집단이 차지하는 비중을 보는 것이다. 어떤 질문을 하느냐에 따라 기준이 달라진다. ct = pd.crosstab( ['남', '남', '여', '여', '여'], ['흡연', '비흡연', '비흡연', '비흡연', '흡연'], normalize='index' # 행 기준, 열 기준이 필요하면 'columns' ) print((ct * 100).round(1)) 💭 나는 행 기준으로만 썼는데, 열 기준이라는 선택지가 있다는 것을 알고 나니 질문에 맞게 고르는 것이 중요하다고 느꼈다. 4-6. 같은 데이터프레임을 끝까지 쓴다 📖 배움. 해설은 처음부터 끝까지 하나의 표를 정리해 가며 이어서 썼다. 각 단계에서 만든 컬럼도 같은 표에 쌓았다. 새 지표를 만들 때도 같은 표 안의 컬럼끼리 계산했다. 💭 나는 원본 표와 복사본을 번갈아 쓰면서 각 그래프가 어느 표의 결과인지 구분하기 어려워졌다. 이번 미션에서 가장 크게 느낀 교훈이다. 4-7. 평균만 보면 구성의 차이가 가려진다 📖 배움. 연령대별 평균 BMI는 큰 차이가 없어 보였지만, 비만도를 구간으로 나누어 비율을 보니 중년층에서 비만이 늘고 고령층에서 다시 줄어드는 구성의 차이가 드러났다. 평균과 구성비를 함께 연결해서 설명해야 한다. 💭 내가 쓴 해석은 이 설명과 정반대였다. 그래프가 그려졌다는 이유로 맞다고 믿은 것이 문제였다. 💡 평균 하나로 말하는 것과 구성을 나누어 보는 것은 같은 데이터에서도 전혀 다른 결론으로 이어질 수 있다. 4-8. 자유 EDA는 질문에서 시작한다 📖 배움. 해설의 자유 EDA는 식전혈당이 높은 집단을 따로 뽑아 나머지와 평균과 구성을 비교하는 것부터 시작했다. 지역별 평균 지표, 연령대와 성별 조합의 변화, 흡연 상태에 따른 혈압과 혈당 비교처럼 질문을 먼저 정한 뒤 그에 맞는 그래프를 고르는 식이었다. 💭 나는 마지막 과제를 시작도 못 했는데, 해설을 보니 이상한 값을 별도의 집단으로 보는 발상은 어제 배운 이상치 처방과 이어져 있었다. 다시 도전하면 해 볼 수 있을 것 같다. 5️⃣ 해설과 내 코드의 다른 점 내 노트북과 해설을 문제별로 나란히 놓고 비교했다. 항목 내 코드 해설 컬럼 역할 정리 의미가 범주인 컬럼 일부를 범주형으로 바꿨다. 지역 코드는 빠졌다. 역할별로 컬럼 목록을 먼저 만들고 시작한다. 특수 코드 데이터 설명에 적혀 있었지만 따로 확인하지 못했다. 표시 열을 남기고 결측으로 바꾼 뒤 처리한다. 결측 처리 숫자형과 범주형을 반복문으로 채웠다. 같은 셀을 여러 번 복사했다. 역할별로 목록을 나누어 한 번에 채운다. 이상치 대상 컬럼 여덟 개를 한 반복문에서 삭제했다. 세 컬럼만 대상으로 삼고 단계마다 크기를 확인한다. 이상치 판단 상식 범위를 직접 정해 확인한 뒤 삭제했다. 탐지 기준일 뿐이고 실무에서는 집단 분석으로 확장한다고 짚는다. 중복값 안내된 순서대로 처리했다. 같은 순서로 처리한다. 이름표 컬럼 지역과 연령대, 성별을 새 컬럼으로 만들었다. 같은 방식이고 흡연, 음주, 청력까지 모두 만든다. 연령대 순서 순서를 지정하지 않았다. 순서형 범주로 지정한다. 기술통계 숫자형과 범주형을 나누어 확인했다. 같은 흐름이고, 교차표까지 이어서 본다. 분포 비교 색을 나눈 히스토그램을 주로 썼다. 박스플롯을 비교의 중심에 둔다. 변수 관계 표본 추출까지만 하고 페어플롯은 그리지 못했다. 표본을 뽑아 페어플롯을 그리고 해석한다. 상관 히트맵 코드와 식별자 컬럼까지 포함해서 큰 히트맵을 그렸다. 의미 있는 컬럼만 골라서 그린다. 사용한 표 원본 표와 정리한 표를 섞어 썼다. 하나의 표를 끝까지 이어서 쓴다. BMI 계산 체중은 원본 표에서, 신장은 정리한 표에서 가져와 계산했다. 같은 표의 두 컬럼으로 계산한다. 비만도 구간 미션 안내의 기준 대신 정상 체중의 상한을 더 낮게 잡은 구간을 썼다. 나와 같은 구간을 쓰고, 경계를 포함하는지를 주석으로 설명한다. 연령대별 BMI 해석 나이가 들수록 올라간다고 해석했다. 평균은 큰 변화가 없고 구성비에서 차이가 난다고 해석한다. 비만도별 흡연 비만일수록 비흡연이 는다고 해석했다. 비만일수록 흡연 경험이 많다고 해석한다. 자유 EDA 시작하지 못했다. 질문을 정해 집단 비교를 한다. 💡 비교해 보니 앞부분은 해설과 거의 같은 흐름이었지만, 달랐던 곳은 대부분 "결과는 나오지만 맞는지 확인하지 않은" 부분이었다. 특히 BMI를 서로 다른 표에서 가져와 계산한 것이 뒤의 해석을 모두 어긋나게 만들었다. 그래프가 그려진다는 것과 분석이 맞다는 것은 다르다는 것을, 5일차와 11일차에 이어 다시 확인했다. 📝 오늘의 정리 주제 내가 이해한 핵심 더 공부할 점 컬럼 정리 의미로 역할을 나누고 특수 코드를 먼저 분리한다 코드 종류 점검 습관 이상치 탐지 기준일 뿐이고 대상과 처방을 판단한다 이상치 집단 따로 분석 표 관리 하나의 표를 끝까지 이어서 쓴다 셀 정리와 최종본 구분 계산 검증 새 지표를 만들면 값이 맞는지 앞부분을 확인한다 결과가 이상하면 계산부터 의심 시각화 비교의 목적에 맞는 그래프를 고른다 박스플롯과 구성비 그래프 해석 평균과 구성을 함께 보고 결론을 쓴다 자유 EDA 처음부터 다시 📌 다음 일차 다음 일차: 14일차 (2026-05-22) 커리큘럼: Tableau 다음 강의자료 예고: 코드가 아닌 도구로 대시보드를 만드는 시각화를 시작한다.