출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] 'Python' 태그의 글 목록 (2 Page) :: 하나둘셋넷
728x90

python 기법] 워드 클라우드

 

텍스트 전처리

ㆍ 파일 읽기, 내용 확인

# 파일 읽기
file = open('Dream.txt', 'r', encoding='UTF-8')
text = file.read() 
file.close()

# 확인(100 글자만)
text[:100]

 

ㆍ split() 메소드를 이용하여 단어 단위로 잘라 리스트 형태로 만들기

# 공백을 구분자로 하여 단어 단위로 자르기
wordList = text.split()

# 확인(10 개만)
wordList[:10]

 

 

단어별 빈도수 계산하여 딕셔너리에 저장

# 중복 단어 제거
worduniq = set(wordList)

# 딕셔너리 선언
wordCount = {}

# 단어별 개수 저장
for w in worduniq:
    wordCount[w] = wordList.count(w)

# 제외 대상 조사 
del_word = ['the','a','is','are', 'not','of','on','that','this','and','be','to', 'from']

# 제외하기
for w in del_word:
    if w in wordCount:
        del wordCount[w]

 

 

워드 클라우드 그리기

# 패키지 설치
!pip install wordcloud

# 라이브러리 불러오기
import matplotlib.pyplot as plt
from wordcloud import WordCloud
%config InlineBackend.figure_format='retina'

# 워드 클라우드 만들기
wordcloud = WordCloud(font_path = 'C:/Windiws/fonts/HMKMRHD.TTF', 
                      width=2000,
                      height=1000,
                     # colormap='Blues'
                      background_color='white').generate_from_frequencies(wordCount)

# 표시하기
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()

 

불필요한 단어나 조사 추가 제거

# 제외 대상 조사
del_word = ['for','But','into','So', 'which','by','as','With','am','was','when','who', 'an', 'has', 'in']

# 제외하기
for w in del_word:
    if w in wordCount:
        del wordCount[w]

 

워드 클라우드 그리기

# 워드 클라우드 만들기
wordcloud = WordCloud(font_path = 'C:/Windiws/fonts/HMKMRHD.TTF',
                      width=2000, 
                      height=1000, 
                      background_color='white').generate_from_frequencies(wordCount)

# 표시하기
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
728x90
728x90

범주형 feature -> 수치형 target

 

카이제곱 검정, ttest, ANOVA 검정에서의 p_value의 의미 

 

  t-검정

 

- 귀무가설 : 집단의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

  카이제곱 검정

 

- 귀무가설 : 두 집단의 빈도 분포가 독립적이다.

- p-value < 0.05 : 귀무 가설 기각, 두 집단의 빈도 분포가 독립적이지 않을 것이다.

 

  ANOVA 

 

- 귀무가설 : 집단(세 개 이상)의 평균 간에 차이가 없을 것이다.

- p-value < 0.05 : 귀무 가설 기각, 집단 간의 평균에 유의미한 차이가 있다.

 

 

(1) Gender

plt.figure(figsize = (15,8))
sns.barplot(x='Gender', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['Gender'].value_counts()

 

 

## 평균 분석 : ttest_ind

t_male = base_data.loc[base_data['Gender']=='M', 'Score_diff_total']
t_female = base_data.loc[base_data['Gender']=='F', 'Score_diff_total']

spst.ttest_ind(t_male, t_female)

 

 

3-2-2) 학습목표

 

# 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습목표', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습목표'].value_counts()

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습목표']=='승진', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습목표']=='자기계발', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습목표']=='취업', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

3-2-3) 학습방법

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='학습방법', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()
base_data['학습방법'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['학습방법']=='온라인강의', 'Score_diff_total']
anova_2 = base_data.loc[base_data['학습방법']=='오프라인강의', 'Score_diff_total']
anova_3 = base_data.loc[base_data['학습방법']=='참고서', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3)

 

 

  3-2-4) 강의 학습 교재 유형

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='강의 학습 교재 유형', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

 

## 범주 데이터 확인 : value_counts()
base_data['강의 학습 교재 유형'].value_counts()

 

 

## 분산 분석 : f_oneway

anova_1 = base_data.loc[base_data['강의 학습 교재 유형']=='일반적인 영어 텍스트 기반 교재', 'Score_diff_total']
anova_2 = base_data.loc[base_data['강의 학습 교재 유형']=='영상 교재', 'Score_diff_total']
anova_3 = base_data.loc[base_data['강의 학습 교재 유형']=='뉴스/이슈 기반 교재', 'Score_diff_total']
anova_4 = base_data.loc[base_data['강의 학습 교재 유형']=='비즈니스 시뮬레이션(Role Play)', 'Score_diff_total']

spst.f_oneway(anova_1, anova_2, anova_3, anova_4)

 

 

 3-2-6) 취약분야 인지 여부

 

## 그래프 분석 : barplot

plt.figure(figsize = (15,8))
sns.barplot(x='취약분야 인지 여부', y='Score_diff_total', data = base_data)
plt.grid()
plt.show()

 

 

## 범주 데이터 확인 : value_counts()

base_data['취약분야 인지 여부'].value_counts()

 

## 평균 분석 : ttest_ind

t_yes = base_data.loc[base_data['취약분야 인지 여부']=='알고 있음', 'Score_diff_total']
t_no = base_data.loc[base_data['취약분야 인지 여부']=='알고 있지 않음', 'Score_diff_total']

spst.ttest_ind(t_yes, t_no)

 

 

728x90
728x90

피어슨 상관계수, regplot

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import scipy.stats as spst   

target = '등록차량수'

for feature in analyze_features:

    print(f"[{feature}] 통계 분석 및 그래프 분석")

    # 통계 분석 : 통계 분석

    print("   ***** 통계 분석 *****")
    result = spst.pearsonr(data[feature], data[target])
    print(feature, " vs ", target, " 상관 분석: ", spst.pearsonr(data[feature], data[target]))
    
    if result[1] > 0.05:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 주지 않는다")
    else:
        print(f"통계분석 결과 : {feature}는 등록차량수에 영향을 준다")

    # 그래프 분석 : regplot

    # plt.figure(figsize = (12,8))
    print("   ***** 그래프 분석 *****")
    sns.regplot(x = feature, y= target, data = data)
    plt.grid()
    plt.show()
    
    print("")
    print("-"*50)

 

 

heatmap

 

## 각 컬럼간 상관계수에 대한 heatmap 그래프 분석

plt.figure(figsize = (20,12))
sns.heatmap(data[col_num].corr(),cmap="PiYG", annot=True)
plt.show()

 

728x90
728x90

기본 차트 그리기 plt.plot(1차원 값)

 

 

# 차트 그리기
plt.plot(data['Temp'])

# 화면에 보여주기
plt.show()

 

x축, y축 지정하고 그래프 그리기

 

import pandas as pd
import matplotlib.pyplot as plt
plt.rc('font', family = 'Malgun Gothic')
plt.rcParams['font.family']

plt.plot(df['timestamp'], df['price(원/kg)])
plt.xticks(rotation=70)

plt.ylabel('price(원/kg)')
plt.show()

 

# 방법 2
plt.plot('Date', 'Temp', data = data)
plt.show()

 

 

시각화 axhline

train.groupby('hour').mean()['hour_bef_temperature'].plot()
plt.axhline(train.groupby('hour').mean()['hour_bef_temperature'].mean())

 

차트 꾸미기

plt.plot(data['Date'], data['Ozone'])

plt.xticks(rotation = 30)       # x축 값 꾸미기 : 방향을 30도 틀어서
plt.xlabel('Date')              # x축 이름 지정
plt.ylabel('Ozone')             # y축 이름 지정
plt.title('Daily Airquality')   # 타이틀

plt.show()

 

 

라인스타일 조정

 

plt.plot(data['Date'], data['Ozone']
         ,color='green'                # 칼러
         , linestyle='dotted'          # 라인스타일
         , marker='o')                 # 값 마커(모양)

plt.xlabel('Date') 
plt.ylabel('Ozone')
plt.title('Daily Airquality')
plt.xticks(rotation=45)

plt.show()

 

 

그래프 겹쳐서 그리기

 

# 첫번째 그래프
plt.plot(data['Date'], data['Ozone'], color='green', linestyle='dotted', marker='o')
# 두번째 그래프
plt.plot(data['Date'], data['Temp'], color='r', linestyle='-', marker='s')

plt.xlabel('Date') 
plt.ylabel('Ozone')
plt.title('Daily Airquality')
plt.xticks(rotation=45)

# 위 그래프와 설정 한꺼번에 보여주기
plt.show()

 

 

범례, 그리드 추가

 

plt.plot(data['Date'], data['Ozone'], label = 'Ozone')  # label = : 범례추가를 위한 레이블값
plt.plot(data['Date'], data['Temp'], label = 'Temp')

plt.legend(loc = 'upper right')    # 레이블 표시하기. loc = : 위치
plt.grid()
plt.xticks(rotation=45)
plt.show()

 

 

여러 개 차트 그리기, 방식 2

 

data.plot(x = 'Date', y = ['Temp','Ozone']
          , title = 'Daily Airquality')
plt.grid()
plt.show()

 

 

축 범위 조정

 

plt.plot(data['Ozone'])

# plt.ylim(0, 100)
# plt.xlim(0, 10)
plt.grid()
plt.show()

 

 

그래프 수직선, 수평선 추가

 

plt.plot(data['Ozone'])

plt.axhline(40, color = 'grey', linestyle = '--')
plt.axvline(10, color = 'red', linestyle = '--')
plt.show()

 

 

 

그래프에 텍스트 추가

 

plt.plot(data['Ozone'])

plt.axhline(40, color = 'grey', linestyle = '--')
plt.axvline(10, color = 'red', linestyle = '--')

plt.text(5, 41, '40')
plt.text(10.1, 20, '10')

plt.show()

 

 

여러 그래프 나눠서 그리기

 

plt.figure(figsize = (12,8))
plt.subplot(3,1,1)
plt.plot('Date', 'Temp', data = data)
plt.grid()

plt.subplot(3,1,2)
plt.plot('Date', 'Wind', data = data)

plt.subplot(3,1,3)
plt.plot('Date', 'Ozone', data = data)
plt.grid()
plt.ylabel('Ozone')

plt.tight_layout() # 그래프간 간격을 적절히 맞추기
plt.show()

 

 

 

 

하나의 데이터프레임에서 여러 개의 차트 그리기

 

# 남녀 인구 변화
plt.plot(pop_test[['male','female']])
plt.show()

 

728x90
728x90

내용

  • PCA
  • PCA 코드
  • 주성분 누적 분산 그래프 elbow method
PCA 사용하기
* 선언

- 생성할 주성분의 개수 지정
- 원래 feature의 수만큼 지정할 수 있음
( 일반적으로 feature 수 만큼 지정 )
- 생성 후 조정할 수 있음
* 적용
- x_train으로 fit & transform
- 다른 데이터는 적용
- 결과는 numpy array
* 코드
# 라이브러리
from sklearn.decomposition import PCA

# 주성분 분석 선언
pca = PCA(n_components=n)

# 만들고, 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

 

코드
1. 데이터 준비

(1) 라이브러리 로딩

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklean.model_selection import train_test_split


(2) 스케일링
scaler = MinMaxScaler()
x = scaler.fit_transform(x)

(3) 데이터 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random = 20)


2. 차원 축소 : 주성분 PCA

(1) 주성분 만들기
from sklearn.decomposition import PCA

(2) 주성분 분석 수행
# 주성분을 몇 개로 할지 결정( 최대값 : 전체 feature 수)
n = x_train.shape[1]

# 주성분 분석 선언
pca = PCA(n_components = n)

# 만들고 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

(3) 결과는 numpy array로 주어지므로 데이터 프레임으로 변환

# 컬럼 이름 생성
column_names = ['PC' + str(i+1) for i in range(n) ]

# 데이터프레임으로 변환
x_train_pc = pd.DataFrame(x_train_pc, columns = column_names )
x_val_pc = pd.DataFrame(x_val_pc, columns = column_names
연습

# 주성분 1개짜리
pca1 = PCA(n_components = 1)
x_pc1 = pca1.fit_transform(x_train)

# 주성분 2개짜리
pca2 = PCA(n_components = 2)
x_pc2 = pca2.fit_transform(x_train)

# 주성분 3개짜리
pca3 = PCA(n_components = 3)
x_pc3 = pca3.fit_transform(x_train)
주성분 누적 분산 그래프

- 그래프를 보고 적절한 주성분의 개수를 지정(elbow method)
- x축 : PC 수
- y축 : 전체 분산크기 - 누적분산크기

# 코드
plt.plot( range(1, n+1), pca.explained_variance_ratio_, marker = '.')
plt.xlabel('No. of PC')

728x90
728x90

내용

  • countplot 이용
  • 기초 통계량 산출 value_counts() $ value_counts(normalize = True)

 

1. countplot 이용

sns.countplot(y='컬럼명', data = 데이터프레임명)

plt.grid()

plt.show()

 

가로로 그리려면,

sns.countplot(x='컬럼명', data=데이터프레임)

 

 

2. 기초 통계량 산출 value_counts() $ value_counts(normalize = True)

데이터프레임['컬럼명'].value_counts()

데이터프레임['컬럼명'].value_counts(normalize=True)

 

 

3. pie chart 이용

plt.pie( 데이터프레임['컬럼명'].values, labels = 데이터프레임['컬럼명'].index(), autopct = '%.2f%%' )



plt.pie( 데이터프레임['컬럼명'].vauels, labels = 데이터프레임['컬럼명'].index(), autopct = '%.2f%%', startangle = 90, counterclock=False)



pt.pie( 데이터프레임['컬럼명'].values, labels = 데이터프레임['컬럼명'].index(), autopct = '%.2f%%', startangle = 90, counterclock = False, explode = [0.05, 0.05, 0.05],  shadow = True )
728x90
728x90

KT Aivle School 에이블스쿨 기자단] 9.04(월) ~ 9.10(일)  시즌 1호 발표 & ADsP 합격

이번 주의 스케줄

  • 미니 프로젝트
  • ADsP 발표
  • 데이터 수집 -> 웹 크롤링을 잘 활용하면 쏠쏠하게 아르바이트를 할 수 있다고 해서 좀 더 흥미가 갔다 “크몽” 사이트는 메모
  • 데이터 분석
  • 이번 셀프 테스트 잘 본건가.. 알쏭달쏭
  • 데이터 분석 삽질 ㅠ

 

2차 미니프로젝트 1일차

시즌 1호 발표 완료~
 
저번 1차 미니 프로젝트에서는 스스로에게 만족스럽지 못해서 열심히 준비한 결과,
 

발표를 하고 칭찬을 받을 수 있었다

 코딩 파일 시작 부분에 뚜렷한 목적성을 잘 나타낸게 어필한 포인트

시즌 1호 발표 완료!! 칭찬 받은 시작 부분 9.06(수)

 

첫 발표라 그런지 우쭈쭈해주는 고마운 팀원들ㅜ 

 이번 주 미니 프로젝트에서 계속 삽질했던 포인트는 상관분석, 카이제곱검정, t검정에서의 p-value에 따른 귀무가설 기각이었다...
 ADsP를 땄다는 녀석이 이런 부분에서 실수를 하니 스스로 한심하게 느껴진 부분

 

이번 수업 리뷰

 

이번주 수업 중 인상 깊었던 내용
수업 때 적었던 내용들 중 일

 브라우저 홈페이지에서 F12를 눌러 페이지 내의 정보를 탐색하는 내용이 흥미로웠다.

 Beautiful Soup 라이브러리, CSS를 열심히 배워서 웹 크롤링을 통해 추후에 해커톤이든 개인 프로젝트에서든 정보 수집 능력을 키우고 싶다는 생각을 했다!!

 

ADsP 합격!!

 
1 과목 만점으로 점수를 많이 딴게 다행
민트 이론 한 바퀴 돌리고, 모의고사 + 기출을 5바퀴 돌리니 시험 때 큰 어려움 없이 문제를 풀 수 있었다
역시 자격증은 무조건 기출 뺑뻉이
 

이번 주 셀프 테스트

 

그동안 셀프 테스트 점수가 잘 나와서 만만하게 봤는데 이번에는 수업 때 이론 부분에서 잘 집중을 못해서 그런지 쉽지 않게 느껴졌다

앞으로 수업에서 딴짓하지 말고 빡 집중 해야지!!

 

 

 

이번 주 프로그래머스 문제 풀이

 

문제 <3진법 뒤집기>
문제 <배열 조각하기>
문제 <수열과 구간 쿼리 2>
문제 <주사위 게임 3>

코드 정리

 

수치형 상관분석 p-value 내림차순 정렬

def pearson_value(df):
    keys = []
    spst_list=[]
    spst_dict = {}
    
    for i in df.columns:
        if ( df[i].dtypes=='int64'):
    #         print(i, base_data[i].dtypes)
            keys.append(i)
    # print(keys)

    # 피어슨 상관분석 p-value 값을 value로 사용하기 위해 준비
    for i in keys:
        spst_list.append(list(spst.pearsonr(df[i], df['Score_diff_total'] ))[1])
    # print(spst_list)
    # print('='*100, '\n상관계수 p-value 출력', sep='')
    spst_dict = dict(zip(keys, spst_list))
    # display(spst_dict)
    
    # 딕셔너리 형태로 만들어 p-value 값을 아래로 오름차순으로 출력
    # lambda 매개변수 : 표현식
    # items를 통해 키-값 쌍을 나타내는 튜플 리스트를 생성
    # key = lambda x : x[1] 부분에서 'x'는 리스트에서 하나의 튜플
    # x[1] 은 value 값을 정렬 기준으로 삼는다.
    spst_dict = sorted( spst_dict.items(), key = lambda x : x[1])
    # display(spst_dict)

    for key, value in spst_dict:
        print(f'{key}:{value}')

 

728x90

+ Recent posts