-
통계학 -2 /code 해례본기초수학/통계학 유사품 2024. 5. 27. 21:32
df.order_id.value_counts()
더보기- Syntax:
- df['column']: This is the dictionary-like access method. You use the column name as a key inside square brackets.
- df.column: This is the attribute access method. You use a dot followed by the column name.
- Flexibility:
- df['column']: This method is more flexible because it works with any column name, including those with spaces or special characters. For example, you can access columns named Total Sales, 123Column, or column-name.
- df.column: This method only works if the column name is a valid Python identifier (i.e., it must be a valid variable name, without spaces or special characters, and cannot start with a number).
- Namespace Collisions:
- df['column']: This method avoids namespace collisions. For example, if there is a column name that conflicts with a DataFrame method or attribute (like index, shape, or sum), using df['column'] will still work correctly.
- df.column: This method can lead to namespace collisions. If the column name conflicts with an existing DataFrame method or attribute, it can cause unexpected behavior or errors.
- Consistency:
- df['column']: This method is always safe to use and is the preferred way when writing robust code that handles a wide range of potential column names.
- df.column: This method is more concise and can make the code cleaner and easier to read, but it's less safe due to the potential issues mentioned above.
웬만하면 안쓰는게 나은 듯.
target_user = df.user_id.sample().values[0]
더보기.values: DataFrame이나 Series 객체의 값들을 numpy 배열로 반환합니다. 단일 행 DataFrame의 경우, .values는 2차원 numpy 배열을 반환합니다.
We recommend using DataFrame.to_numpy() instead.
Only the values in the DataFrame will be returned, the axes labels will be removed
하나의 컬럼(row)에서 array 를 가져오기에 [0]만 지정 가능
sample(n>=2) 이상일 경우 index 값 유효
revisit_user_set = set(df.loc[df.days_since_prior_order.notna(), "user_id"])
더보기DataFrame.notna()
Detect existing (non-missing) values.
Return a boolean same-sized object indicating if the values are not NA. Non-missing values get mapped to True. Characters such as empty strings '' or numpy.inf are not considered NA values (unless you set pandas.options.mode.use_inf_as_na = True). NA values, such as None or numpy.NaN, get mapped to False values.
[row , column]
에 대해 True 값만 받는다고 생각한다면?
일치하는 값만이 존재한다?
print(f"재방문 유저 수 : {revisit_user_count:,}({revisit_ratio*100:.2f}%)")
f-string 및 소수점 지정 방법 (반올림)
df = df.assign(is_weekend = df.order_dow.isin([6,0])) # assign : column 생성 및 T / F 할당?
더보기Assign new columns to a DataFrame.
Returns a new object with all original columns in addition to new ones. Existing columns that are re-assigned will be overwritten.
(3인칭 단수 현재 : assigns)타동사
- 1.<일·사물·방 등을> 할당하다, 배당하다(allot) ((to))assign work to each man각자에게 작업을 할당하다
- 2.<사람을 임무·직책 등에> 임명하다, 선임하다(appoint), 선정하다 ((for, to)); <남에게 …하도록> 명하다, 임명하다assign a person for a guard…을 수위[경호원]로 임명하다
자동사
- 1.(채권자를 위해 타인에게) 재산을 위탁하다
명사
- 1.[보통 pl.] 양수인, 수탁인(assignee)
활용형-
3인칭 단수 현재assigns
-
과거형assigned
-
현재 분사assigning
-
과거 분사assigned
df.is_weekend.value_counts(normalize=True).sort_index().plot.bar()
더보기normalizebool, default False
Return proportions rather than frequencies.
빈도가 아닌 비율을 반환합니다.
legend = [] for is_weekend, group in weekly_user_order_count.groupby('is_weekend') : group.order_count.apply(np.log).hist(bins = np.arange(0,8.1,0.5), alpha = 0.4, density = True) # 어떤 유저는 2~300번을 어떤이는 1번도 겨우~ 를 감안하기 위한 log // vectorize legend.append(is_weekend) plt.legend(legend) plt.xticks(np.arange(0,8.1, 1), np.exp(np.arange(0, 8.1, 1)).astype(int), rotation = 30) plt.show()
더보기Pandas DataFrame 성능 빠르게하기 - apply말고 Vectorization쓰자 (tistory.com)
Vectorization 함수 백터화 하기
numpy의 decorator를 사용해서 함수를 백터화 할 수 있습니다.
기존의 그냥 함수와 다르게 numpy 형태로 함수를 적용할 수 있도록 만들어줍니다.
2장. Vectorization 및 BroadCasting : 네이버 블로그 (naver.com)
for i in range() : for j in range() : ....
에 대하여 for 문 2개 반복되어 상당히 큰 시간복잡도를 가짐
import numpy as np # 행렬 A와 벡터 v를 정의합니다 (예시) A = np.array([[1, 2], [3, 4]]) v = np.array([5, 6]) # A와 v의 내적을 계산합니다 u = np.dot(A, v) print(u)
함수를 이용한 내적
2장. Vectorization 및 BroadCasting : 네이버 블로그 (naver.com)
numpy.vectorize() (runebook.dev)
좀 더 고민해봐야겠다.
더보기네, 예시를 만들어보겠습니다. 예를 들어, 다음과 같은 함수가 있다고 가정해보겠습니다:
import numpy as np # 임의의 크기의 행렬과 벡터를 생성합니다 A = np.random.rand(100, 100) # 100x100 크기의 임의의 행렬 v = np.random.rand(100) # 크기가 100인 임의의 벡터 # A와 v의 내적을 계산하는 함수 def dot_product(A, v): result = np.zeros(A.shape[0]) for i in range(A.shape[0]): result[i] = np.dot(A[i], v) return result # 함수를 실행하여 결과 확인 u = dot_product(A, v) print(u)
이 함수는 행렬 A의 각 행과 벡터 v의 내적을 계산하여 결과를 새로운 벡터에 저장합니다. 그러나 이 코드는 명시적인 반복문을 사용하여 각 행에 대한 내적을 계산하기 때문에 성능이 좋지 않을 수 있습니다.
이제 이 함수를 벡터화하여 반복문 없이 행렬과 벡터의 내적을 계산할 수 있도록 만들어 보겠습니다
# 벡터화된 함수 def dot_product_vectorized(A, v): return np.dot(A, v) # 벡터화된 함수 실행 u_vectorized = dot_product_vectorized(A, v) print(u_vectorized)
이렇게 하면 벡터화된 함수를 사용하여 더 간결하고 성능이 우수한 코드를 얻을 수 있습니다.
위의 예시에서는 먼저 임의의 크기의 행렬과 벡터를 생성하고, 그 다음에 일반적인 반복문을 사용하여 각 행의 내적을 계산하는 함수를 정의했습니다. 그리고 마지막으로 해당 함수를 호출하여 내적을 계산하고 결과를 출력했습니다.
그 다음 예시에서는 동일한 연산을 수행하지만 벡터화된 함수를 사용하여 간결하게 표현하였습니다. 이 함수는 np.dot 함수를 사용하여 행렬과 벡터의 내적을 계산하므로 반복문 없이도 내적을 계산할 수 있습니다. 따라서 코드가 간결해지고 실행 속도도 더 빠르게 동작할 것으로 기대됩니다.
더보기group.order_count.apply(np.log) hist(bins = np.arange(0,8.1,0.5), alpha = 0.4, density = True) # 어떤 유저는 2~300번을 어떤이는 1번도 겨우~ 를 감안하기 위한 log // vectorize plt.xticks(np.arange(0,8.1, 1), np.exp(np.arange(0, 8.1, 1)).astype(int), rotation = 30)
numpy.log
numpy.log(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'log'>
Natural logarithm, element-wise.
The natural logarithm log is the inverse of the exponential function, so that log(exp(x)) = x. The natural logarithm is logarithm in base e.
numpy.e
Euler’s constant, base of natural logarithms, Napier’s constant.
Histogram bins, density, and weight — Matplotlib 3.9.0 documentation
numpy.histogram — NumPy v1.26 Manual
densitybool, optional
If False, the result will contain the number of samples in each bin. If True, the result is the value of the probability density function at the bin, normalized such that the integral over the range is 1. Note that the sum of the histogram values will not be equal to 1 unless bins of unity width are chosen; it is not a probability mass function.
# First plot plt.hist(data['numbers']) # Then assign the ticks plt.xticks(np.arange(0, 1, 0.1)) plt.yticks(np.arange(0, 100,10))
이 코드는 주어진 데이터셋에서 'numbers' 열의 값들에 대한 히스토그램을 시각화하고 있습니다. 그리고 x축과 y축의 눈금을 설정하고 있습니다.
- plt.hist(data['numbers']): 이 부분은 'numbers' 열의 값들에 대한 히스토그램을 생성합니다. 히스토그램은 주어진 데이터를 일정한 구간으로 나누고 각 구간에 속하는 데이터의 빈도를 막대로 나타낸 그래프입니다.
- plt.xticks(np.arange(0, 1, 0.1)): x축의 눈금을 설정하는 부분입니다. np.arange 함수를 사용하여 0부터 1까지 0.1 간격으로 눈금을 설정하고 있습니다. 이는 x축의 범위가 0에서 1까지이며, 간격은 0.1로 설정됩니다.
- plt.yticks(np.arange(0, 100,10)): y축의 눈금을 설정하는 부분입니다. np.arange 함수를 사용하여 0부터 100까지 10 간격으로 눈금을 설정하고 있습니다. 이는 y축의 범위가 0에서 100까지이며, 간격은 10으로 설정됩니다.
이 코드를 실행하면 'numbers' 열의 값들에 대한 히스토그램이 나타나며, x축과 y축에는 설정한 눈금이 표시됩니다.
데이터 해상도
더보기# 데이터 해상도 : 10.23 월 : 3 /10.30 월 : 20 ... \\ 월 : 556705 : 뭉개져있다.
from scipy import stats stats.ttest_ind( order_item_count_weekday, order_item_count_weekend, equal_var=False ) # TtestResult(statistic=136.28489660027753, pvalue=0.0, df=1792625.315539146)
더보기이 코드는 scipy 라이브러리에서 제공하는 t-검정(t-test)을 사용하여 두 개의 샘플 그룹 간의 평균값이 유의하게 다른지를 검정하는 것으로 보입니다.
여기서 stats.ttest_ind 함수는 두 개의 샘플 그룹을 입력으로 받아 독립적인 두 집단의 평균에 대한 t-검정을 수행합니다. equal_var=False 옵션은 두 그룹의 분산이 다르다고 가정합니다.
결과는 TtestResult 객체로 반환되며, 이 객체에는 t-검정의 결과를 나타내는 여러 정보가 포함되어 있습니다. 여기서 statistic은 t-통계량을, pvalue는 검정의 유의확률(p-value)을 나타냅니다.
주어진 결과에서는 t-통계량이 136.28이고 유의확률(p-value)이 0.0으로 나타나고 있습니다. 이는 유의수준 0.05에서 유의하게 낮은 p-value를 가지므로, 귀무가설을 기각하고 대립가설을 채택합니다. 따라서 두 그룹의 평균은 통계적으로 유의하게 다르다고 할 수 있습니다.
- 귀무가설 (H0): 두 그룹의 평균은 같다. 즉, 두 그룹 간에는 유의한 차이가 없다.
- 대립가설 (H1 또는 Ha): 두 그룹의 평균은 다르다. 즉, 적어도 한 그룹은 다른 그룹과는 평균이 다르다.
- t-통계량 (t-statistic):
- t-통계량은 t-검정에서 사용되는 값으로, 두 그룹 간의 평균 차이를 표준 오차로 나눈 것입니다. 평균 차이의 크기와 그룹 내 변동성을 고려하여 두 그룹 간의 차이를 측정하는데 사용됩니다. 일반적으로 두 그룹 간의 차이가 클수록 t-통계량이 커지며, 두 그룹 간의 차이가 표준 오차에 비해 큰 경우 t-통계량은 유의한 값이 됩니다.
- 유의확률 (p-value):
- 검정의 유의확률은 귀무가설이 참일 때, 현재의 검정 통계량 또는 더 극단적인 결과가 나타날 확률을 나타냅니다. 즉, 주어진 검정 통계량이 귀무가설을 지지하는 정도를 측정합니다. 유의확률은 일반적으로 0과 1 사이의 값으로 나타나며, 작을수록 귀무가설을 기각하는데 더 강한 증거가 됩니다. 일반적으로는 0.05 (또는 5%)보다 작을 때, 귀무가설을 기각하고 대립가설을 채택합니다.
이렇게 설명할 수 있겠습니다! 요약하자면, t-통계량은 두 그룹 간의 차이를 측정하는데 사용되며, 유의확률은 이 차이가 우연히 발생할 확률을 나타냅니다.
'기초수학 > 통계학 유사품' 카테고리의 다른 글
통계학 - ANOVA (0) 2024.05.31 통계학 - 3 : 통계적 가설 (0) 2024.05.28 통계학 - 평균 (0) 2024.05.27 통계학 (0) 2024.05.27 - Syntax: