Skip to main content

Smart Arabic survey analysis: Likert, reliability, validity, inferential tests, open-text analysis and automatic Arabic Word/Excel reports

Project description

ArabicSurveyAnalyzer — محلل الاستبيانات العربية

Repo Python License: MIT

مكتبة Python ذكية لتحليل الاستبيانات باللغة العربية: من ملف Excel/CSV إلى تقرير عربي أكاديمي كامل (Word + Excel + JSON + رسوم بيانية) في سطور قليلة.

A smart Python library for Arabic-language survey analysis: from a raw Excel/CSV file to a complete academic Arabic report (Word + Excel + JSON + publication-quality charts) in a few lines of code.

Author: Dr Merwan Roudane — https://github.com/merwanroudane/surveyarabic


Table of contents — المحتويات

  1. Features — المزايا
  2. Installation — التثبيت
  3. Input data format — صيغة البيانات
  4. Quick start — البداية السريعة
  5. SurveyAnalyzer — full API reference
  6. Results objects — بنية النتائج
  7. Outputs — المخرجات
  8. Likert scales — مقاييس ليكرت
  9. Low-level module API
  10. Charts — الرسوم البيانية
  11. MATLAB color palettes — الألوان
  12. AI / LLM integration — الذكاء الاصطناعي
  13. Streamlit web app — واجهة الويب
  14. Demo & tests — المثال والاختبارات
  15. Methodological & ethical notes — ملاحظات منهجية

1. Features — المزايا

الوحدة Module ما تقدمه What you get
التحليل الوصفي Descriptive sample overview, frequencies & percentages, mean, SD, median, mode, min/max, item ranking, automatic Arabic agreement-level interpretation
مقاييس Likert 3/5/7-point Arabic presets, custom mappings, Arabic-text → numeric conversion, diverging stacked bar chart
الثبات Reliability Cronbach's alpha, McDonald's omega (ω), corrected item-total correlation, alpha-if-item-deleted, Composite Reliability (CR), AVE
الصدق Validity item-dimension correlations, KMO, Bartlett's sphericity, EFA (varimax, Kaiser criterion), Fornell–Larcker, HTMT
الاختبارات الاستدلالية Inferential t-test / Mann-Whitney, ANOVA / Kruskal-Wallis (automatic normality-based selection), effect sizes (Cohen's d, η², ε², rank-biserial), chi-square + Cramér's V, Pearson/Spearman/Kendall, OLS regression
جودة البيانات Data quality straightlining, low variance, missingness, Mahalanobis multivariate outliers, weak/duplicate open answers — review report only, no automatic deletion
الإجابات المفتوحة Open text Arabic normalization, keyword extraction, lexicon-based sentiment (with negation), representative quotes, auto Arabic summary paragraph, optional LLM hook
المخرجات Outputs full RTL Arabic Word report, styled RTL Excel workbook, raw JSON, PNG charts (Parula palette)
الواجهة UI Streamlit web application

2. Installation — التثبيت

git clone https://github.com/merwanroudane/surveyarabic
cd surveyarabic

pip install -e .          # core library
pip install -e .[app]     # + streamlit & plotly (web interface)
pip install -e .[ai]      # + anthropic SDK (optional LLM analysis)

Core dependencies (installed automatically): pandas, numpy, scipy, statsmodels, factor_analyzer, matplotlib, openpyxl, python-docx, arabic-reshaper, python-bidi.

Compatible with pandas 3.x (new str dtype) and scikit-learn 1.8 (a built-in shim fixes the factor_analyzer ↔ sklearn incompatibility).

3. Input data format — صيغة البيانات

One row per respondent, one column per question. Accepted files: .xlsx, .xls, .xlsm, .csv (UTF-8 or Windows-1256) — or pass a ready pandas.DataFrame directly.

الجنس العمر Q1 Q2 Q10 ملاحظات
ذكر 25-35 موافق موافق بشدة محايد الخدمة ممتازة…
أنثى 36-45 محايد موافق موافق أعاني من بطء…

Likert answers may be Arabic text (موافق بشدة, …) or numbers (1–5); both are handled. Text matching is normalization-tolerant (غير موافق جداًغير موافق جدا, hamza/ta-marbuta variants unified).

4. Quick start — البداية السريعة

from arabic_survey_analyzer import SurveyAnalyzer

analyzer = SurveyAnalyzer("survey.xlsx",
                          title="تقرير تحليل استبيان جودة الخدمة",
                          researcher="د. مروان رودان")

analyzer.define_likert_scale("5-point")

analyzer.set_dimensions({
    "جودة الخدمة": ["Q1", "Q2", "Q3", "Q4"],
    "الرضا":       ["Q5", "Q6", "Q7"],
    "الثقة":       ["Q8", "Q9", "Q10"],
})

analyzer.set_demographics(["الجنس", "العمر", "المستوى التعليمي"])

analyzer.run_all(group_vars=["الجنس"],
                 text_cols=["ملاحظات"],
                 regression_dependent="الرضا")

paths = analyzer.export_all("output")
# output/تقرير_الاستبيان.docx  +  نتائج_الاستبيان.xlsx  +  results.json  +  charts/*.png

5. SurveyAnalyzer — full API reference

from arabic_survey_analyzer import SurveyAnalyzer

5.1 Constructor

SurveyAnalyzer(source, sheet_name=0, title="تقرير تحليل الاستبيان", researcher="")
Parameter Type Default Description
source str path or DataFrame .xlsx/.xls/.csv file path, or a pandas DataFrame
sheet_name int/str 0 Excel sheet to read
title str تقرير تحليل الاستبيان Title shown on the Word report cover
researcher str "" Researcher name shown on the cover

On load: column names stripped, fully-empty rows/columns dropped, text cells trimmed, empty strings → missing.

5.2 Configuration methods

All configuration methods return self, so they can be chained.

define_likert_scale(scale_type="5-point", mapping=None)

Parameter Type Description
scale_type str "3-point", "5-point" or "7-point" — sets scale bounds and default Arabic label presets
mapping dict or None optional custom {label: number} map; labels are Arabic-normalized before matching
# preset
analyzer.define_likert_scale("5-point")

# fully custom labels
analyzer.define_likert_scale("5-point", mapping={
    "أرفض بشدة": 1, "أرفض": 2, "لا أدري": 3, "أوافق": 4, "أوافق بشدة": 5,
})

set_dimensions(dimensions)

analyzer.set_dimensions({
    "جودة الخدمة": ["Q1", "Q2", "Q3", "Q4"],
    "الرضا":       ["Q5", "Q6", "Q7"],
})

{dimension_name: [item_columns]}. Raises KeyError listing any column that does not exist in the data.

set_demographics(columns)

analyzer.set_demographics(["الجنس", "العمر", "المستوى التعليمي", "سنوات الخبرة"])

Columns to describe with frequency tables + pie/bar charts. Unknown columns are silently skipped.

set_text_columns(columns)

analyzer.set_text_columns(["ملاحظات", "اقتراحات"])

Open-ended question columns for qualitative analysis.

5.3 Analysis methods

Each run_* method returns its result table(s) and also stores them in analyzer.results / analyzer.tables (see §6).

run_descriptive()

items_table, dims_table = analyzer.run_descriptive()

Produces: sample overview, demographic frequency tables, per-item statistics (count, mean, SD, median, mode, min, max, rank, agreement level), per-dimension statistics, Likert category percentages, and the auto-written Arabic paragraph analyzer.paragraphs["dimensions"].

run_reliability()

rel_table = analyzer.run_reliability()

Per dimension + overall: Cronbach's α, McDonald's ω, CR, AVE, Arabic interpretation. Item-total tables per dimension are stored in analyzer.results["reliability"]["item_total"].

run_validity(n_factors=None)

Parameter Type Description
n_factors int or None number of EFA factors; None → Kaiser criterion (eigenvalues > 1)
val = analyzer.run_validity()        # dict, see §6
val = analyzer.run_validity(n_factors=3)

Produces: item-dimension correlations, KMO + Bartlett table, EFA loadings

  • explained variance + eigenvalues (scree), Fornell–Larcker matrix, HTMT matrix. If EFA fails (e.g. singular matrix) the error string is stored in val["efa_error"] and the rest still completes.

run_group_tests(group_var, force=None)

Parameter Type Description
group_var str grouping column (e.g. "الجنس")
force None / "parametric" / "nonparametric" override the automatic Shapiro-Wilk-based test choice
t = analyzer.run_group_tests("الجنس")                       # auto choice
t = analyzer.run_group_tests("العمر", force="nonparametric") # always KW/MW

Test selection logic:

Groups Normal (Shapiro p ≥ .05 in all groups) Not normal
2 Welch t-test + Cohen's d Mann-Whitney U + rank-biserial r
3+ one-way ANOVA + η² Kruskal-Wallis + ε²

Can be called repeatedly with different group_vars; each adds a table and an Arabic paragraph.

run_correlations(method="pearson")

r = analyzer.run_correlations()              # Pearson
r = analyzer.run_correlations("spearman")    # or "kendall"

Correlation + p-value matrices between dimension scores (analyzer.results["correlation"]["r"] / ["p"]).

run_regression(dependent, predictors=None)

Parameter Type Description
dependent str dimension name used as the outcome
predictors list[str] or None predictor dimensions; None → all other dimensions
coef, summary = analyzer.run_regression("الرضا")
coef, summary = analyzer.run_regression("الرضا", predictors=["جودة الخدمة"])

OLS on respondent-level dimension scores; returns the coefficient table (B, SE, t, p, significance) and the model summary (R², adj-R², F, p).

run_data_quality()

summary = analyzer.run_data_quality()

Flags per respondent: straightlining (≥ 90 % identical answers), low variance (SD < 0.5), high missingness (> 20 %), Mahalanobis outliers (χ², p < .001), weak/duplicate open answers. Detailed per-respondent table in analyzer.results["quality"]["detail"]. Nothing is deleted.

run_text_analysis(columns=None, llm_callable=None)

(alias: run_ai_open_text_analysis — proposal-compatible name)

Parameter Type Description
columns list[str] or None open-text columns; None → those from set_text_columns
llm_callable f(prompt)->str or None optional LLM for deep thematic analysis (§12)
out = analyzer.run_text_analysis(["ملاحظات"])
out["ملاحظات"]["keywords"]            # DataFrame: keyword / count / %
out["ملاحظات"]["sentiment_summary"]   # DataFrame: إيجابي/محايد/سلبي + %
out["ملاحظات"]["quotes"]              # list of representative quotes
out["ملاحظات"]["paragraph"]           # auto Arabic summary paragraph

run_all(group_vars=None, text_cols=None, regression_dependent=None)

Runs the full pipeline in the right order: descriptive → data quality → reliability → validity → group tests (each var) → correlations → regression (optional) → text analysis (optional).

analyzer.run_all(group_vars=["الجنس", "المستوى التعليمي"],
                 text_cols=["ملاحظات"],
                 regression_dependent="الرضا")

5.4 Export methods

export_charts(out_dir="charts")

Renders every chart available for the analyses already run; returns {section: [png paths]} and caches it in analyzer.charts.

export_excel(path="نتائج_الاستبيان.xlsx")

All result tables → one styled workbook (navy headers, zebra rows, borders, auto column widths, RTL sheet view, frozen header row).

export_report(path="تقرير_الاستبيان.docx", charts_dir="charts")

Full Arabic academic Word report (see §7.1). Charts are rendered first if not already cached.

export_json(path="results.json")

Entire results dict serialized to UTF-8 JSON (DataFrames → record lists) — your machine-readable audit trail.

export_all(out_dir="output")

Charts + Excel + Word + JSON into one folder. Returns {"excel": ..., "word": ..., "json": ..., "charts": ...} paths.

5.5 Attributes

Attribute Type Content
analyzer.df DataFrame cleaned raw data
analyzer.num_df DataFrame data with Likert items converted to numbers
analyzer.scores DataFrame respondent-level mean score per dimension
analyzer.items list[str] all item columns (property)
analyzer.results dict every analysis result (§6)
analyzer.tables dict[str, DataFrame] flat table registry → Excel sheets
analyzer.paragraphs dict auto-generated Arabic narrative
analyzer.charts dict section → list of PNG paths

6. Results objects — بنية النتائج

analyzer.results keys after run_all:

results
├── descriptive
│   ├── overview          DataFrame  — participants / variables / missing
│   ├── demographics      {var: DataFrame}  — frequencies + %
│   ├── items             DataFrame  — per-item stats + rank + level
│   ├── dimensions        DataFrame  — per-dimension stats + rank + level
│   └── percentages       DataFrame  — % per Likert category per item
├── quality
│   ├── detail            DataFrame  — per-respondent flags
│   └── summary           DataFrame  — counts + % per indicator
├── reliability
│   ├── summary           DataFrame  — α, ω, CR, AVE + interpretation
│   └── item_total        {dim: DataFrame}  — r(item, total), α-if-deleted
├── validity
│   ├── item_dimension    DataFrame  — item ↔ dimension r + p
│   ├── kmo_bartlett      DataFrame
│   ├── efa_loadings      DataFrame  — loadings + communalities
│   ├── efa_variance      DataFrame  — eigenvalue / % / cumulative %
│   ├── eigenvalues       list       — for the scree plot
│   ├── fornell_larcker   DataFrame  — √AVE diagonal vs correlations
│   └── htmt              DataFrame
├── group_tests           {group_var: DataFrame}  — test, stat, p, effect size
├── correlation           {"r": DataFrame, "p": DataFrame}
├── regression            {"coefficients": DataFrame, "summary": DataFrame}
└── text                  {column: {keywords, sentiment_detail,
                                    sentiment_summary, quotes,
                                    paragraph, llm_analysis}}

7. Outputs — المخرجات

7.1 Word report (RTL) — التقرير العربي

True right-to-left layout (OOXML <w:bidi/> paragraphs, <w:bidiVisual/> tables), Traditional Arabic body font, navy-styled tables, embedded charts. Sections:

  1. صفحة عنوان — cover page
  2. مقدمة — introduction
  3. وصف العينة — sample description (+ demographic charts)
  4. جودة البيانات — data-quality summary
  5. التحليل الوصفي للفقرات (+ Likert & means charts)
  6. تحليل المحاور (+ bar & radar charts) مع فقرة نتائج آلية
  7. الثبات (+ α/ω chart) مع فقرة تفسيرية
  8. الصدق: KMO/بارتليت، EFA، فورنيل-لاركر، HTMT (+ scree)
  9. الاختبارات الاستدلالية (+ boxplots) مع فقرات تفسيرية
  10. الارتباط (+ heatmap) والانحدار
  11. تحليل الإجابات المفتوحة (+ keywords & sentiment charts، اقتباسات)
  12. ملخص النتائج والتوصيات — auto-generated recommendations

7.2 Excel workbook — ملف الجداول

One sheet per table (~26 sheets for the full pipeline): نظرة عامة، توزيع كل متغير ديموغرافي، إحصاءات الفقرات/المحاور، جودة البيانات (ملخص + تفصيلي)، الثبات، ارتباط الفقرات لكل محور، صدق الاتساق الداخلي، KMO وبارتليت، التشبعات العاملية، التباين المفسر، فورنيل-لاركر، HTMT، الفروق حسب كل متغير، مصفوفة الارتباط، الانحدار، الكلمات المفتاحية والمشاعر لكل سؤال مفتوح.

7.3 JSON — سجل التدقيق

Everything in results as UTF-8 JSON for reproducibility, audit, or downstream apps.


8. Likert scales — مقاييس ليكرت

Presets — الإعدادات الجاهزة

scale_type Labels (value)
"3-point" غير موافق (1) محايد (2) موافق (3)
"5-point" غير موافق بشدة/جداً (1) غير موافق (2) محايد (3) موافق (4) موافق بشدة/جداً (5)
"7-point" غير موافق بشدة (1) … محايد (4) … موافق بشدة (7)

Agreement levels — مستويات الموافقة

Equal-width thirds of the scale range. For a 5-point scale:

Mean range Level
1.00 – 2.33 منخفض
2.34 – 3.67 متوسط
3.68 – 5.00 مرتفع
from arabic_survey_analyzer import agreement_level
agreement_level(4.12)                          # 'مرتفع'   (5-point default)
agreement_level(4.12, scale_min=1, scale_max=7) # 7-point scale

9. Low-level module API

Every stage is usable standalone with plain DataFrames.

9.1 Reading data

from arabic_survey_analyzer import read_survey
df = read_survey("survey.xlsx")            # or .csv (UTF-8 / Windows-1256)
df = read_survey(existing_dataframe)       # pass-through + cleaning

9.2 Likert conversion

from arabic_survey_analyzer.likert import build_mapping, to_numeric

mapping = build_mapping("5-point")                       # preset
mapping = build_mapping(mapping={"أوافق": 4, ...})       # custom
num_df  = to_numeric(df, items=["Q1", "Q2"], mapping=mapping)

9.3 Descriptives

from arabic_survey_analyzer.descriptive import (
    sample_overview, frequency_table, demographics_tables,
    item_statistics, dimension_statistics, dimension_scores,
    likert_percentages)

item_statistics(num_df, ["Q1", "Q2"], scale_min=1, scale_max=5)
dimension_statistics(num_df, {"محور أ": ["Q1", "Q2"]})
scores = dimension_scores(num_df, dimensions)   # n × dims, for tests/SEM

9.4 Reliability

from arabic_survey_analyzer import cronbach_alpha, mcdonald_omega
from arabic_survey_analyzer.reliability import (
    item_total_statistics, composite_reliability_ave, reliability_table)

cronbach_alpha(num_df[["Q1", "Q2", "Q3"]])      # float
mcdonald_omega(num_df[["Q1", "Q2", "Q3"]])      # float (1-factor ω total)
item_total_statistics(num_df[["Q1", "Q2", "Q3"]])  # DataFrame
cr, ave = composite_reliability_ave(num_df[["Q1", "Q2", "Q3"]])
reliability_table(num_df, dimensions)           # full Arabic table

9.5 Validity

from arabic_survey_analyzer.validity import (
    item_dimension_correlations, kmo_bartlett, efa,
    fornell_larcker, htmt_matrix)

table, kmo_value, bartlett_p = kmo_bartlett(num_df, items)
loadings, variance, eigenvalues = efa(num_df, items)            # Kaiser
loadings, variance, eigenvalues = efa(num_df, items, n_factors=3,
                                      rotation="varimax")       # fixed k
fornell_larcker(num_df, dimensions)
htmt_matrix(num_df, dimensions)

9.6 Inferential tests

from arabic_survey_analyzer.inferential import (
    compare_groups, chi_square_table, correlation_matrix, linear_regression)

compare_groups(num_df, df["الجنس"], scores)                  # auto test
compare_groups(num_df, df["العمر"], scores, force="parametric")
res, crosstab = chi_square_table(df, "الجنس", "المستوى التعليمي")
r_mat, p_mat  = correlation_matrix(scores, method="spearman")
coef, summary = linear_regression(scores, "الرضا", ["جودة الخدمة", "الثقة"])

9.7 Data quality

from arabic_survey_analyzer.data_quality import (
    straightlining, low_variance, missing_per_respondent,
    mahalanobis_outliers, weak_text_answers, quality_report)

detail, summary = quality_report(df, num_df, items, text_cols=["ملاحظات"])
straightlining(num_df, items, threshold=0.9)
mahalanobis_outliers(num_df, items, alpha=0.001)

9.8 Text analysis

from arabic_survey_analyzer.text_analysis import (
    clean_answers, keyword_frequencies, sentiment_score, sentiment_analysis,
    representative_quotes, analyze_open_text)
from arabic_survey_analyzer.textutils import normalize_ar, ar

keyword_frequencies(df["ملاحظات"], top_n=20)
sentiment_score("الخدمة ممتازة والموظفون متعاونون")    # 1.0
detail, summary = sentiment_analysis(df["ملاحظات"])
normalize_ar("إستبيانٌ")     # 'استبيان' (hamza/diacritics unified)
ar("جودة الخدمة")            # reshaped+bidi string for matplotlib labels

10. Charts — الرسوم البيانية

All charts: Arabic-safe text (arabic-reshaper + python-bidi, Tahoma), 150 dpi PNG, Parula palette by default. Each function saves a PNG and returns its path.

from arabic_survey_analyzer import visualization as viz
Function Chart
viz.likert_diverging_chart(pct_df, out_dir) diverging stacked bars (Heiberger–Robbins) per item
viz.item_means_chart(item_table, out_dir, scale_max=5) horizontal item means + SD error bars
viz.dimension_means_chart(dim_table, out_dir, scale_max=5) dimension means + SD
viz.dimensions_radar_chart(dim_table, out_dir, scale_max=5) radar profile (needs ≥ 3 dims)
viz.correlation_heatmap(r_mat, out_dir, colorscale="Parula") annotated heatmap
viz.demographic_chart(freq_table, var_name, out_dir) pie (≤ 5 categories) or bars
viz.group_boxplot(scores, df["الجنس"], "الرضا", out_dir) boxplots by group
viz.scree_plot(eigenvalues, out_dir) scree + Kaiser line
viz.reliability_chart(rel_table, out_dir) α vs ω bars + 0.70 threshold
viz.keywords_chart(kw_df, col, out_dir) top-15 keyword bars
viz.sentiment_chart(sent_summary, col, out_dir) sentiment pie
viz.interactive_dimension_chart(dim_table) plotly interactive bar (returns Figure)
path = viz.dimension_means_chart(dims_table, "charts", scale_max=5)
fig  = viz.interactive_dimension_chart(dims_table, colorscale="Parula")
fig.show()

11. MATLAB color palettes — الألوان

parula_colors(n) reproduces MATLAB R2014b Parula from the official 64 RGB stops; Parula is the default everywhere.

from arabic_survey_analyzer import (parula_colors, matlab_jet_colors,
                                    turbo_colors, bluered_colors,
                                    sinha_colors, resolve_colorscale)

parula_colors(8)            # ['#352a87', '#2058b0', ...]  8 hex colours
matlab_jet_colors(16)       # classic MATLAB Jet
turbo_colors(16)            # Google Turbo
bluered_colors(16)          # blue-white-red diverging
sinha_colors(16)            # navy-teal-green-gold-red ramp

resolve_colorscale("Parula")        # plotly colorscale [[0.0,'#352a87'],...]
from arabic_survey_analyzer.colors import get_cmap
cmap = get_cmap("Parula")           # matplotlib colormap object

12. AI / LLM integration — الذكاء الاصطناعي

The library never requires an API. Any function f(prompt: str) -> str works as llm_callable; two convenience builders are provided.

Local model (full privacy — recommended for sensitive data)

from arabic_survey_analyzer.ai_analysis import make_openai_compatible_callable

llm = make_openai_compatible_callable("http://localhost:11434/v1",
                                      model="qwen2.5")        # Ollama
analyzer.run_text_analysis(["ملاحظات"], llm_callable=llm)

Anthropic API

from arabic_survey_analyzer.ai_analysis import make_anthropic_callable

llm = make_anthropic_callable(model="claude-sonnet-4-6")  # uses ANTHROPIC_API_KEY
analyzer.run_text_analysis(["ملاحظات"], llm_callable=llm)

Custom function

def my_llm(prompt: str) -> str:
    ...  # anything: requests.post to your server, a pipeline, etc.
    return generated_text

analyzer.run_text_analysis(["ملاحظات"], llm_callable=my_llm)

The LLM output appears under "تحليل الذكاء الاصطناعي" in the Word report and in results["text"][col]["llm_analysis"]. LLM failures never break the pipeline — the error message is stored instead.


13. Streamlit web app — واجهة الويب

streamlit run arabic_survey_analyzer/streamlit_app.py

Workflow: upload file → preview → pick Likert scale, demographics, open questions and dimensions in the sidebar → run → browse 6 result tabs (الوصفي / المحاور / الثبات والصدق / الفروق / الإجابات المفتوحة / جودة البيانات) → download Word / Excel / JSON.


14. Demo & tests — المثال والاختبارات

python examples/generate_sample_data.py   # synthetic Arabic survey (n=220)
python examples/run_demo.py               # full pipeline -> examples/output/
python -m pytest tests -q                 # 8 unit tests

The synthetic data has person-level latent traits per dimension, so the demo produces realistic psychometrics (α ≈ 0.81–0.84, KMO ≈ 0.74).


15. Methodological & ethical notes — ملاحظات منهجية

  • مخرجات الذكاء الاصطناعي احتمالية وليست حكماً نهائياً، ولا تعوض الحكم العلمي للباحث.
  • لا يُحذف أي مشارك آلياً؛ وحدة جودة البيانات تنتج تقرير مراجعة فقط.
  • استخدم نموذجاً محلياً عند تحليل بيانات حساسة، ولا تُرسل بيانات شخصية لأي خدمة خارجية دون موافقة.
  • كل خطوة تحليلية موثقة في results.json (سجل تدقيق Audit trail).
  • ω يحسب من نموذج عامل واحد (minres)؛ عند فشل التقدير يستخدم احتياطي PCA.
  • اختيار الاختبار المعلمي/اللامعلمي يعتمد على Shapiro-Wilk داخل كل مجموعة (عينة ≤ 500)، ويمكن فرضه يدوياً عبر force=.

License

MIT © Dr Merwan Roudane

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

arabic_survey_analyzer-0.1.0.tar.gz (59.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

arabic_survey_analyzer-0.1.0-py3-none-any.whl (54.4 kB view details)

Uploaded Python 3

File details

Details for the file arabic_survey_analyzer-0.1.0.tar.gz.

File metadata

  • Download URL: arabic_survey_analyzer-0.1.0.tar.gz
  • Upload date:
  • Size: 59.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for arabic_survey_analyzer-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d14f2d36ca162b94209698fcc10d05cd9404c8cd430e971d924c1b740c5bb6ab
MD5 704ce6e4b30a17f856d7424f7e293eec
BLAKE2b-256 23120782d8a1825091191e4fb5654fc3ec81e87155aa8433f484c70a5762b669

See more details on using hashes here.

File details

Details for the file arabic_survey_analyzer-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for arabic_survey_analyzer-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b77b608335b65d6d049ab7f7f72ac917067ce58616984a6f8f7939b20b6a583f
MD5 49933bd062c58df7ace1344eebb059aa
BLAKE2b-256 5051d58a2a5f1178d94ced8fac6314518f15e279b4a9321c4b37f86a587a3a7b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page